Skip to main content
WEBHOOK
Rejected inbound calls are saved with status rejected, but do not send a call_ended webhook. You can find them through List Calls or in Conversation History.

Call outcome

Three fields describe what happened, and they are the ones to build on:
  • state — where the call is in its lifecycle
  • status — how it ended, once it has ended
  • follow_up — the follow-up telli scheduled, if any
call_status is deprecated and will be removed. Use state, status, and follow_up instead.
The legacy field maps onto the new ones like this: call_status is lossy in both directions: IN_PROGRESS cannot tell in_progress from processing, and COMPLETED and ANSWERED differ only by whether a follow-up was scheduled.

Analysis fields

call_analysis and call_outcome are deprecated and will be removed on 1st of February 2027. Both fields are retained for compatibility until then. Update your integrations to use outcomes before the removal date.
outcomes contains account and agent call outcomes as an array of { key, dataType, value, reason? } entries. dataType is always present. reason is omitted when unavailable. When both sources return the same key, only the agent result is included. Both deprecated fields retain their existing shapes for compatibility until their removal on 1st of February 2027. The deprecated call_analysis field contains legacy extraction results. Every entry has a boolean value; entries that support additional detail also carry details. These results are not included in outcomes:
The deprecated call_outcome field contains legacy agent-specific outcome results. Entries are keyed by field name and carry the extracted value plus the schema it was validated against:
A call_outcome entry may also include reason, explaining why the agent chose that value.

Collected data

When the agent has Collect Data tasks, collected_data reports what was gathered and confirmed during the call:
Only confirmed entries carry a value you should trust. Address entries also include latitude and longitude when address validation produced coordinates; other task types omit these fields. When no Collect Data tasks are configured or none were triggered, collected_data is empty or null — handle both.

Appointments

call.appointments contains bookings recorded during the call, including their start time (starts_at, in UTC), status, hosts, and provider identifiers. It is empty when none were recorded. Failed booking attempts are excluded. booked describes booking creation, not customer confirmation. pending means booking completion or provider confirmation is still required; unknown means the integration reported no status. Later cancellations or rescheduling at the provider are not reflected. call.booked_slot_for is deprecated and remains available for compatibility. Use call.appointments for booking details. Older calls can have call.booked_slot_for set while call.appointments is empty.

Recording

recording_url links to the audio of the call, or is null when recording is disabled or unavailable. The link expires 1 hour after the webhook is sent, so download the recording right away if you need to keep it.

Retry attempts

Automatic retries within one scheduled sequence share a loop_id, and attempt counts up within it. Scheduling the same contact again starts a new loop, so use contact_id to track a contact across sequences.

Body

application/json
event
string
required

Always call_ended.

Allowed value: "call_ended"
call
object
required
contact
object
required

The contact as it stood after the call was processed.

Response

2XX

Acknowledged. Return any 2xx within 15 seconds or the message is retried.