call.ended
Emitted when a voice call on one of your Dial numbers wraps up. It’s the terminal snapshot: one event per call, carrying the outcome (status, durationSeconds). To follow a call while it’s happening — ringing, answered — listen for call.status_changed, which streams every lifecycle transition; its Terminated transition coincides with this event. The full call record (status, duration, transcript) is available via GET /api/v1/calls/{id} — the relatedObject.url.
Schema
Shares the common event envelope (id, object, type, version, createdAt, relatedObject). relatedObject is { id: <callId>, type: "call", url: "/api/v1/calls/<callId>" }. The data payload:
Example
When it fires
- Every voice call on one of your Dial numbers, inbound or outbound, emits exactly one
call.endedonce the call reaches its terminal status. - Cancelling a call — via the dashboard’s terminate button or the cancel API — also produces a
call.ended, carryingdata.canceled: true. So adial wait-for call.endedis always released when the call ends, however it ends. - Filter on
direction: "inbound"if you only care about calls to your number — see Receive a voice call for the full flow. - The event tells you the call is done. To read the transcript or other details, fetch the call record after —
data.transcriptAvailablemay befalseat the instant the event fires and finalize a moment later, at which point acall.transcribedevent fires.