Envelope
Every event has the same outer shape:Event types
GET /v1/webhooks/event-types returns {"all": [...], "live": [...]}: all is every subscribable type. live currently omits session.queued and session.in_progress, which are nonetheless delivered.
For one call, events are dispatched in this order: session.queued (single outbound only), session.started and session.in_progress, recording.ready, session.completed. Each is a separate request, so do not rely on arrival order.
conversation.item.status
One event per move of an outbound channel message’sdelivery_status. Receipts
arrive out of order and repeat, but a message only ever moves forward, so you
get each status at most once.
conversation.attachment.received
One event per file a person sent, as soon as it is stored. A document arrives withstatus: "pending"; the event is not sent again once the agent reads it.
The
url lives one hour, because this payload lands in logs. For a fresh one, call
GET /v1/attachments/{attachment_id}.
session.queued
session.started
A chat sends it once, when its first message arrives, not onPOST /v1/chats.
If you subscribe to everything you receive both
session.started and session.in_progress for every phone call; count one of them.
session.refused
Sent once for every inbound session refused at the door: the workspace is out of credits, the caller’s number is unreadable, calling is off on the WhatsApp number, the agent is unpublished, the same call arrived twice, or your inbound webhook did not answer. A WhatsApp or Telegram chat is refused only by the inbound webhook; a chat message turned away for credits or an unpublished agent sends no event. Neithersession.started nor session.completed follows.
recording.ready
Sent once audio is in storage, beforesession.completed. Not sent for a call with no stored audio.
session.completed
The end-of-session report and the only event carrying the outcome. It is built from the stored session, so it matchesGET /v1/calls/{session_id}.
- A call sends it once, after finalize, recording, analysis and billing.
- A chat sends it once, when the chat ends (the agent’s
end_call,POST /v1/chats/{chat_id}/end, or replacement by a newer chat). A chat nobody ends never sends it; a chat that ended with no messages sends neither this norsession.started. - A session whose worker died before ending sends none. Reconcile from
GET /v1/callswithstart/end.
transcript rows
cost
How to read it is on costs.
transfer
There is no separate transfer event: a transfer ends the session, so
session.completed follows immediately.
recording and screen_recording
Fetch a link with
GET /v1/calls/{session_id}/recording; see recordings.