Changelog
Dated changes to the public /v1 contract, newest first. This page is the
record — marketing pages are not the contract, and neither is a blog post.
Additive changes ship without a version bump; breaking ones get a new dated version and a deprecation window. See Versioning for which is which.
2026-08-15
The pre-launch hardening pass. Everything here landed before the API was published, so nothing below breaks an existing integration.
Added
- Asynchronous lifecycle events.
knowledge.dataset.trainedand.failed,crawl.completedand.failed,action.run.succeededand.failed, andbilling.credits.lowand.exhaustedare now emitted. Previously declared but never sent, which meant training and crawling could only be polled. conversation.handoff.requested. A new event for the moment a visitor asks for a human. There was no way to learn about a handoff before.- Message credits in
GET /v1/usage. The endpoint returned storage only; the resource that actually runs out was buried in the subscription payload. - Citations on stored messages.
sourcesnow appears onGET /v1/messages/{id}and in conversation transcripts, not just on the live chat response. - Handoff state on conversations.
handoff_requestedandhandoff_reasonare now readable. - Account-wide conversation listing.
chatbot_idis optional onGET /v1/conversations; omit it for the whole account. - Cross-channel session lookup.
GET /v1/conversations/by_session/{id}accepts sessions started by the widget or a messaging channel, not only the API. - Batch file upload.
POST /v1/filesacceptsfiles[]under oneIdempotency-Key. POST /v1/sitemap_crawlers/validate_url. Check a sitemap before committing to a crawl. Read-scoped, because it changes nothing.- Real examples in the spec. Every core read endpoint now publishes an example response captured from the live API.
Changed
POST /v1/chat/streamno longer double-charges on retry. A retry with the sameIdempotency-Keyanswers with a JSON summary of the original turn andIdempotency-Replayed: trueinstead of running a second billed turn.ending_beforenow pages backwards correctly. It previously returned the wrong page on endpoints with a fixed sort order.POST /v1/knowledge/removal_impactand the URL validators moved to:readscopes. They compute an answer without changing anything, so a read-only integration can call them.- Error responses on
/v1no longer carry asuccessfield. The documented envelope is{ message, errors?, error, request_id }; some failure paths were answering in the dashboard's shape. - Registering a duplicate webhook URL is rejected with
409 ENDPOINT_URL_ALREADY_REGISTERED. It previously fanned every event out twice to the same destination. - Authentication failures appear in
GET /v1/request_logswhen the caller proved possession of the key — the case behind "my key stopped working".
Removed
Twenty-nine operations that exposed dashboard internals rather than anything an integration needs. None had shipped publicly.
GET /v1/scopes— in the OpenAPI document instead.GET /v1/reference/countries,GET /v1/reference/timezones— picker data, already public elsewhere.GET /v1/search/suggestions— a name-prefix scan, not retrieval. UsePOST /v1/search.GET /v1/queries,GET /v1/queries/stats— duplicatedGET /v1/conversations/{id}/messages.GET /v1/jobs/*— internal queue introspection. UseGET /v1/knowledge/{id}/status.GET|PATCH /v1/me/preferences— dashboard theme and date-format settings.GET /v1/accountsand/v1/account/*— team administration belongs in a browser.POST /v1/billing/checkout,/addons/checkout,/portal— these returned hosted URLs that only a human can complete.GET /v1/chatbots/templates— onboarding-wizard data.GET /v1/api_keys,GET /v1/api_keys/{id}—GET /v1/medescribes the calling key. Self-revoke viaDELETE /v1/api_keys/{id}remains.GET /v1/knowledge/removal_status— always returned zero.POST /v1/knowledge/edit_impact— identical toremoval_impact.- The legacy
POST /v1/knowledge/ingestalias, which used a different credential type and a different response envelope. UsePOST /v1/knowledge.
The scopes jobs:read, team:read, team:write and billing:write were
removed with the endpoints they gated. A key that still lists one is
unaffected: unknown scopes are ignored, not rejected.
2026-08-14
- Public
/v1introduced. - Error codes are
SCREAMING_SNAKE. - OpenAPI document published with bearer auth, 403/429 responses, and the
webhooksobject.