Your UI owns every state.
Choose this path when DNS instructions, lifecycle statuses and support actions must follow your product system exactly.
- Browser
- Your components
- API key
- Server only
- Rendering
- Your product
Your team declares where traffic should go. Your customer makes the DNS change. The lifecycle remains inspectable from creation to deletion.
The setup separates what your server does, what the customer changes and what the edge automates. That makes the flow easier to embed, support and recover.
Declare a public HTTPS URL. The first HTTPS destination becomes the default.
POST /v1/destinations
{ "url": "https://app.yoursaas.com" }Use the REST API, dashboard or a short-lived embedded widget session.
Idempotency-Key: customer-42-domainDisplay the dns_records returned by creation, exactly as provided.
CNAME portal.acme.eu → in.subdomain.toDNS is detected, the certificate is issued and the registered route becomes active.
pending_dns → validating → provisioning → activeBoth paths create the same customer-domain resource. Choose how much of the onboarding interface your product needs to own.
Choose this path when DNS instructions, lifecycle statuses and support actions must follow your product system exactly.
Create a widget session on your server, then let the customer submit the hostname without exposing your API key.
subdomain-to:createdEnter a sample domain. Demo mode stays in this browser and makes no API request.
The happy path is not the only path. Secondary statuses keep DNS drift, provisioning failure, suspension and deletion explicit.
The domain can return to validation after the expected record is restored.
active → misconfigured → validatingThe domain records the latest error instead of appearing indefinitely pending.
provisioning → failedA distinct status separates suspension from DNS or certificate problems.
active → suspendedDeletion returns 202 and moves the resource into an explicit terminal workflow.
* → deletingDo not infer readiness from DNS alone. Expose the branded URL only when the overall lifecycle is active and every required subsystem is operational.
dns_status: validcertificate_status: issuedrouting_status: activestatus: activeGET /v1/domains/{id}
{
"data": {
"status": "active",
"dns_status": "valid",
"certificate_status": "issued",
"routing_status": "active"
}
}Only on your server. For an in-product browser experience, issue a short-lived widget token server-side.
You can retrieve GET /domains/{id} during onboarding. Webhooks currently cover hostname.created and hostname.deleting; use the resource status as the source of truth.
No. Exact subdomains receive a CNAME. Apex domains receive one or more A records.
Only after DNS validation and certificate provisioning. Unknown hostnames receive a 421 response at the edge.
The quickstart covers the server-led path. The dashboard lets you inspect the same lifecycle before embedding it.