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
/domains
sp_ key or ID tokenSend 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.
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"}'{
"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"
}
}| Status | Description |
|---|---|
402payment required | subscription_required: no active Team plan on the account. |
409conflict | domain_limit: the account already has 10 domains waiting, securing or live. |
422unprocessable | domain_invalid: not a domain we can serve, like an IP address, a single label or one of our own domains. |
429rate limited | rate_limited: adds, repoints and removals share one limit of 10 a minute per account. Checks have their own. |
503unavailable | backend_unavailable: billing couldn't be verified. domains_unavailable: custom domains are down for a moment. Try again shortly. |
Check DNS now
/domains/<id>/check
sp_ key or ID tokenChecks 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.
curl -X POST https://ship.page/domains/6f1d2c3a-8e4b-4c1a-9a7e-2d5b8c9e0f12/check -H "Authorization: Bearer sp_QffDmo0..."
# { "domain": { "status": "securing", ... } }| Status | Description |
|---|---|
404not found | not_found: no domain with that id on your account. |
429rate limited | rate_limited: checks have their own limit of 10 a minute per account. |
Point it at another drop
/domains/<id>
sp_ key or ID tokenSend another slug and visitors get that drop within about 10 seconds. DNS stays the same.
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", ... } }| Status | Description |
|---|---|
402payment required | subscription_required: no active Team plan on the account. |
404not found | not_found: no domain with that id on your account. |
429rate limited | rate_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
/domains
sp_ key or ID tokenEvery 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.
curl https://ship.page/domains -H "Authorization: Bearer sp_QffDmo0..."
# { "domains": [ ... ], "limit": 10, "bareDomains": true }Remove a domain
/domains/<id>
sp_ key or ID tokenStops serving it right away and deletes its certificate. Use it to clear moved and removed domains from the list too.
curl -X DELETE https://ship.page/domains/6f1d2c3a-8e4b-4c1a-9a7e-2d5b8c9e0f12 -H "Authorization: Bearer sp_QffDmo0..."
# 204 No Content| Status | Description |
|---|---|
404not found | not_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
nameis 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
dnsHostnames 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.
messagesays 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