Sign inGet Started

List a call's recordings and transcripts

GET
/v1/voice/calls/{call_id}/recordings
const inventory = await bird.voice.calls.recordings.list("vcs_01krdgeqcxet5s7t44vh8rt9mg");
for (const recording of inventory.recordings) {
  console.log(recording.leg_id, recording.id);
}
Response200
{
  "media": [
    {
      "id": "vcm_01krdgeqcxet5s7t44vh8rt9mg",
      "leg_id": "vcl_01krdgeqcxet5s7t44vh8rt9mg",
      "call_id": "vcs_01krdgeqcxet5s7t44vh8rt9mg",
      "codec": "PCMU",
      "state": "available",
      "offset_ms": 0,
      "audio_ms": 1000,
      "started_at": "2026-11-01T12:00:00Z",
      "ended_at": "2026-11-01T12:00:01Z",
      "source_party": {
        "endpoint": {
          "type": "pstn"
        },
        "address": "+14155551234"
      }
    }
  ],
  "recordings": [
    {
      "id": "vrc_01krdgeqcxet5s7t44vh8rt9mg",
      "leg_id": "vcl_01krdgeqcxet5s7t44vh8rt9mg",
      "call_id": "vcs_01krdgeqcxet5s7t44vh8rt9mg",
      "number": "+12025550100",
      "channel": "rx",
      "media_id": "vcm_01krdgeqcxet5s7t44vh8rt9mg",
      "media_started_at": "2026-11-01T12:00:00Z",
      "started_at": "2026-11-01T12:00:00Z",
      "ended_at": "2026-11-01T12:00:01Z"
    }
  ],
  "transcripts": [],
  "truncated": false,
  "evaluated_at": "2026-11-01T12:01:00Z"
}

Returns everything captured across every leg of one call: its stored audio, each leg's view of it, and every transcription attempt over it. A stream heard on several legs appears once in media, with one view per leg in recordings.

Audio streams, their recording views and transcripts leave the API 30 days after the source audio starts. Transcription does not restart that period. Read truncated before presenting the result as complete.

The collections arrive independently. A stream can appear before its recording view, or without a view if delivery fails or the view expires. Download audio with getVoiceLegRecordingAudio, passing the recording view's leg_id and id. The download requires a recording view ID, so a stream cannot be downloaded until its view is available.

A call this workspace never placed, or whose recordings have all expired, answers with empty collections rather than 404.

Parameters

call_idstring

The call to read. Every leg carries its call's ID as call_id.

Response Payload

media
array of object
required

The stored audio this read covers, each stream once.

Show child attributes
recordings
array of object
required

Each leg's view of that audio.

Show child attributes
transcripts
array of object
required

Every transcription attempt over that audio, including failed ones.

Show child attributes
transcripts.id
string
required

Unique identifier for this attempt.

transcripts.leg_id
string
required

The leg the transcribed stream was captured from.

transcripts.call_id
nullable string

null on a transcript of a stream captured before calls existed.

transcripts.media_id
string
required

The stream this attempt describes.

transcripts.media_started_at
string
required

When that stream started. A transcript is retained with the stream it describes rather than on its own transcription lag.

transcripts.state
string
required

Whether the attempt produced a transcript. failed is an outcome, not evidence that a later attempt cannot succeed.

Possible values: available, failed

transcripts.source
string
required

What the times in cues are worth: whole for a pass that times nothing, aligned for offline forced alignment, live for a streaming producer.

Possible values (may grow over time): whole, aligned, live

transcripts.model
string

The model that produced it.

transcripts.channel
string
required

The direction of the transcribed stream.

Possible values: rx, tx

transcripts.cues
array of object
required

The transcript, in order. Concatenating cues across streams reads as prose nobody spoke, and a reader matching over it can match the wrong party's words.

Show child attributes
transcripts.source_party
nullable object

The party this audio was captured from, which is what says whose voice it carries. channel only says which direction of the leg the stream came from. A recording view's number identifies a number associated with that view, which can be an outbound destination.

null on a stream stored before the platform recorded a party for it.

Show child attributes
transcripts.source_party.endpoint
nullable object

What kind of participant sat on this side of a leg, and the coordinate that kind carries: a telephone endpoint off the platform, a SIP or WebRTC endpoint, Bird answering, or the platform placing a leg onward. It does not name a person.

null on an observation this API could not read. The entry stays, because the call counted it when it deduplicated, and dropping it here would report fewer participants than were observed.

Show child attributes
transcripts.source_party.endpoint.type
string
required

What kind of participant sat on this side of a leg. It selects which payload below is present, and most kinds carry none because the party's address is already their coordinate.

Possible values (may grow over time): pstn, sip, voicemail, bridge_pstn, bridge_sip, webhook

transcripts.source_party.endpoint.sip
object

The registered contact of a sip endpoint. Absent when the observation recorded none, and on every other kind of endpoint.

Show child attributes
transcripts.source_party.endpoint.bridge_pstn
object

Where the platform placed the leg onward, on a bridge_pstn endpoint. Absent on every other kind of endpoint.

Show child attributes
transcripts.source_party.endpoint.bridge_sip
object

The trunk the platform delivered the leg onward to, on a bridge_sip endpoint. Absent on every other kind of endpoint.

Show child attributes
transcripts.source_party.address
nullable string

This side's own address, in E.164 or as a sip: URI. null when the observation carried none, which does not say whether one was withheld, missing, or nonexistent.

transcripts.source_party.overdial_suffix
string

Digits dialled after this party's number, including leading zeroes. Absent when no overdial was received.

transcripts.source_party.trunk_id
nullable string

The workspace trunk on this side of the leg. null when this side sat behind no trunk.

transcripts.source_party.user_id
nullable string

The workspace user this side acted for, such as a user's browser, the ring group member whose side a recording captured, or the user who started a sequence call. null for every other participant, including an API key.

transcripts.created_at
string
required
truncated
boolean
required

Whether a collection above was cut at this read's per-collection limit of 500. When true, there is more than is shown here and this response is not the whole set.

false means no collection hit that limit, and a collection that could not be read in full fails the request rather than returning a short answer. What false does not establish is that every recording made has arrived: delivery into this store is asynchronous, so a recording made moments ago can be absent from a complete read.

evaluated_at
string
required

The instant each collection's retention was decided at. Nothing here stays true because you are still holding the response. A recording can expire after it.

Continue with the documentation, guides and examples for this topic.