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”.
string
The session id (UUID). Use as idempotency key.
string
Constant:
"session.created".enum
VOICE, CHAT.enum
PHONE, WEB, WHATSAPP.enum
INBOUND, OUTBOUND.enum
Session state at emission (
OPEN for session.created).string
The agent id (UUID).
string
RFC 3339 UTC timestamp.
object
Channel and session metadata. Includes
customerPhoneNumber, roomName, and sessionVariables — see below.object
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.
string
The session id (UUID). Same as in
session.created.string
Constant:
"session.ended".enum
CLOSED.string
Session start time.
string
Most recent activity timestamp.
string
When the session closed.
object
Same shape as
session.created. metadata.sessionVariables is echoed verbatim.string
One-paragraph summary of the call.
object
Best-fit intent classification —
conversation.intent, confidence, explanation. Present only when Intent Recognition is enabled on the agent.object
classification (RESOLVED / PARTIALLY_RESOLVED / UNRESOLVED / NOT_APPLICABLE), confidenceScore, satisfiedChecklistItems, evidence, explanation. Present only when Resolution Analysis is enabled.object
conversation.sentiment (POSITIVE / NEUTRAL / NEGATIVE), score (-1.0 to +1.0), detectedLanguage. Present only when Sentiment is enabled.object
Map of
{ <fieldName>: <value> } for every field defined in the agent’s Data Extraction schema.string
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.
string
Session id (UUID).
string
Constant:
"session.updated".string[]
Which fields changed (e.g.
["state", "intelligence"]).enum
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.string
string
The message id (
msg_…).enum
USER, ASSISTANT, TOOL, SYSTEM.string
The text content (may be empty for tool calls).
object
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.
object
{ "start": ISO, "end": ISO }.object
{ "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.
string
enum
active, past_due, canceled, paused.string
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.string
string
enum
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.