Skip to main content

AccountAITranscription

Fires when a call's transcription and summary have finished processing — after the call has ended, not when it ends. Requires AI transcription to be enabled on the account.

Payload

{
"id": 41882,
"callId": "1754489201.884213",
"bridgedCallId": "1754489288.884219",
"agentFirstName": "Dana",
"agentLastName": "Spencer",
"agentEmail": "dana@acme.example",
"direction": "inbound",
"callerType": "external",
"calledType": "user",
"callerNumber": "13475550123",
"calledNumber": "204",
"callerIdInternal": "204",
"externalCallerId": "12125550188",
"callerNameInternal": "Dana Spencer",
"externalCallerName": "Acme Inc",
"startTime": "2026-08-11T13:20:01Z",
"endTime": "2026-08-11T13:23:59Z",
"language": "en",
"transcription": [
{"start": 0.5, "end": 3.2, "speaker": 0, "text": "Thanks for calling Acme, this is Dana."},
{"start": 3.6, "end": 8.1, "speaker": 1, "text": "Hi Dana — can we move Tuesday's visit to nine?"}
],
"summarizationData": {
"summary": "Caller rescheduled a site visit from Tuesday 10am to 9am.",
"sentiment": "positive"
},
"webhookType": "AccountAITranscription"
}
FieldTypeDescription
idintegerThe transcription id. Use it to deduplicate.
callIdstringThe call — matches call history and the recordings endpoint.
bridgedCallIdstringThe call this one was bridged from, if it was transferred.
agentFirstName / agentLastName / agentEmailstringThe agent on the call.
directionstringinbound or outbound.
callerType / calledTypestringWhat kind of party each end was.
callerNumber / calledNumberstringThe two ends.
callerIdInternal / externalCallerIdstringInternal extension and external number presented.
callerNameInternal / externalCallerNamestringThe corresponding names.
startTime / endTimestringRFC 3339 UTC — the call's span, not the transcription job's.
languagestringDetected language of the audio.
transcriptionarrayThe segments — see below. Absent when there is no transcript.
summarizationDataobjectAI summary. Absent when summarization did not run. Shape varies.
webhookTypestringAlways AccountAITranscription.

transcription[]

FieldTypeDescription
startnumberSeconds from the start of the audio. Fractional.
endnumberSeconds from the start of the audio. Fractional.
speakerintegerDiarization index — 0, 1, …
textstringWhat was said.

:::caution speaker is an index, not an identity 0 and 1 distinguish voices; they do not tell you which is the agent and which is the caller, and the mapping is not stable between calls. Infer it from context — who speaks first, or match against the agent fields — and do not hardcode speaker: 0 as the agent. :::

summarizationData has no fixed schema

Its keys come from the summarization model and change as that model does. Store the whole object as JSON rather than a column per key. Internal-only scoring fields are stripped before delivery; the rest are camelCased.

Timing

This arrives after the call's AccountEndedCalls event — transcription runs on the recording, which is written after hangup. The delay depends on call length and queue depth, and for a call that was not recorded it never arrives at all.

Gotchas

  • Not every call gets one. Transcription is opt-in and depends on recording being on. Silence is normal.
  • transcription is absent, not [], when there is no transcript. Same for summarizationData.
  • Transcript text carries the same privacy weight as the audio — and it lands on an unverified webhook endpoint.