Every endpoint on this page requires either a Clerk-issued JWT (
Authorization: Bearer <token>) or
an organization API key (x-api-key: pk_…). Anonymous calls return 401 Unauthorized. See
Authentication for the full setup.session.created (when the call/conversation starts) and session.ended (when it closes, with the full post-call analysis attached). The other events on this page are on the roadmap — documented so you can design against them, but not delivered as webhooks yet.
Available now:
session.created and session.ended. Every event marked Planned below is not emitted to webhook endpoints yet — don’t build hard dependencies on it. session.updated and knowledge_store.updated currently exist only as in-app real-time (SSE) signals, not as webhooks.session.created Available
Fired when a session is initiated — for outbound voice calls, this is before pickup. Use it to lock the originating task as “in-flight”.
The session id (UUID). Use as idempotency key.
Constant:
"session.created".VOICE, CHAT.PHONE, WEB, WHATSAPP.INBOUND, OUTBOUND.Session state at emission (
OPEN for session.created).The agent id (UUID).
RFC 3339 UTC timestamp.
Channel and session metadata. Includes
customerPhoneNumber, roomName, and sessionVariables — see below.The
session_variables you passed at trigger time, echoed back verbatim — regardless of whether the prompt referenced them. Use these as your correlation IDs (e.g. crmContactId, taskId, campaignId).session.ended Available
Fired once when a session closes (manually, via timeout, on call hangup, or on ttl expiry). Carries the full post-call analysis block — see Post-call analysis for what each field means.
The session id (UUID). Same as in
session.created.Constant:
"session.ended".CLOSED.Session start time.
Most recent activity timestamp.
When the session closed.
Same shape as
session.created. metadata.sessionVariables is echoed verbatim.One-paragraph summary of the call.
Best-fit intent classification —
conversation.intent, confidence, explanation. Present only when Intent Recognition is enabled on the agent.classification (RESOLVED / PARTIALLY_RESOLVED / UNRESOLVED / NOT_APPLICABLE), confidenceScore, satisfiedChecklistItems, evidence, explanation. Present only when Resolution Analysis is enabled.conversation.sentiment (POSITIVE / NEUTRAL / NEGATIVE), score (-1.0 to +1.0), detectedLanguage. Present only when Sentiment is enabled.Map of
{ <fieldName>: <value> } for every field defined in the agent’s Data Extraction schema.Link into the dashboard to play back the call recording.
The webhook is summary-grade, not transcript-grade. The full message-by-message transcript is not included, and some long-call fields may be truncated. For the complete picture, pull from
GET /api/v1/chat/sessions/{id}/messages.session.updated Planned chat
Emitted for chat sessions when state, agent assignment, intelligence summary, or analytics records change mid-session. Voice/outbound calls do not emit this event — they go straight from session.created to session.ended.
Today this fires only as an in-app real-time (SSE) signal for live dashboards. It is not yet delivered to webhook endpoints.
Session id (UUID).
Constant:
"session.updated".Which fields changed (e.g.
["state", "intelligence"]).OPEN, CLOSED, EXPIRED.message.added Planned
A user, assistant, or tool message was appended to a session.
Not emitted to webhook endpoints yet. Until it ships, poll
GET /api/v1/chat/sessions/{id}/messages or consume the in-app real-time stream.The message id (
msg_…).USER, ASSISTANT, TOOL, SYSTEM.The text content (may be empty for tool calls).
Present only for
TOOL role.usage.updated Planned
Aggregate usage metrics for the org changed (rolled up every 60s).
Not emitted to webhook endpoints yet.
{ "start": ISO, "end": ISO }.{ "chat_messages": number, "voice_seconds": number, "knowledge_chunks": number }.subscription.updated Planned
Plan change, payment method update, cancel, or resume.
Not emitted to webhook endpoints yet.
active, past_due, canceled, paused.e.g.
growth.knowledge_store.updated Planned
A document finished processing (chunked + embedded + indexed).
Today this fires only as an in-app real-time (SSE) signal (named
knowledge.store.updated). It is not yet delivered to webhook endpoints.UPSERTED, FAILED.Delivery semantics
- At-least-once. Always idempotent on the top-level
id. - Order is not guaranteed. Use
createdAtif you need to sort. - Retries: exponential backoff up to 24h. After 24h the event is dead-lettered (visible in the dashboard).
- Timeout: your endpoint must respond
2xxwithin 15 seconds.