---
title: "Get a transcription job"
method: GET
path: "/v2/transcriptions/{id}"
tags: ["Transcriptions"]
---

# Get a transcription job

`GET /v2/transcriptions/{id}`

## Request

- Base URL: `https://api.sync.so`
- URL: `https://api.sync.so/v2/transcriptions/{id}`
- Auth: API key in header `x-api-key`

Returns the job status and, once `status` is `COMPLETED`, the word-level transcript. `COMPLETED` and `FAILED` are terminal; `error.code` says why a job failed.

## Path parameters

- `id` string, required

## Response `200`

- TranscriptionJobDto
  - `id` string, uuid, required: Job id. Poll GET /v2/transcriptions/{id} with it.
  - `revision` string: Content hash of the source and transcript this job produced. Present once the job has a transcript.
  - `status` 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'FAILED', required: Job status. `COMPLETED` and `FAILED` are terminal.
  - `sourceVideoUrl` string, nullable, required: The source video the job was created from. Null for jobs created from `sourceAudioUrl`.
  - `sourceStartMs` integer, required: Start of the transcribed window, in source milliseconds.
  - `sourceEndMs` integer, nullable, required: End of the transcribed window, in source milliseconds. Null when the job transcribes to the end of the source.
  - `transcript` object, nullable, required: Word-level transcript. Word timings are in milliseconds from the start of the source video, not the window. Null until `status` is `COMPLETED`.
    - `segments` object[], required
      - `id` string, required
      - `words` object[], required
        - `id` string, required
        - `text` string, required
        - `speakerId` string, nullable
        - `startMs` integer, required
        - `endMs` integer, required
    - `speakers` object[]
      - `id` string, required
      - `displayOrder` integer, required
      - `label` string, required
      - `providerSpeakerId` string
    - `speakerCount` integer, required
  - `speakerCount` integer, nullable, required: Number of distinct speakers detected. Dialogue edits currently support a single speaker; a count above 1 completes the job but a dialogue edit of that source is unsupported. Null until `status` is `COMPLETED`.
  - `difficulty` object, nullable, required: Informational estimate of how hard the source is to edit cleanly, with the reasons behind it. Null while the job is running and for some older jobs. Do not gate behaviour on it.
    - `tier` 'green' | 'yellow' | 'red', required
    - `reasons` string[], required
  - `error` object, nullable, required: Why the job failed. Null unless `status` is `FAILED`.
    - `code` 'NO_AUDIO' | 'NO_AUDIO_TRACK' | 'SOURCE_TOO_LONG' | 'EXTRACTION_FAILED' | 'PROVIDER_FAILED' | 'TIMEOUT' | 'UNKNOWN', required: Machine-readable failure code. `NO_AUDIO`, `NO_AUDIO_TRACK` and `SOURCE_TOO_LONG` describe the source and will not succeed on retry.
    - `message` string, required: Human-readable summary of the failure.
  - `createdAt` string, date-time, required
  - `startedAt` string, date-time, nullable, required
  - `finishedAt` string, date-time, nullable, required

## Other responses

- `404`: Transcription job not found

## Changes

- **2026-10-14** `731f968d8555`: 3 info
  - added the optional property `revision` to the response with the `200` status
  - added the optional property `transcript/anyOf[subschema #1]/segments/items/words/items/speakerId` to the response with the `200` status
  - added the optional property `transcript/anyOf[subschema #1]/speakers` to the response with the `200` status
- …earlier changes not shown

[Operation history](https://skmtc.dev/sync/apis/sync-api-v2/changes/v2/transcriptions/:id/get.md)

---

[API](https://skmtc.dev/sync/apis/sync-api-v2.md) - [All operations](https://skmtc.dev/sync/apis/sync-api-v2/llms.txt) - [OpenAPI document](https://skmtc.dev/sync/apis/sync-api-v2/revisions/26662c96c138?raw)
