Skip to content

Deploying

Custom domains

Team accounts can show any drop they own on their own domain, like docs.acme.com or acme.com. Add the domain, set the DNS records we give you, and it goes live with SSL a few minutes after DNS updates. Point it at another drop whenever you like without touching DNS. The drop keeps its own <slug>.ship.place URL too.

On this page

Add a domain

POST

/domains

sp_ key or ID token

Send the domain and the slug of the drop to show. docs.acme.com needs one CNAME. A bare domain like acme.com needs a CNAME on www plus an A and an AAAA record, and www redirects to it; send www.acme.com to make www the main address instead. The response lists the exact records to add. Adding a domain the account already has returns it with a 200.

bash
curl -X POST https://ship.page/domains \
  -H "Authorization: Bearer sp_QffDmo0..." \
  -H "Content-Type: application/json" \
  -d '{"domain": "docs.acme.com", "slug": "vivid-otter-a1b2c"}'
json201 Created
{
  "domain": {
    "id": "6f1d2c3a-8e4b-4c1a-9a7e-2d5b8c9e0f12",
    "host": "docs.acme.com",
    "address": "docs.acme.com",
    "apex": false,
    "apexMain": false,
    "slug": "vivid-otter-a1b2c",
    "status": "waiting",
    "records": [
      { "type": "CNAME", "name": "docs", "value": "k3x7p2m6qa.pagedns.com" }
    ],
    "problem": null,
    "message": null,
    "apexOk": null,
    "apexReady": null,
    "apexProblem": null,
    "apexMessage": null,
    "frozen": false,
    "pausesAt": null,
    "endsAt": null,
    "dnsHost": null,
    "checkedAt": null,
    "liveAt": null,
    "createdAt": "2026-11-04T09:12:00.000Z"
  }
}
StatusDescription
402payment requiredsubscription_required: no active Team plan on the account.
409conflictdomain_limit: the account already has 10 domains waiting, securing or live.
422unprocessabledomain_invalid: not a domain we can serve, like an IP address, a single label or one of our own domains.
429rate limitedrate_limited: adds, repoints and removals share one limit of 10 a minute per account. Checks have their own.
503unavailablebackend_unavailable: billing couldn't be verified. domains_unavailable: custom domains are down for a moment. Try again shortly.

Check DNS now

POST

/domains/<id>/check

sp_ key or ID token

Checks DNS and SSL right away and returns the domain. We also check every few minutes on our own, so this only skips the wait. When something is off, problem holds a code and message says what to fix.

bash
curl -X POST https://ship.page/domains/6f1d2c3a-8e4b-4c1a-9a7e-2d5b8c9e0f12/check -H "Authorization: Bearer sp_QffDmo0..."
# { "domain": { "status": "securing", ... } }
StatusDescription
404not foundnot_found: no domain with that id on your account.
429rate limitedrate_limited: checks have their own limit of 10 a minute per account.

Point it at another drop

PATCH

/domains/<id>

sp_ key or ID token

Send another slug and visitors get that drop within about 10 seconds. DNS stays the same.

bash
curl -X PATCH https://ship.page/domains/6f1d2c3a-8e4b-4c1a-9a7e-2d5b8c9e0f12 \
  -H "Authorization: Bearer sp_QffDmo0..." \
  -H "Content-Type: application/json" \
  -d '{"slug": "quiet-heron-k3m9p"}'
# { "domain": { "slug": "quiet-heron-k3m9p", ... } }
StatusDescription
402payment requiredsubscription_required: no active Team plan on the account.
404not foundnot_found: no domain with that id on your account.
429rate limitedrate_limited: adds, repoints and removals share one limit of 10 a minute per account. Checks have their own.

Frozen domains can't be repointed: they answer domain_frozen. See takedowns.

List your domains

GET

/domains

sp_ key or ID token

Every domain on the account. limit is how many waiting, securing and live domains the account may hold: 10 on Team, 0 without it. While bareDomains is false, only subdomains can be added.

bash
curl https://ship.page/domains -H "Authorization: Bearer sp_QffDmo0..."
# { "domains": [ ... ], "limit": 10, "bareDomains": true }

Remove a domain

DELETE

/domains/<id>

sp_ key or ID token

Stops serving it right away and deletes its certificate. Use it to clear moved and removed domains from the list too.

bash
curl -X DELETE https://ship.page/domains/6f1d2c3a-8e4b-4c1a-9a7e-2d5b8c9e0f12 -H "Authorization: Bearer sp_QffDmo0..."
# 204 No Content
StatusDescription
404not foundnot_found: no domain with that id on your account.

Frozen domains can't be removed: they answer domain_frozen.

DNS records

Subdomain
One CNAME from the name to your target, like docs CNAME k3x7p2m6qa.pagedns.com. The target is unique to your account and domain, so copy it from the response.
Bare domain
The CNAME on www, plus one A and one AAAA record on the bare name (@) that point at our edge.
Names
name is relative to your domain (docs, www, @), the way most DNS hosts ask for it.
Cloudflare
Set our records to DNS only (grey cloud). Proxied records hide them from us.
DNS host
dnsHost names who runs your DNS when we can tell, with a link to its DNS settings.

Statuses

waiting
We haven't seen the CNAME yet.
securing
DNS is right and SSL is being set up. This usually takes a few minutes.
live
Your drop is served on the domain.
moved
The domain was proven somewhere else, or its CNAME was gone 3 days running.
removed
The domain ended. message says why.

Domains that don't go live within 7 days end. Bare domains report their A and AAAA records in apexOk, apexProblem and apexMessage.

When Team ends

Domains keep serving for 30 days after the Team plan ends, then show an offline page. After 90 days they're removed. pausesAt and endsAt carry both dates, and resubscribing before then brings everything back. Adding and repointing need an active Team plan.

Takedowns

If the drop a domain shows is taken down for abuse, the domain is frozen with it: it serves the takedown notice and can't be repointed or removed (domain_frozen).

Last updated Jun 12, 2026