GET /calls/{id} (scope calls.view).
To find call IDs, list calls with GET /calls?campaignId=…, or take data.finalCall.id from a
lead result.
GET /calls and GET /calls/{id} are part of the workspace API and need a scoped API key.Transcripts
Each transcript turn looks like this:
roleisagent,user(the person called) orsystem.startedAtMs, when present, is the Unix time in milliseconds at which the turn started (not an offset from the start of the call). Subtract the call’sansweredAtto get an offset.
English translation
For a call in another language,POST /calls/{id}/transcript-translation returns an English version:
transcriptTranslation on
GET /calls/{id}. A call with no transcript returns 400 no_transcript. API keys need calls.edit for this
endpoint (see stricter permissions).
Recordings
Download a recording from:302) to a short-lived download link for the audio. Follow the redirect and download
straight away: the link it points to expires after a short time, but the /recordings/{callId} URL itself
never expires. Store the /recordings/{callId} URL or the call ID, not the link it redirects to.
Use
/recordings/{callId} rather than the recordingUrl field of GET /calls/{id}. recordingUrl is a
temporary link that stops working once recordingUrlExpires has passed.When transcripts and recordings become available
A call reaches its final status first; the transcript, summary, recording and extracted fields can arrive afterwards. Analysis waits for the transcript and keeps retrying for several hours if it is late.- If
transcriptisnullorhasRecordingisfalseshortly after a call ended, pollGET /calls/{id}again later. Back off between attempts. - A lead result is created only after the call’s analysis has finished, so by the time you
receive it the transcript is normally available on
GET /calls/{data.finalCall.id}. - Calls that never connected have no transcript or recording.

