Jobs & transcripts workflows
Async transcription pipeline
Transcription is always asynchronous. Jobs track status and progress; transcripts hold the final text and timings.
POST /v1/jobswithserviceType: transcription— savedata.jobId.- Poll
GET /v1/jobs/{jobId}untilstatusis terminal (completed,failed, orcancelled). New jobs may showpendingbeforequeued; keep polling throughcancellinguntilcancelled. - Optional:
POST /v1/jobs/{jobId}/cancelto stop a job before it finishes. - On success, read
resultSummary.transcriptionIdand fetch viaGET /v1/transcriptions/{transcriptionId}. - Use
GET /v1/transcriptions/{transcriptionId}for export-ready JSON or SRT.
On failed, read error.code (e.g. duration_exceeded, transcript_too_large) and progress[] — see Plans & limits → Job failure codes.
Jobs run extract_audio and denoise_audio by default; separate_vocals only when enabled in platform settings. Progress emits the configured stages — see Jobs for the full stage list.
Which endpoint for which UI
| What you are building | Jobs API | Transcripts & catalog API |
|---|---|---|
| Submit new transcription | POST /v1/jobs | — |
| Progress bar / stage timeline | GET /v1/jobs/{id} → progress[] (incl. preprocessing + chunk stages) | — |
| Show job submit options (language only) | Echo job.input.options from retrieve/list | — |
| Jobs history table | GET /v1/jobs | — |
| Cancel in-flight job | POST /v1/jobs/{id}/cancel | — |
| Transcripts library (previews only) | — | GET /v1/transcriptions |
| Export / clips / captions | — | GET …/transcriptions/{id} or ?format=srt or ?format=vtt |
| Custom transcript editor (load) | — | GET …?include=layers |
| Save one segment edit | — | PATCH …/segments/{segmentId} + revision |
| Save many segment edits | — | PATCH …/segments with updates[] |
| Glossary / revert in editor | — | POST …/glossary/*, POST …/revert/* |
| Index for semantic search | POST /v1/jobs (serviceType: indexer) | — |
| Search indexed speech | — | POST /v1/catalog/search (ai:search) |
| Index inventory / remove from index | — | GET/DELETE /v1/catalog/indexed-transcriptions/… |
Default transcript vs layers
Default GET returns the working copy your users should see in production: glossary applied, manual edits included, word timings reconciled to segment text. This is what you feed into clips, search, or downstream AI.
Layers expose the editorial history:
raw— engine output as stored at job completionglossary— after project glossary rulescurrent— glossary plus any manual segment editsdiffs— text changes between layers;wordSyncVsRawshows word-timing adjustments
Fetch layers with ?include=layers on retrieve (one request) or GET …/layers (separate call). Only integrations that need review, audit, or edit UIs should load layers — export pipelines should use default GET.
Semantic search workflow
Semantic search runs on vectors produced by indexer jobs — not on raw transcripts until they are indexed.
- Complete a transcription and note
transcriptionId. POST /v1/jobswithserviceType: indexerandinput.transcriptionIds(array, one to 50 IDs). Poll untilcompleted.- Optional:
GET /v1/catalog/indexed-transcriptionsto confirm chunk counts. POST /v1/catalog/searchwith a natural-languagequery. Responses are camelCase: prefergroups[](one row per transcript withtopScore) or flatresults[]for the full hit payload (transcriptionId,startTimestamp,sourceUrl, etc.). Each hit includesstart/endand optionalstartSegmentId/endSegmentId. Pair withlatestJobIdfrom the index list orjobIdfromGET /v1/transcriptions/{id}to open the transcript editor.- To drop vectors without deleting the transcript:
DELETE /v1/catalog/indexed-transcriptions/{transcriptionId}.
See Semantic search and Create indexer job.
Custom editor workflow
- Load
GET /v1/transcriptions/{id}?include=layers— bind segment list tolayers.current.segmentsand storelayers.current.revision(ordata.revisionfrom GET without layers). - Show diffs from
layers.diffs— highlight glossary changes andwordSyncVsRawwhere timings were adjusted. - Save edits: one segment →
PATCH …/segments/{segmentId}withtext+revision, then update localrevisionfromdata.revision. Many segments → onePATCH …/segmentswithupdates[](see Edit multiple segments). Never fire parallel single-segment PATCH calls with the same starting revision. - On
409 conflict, re-GET the transcript, merge UI state, and retry with the newrevision. - Before bulk terminology fixes:
POST …/glossary/preview, thenPOST …/glossary/applyif the user confirms. - Undo paths:
POST …/revert/glossary(drop manual edits, keep glossary) orPOST …/revert/raw(full reset to engine output).
See Transcripts for request/response examples, including batch vs parallel behavior.