hosting
POST /v1/sites/{siteId}/chat-agent
Switch on the chat agent for this site.
Authentication
Send an API key as a bearer token. This endpoint does not state a specific permission in the specification, so give your key the least it needs and check the response rather than assuming.
This endpoint takes no organisation id. Your key already identifies the organisation it belongs to, and the response is scoped to it.
Try it
Replace anything in angle brackets with your own values, and the key placeholder with a key from your dashboard.
curl -X POST https://api.zinndigital.com/v1/sites/{siteId}/chat-agent \
-H "Authorization: Bearer zdk_live_…" \
-H "Content-Type: application/json" \
-d '{ }'Signed in? The API console in your dashboard fills in your real organisation id and your own key, and runs the request against the live API so you can see the actual response. Open this endpoint in the API console
Details
Creates the agent, named after the site and pre-authorised for the site's own domains so the snippet works the moment it is pasted. ⛔ Refuses with 422 when the product has not been bought for this site, or when the account is not in good standing — two different refusals with two different remedies, told apart by the code in the error details (not_purchased / not_in_good_standing). A suspension is not cleared by credit, so that refusal deliberately offers no top-up. Calling it twice returns the existing agent with 200 rather than an error.
Parameters
| Name | Type | Required | What it is |
|---|---|---|---|
siteId (path) | Uuid | Yes | Site ID (UUIDv7). |
Request body
| Name | Type | Required | What it is |
|---|---|---|---|
name | string | No | — |
greeting | string | No | — |
persona | string | No | — |
brand_colour | string | No | — |
launcher_position | string<left, right> | No | — |
handoff_enabled | boolean | No | — |
status | string<active, paused> | No | — |
allowed_origins | string[] | No | — |
monthly_message_cap | integer | No | — |
Response
| Name | Type | Required | What it is |
|---|---|---|---|
id | string | Yes | — |
site_id | string | No | — |
name | string | Yes | What the agent calls itself to visitors. The customer's brand, not ours. |
greeting | string | No | — |
persona | string | No | Free text describing tone and what to say. ⛔ It cannot widen what the agent may read — retrieval decides that before the model sees anything. |
brand_colour | string | No | — |
launcher_position | string<left, right> | No | — |
status | string<active, paused> | Yes | paused stops it answering and keeps everything it has learned, so switching back on is instant rather than a re-index. |
handoff_enabled | boolean | No | Offer to pass the visitor to a person when the agent cannot answer. |
public_key | string | Yes | Carried in the embed snippet. It identifies the agent and authorises nothing a page's reader could not already do — the fence is allowed_origins. |
allowed_origins | string[] | Yes | Origins the public endpoints will answer for. ⛔ Empty refuses everything — it means "not installed yet", never "allow anything". |
monthly_message_cap | integer | No | Messages included per calendar month. Checked before each answer. |
messages_this_month | integer | No | — |
indexed_chunks | integer | No | Passages of the site currently searchable. Zero means it knows nothing yet. |
embed_snippet | string | No | The two lines to paste into any website. |
sources | ChatAgentSource[] | Yes | — |
Errors this endpoint can return
401 · 403 · 404 · 422