call.complete webhook fires after every call ends — inbound
telephony, outbound telephony, widget, or mic session. It is
non-blocking: respond with any 2xx status within 30 s. We retry on
non-2xx with exponential backoff for up to 24 hours.
In the endpoint-based delivery system, the
equivalent event types are
telephony.complete (phone calls) and
web.complete (widget / mic). The legacy single-URL webhook uses
call.complete for both. See the events catalog.Request payload
| Field | Type | Description |
|---|---|---|
call_id | integer | Stable across every event for this call |
direction | string | inbound, outbound, mic, widget |
from_number, to_number | string | E.164. from_number is "web" for mic/widget |
start_time, end_time | timestamp | ISO 8601 UTC |
duration_seconds | integer | Derived |
status | string | completed or failed |
end_reason | string | See table below |
product, voice | string | Agent config in effect at call time |
transfer_number | string | null | If end_reason = "transfer" |
recording_url | string | null | Expiring signed URL; download promptly. null for sessions with no recording |
billable_minutes | integer | Rounded-up minutes |
billing_total_cents | integer | USD cents |
transcripts | array | Per-turn transcript — see next section |
End reasons
| Value | Meaning |
|---|---|
caller_hangup | Remote party hung up first |
agent_end | AI ended the call deliberately |
transfer | Call was transferred; transfer_number is set |
timeout | Silence / inactivity timeout |
error | Upstream failure |
Transcript format
| Field | Type | Description |
|---|---|---|
role | string | user, assistant, tool_call, or tool_response |
content_type | string | text/plain for speech; application/json for tools |
content | string | object | |
start_ms, end_ms | integer | Offsets from call start, ms. Tool rows may have equal start/end |
GET /v1/calls/{call_id}/history.
Example handler
Common use cases
CRM integration
Persist each call’s transcript + recording URL alongside your
customer records.
Analytics
Stream transcripts to a pipeline for topic modeling, CSAT signal
extraction, or transfer-rate monitoring.
Quality review
Open calls in a QA tool for human review, or run them through your
own evaluation model.
Notifications
Trigger a human teammate on transfer / timeout / error.
Related
call.incoming
The blocking counterpart that runs at call start.
Events catalog
Other event types you can subscribe to.
Call history API
Same data accessible via REST for backfill / replay.