Skip to main content

UserEndedCalls

Fires when a call finishes, scoped to a user. Same shape as AccountEndedCalls minus the cdrs array — the call's summary, from one person's point of view.

Payload

{
"callId": "1754489201.884213",
"direction": "inbound",
"status": "answered",
"callerType": "external",
"callerName": "ACME ROOFING",
"callerNumber": "13475550123",
"calledType": "user",
"calledName": "Dana Spencer",
"calledNumber": "204",
"dialledNumber": "12125550188",
"startTime": "2026-08-11T13:20:01Z",
"callDuration": 238,
"talkDuration": 220,
"agentOnCall": true,
"webhookType": "UserEndedCalls",
"externalCallerId": "12125550188",
"externalCallerName": "Acme Inc",
"recordingUrl": "https://api.account.telebroad.com/recordings/play/9f2c…"
}
FieldTypeDescription
callIdstringThe call id — matches call history, reports and the recordings endpoint.
directionstringinbound or outbound, from this user's perspective.
statusstringHow the call ended.
callerType / callerName / callerNumberstringThe calling party.
calledType / calledName / calledNumberstringThe called party.
dialledNumberstringWhat was actually dialled.
startTimestringRFC 3339 UTC.
callDurationintegerSeconds, including ringing.
talkDurationintegerSeconds connected.
agentOnCallbooleanWhether an agent was on the call.
externalCallerId / externalCallerNamestringThe external caller ID presented.
recordingUrlstringSigned playback link. Absent when nothing was recorded.
webhookTypestringAlways UserEndedCalls.

Which one should you subscribe to

UseEvent
A company-wide call log, CRM sync, reportingAccountEndedCalls
Per-agent activity, a personal dashboard, "my calls"UserEndedCalls
You need the leg breakdown, transfers, or per-leg recordingsAccountEndedCallscdrs is only there

:::caution Do not subscribe to both and merge them The same call produces both events. A receiver that writes both to one table double-counts every call. Pick one as your source of record. :::

Direction is relative

direction is from this user's perspective. A call transferred from a colleague can read inbound here while the account-level event calls the same call outbound. If you compare against AccountEndedCalls data, compare on callId, not on direction.

Gotchas

  • No cdrs. Use the account event for the leg breakdown.
  • recordingUrl is absent, not empty, when there is no recording.
  • Internal calls fire this too, with both parties on your account.