acme.com/, acme.com/support, and acme.com/docs end up serving different resources from the same hostname.
When to use a route
- Hosting your chatbot at
support.acme.com(one route, default slug). - Splitting one hostname into multiple destinations —
acme.com/helpfor the knowledge base,acme.com/chatfor the chatbot. - A microsite per product, each on its own subdomain.
Path model
Every route lives on exactly one custom domain and owns exactly oneslug. The full URL is https://<domain>/<slug>.
slug | URL | Notes |
|---|---|---|
"" | https://acme.com/ | The default route. Visitors landing on the bare hostname see this. |
"support" | https://acme.com/support | Lives at the /support path. |
"docs" | https://acme.com/docs | Lives at the /docs path. |
(domain_id, slug) is unique — you can’t have two routes at the same path on the same domain. To re-point a path, delete the existing route and create a new one.
Slugs are lowercase alphanumeric + hyphen only (
^[a-z0-9-]*$). A small list of slugs is reserved for platform internals (api, health, _next, .well-known, etc.) and cannot be used.Resource types
Exactly one ofchatbot_id, kb_id, or page_id is set on every route, and it must match the type discriminator:
type | Required id field | Serves |
|---|---|---|
chatbot | chatbot_id | A chatbot. |
kb | kb_id | A knowledge base. |
page | page_id | A page. |
400 invalid_payload.
Create a route
cURL
Response
true.
POST /custom-domain-routes accepts an Idempotency-Key header so retries are safe. See Idempotency.
List routes on a domain
domain_id is required — listing across every domain in an org isn’t supported.
cURL
(domain_id, slug) uniqueness, so pagination isn’t necessary.
Update
PATCH /custom-domain-routes/{id} accepts slug and is_default. The route type and underlying resource id are immutable — delete and recreate to re-point a path.
cURL
Delete
cURL
204 No Content. The parent domain and the underlying chatbot/kb/page are untouched — only the binding is removed.
Permissions
| Endpoint | Required scope |
|---|---|
POST /custom-domain-routes | domains.manage |
GET /custom-domain-routes | domains.view |
GET /custom-domain-routes/{id} | domains.view |
PATCH /custom-domain-routes/{id} | domains.manage |
DELETE /custom-domain-routes/{id} | domains.manage |

