# Seedance 2.5 (video) > Seedance 2.5 makes cinematic clips of 4 to 30 seconds with synchronized audio from text, a first frame, or a mix of image, video and audio references. It is best at multi-beat storytelling, dialogue with lip-sync, and product motion in one long take. Status: roasOS API v1.1. Catalog `model-catalog@2026-10-06.v5`, pricing `customer-pricing@2026-11-05.v15`. The endpoint `POST /v1/video/seedance-2.5` is live. `POST /v1/generations` stays for one minor version as a deprecated alias (see "Today"). ## Endpoint POST https://api.roasos.com/v1/video/seedance-2.5 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 Seedance 2.5 is the premium video model of the roster. It makes one continuous take of up to 30 seconds with sound effects, ambience and lip-synced speech; the audio has no surcharge. It follows beat-by-beat prompts with timestamps, and it keeps a product, a set and a palette stable across cuts. Reference mode binds images, videos and audio files to ordinal tags, so a caller can lock a product look, copy a motion, or use a voice track. It accepts a human face in a reference image, a real photo or a saved avatar. roasOS runs this model on a provider route that accepts faces. ## Pricing Unit: clip. Pricing key: `seedance-2.5`. | request | credits | |---|---| | `4s_720p` | 12 | | `12s_720p` | 36 | | `30s_720p` | 90 | | `4s_720p_no_audio` | 12 | Credits come from the roasOS pricing table (`MODEL_COSTS`) through the catalog. No other field changes the price. ## Modes - `text-to-video` - `image-to-video` - `reference-to-video` The worker derives the mode from the media fields of the request. Provider endpoints: `bytedance/seedance-2.5/image-to-video` · `bytedance/seedance-2.5/reference-to-video` · `bytedance/seedance-2.5/text-to-video`. ## Request fields | field | type | required | default | rule | |---|---|---|---|---| | `aspect_ratio` | enum | no | `16:9` | `auto`, `9:16`, `1:1`, `3:4`, `4:3`, `16:9`, `21:9`; only in `text-to-video`, `reference-to-video` | | `audio_urls` | string[] | no | — | ≤ 10 items; only in `reference-to-video` | | `avatar_id` | string | no | — | UUID; only in `reference-to-video` | | `avatar_outfit` | string | no | — | ≤ 500 characters | | `duration_seconds` | enum | no | `5` | `auto`, `4`, `5`, `6`, `8`, `10`, `12`, `15`, `20`, `25`, `30`; required in `reference-to-video` | | `end_image_url` | string | no | — | https URL; ≤ 4,096 characters; only in `image-to-video` | | `extend_of_generation_id` | string | no | — | UUID | | `generate_audio` | boolean | no | `true` | — | | `image_url` | string | no | — | https URL; ≤ 4,096 characters; only in `image-to-video` | | `mode` | enum | no | — | `text-to-video`, `image-to-video`, `reference-to-video` | | `prompt` | string | yes | — | ≥ 1 character; ≤ 10,000 characters | | `quote_id` | string | no | — | UUID | | `quote_only` | boolean | no | `false` | — | | `references` | string[] | no | — | ≤ 30 items; only in `reference-to-video` | | `resolution` | enum | no | `720p` | `480p`, `720p`, `1080p` | | `scene_id` | string | no | — | UUID | | `video_urls` | string[] | no | — | ≤ 10 items; only in `reference-to-video` | | `wait_timeout_seconds` | integer | no | `0` | 0–60 | | `webhook_url` | string | no | — | https URL; ≤ 4,096 characters | 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 - `avatar_id` — identity; the saved character reference sheet, with a derived portrait only where the model requires a single face or source frame - `references` — style and appearance references - `image_url` — first frame (or the single source image) - `end_image_url` — last frame - `scene_id` — first frame — a scene this workspace owns - `video_urls` — reference videos - `audio_urls` — reference or driving audio | role | items | max size | content types | duration | |---|---|---|---|---| | `audio_urls` | ≤ 10 | 14.3 MB | `audio/mpeg`, `audio/wav` | 1.8–30.2 s | | `end_image_url` | ≤ 1 | 10 MB | `image/jpeg`, `image/png`, `image/webp` | — | | `image_url` | ≤ 1 | 10 MB | `image/jpeg`, `image/png`, `image/webp` | — | | `references` | ≤ 30 | 10 MB | `image/jpeg`, `image/png`, `image/webp` | — | | `video_urls` | ≤ 10 | 100 MB | `video/mp4` | 2–30 s | - Refused: `elements`, `product_id`, `product_images`, `reference_images`, `scene_image`, `video_url`, `audio_url`, `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 Limit 10,000 characters including the roasOS route-facts block (`ROUTE-VERIFIED FEATURE FACTS:` with one line for the first frame or the references). Tags: `@Image1`, `@Video1`, `@Audio1`, each once, in order. - Order: Subject → Action → Camera → Style/lighting → Constraints. One primary movement per beat. - Give each beat a start time: `[00:00] … [00:05] …`. - Write dialogue as `She says: "…"` with the delivery; name the mic source ("direct phone mic, room ambience, no music"). - Dialogue pacing: 1–8 words ≈ 4–5 s, 9–15 ≈ 6–8 s, 16–25 ≈ 9–12 s, 26–35 ≈ 13–15 s. - Avoid: cinematic, professional, stunning, 8k, studio, perfect. Say "documentary", "handheld", "phone-shot". - Motion needs intensity and degree adverbs ("slowly picks up the bottle with her right hand and turns the label to camera"). - Lock a product: "The product from @Image2 must remain visually unchanged in every shot". - A face in an image reference is accepted. An `avatar_id` appends the avatar's front and full-body shots as the trailing `@ImageN` entries. - If the provider refuses a face, the run fails with `provider_rejects_face_references`. roasOS refunds the reservation. ## Not exposed - `duration_seconds`: values not exposed — `7`, `9`, `11`, `13`, `14`, `16`, `17`, `18`, `19`, `21`, `22`, `23`, `24`, `26`, `27`, `28`, `29`. - `video_urls`: values not exposed — `MOV containers`. - `references`: values not exposed — `BMP`, `TIFF`, `GIF`, `HEIC`, `HEIF`. - `seed`: pinned to `output only`. - `end_user_id`: not accepted by this public endpoint. ## Result Result kind `video`. Always present: `url`. ```json { "data": { "id": "gen_…", "kind": "video", "model": "seedance-2.5", "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/video/seedance-2.5 \ -H "Authorization: Bearer roasos_sk_live_…" \ -H "Idempotency-Key: 0f1c9e2a-seedance-2.5-0001" \ -H "Content-Type: application/json" \ -d '{"quote_only":true,"prompt":"A woman holds the bottle at eye level in a bright kitchen, morning light, static camera."}' # → 200 { "data": { "kind": "quote", "quote_id": "q_7Hk…", "credits": 12, "expires_at": "…", "confirmation": { "model": "seedance-2.5", "example": "4s_720p" } } } # 2. run — the same body and the same Idempotency-Key, quote_id instead of quote_only curl -X POST https://api.roasos.com/v1/video/seedance-2.5 \ -H "Authorization: Bearer roasos_sk_live_…" \ -H "Idempotency-Key: 0f1c9e2a-seedance-2.5-0001" \ -H "Content-Type: application/json" \ -d '{"quote_id":"q_7Hk…","prompt":"A woman holds the bottle at eye level in a bright kitchen, morning light, static camera."}' # → 201 { "data": { "id": "gen_…", "kind": "video", "model": "seedance-2.5", "status": "queued", "credits_reserved": 12, "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 `POST /v1/generations { "type": "video", "model": "seedance-2.5", "options": { prompt, image, last_frame, reference_images, reference_videos, audio_urls, duration, resolution, aspect_ratio, generate_audio } }`. Contract authority `exact` for all three modes. It returns the same job envelope. The alias stays one minor version after v1.1 ships. ## See also https://docs.roasos.com/models/video/seedance-2.5 · https://api.roasos.com/v1/catalog/video/seedance-2.5 · bytedance/seedance-2.5/image-to-video · bytedance/seedance-2.5/reference-to-video · bytedance/seedance-2.5/text-to-video