---
title: "Read a transcript"
method: GET
path: "/v1/transcriptions/{uuid}"
tags: ["Audio"]
---

# Read a transcript

`GET /v1/transcriptions/{uuid}`

## Request

- Base URL: `https://contentmaschine.ai/api`
- URL: `https://contentmaschine.ai/api/v1/transcriptions/{uuid}`
- Auth: one of:
  - HTTP bearer
  - OAuth 2 (authorization code, authorization URL `https://contentmaschine.ai/api/oauth/authorize`, token URL `https://contentmaschine.ai/api/oauth/token`)

**Requires `text:read`, NOT `audio:read`** (D-15-07 / D-08). A transcript is text, so
it lives in the `text` container even though it was produced from audio. The route
that CREATED it requires `audio:write`. This asymmetry is intentional and must not be
"fixed": a complete transcription workflow legitimately needs both scopes.

`transcript` is null until `status` is `completed`. A uuid belonging to another
account answers 404, identical to an unknown uuid - there is no source-based
exemption on this route.

## Path parameters

- `uuid` string, uuid, required

## Response `200`

The transcription record.

- object
  - `success` boolean
  - `data` object
    - `uuid` string, uuid
    - `title` string, nullable
    - `status` string: completed | processing | failed | pending
    - `source` string, nullable
    - `original_filename` string, nullable
    - `refinement_type` 'raw' | 'refined' | 'summary' | 'conclusions' | 'devils_advocate' | 'action_points', nullable
    - `transcript` string, nullable: null until status is completed.
    - `refined_content` string, nullable
    - `audio_duration_seconds` integer, nullable
    - `file_size_bytes` integer, nullable
    - `credits_charged` number, float, nullable
    - `created_at` string, date-time, nullable
    - `updated_at` string, date-time, nullable
    - `segments` object[]: Sentence or utterance timing, empty for older transcripts. speaker (0-based) only with speaker separation.
      - `start_ms` integer
      - `end_ms` integer
      - `text` string
      - `speaker` integer
    - `words` object[], nullable: Word timing when the provider returned it, else null.
      - `start_ms` integer
      - `end_ms` integer
      - `text` string
      - `speaker` integer
  - `timestamp` string, date-time

## Other responses

- `401`: Missing or invalid API key.
- `403`: The token does not hold text:read.
- `404`: Unknown transcription, or not yours.
- `default`: Any other error. Every failure this API emits uses the same envelope; branch on `error.type`, never on `error.message`, and quote `error.correlation_id` to support.

---

[API](https://skmtc.dev/contentmaschine/apis/contentmaschine-ai-api.md) · [All operations](https://skmtc.dev/contentmaschine/apis/contentmaschine-ai-api/llms.txt) · [OpenAPI document](https://skmtc.dev/contentmaschine/apis/contentmaschine-ai-api/revisions/28c74f46051c?raw)
