Skip to main content
Yotel records all answered calls by default. Recordings are stored in GCP Cloud Storage and accessed via signed URLs or a streaming proxy. Voice agent calls produce stereo recordings (left channel = caller, right channel = AI).

Get a recording signed URL

Returns a JSON response with a time-limited signed URL and metadata.
curl https://api.yotel.in/api/v1/calls/{call_id}/recording \
  -H "Authorization: Bearer yt_live_YOUR_KEY"
Scope: calls:read  |  Status: 200 OK

Response

{
  "call_id": "call_abc123",
  "url": "https://storage.googleapis.com/yotel-dialer-audio/...",
  "expires_at": "2026-05-25T10:04:48Z",
  "duration_s": 142,
  "stereo": true,
  "format": "audio/wav"
}
FieldTypeDescription
call_idstringCall UUID
urlstringGCS signed URL — expires in 7 days
expires_atstringISO 8601 expiration timestamp
duration_sinteger | nullRecording duration in seconds
stereobooleantrue for voice agent calls (left=caller, right=AI); false for human-only
formatstringMIME type hint, typically "audio/wav"
The signed URL expires after 7 days. For long-lived access, use the audio streaming endpoint below or re-fetch the signed URL.

Stream recording audio

Returns the raw audio bytes directly. Use this for server-side processing pipelines or when you need a stable URL that doesn’t expire.
curl https://api.yotel.in/api/v1/calls/{call_id}/recording/audio \
  -H "Authorization: Bearer yt_live_YOUR_KEY" \
  -o recording.wav
Scope: recordings:download  |  Status: 200 OK Returns audio/wav content type with Cache-Control: private, max-age=300. The response is chunked (64 KiB chunks) for memory efficiency.
The recordings:download scope is separate from calls:read. A key with only calls:read can fetch the signed URL (JSON) but cannot stream the raw audio.

Stereo recordings

When a voice agent handles a call, Yotel records in stereo:
  • Left channel — caller (PSTN audio)
  • Right channel — AI agent (WebSocket audio)
Use the stereo field in the signed URL response to detect this. Stereo recordings enable speaker diarisation without additional processing.

Compliance

Every recording access (both signed URL and stream) is logged to an internal audit table. The log captures the accessor identity, access method, and timestamp for compliance purposes.

Errors

StatusCondition
404Call not found or belongs to another tenant
409Recording not yet available — the upload pipeline is still processing. Wait for the call.recording_ready webhook.