Skip to main content
WEBHOOK

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

The payload carries two kinds of analysis, and their shapes differ. call_analysis holds telli’s built-in analysis. Every entry has a boolean value; entries that support supporting detail also carry details:
call_outcome holds the custom analysis fields you configure in telli. 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, and error when extraction failed.

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.