> ## Documentation Index
> Fetch the complete documentation index at: https://docs.bland.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Get Transcript Stream URL

> Get a short-lived, ready-to-connect WebSocket URL for a call's live post-transfer transcript stream.

## Overview

Returns a short-lived, ready-to-connect WebSocket URL for the call's [post-transfer transcript stream](/api-v1/post/calls-id-transcript-stream). Use this from your backend so browser clients never see your long-lived API key; the returned URL carries only a 5-minute credential scoped to this one call.

The URL is opaque — connect to it exactly as returned. Do not parse it or construct your own.

The URL becomes available when the call is answered (that is when the server handling the call is assigned). Until then this endpoint returns 404 with `CALL_NOT_FOUND` ("Call was either not found or not started" — the same response as [Listen to Active Call](/api-v1/post/calls-id-listen)); poll every second or two after placing the call. Once connected, you can hold the socket through the rest of the call — it parks until the transfer starts.

<Note>
  The post-transfer transcript stream is in limited rollout. If this endpoint returns 403 with `FEATURE_NOT_ENABLED`, it is not yet enabled for your organization.
</Note>

***

## Headers

<ParamField header="authorization" type="string" required>
  Your API key for authentication.
</ParamField>

***

## Path Parameters

<ParamField path="call_id" type="string" required>
  The call whose post-transfer transcript you want to stream. The call must have been created with `include_post_transfer_transcript: true`.
</ParamField>

***

## Body Parameters

This endpoint takes no body. POST an empty body or `{}`.

***

## Response

<ResponseField name="data.url" type="string">
  Opaque WebSocket URL. Connect to it as returned, within 5 minutes.
</ResponseField>

<ResponseField name="data.expires_in_seconds" type="number">
  Lifetime of the URL's embedded credential. Currently `300` (5 minutes). The TTL gates the connection handshake only; an established stream is not closed when it expires.
</ResponseField>

<ResponseField name="errors" type="null | array">
  `null` on success. `401` when the call belongs to a different organization, `403` when the feature is not enabled for your organization, `404` with `CALL_NOT_FOUND` when the call does not exist or has no active transcript stream (not created with `include_post_transfer_transcript`, not yet answered, or already ended).
</ResponseField>

<RequestExample>
  ```bash cURL theme={null}
  curl -X POST "https://api.bland.ai/v1/calls/{call_id}/transcript-stream/token" \
    -H "authorization: YOUR_API_KEY"
  ```
</RequestExample>

<ResponseExample>
  ```json Response theme={null}
  {
    "data": {
      "url": "wss://stream.aws.dc8.bland.ai/ws/transcript-stream/eyJhbGciOiJBMjU2R0NNS1ci...?token=eyJhbGciOiJIUzI1NiIs...",
      "expires_in_seconds": 300
    },
    "errors": null
  }
  ```
</ResponseExample>

***

Docs for agents: [llms.txt](/llms.txt)
