acme.com, support.acme.com, docs.acme.com — instead of the default *.awardee.dev URLs. Customers see your brand, links stay short, and email/share previews carry your domain.
A connected domain on its own doesn’t route anything. You attach one or more Custom Domain Routes to map paths on the domain to specific chatbots, knowledge bases, or pages.
Custom domains are a paid add-on. Each connected hostname adds one unit of the
custom_domain add-on to your subscription, prorated by Stripe. The number of domains per organization is not capped — billing is per-slot.Lifecycle
Connect
POST /custom-domains with { "domain": "acme.com" }. We register the hostname with the TLS terminator and return a list of DNS records you need to publish.Publish DNS
Add each record in
verification_records at your DNS provider. Apex domains use an A record (76.76.21.21); subdomains use a CNAME to cname.vercel-dns.com. Some domains also need a TXT record for ownership.Verify
Once DNS has propagated (5 minutes to ~24 hours depending on the provider), call
POST /custom-domains/{id}/verify. When it returns status: "verified", the TLS cert provisions automatically and traffic starts flowing.Route
Attach one or more routes so paths on the domain resolve to your content.
Connect a domain
cURL
Response
POST /custom-domains accepts an Idempotency-Key header so retries are safe. See Idempotency.
Verify
DNS changes can take a few minutes to a few hours to propagate. Once you’ve published the records, ask the API to re-check:cURL
Response (still pending)
Response (success)
status is one of:
| Value | Meaning |
|---|---|
verified | Ownership confirmed, DNS pointing at us, TLS cert provisioning. Domain is live. |
pending | DNS hasn’t propagated yet — wait and retry. This is the normal greenfield state. |
error | The check itself failed (e.g. upstream timeout). error carries the reason. |
We also poll verification automatically every few minutes for the first hour after connect, so a domain often flips to
verified without you calling the endpoint. You can still call it manually to force an immediate re-check.List
cURL
page, page_size, and search (substring match on domain).
Disconnect
DELETE /custom-domains/{id} removes the hostname from the TLS terminator, deletes the row, and releases the billable add-on slot. All custom_domain_routes attached to the domain are removed by the FK cascade.
cURL
204 No Content.
Permissions
Endpoints under/custom-domains require these scopes when called with an OAuth access token. Personal API keys are unscoped — they bypass these checks.
| Endpoint | Required scope |
|---|---|
POST /custom-domains | domains.manage |
GET /custom-domains | domains.view |
GET /custom-domains/{id} | domains.view |
DELETE /custom-domains/{id} | domains.manage |
POST /custom-domains/{id}/verify | domains.manage |

