---
title: "Transcribe task"
method: POST
path: "/v1/tasks/transcribe"
tags: ["tasks"]
---

# Transcribe task

`POST /v1/tasks/transcribe`

## Request

- Base URL: `https://api.framelane.io`
- URL: `https://api.framelane.io/v1/tasks/transcribe`
- Auth: HTTP bearer

Submit a media URL for transcription. Runs asynchronously — the task is accepted with `202` and moves through `queued` → `processing` → a terminal status; poll `GET /v1/tasks/{task_id}` or pass `wait` there to long-poll. Supports word-level timestamps and speaker diarisation.

## Headers

- `Idempotency-Key` string, nullable

## Request body

- TranscribeBody
  - `metadata` object: Arbitrary key-value pairs echoed back in all webhook payloads.
  - `webhook_url` string, uri, nullable: Per-request webhook URL. Overrides workspace-level webhooks for this job only. Receives task.completed, task.failed, and progress events.
  - `source_url` string, uri, required
  - `language` string, nullable: BCP-47 language code (e.g. 'en'). Auto-detected when omitted.
  - `speech_model` 'universal-2' | 'universal-3-pro' | 'nano': AssemblyAI speech model to use.
  - `word_timings` boolean: Include word-level timestamps in the output.
  - `speaker_labels` boolean: Enable speaker diarisation (who spoke when).
  - `speakers_expected` integer, nullable: Hint for the expected number of speakers (used when speaker_labels=true).
  - `sentiment_analysis` boolean: Detect positive / neutral / negative sentiment per sentence.
  - `entity_detection` boolean: Identify named entities (people, organisations, places, etc.).
  - `auto_highlights` boolean: Extract the most important phrases automatically.
  - `content_safety` boolean: Flag sensitive content categories.
  - `iab_categories` boolean: Classify content into IAB taxonomy topics.
  - `word_boost` string[]: Domain-specific terms to boost recognition accuracy (max 200).

## Response `200`

Idempotent replay.

- JobOut: A render job or AI task.
  - `id` string, required: Unique job ID. Prefix indicates type: `render_` or `task_`.
  - `kind` 'render' | 'task', required
  - `is_preview` boolean: True for a cheap preview render. Previews are not billed and are excluded from the renders list.
  - `editor_url` string, nullable: Open the project this job was submitted from in the authenticated console. Absent for a job with no project.
  - `task_type` 'transcribe': The AI task types the API offers. Values: - `transcribe` — Speech-to-text transcription (via AssemblyAI) with optional analysis. Returns the transcript inline on the task's `result` object — there is no file artifact, so `output` is null and `/v1/tasks/{id}/download` returns 404.
  - `workspace_id` string, required: ID of the workspace that owns this job.
  - `status` 'ingesting' | 'queued' | 'processing' | 'completed' | 'failed' | 'cancelled', required: Values: - `ingesting` — External source files are being probed for duration before the render is queued. - `queued` — Accepted and waiting for a worker to pick it up. - `processing` — Actively rendering or processing. - `completed` — Finished successfully; the output artifact is available. - `failed` — Terminated with an error (see `error`). - `cancelled` — Cancelled by the caller before completion.
  - `progress_percent` integer: 0–100 progress indicator updated by the render engine.
  - `progress_stage` 'downloading' | 'compositing' | 'encoding' | 'uploading': Values: - `downloading` — Fetching source media. - `compositing` — Compositing the scene on the GPU. - `encoding` — Encoding the output video. - `uploading` — Uploading the finished artifact to storage.
  - `output` JobOutput
    - `url` string, nullable: CDN URL to the completed artifact.
    - `width` integer, nullable: Output video width in pixels.
    - `height` integer, nullable: Output video height in pixels.
    - `duration` number, nullable: Output duration in seconds.
    - `size_bytes` integer, nullable: Artifact file size in bytes.
  - `result` object, nullable: Structured JSON result for tasks that return data rather than a file — `transcribe` returns the transcript here (`text`, `words`, `utterances`, and any requested analysis). Populated once `status == completed`; `null` for renders and for any job whose only artifact is the file at `output.url`.
  - `error` JobError
    - `code` 'invalid_source' | 'source_not_found' | 'source_too_large' | 'asset_not_ready' | 'codec_unsupported' | 'decode_failed' | 'encode_failed' | 'timeout' | 'out_of_memory' | 'gpu_error' | 'upload_failed' | 'provider_error' | 'ingest_failed' | 'render_refused' | 'internal' | 'cancelled', required: Structured error codes surfaced on Job.error_code. Values: - `invalid_source` — A source URL was malformed or inaccessible. - `source_not_found` — A source URL returned 404. - `source_too_large` — A source file exceeded the maximum allowed size. - `asset_not_ready` — A referenced asset was still ingesting when the job ran. - `codec_unsupported` — A source used a codec the renderer cannot decode. - `decode_failed` — A source file could not be decoded. - `encode_failed` — The output could not be encoded. - `timeout` — Processing exceeded the time limit. - `out_of_memory` — The renderer ran out of GPU memory. - `gpu_error` — A GPU hardware/driver error occurred. - `upload_failed` — The output artifact failed to upload to storage. - `provider_error` — An upstream provider (e.g. AssemblyAI) returned an error. - `ingest_failed` — An external source could not be probed (unreachable, not a media file, or timed out). - `render_refused` — The renderer refused the composition by name: a runtime shader that did not compile or ran over its GPU time budget, or an operation, a component or a nested composition it could not apply. `error_message` carries the engine's words; change what it names and submit again. - `internal` — An unexpected internal error occurred. - `cancelled` — The job was cancelled.
    - `message` string, required: Human-readable error description.
  - `metadata` object: Caller-supplied key-value pairs echoed back on every webhook and response.
  - `created_at` string, date-time, required: ISO-8601 UTC timestamp when the job was created.
  - `updated_at` string, date-time, required: ISO-8601 UTC timestamp of the last status change.
  - `completed_at` string, date-time, nullable: ISO-8601 UTC timestamp when the job reached a terminal state.

## Other responses

- `202`: Successful Response
- `401`: Missing or invalid API key.
- `422`: Validation error or unsupported feature.
- `429`: Rate limit exceeded.

---

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