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

# Retrieve call results

> Poll independent summary and transcript resources, then page one immutable transcript revision.

## Before you start

Use a server-side API key with `calls:read` to retrieve summaries and
`transcripts:read` to retrieve transcripts. Grant both scopes only when the
integration needs both resources. Existing keys do not gain transcript access
automatically.

## Poll the summary

Call `GET /calls/{call_id}/summary`. A normal unfinished result is HTTP 200
with `status: "processing"` and `poll_after_seconds: 5`. Stop polling when the
status is `ready`, `unavailable`, or `failed`.

<CodeGroup>
  ```curl theme={null}
  curl --request GET 'https://api.brightalk.ai/calls/11111111-1111-4111-8111-111111111111/summary' \
    --header "Authorization: Bearer $BRIGHTALK_API_KEY" \
    --header "Brightalk-Version: 2026-07-16"
  ```

  ```javascript theme={null}
  const response = await fetch("https://api.brightalk.ai/calls/11111111-1111-4111-8111-111111111111/summary", {
    method: "GET",
    headers: {
      Authorization: `Bearer ${process.env.BRIGHTALK_API_KEY}`,
      "Brightalk-Version": "2026-07-16",
    },
  });
  console.log(response.status, await response.json());
  ```

  ```python theme={null}
  import os
  import requests

  response = requests.request(
      "GET",
      "https://api.brightalk.ai/calls/11111111-1111-4111-8111-111111111111/summary",
      headers={
      "Authorization": f"Bearer {os.environ['BRIGHTALK_API_KEY']}",
      "Brightalk-Version": "2026-07-16",
      },
  )
  print(response.status_code, response.json())
  ```
</CodeGroup>

## Poll the transcript

Call `GET /calls/{call_id}/transcript?limit=100`. Summary and transcript
readiness are independent, so do not infer one from the other.

<CodeGroup>
  ```curl theme={null}
  curl --request GET 'https://api.brightalk.ai/calls/11111111-1111-4111-8111-111111111111/transcript?limit=100' \
    --header "Authorization: Bearer $BRIGHTALK_API_KEY" \
    --header "Brightalk-Version: 2026-07-16"
  ```

  ```javascript theme={null}
  const response = await fetch("https://api.brightalk.ai/calls/11111111-1111-4111-8111-111111111111/transcript?limit=100", {
    method: "GET",
    headers: {
      Authorization: `Bearer ${process.env.BRIGHTALK_API_KEY}`,
      "Brightalk-Version": "2026-07-16",
    },
  });
  console.log(response.status, await response.json());
  ```

  ```python theme={null}
  import os
  import requests

  response = requests.request(
      "GET",
      "https://api.brightalk.ai/calls/11111111-1111-4111-8111-111111111111/transcript?limit=100",
      headers={
      "Authorization": f"Bearer {os.environ['BRIGHTALK_API_KEY']}",
      "Brightalk-Version": "2026-07-16",
      },
  )
  print(response.status_code, response.json())
  ```
</CodeGroup>

## Follow the cursor

When `next_cursor` is non-null, send it unchanged on the next request. The
cursor pins the transcript revision. A later reconciliation can publish a new
revision without changing pages already in progress. A page can contain fewer
turns than `limit` to stay within the response byte budget, so only a null
`next_cursor` means pagination is complete.

## Detect content changes

Store `call_id`, endpoint name, and `revision`. A higher revision means the
sanitized endpoint content changed. Repeating a projection with identical
content does not increment the revision.

## Handle terminal states

`unavailable` means the call cannot produce that result; inspect its stable
reason. `failed` with `processing_failed` means safe processing was exhausted.
Neither is an HTTP error.
