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"
}
| Field | Type | Description |
|---|---|---|
id | integer | The transcription id. Use it to deduplicate. |
callId | string | The call — matches call history and the recordings endpoint. |
bridgedCallId | string | The call this one was bridged from, if it was transferred. |
agentFirstName / agentLastName / agentEmail | string | The agent on the call. |
direction | string | inbound or outbound. |
callerType / calledType | string | What kind of party each end was. |
callerNumber / calledNumber | string | The two ends. |
callerIdInternal / externalCallerId | string | Internal extension and external number presented. |
callerNameInternal / externalCallerName | string | The corresponding names. |
startTime / endTime | string | RFC 3339 UTC — the call's span, not the transcription job's. |
language | string | Detected language of the audio. |
transcription | array | The segments — see below. Absent when there is no transcript. |
summarizationData | object | AI summary. Absent when summarization did not run. Shape varies. |
webhookType | string | Always AccountAITranscription. |
transcription[]
| Field | Type | Description |
|---|---|---|
start | number | Seconds from the start of the audio. Fractional. |
end | number | Seconds from the start of the audio. Fractional. |
speaker | integer | Diarization index — 0, 1, … |
text | string | What 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.
transcriptionis absent, not[], when there is no transcript. Same forsummarizationData.- Transcript text carries the same privacy weight as the audio — and it lands on an unverified webhook endpoint.