List a call's recordings and transcripts
/v1/voice/calls/{call_id}/recordingsconst inventory = await bird.voice.calls.recordings.list("vcs_01krdgeqcxet5s7t44vh8rt9mg");
for (const recording of inventory.recordings) {
console.log(recording.leg_id, recording.id);
}inventory = client.voice.calls.recordings.list("vcs_01krdgeqcxet5s7t44vh8rt9mg")
for recording in inventory.recordings:
print(recording.leg_id, recording.id)inventory, err := client.Voice.Calls.Recordings.List(context.Background(), "vcs_01krdgeqcxet5s7t44vh8rt9mg")
if err != nil {
log.Fatal(err)
}
for _, recording := range inventory.Recordings {
fmt.Println(recording.LegId, recording.Id)
}$inventory = $bird->voice->calls->recordings->list('vcs_01krdgeqcxet5s7t44vh8rt9mg');
foreach ($inventory->getRecordings() ?? [] as $recording) {
echo $recording->getLegId(), ' ', $recording->getId(), PHP_EOL;
}bird voice calls recordings list <call-id>curl -X GET "https://us1.platform.bird.com/v1/voice/calls/{call_id}/recordings" \
-H "Authorization: Bearer $TOKEN"{
"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.
Parâmetros
call_idstringThe call to read. Every leg carries its call's ID as call_id.
Payload de resposta
mediaThe stored audio this read covers, each stream once.
Mostrar atributos secundários
media.idUnique identifier for this stream.
media.leg_idThe leg this stream was captured from.
media.call_idnull on a stream captured before calls existed, which only its leg addresses.
media.codecCodec of the stored payload.
media.stateWhat became of this stored audio.
open while capture is still running. available once the bytes are
stored. failed when capture did not produce any. purged is reserved for
future use. Recordings are removed from the response after their retention
period.
Possible values: open, available, failed, purged
media.offset_msLength of the announcement that played before capture started. Zero when nothing was announced. It is not a position on a call clock.
media.audio_msLength of the payload itself. This runs shorter than ended_at - started_at by the silence before the first packet, so use it for anything about the sound and the window for anything about the leg.
media.source_partyThe 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.
Mostrar atributos secundários
media.source_party.endpointWhat 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.
Mostrar atributos secundários
media.source_party.endpoint.typeWhat 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
media.source_party.endpoint.sipThe registered contact of a sip endpoint. Absent when the observation recorded none, and on every other kind of endpoint.
media.source_party.endpoint.bridge_pstnWhere the platform placed the leg onward, on a bridge_pstn endpoint. Absent on every other kind of endpoint.
media.source_party.endpoint.bridge_sipThe trunk the platform delivered the leg onward to, on a bridge_sip endpoint. Absent on every other kind of endpoint.
media.source_party.addressThis 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.
media.source_party.overdial_suffixDigits dialled after this party's number, including leading zeroes. Absent when no overdial was received.
media.source_party.trunk_idThe workspace trunk on this side of the leg. null when this side sat behind no trunk.
media.source_party.user_idThe 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.
media.started_atWhen capture started, which is after any announcement rather than at the answer.
media.ended_atWhen capture ended, or null while capture is open or its end is unknown.
transcriptsEvery transcription attempt over that audio, including failed ones.
truncatedWhether 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_atThe 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.
Recursos relacionados
Continue com a documentação, guias e exemplos sobre este tópico.