Skip to main content
Every delivery has the same envelope; only type and data change:
Subscribe to exact types, to a wildcard such as call.*, or to *. Payloads may gain new fields over time, so ignore fields you don’t recognise. The live list, with a JSON Schema for each event, is at GET /v1/webhooks/event-types, and every event has its own page with its payload schema in the API reference. Content fields are left out unless the endpoint has include_content: true. They’re marked below.

Calls

These four share one shape. revision goes up with every change, so you can ignore an older event that arrives late. Content: from_number, to_number.
call.ended
call.ringing adds ringing_at; call.answered adds answered_at; call.ended adds terminal_reason, ring_ms, talk_ms, total_ms and ended_at. channel is phone or web.
call.transcript.ready
call.recording.ready
Then fetch them with GET /v1/calls/{call_id}/transcript and …/recording.
Content: summary.
disposition is one of the agent’s analysis.dispositionLabels. callback_at is set when the caller asked to be called back; a proposed scheduled call is created for it.
call.transfer.completed
call.transfer.failed carries error (for example no_answer) instead of transferred_at. billed_by is kallabot or customer_carrier (your own carrier carried the transferred part).
mode is listen, takeover or phone_takeover.

Tools

tool.called
kind is api, mcp_server, google_sheets or a built-in. On a chat, conversation_id is set instead of call_id.

Conversations

Chats on WhatsApp, Messenger, Instagram and web chat. channel is whatsapp, messenger, instagram or web_chat. conversation_id is the thread and stays the same across visits; session_id is one sitting.
author is contact, agent, human (a teammate), business_app (sent from the WhatsApp Business app) or system.

Numbers

stage is the simple view: draft, waiting, approved, fix, rules_changed, update, updating or hidden.
item is signed_calls, caller_name or spam_check.

Agents

agent.published
agent.updated may include changed_paths, JSON Pointers to what changed.

Knowledge

knowledge.source.failed

Webhooks

webhook.test

Old names

These older names are still accepted when subscribing and map to the new ones: call.completed → call.ended, transfer.requested → call.transfer.requested, transfer.completed → call.transfer.completed, transfer.failed → call.transfer.failed.
The catalogue also reserves number.suspended, number.payment_failed and billing.balance.low. They aren’t sent yet, and GET /v1/webhooks/event-types marks them available: false. A * or number.* subscription will receive them once they ship.