Cut.ProDocs
Transcriptions

List transcriptions

Returns a paginated list of the workspace's transcription jobs, newest first.

X-Api-Key<token>

In: header

Query Parameters

page?number

Page number (default: 1)

Range1 <= value
limit?number

Items per page (default: 20, max: 100)

Range1 <= value <= 100

Response Body

application/json

GET
/transcriptions
curl -X GET "https://example.com/transcriptions"
{  "transcriptions": [    {      "transcription_id": "string",      "media_id": "string",      "title": "string",      "duration_seconds": 0,      "status": "processing",      "language": "string",      "speaker_labels": true,      "speaker_count": 0,      "credits_charged": 0,      "media_type": "image",      "created_at": "string",      "completed_at": "string"    }  ],  "pagination": {    "current_page": 0,    "total_pages": 0,    "total_count": 0,    "has_next_page": true,    "has_previous_page": true,    "limit": 0  }}

Start an upload POST

Returns the generated `media_id` plus a presigned PUT URL. Upload the raw bytes to `upload_url` with the same `Content-Type` you declared here, then call `POST /transcriptions` with the `media_id` to start the job. Both video and audio files are accepted, so an audio-only podcast never has to be wrapped in a video container. The ceiling is the smaller of your plan's upload limit and the storage quota you still have free; `FILE_TOO_LARGE` reports the effective ceiling in `max_size` and `STORAGE_LIMIT_EXCEEDED` means the quota is full.

Transcribe a media file POST

Starts a transcription for a media file you uploaded via `POST /transcriptions/upload`. Credits are charged per minute of audio, plus a surcharge when `speaker_labels` is requested. Check the balance at `GET /balance` first. Responds `202` with `status: processing` when the ASR worker was dispatched: poll `GET /transcriptions/{transcription_id}` until `status` is `ready` (or `failed` / `no_speech`), then fetch the text. Responds `200` when nothing had to run. That happens when the same audio was already transcribed (the transcript is shared per media, so a re-run is a cache hit and `credits_charged` is `0`), or when the audio is silent, which comes back as `no_speech` and is not billed. Passing a `media_id` that is already in your library re-runs it. That is how a transcript created without diarization is upgraded: ask again with `speaker_labels: true` and the audio is reprocessed, because the speaker column cannot be added after the fact.