# Auto Subtitle (captions) > Auto Subtitle transcribes a clip and burns word-timed captions into it. It is the only caption model that also returns word-level timings and a transcript. Status: roasOS API v1.1. Catalog `model-catalog@2026-10-06.v5`, pricing `customer-pricing@2026-11-05.v15`. The endpoint `POST /v1/captions/auto-subtitle` is live. `POST /v1/generations` has no `captions` type, so this endpoint is the only path to this model. ## Endpoint POST https://api.roasos.com/v1/captions/auto-subtitle Auth: Authorization: Bearer roasos_sk_… (scope api:write). Idempotency-Key required. quote_only / quote_id / webhook_url as in https://docs.roasos.com/llms.txt. ## Good at Caption an ad in the punchy word-by-word style, and get the timings back so you can edit against them. Use this one when you will work with the words later; use VEED Subtitles when the render is the deliverable. The price is $0.03 for each minute of the source clip, rounded up. There are no multipliers. The source must be 480 seconds or shorter. ## Pricing Unit: source_minute. Pricing key: `auto-subtitle`. | request | credits | |---|---| | `30s_source` | 1 | | `60s_source` | 1 | | `120s_source` | 1 | Credits come from the roasOS pricing table (`MODEL_COSTS`) through the catalog. No other field changes the price. ## Modes - `subtitle` Provider endpoints: `fal-ai/workflow-utilities/auto-subtitle`. ## Request fields | field | type | required | default | rule | |---|---|---|---|---| | `audio_url` | string | no | — | https URL; ≤ 4,096 characters | | `background_color` | enum | no | — | `white`, `black`, `red`, `green`, `blue`, `yellow`, `orange`, `purple`, `pink`, `brown`, `gray`, `cyan`, `magenta`, `none`, `transparent` | | `enable_animation` | boolean | no | — | — | | `font_color` | enum | no | — | `white`, `black`, `red`, `green`, `blue`, `yellow`, `orange`, `purple`, `pink`, `brown`, `gray`, `cyan`, `magenta` | | `font_name` | string | no | — | ≥ 1 character; ≤ 64 characters | | `font_size` | integer | no | — | 20–150 | | `font_weight` | enum | no | — | `normal`, `bold`, `black` | | `language` | string | no | — | ≥ 2 characters; ≤ 35 characters | | `position` | enum | no | — | `top`, `center`, `bottom` | | `quote_id` | string | no | — | UUID | | `quote_only` | boolean | no | `false` | — | | `stroke_color` | enum | no | — | `white`, `black`, `red`, `green`, `blue`, `yellow`, `orange`, `purple`, `pink`, `brown`, `gray`, `cyan`, `magenta` | | `stroke_width` | integer | no | — | 0–10 | | `video_url` | string | no | — | https URL; ≤ 4,096 characters | | `wait_timeout_seconds` | integer | no | `0` | 0–60 | | `webhook_url` | string | no | — | https URL; ≤ 4,096 characters | | `words_per_subtitle` | integer | no | — | 1–12 | | `y_offset` | integer | no | — | -200–200 | The schema is strict: a field that is not in this table returns `400 unsupported_option`. Field names are the roasOS role names, one name per role across every family. ## Media - `video_url` — the source video - `audio_url` — the driving audio track | role | items | max size | content types | duration | |---|---|---|---|---| | `video_url` | ≤ 1 | 100 MB | `video/mp4` | 0–480 s | - Refused: `avatar_id`, `elements`, `product_id`, `product_images`, `references`, `reference_images`, `image_url`, `end_image_url`, `scene_id`, `scene_image`, `video_urls`, `audio_urls`, `voice_id`. A refused role returns `400 unsupported_option`. - Every URL must be an immutable object on `https://cdn.roasos.com/…` that your workspace owns; any other URL is `400 reference_media_not_workspace_owned`. Upload with `POST /v1/uploads` (direct POST of the bytes to `put_url`, or a `source_url` import), then use the returned CDN URL. ## Prompt None. This model takes no prompt. Every styling control is optional and none of them changes the price. `words_per_subtitle` is the one that changes the feel most: 1 for single-word display, 2 to 3 for short phrases, 8 to 12 for full sentences. ## Not exposed - `background_opacity`: not accepted by this public endpoint. - `highlight_color`: not accepted by this public endpoint. ## Result Result kind `video`. Always present: `url`. ```json { "data": { "id": "gen_…", "kind": "video", "model": "auto-subtitle", "status": "completed", "result": {"url":"https://cdn.roasos.com/workspaces/ws_01/result"} } } ``` Files live on `https://cdn.roasos.com` and are immutable; a result URL can be a media input to the next call. Poll `GET /v1/jobs/{id}/status` → `{ id, status, updated_at }`, then `GET /v1/jobs/{id}/result` (`409 run_not_completed` until the job is `completed`, `failed` or `canceled`). Statuses: `queued → processing → completed | failed | canceled`. ## Example ```bash # 1. quote — nothing is spent curl -X POST https://api.roasos.com/v1/captions/auto-subtitle \ -H "Authorization: Bearer roasos_sk_live_…" \ -H "Idempotency-Key: 0f1c9e2a-auto-subtitle-0001" \ -H "Content-Type: application/json" \ -d '{"quote_only":true,"video_url":"https://cdn.roasos.com/workspaces/ws_01/uploads/video_url.mp4"}' # → 200 { "data": { "kind": "quote", "quote_id": "q_7Hk…", "credits": 1, "expires_at": "…", "confirmation": { "model": "auto-subtitle", "example": "30s_source" } } } # 2. run — the same body and the same Idempotency-Key, quote_id instead of quote_only curl -X POST https://api.roasos.com/v1/captions/auto-subtitle \ -H "Authorization: Bearer roasos_sk_live_…" \ -H "Idempotency-Key: 0f1c9e2a-auto-subtitle-0001" \ -H "Content-Type: application/json" \ -d '{"quote_id":"q_7Hk…","video_url":"https://cdn.roasos.com/workspaces/ws_01/uploads/video_url.mp4"}' # → 201 { "data": { "id": "gen_…", "kind": "video", "model": "auto-subtitle", "status": "queued", "credits_reserved": 1, "links": { "status": "/v1/jobs/gen_…/status", "result": "/v1/jobs/gen_…/result" } } } # 3. poll curl https://api.roasos.com/v1/jobs/gen_…/status -H "Authorization: Bearer roasos_sk_live_…" curl https://api.roasos.com/v1/jobs/gen_…/result -H "Authorization: Bearer roasos_sk_live_…" ``` ## Today The endpoint is `POST /v1/captions/auto-subtitle`. It is live. ## See also https://docs.roasos.com/models/captions/auto-subtitle · https://api.roasos.com/v1/catalog/captions/auto-subtitle · fal-ai/workflow-utilities/auto-subtitle