---
title: "Get call transcript turns"
method: GET
path: "/v1/calls/{call_id}/transcript"
---

# Get call transcript turns

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

## Request

- Base URL: `https://api.skysay.ai`
- URL: `https://api.skysay.ai/v1/calls/{call_id}/transcript`
- Auth: none declared

Read one bounded original/translation timeline page with canonical IDs, source_revision, unchanged recording anchors, missing-caption events and pagination {limit, returned, has_more, next_cursor}. Follow next_cursor while has_more. Oversized source units return explicit unavailable placeholders so later events remain reachable. Cursors bind the source revision; refresh after a changed source. A selected translation language only reads a cached artifact and never creates work.

## Path parameters

- `call_id` string, required

## Query parameters

- `translation_language` string
- `limit` integer
- `cursor` string

## Response `200`

One bounded, revision-consistent transcript page.

- CallTranscriptPage
  - `call_id` string, required
  - `events` object[], required
    - `speaker` 'caller', required
    - `start_ms` integer, required
    - `type` 'caller_spoke_no_transcript', required
  - `pagination` TranscriptPagination, required
    - `has_more` boolean, required
    - `limit` integer, required
    - `next_cursor` string, nullable, required
    - `returned` integer, required
  - `source_revision` integer, required
  - `text` string, required
  - `timeline` TranscriptTimelineItem[], required
    - union
      - object
        - `data` TranscriptTurn, required
          - `audio_artifact_id` string, nullable
          - `call_id` string
          - `confidence` number, nullable
          - `created_at` string
          - `end_ms` integer, nullable
          - `id` string, required
          - `metadata` object, required
          - `organization_id` string
          - `project_id` string
          - `sequence` integer, required
          - `speaker` string, required
          - `start_ms` integer, nullable
          - `text` string, nullable, required: Original text; null with unavailable_reason for an oversized unit.
          - `translated_text` string, nullable: Cached text for this exact original ID and revision; null when unavailable.
          - `translation_status` 'not_requested' | 'queued' | 'running' | 'ready' | 'waiting_funds' | 'failed' | 'stale'
          - `unavailable_reason` 'source_unit_too_large'
        - `type` 'turn', required
      - object
        - `data` object, required
          - `speaker` 'caller', required
          - `start_ms` integer, required
        - `type` 'caller_spoke_no_transcript', required
  - `transcript_settled` boolean, required
  - `transcript_status` string, required
  - `translation` CommunicationTranslation, required
    - `catalog` object, required
      - `max_targets` 6, required
      - `supported_target_languages` string[], required
      - `tariff` object, required
        - `currency` 'USD'
        - `minimum_per_source_target` 0.01
        - `rate_per_1000_words` 0.02
        - `word_count_rule` string
    - `eligible` boolean, required
    - `pagination` object: Selected call translation units follow the original transcript timeline's pages.
      - `has_more` boolean
      - `limit` integer
      - `next_cursor` string, nullable
      - `returned` integer
    - `quote` object: Pre-inference upper bound using all original words. Language detection can reduce the settled price. Absent for unavailable or unquoted summary sources.
      - `currency` string
      - `max_eligible_words` integer
      - `maximum_amount_minor` integer
    - `quote_pending` boolean: The settled source is waiting for its current-revision word-count summary. Poll this pure read; quote is absent until ready.
    - `source_completeness` 'complete' | 'partial' | 'unavailable': Partial indicates interrupted artifact delivery or unsettled source data; any available original text remains readable.
    - `source_id` string, required
    - `source_kind` 'call' | 'message', required
    - `source_revision` integer, required
    - `source_status` 'not_settled' | 'unavailable' | 'empty' | 'unit_too_large' | 'too_large' | 'available', required
    - `translations` object[], required
      - `amount_minor` integer
      - `currency` string
      - `eligible_words` integer
      - `id` string
      - `reason` string
      - `source_revision` integer
      - `status` 'not_requested' | 'queued' | 'running' | 'ready' | 'waiting_funds' | 'failed' | 'stale'
      - `target_language` string
      - `units` object[]
        - `id` string, required: The immutable original turn or message id.
        - `text` string, required
  - `turns` TranscriptTurn[], required
    - `audio_artifact_id` string, nullable
    - `call_id` string
    - `confidence` number, nullable
    - `created_at` string
    - `end_ms` integer, nullable
    - `id` string, required
    - `metadata` object, required
    - `organization_id` string
    - `project_id` string
    - `sequence` integer, required
    - `speaker` string, required
    - `start_ms` integer, nullable
    - `text` string, nullable, required: Original text; null with unavailable_reason for an oversized unit.
    - `translated_text` string, nullable: Cached text for this exact original ID and revision; null when unavailable.
    - `translation_status` 'not_requested' | 'queued' | 'running' | 'ready' | 'waiting_funds' | 'failed' | 'stale'
    - `unavailable_reason` 'source_unit_too_large'

## Other responses

- `409`: Source revision changed; restart pagination from the first page.

---

[API](https://skmtc.dev/skysay/apis/skysay-api.md) · [All operations](https://skmtc.dev/skysay/apis/skysay-api/llms.txt) · [OpenAPI document](https://skmtc.dev/skysay/apis/skysay-api/revisions/148c7e111260?raw)
