---
title: "Get a call's transcript"
canonical: "https://bird.com/docs/api/reference/get-voice-call-transcript"
---

# Get a call's transcript

`GET /v1/voice/calls/{call_id}/transcript`

Returns one transcript for the whole call: the cues of every party's
stream in spoken order, each pointing into `parties` at the party its
stream was captured from.

It is assembled on each read from the call's stored transcripts, one per
stream: the latest whose every cue is timed, otherwise the latest that
succeeded. When a live transcript exists, its cues take precedence; the
selected transcript adds only timed cues that do not overlap them. Timed
cues are placed by `start_at`. A transcript that timed
nothing has `null` times, and its cues are placed at the start of their
stream. A stream whose every transcription failed contributes nothing and
sets `complete` to `false`. A stream where nothing was heard, one that was
never transcribed, or one whose transcript has not arrived yet contributes
no cues and leaves `complete` as it is.

Transcripts leave the API 30 days after the source audio starts. A call this
workspace never placed, or whose
transcripts have all expired, answers with no cues rather than `404`.

## Servers

- `https://{region}.platform.bird.com`: Regional API endpoint. Use the host for the region your organization is hosted in. Official Bird SDKs and the CLI select it automatically from your API key, so you rarely need to set it by hand.
  - `region`: `us1`, `eu1`. Default: `us1`. The region your organization's data is hosted in.

## Authentication

Use one authentication option:

- `BearerAuth`: HTTP bearer authentication. Pass the API key as a bearer token in the `Authorization` header. Workspace
keys use `bk_{region}_*`; organization master keys use `bm_{region}_*`.
The prefix identifies the region and selects the
API endpoint. Official Bird SDKs and the CLI derive the region from the key.

## Code samples

**TypeScript**

```ts
const transcript = await bird.voice.calls.transcript("vcs_01krdgeqcxet5s7t44vh8rt9mg");
for (const cue of transcript.cues) {
  console.log(cue.text);
}
```

Examples: [TypeScript](/docs/api/reference/get-voice-call-transcript.ts.md) · [Python](/docs/api/reference/get-voice-call-transcript.py.md) · [Go](/docs/api/reference/get-voice-call-transcript.go.md) · [PHP](/docs/api/reference/get-voice-call-transcript.php.md) · [CLI](/docs/api/reference/get-voice-call-transcript.cli.md) · [MCP](/docs/api/reference/get-voice-call-transcript.mcp.md) · [cURL](/docs/api/reference/get-voice-call-transcript.curl.md)

## Example response `200`

```json
{
  "call_id": "vcs_01krdgeqcxet5s7t44vh8rt9mg",
  "parties": [
    {
      "endpoint": {
        "type": "pstn"
      },
      "address": "+14155551234"
    }
  ],
  "cues": [
    {
      "party": 0,
      "start_at": "2026-11-01T12:00:00Z",
      "end_at": "2026-11-01T12:00:01Z",
      "text": "Hello."
    }
  ],
  "complete": true,
  "evaluated_at": "2026-11-01T12:01:00Z"
}
```

## Path parameters

- `call_id` (string, required): The call to read. Every leg carries its call's ID as `call_id`.

## Header parameters

- `X-Workspace-Id` (string, optional): Workspace context for the request. Required for dashboard authentication and master keys. Workspace keys and access tokens already identify their workspace; send that workspace or omit the header. A different one is rejected.
- `X-Organization-Id` (string, optional): Organization context for the request. Required for dashboard authentication. An API key or access token carries its own organization, so send either that organization or no header at all; a different one is rejected.

## Response body

- `call_id` (string, required)
- `parties` (array of object, required): Each distinct stored party heard in `cues`, once. A stream with no recorded party adds nothing here; its cues carry a `null` party.
- `parties.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.
- `parties.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`
- `parties.endpoint.sip` (object): The registered contact of a `sip` endpoint. Absent when the observation recorded none, and on every other kind of endpoint.
- `parties.endpoint.sip.contact` (string, required): The address the user agent registered, as a `sip:` or `sips:` URI. It is where the endpoint asked to be reached, which is not always the address that was dialled.
- `parties.endpoint.bridge_pstn` (object): Where the platform placed the leg onward, on a `bridge_pstn` endpoint. Absent on every other kind of endpoint.
- `parties.endpoint.bridge_pstn.forward_to` (string, required): The number the platform placed the leg onward to, in E.164. The party's own `address` is the number that was dialled, so the two together are one hop of the call.
- `parties.endpoint.bridge_pstn.forward_as` (string, required)

  Which number the forwarded leg presented to the far end.

  Possible values: `dialed_number`, `calling_number`
- `parties.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.
- `parties.endpoint.bridge_sip.trunk_id` (string, required): The workspace trunk the leg was delivered onward to. It is distinct from the party's own `trunk_id`, which is the trunk this side itself sat behind.
- `parties.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.
- `parties.overdial_suffix` (string): Digits dialled after this party's number, including leading zeroes. Absent when no overdial was received.
- `parties.trunk_id` (nullable string): The workspace trunk on this side of the leg. `null` when this side sat behind no trunk.
- `parties.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.
- `cues` (array of object, required): Every cue of the call in spoken order. A cue without times sits at the start of its stream.
- `cues.party` (nullable integer, required)

  Index into the transcript's `parties` of the party who spoke this cue,
  the party its stream was captured from. `null` on a stream with no recorded
  party.
- `cues.start_at` (nullable string, required): When this cue began, measured on its stream. `null` on a transcript that timed nothing, whose cues are placed at their stream's start.
- `cues.end_at` (nullable string, required): When this cue ended. `null` on the same terms as `start_at`.
- `cues.text` (string, required): What was transcribed for this cue.
- `complete` (boolean, required)

  `false` when a stream's every transcription failed, or the read was cut
  at its limit. `true` does not mean every stream has cues: a stream where
  nothing was heard, one never transcribed, or one whose transcript has not
  arrived yet contributes none and leaves this `true`.
- `evaluated_at` (string, required): The instant retention was decided at. A transcript can expire after it.

## Related resources

- [Should I use a Bird SDK or call the API directly?](/explained/platform/should-i-use-an-sdk-or-call-the-api-directly) (answer)
- [Build your first integration](/learn/paths/integration) (course)
- [Send your first email](/docs/get-started/send-your-first-email) (docs)

[Get an implementation brief](/learn/workspace?topic=api-basics)
