Skip to main content
Simple webhooks send the complete call payload as JSON in the body of a POST request (Content-Type: application/json, signed in the X-Signature header). Advanced webhooks use the same data as the source for their templates. This page documents every field. You can fetch the same payload for any past call with GET /agents/{agentId}/calls/{callId}/webhook-payload.
New fields may be added at any time. Ignore fields you don’t recognize instead of rejecting the request. Fields with no value may be null or omitted.

Example

webhook.json

Examples by event

Every delivery uses the same structure. What changes is how much of it is filled in: events that fire before post-call analysis carry the identifiers, the contact, and the live status, but no outcome yet.
Sent before the conversation is analyzed. transcript, events, and conversationFlow are empty, and outcome fields are absent or null. On DIALING the callStatus is NEW; on CONNECTED it’s IN_PROGRESS.

Which fields are filled on which events

Need the outcome? Subscribe to a POST_PROCESSING_FINISHED:* event or CALL_FINISHED, not HANG_UP.

Field reference

Identifiers and context

string
Call ID. Use it with the call endpoints, and with webhookEvent as a deduplication key.
string
Call session ID. Used by the warm-transfer summary endpoint.
string
The event that triggered this delivery, for example CALL_FINISHED. See Webhook events.
string
When the call was created (ISO 8601, UTC).
boolean
true if this is an inbound agent.
boolean
true for test calls placed from the dashboard (no contact attached). Filter these out in production.
object
The agent that handled the call. Named campaign for backward compatibility.
object
The account (or subaccount) the agent belongs to.
string
Account ID (same as account.id).

Phone numbers and contact

string
The calling number.
string
The called number.
string
Same value as phoneFrom.
string
Same value as phoneTo.
object
The contact called.

Status and outcome

string
The call’s overall result in one field. It’s the first that applies of:
  1. The call status while the call isn’t completed: NEW, IN_PROGRESS, BUSY, NO_ANSWER, VOICE_MAIL, FAILED.
  2. COMPLETED for completed calls that didn’t count as a real conversation (for example, silence or an immediate hang-up).
  3. The post-call outcome once analysis is done: INTERESTED, NOT_INTERESTED, CALL_ME_LATER, WRONG_NUMBER, DO_NOT_CALL.
  4. The hang-up reason (see hangUpReason) for a completed call that hasn’t been analyzed yet.
string
Telephony status: NEW, IN_PROGRESS, COMPLETED (answered and ended), NO_ANSWER, BUSY, VOICE_MAIL, FAILED, DO_NOT_CALL_REGISTRY_MATCHED (number found on a Do Not Call registry, not dialed), or ANALYZING.
string
Outcome from post-call analysis: INTERESTED, NOT_INTERESTED, CALL_ME_LATER, WRONG_NUMBER, DO_NOT_CALL, or null if not analyzed (yet).
object
What the contact asked for.
object
The success criterion that matched.
object
deprecated
Legacy version of successCriteria, kept for older integrations. description is the criterion description and reached mirrors successCriteria.goalReached.

Hang-up reasons

string
Why the call ended:

Durations and recording

number
Seconds the contact spent with the AI agent.
number
Total call length in seconds, including any transferred part.
string
Recording link, when recording is on and the recording is ready. Most complete on CALL_FINISHED. Links can expire; get a fresh one with GET /agents/{agentId}/calls/{callId}/recording.

Conversation

object[]
The conversation, in order. Each item has role (assistant for the agent, user for the contact) and content.
string[]
Titles of the script blocks the conversation passed through, in order.
object[]
Actions that happened during the call. Each item has a type and data:Other event types are included with data: null.
object
Present when a meeting was booked: { "meetingUrl": "…" }.
object
Details of a call transfer, when the call was forwarded.

Post-call analysis

object
Answers to the agent’s key questions, keyed by question name. Each entry has:Read an answer with summary["Question name"].value.
object
Values the AI extracted for variables used in your webhooks and actions, keyed by variable name. Each entry has value, and may include type and description.
object[]
Questions the contact asked that the agent couldn’t answer: question and optional context. Useful for improving your knowledge base.
object[]
Commitments the agent made during the call: commitment, commitmentType (a short free-text category such as email, call, or follow-up), and optional context.

Provider details

object
Telephony identifiers. accountSid is the Twilio account SID for calls placed through Twilio; callSessionId is the call session ID.

Agent configuration fields

The payload also includes the agent’s legacy notification settings: webhookUrl, webhooks, webhookEvents, webhookStatuses, slackUrl, slackEvents, and webhookTriggerEvents. They describe configuration, not the call, and may be removed in the future. Don’t build logic on them; use webhookEvent to know why you received a delivery.

Text and Email payloads

Webhooks for Text and Email agents share the identifiers (id, campaign, account, organizationId, createdAt, summary, unansweredQuestions, promisedActions), with conversation-specific fields:

Common tasks

Webhook events

When each event fires.

Advanced webhooks

Send only the fields you need, in your format.

Statuses and outcomes

How statuses are assigned.

Post-call analysis

Configure the questions behind summary.