Skip to main content
Every call can leave two artifacts: an audio recording (when the Speech Pipe has recording=True) and a turn-by-turn transcript. Both are retrieved through the Management API.

Recordings

from unpod import AsyncClient

client = AsyncClient()

recordings = await client.recordings.list()              # all
recordings = await client.recordings.list(call_id=cid)   # one call
Each Recording carries:
r.recording_id   # str
r.call_id        # str
r.duration_s     # float | None
r.format         # str | None
r.size_bytes     # int | None
r.url            # str | None - download / stream URL
Pause and resume recording during a live call (e.g. around card numbers) with ctx.session.recording.pause(reason=...) / .resume() - see AgentRunner & Sessions.

Transcripts

transcripts = await client.transcripts.list()
t = await client.transcripts.get(call_or_session_id)
A Transcript is a list of turns:
for turn in t.turns:
    print(turn.speaker, turn.text)   # "agent" | "user"
    turn.timestamp_ms                # int | None
    turn.timing                      # per-stage latency, below

Per-turn timing

Each turn carries a TurnTiming breakdown - where the milliseconds went:
FieldStage
audio_ingress_msCaller audio reaching the speech stack
stt_msSpeech-to-text
bridge_to_dev_msBridge hop to your AgentRunner
dev_brain_msYour brain’s response time
tts_msText-to-speech
This is the post-call complement to the live metrics in Observability.