Video tasks (Seedance)
Video generation is an async task: submit, poll the status, and receive a downloadable video URL on success; bills settle per output token.
Create a task
POST/v1/videos
| Field | Type | Description | |
|---|---|---|---|
| model | string | required | Copy the exact id of an enabled video model from GET /v1/models or the model catalogue; do not guess it from the display name. |
| content | array | required | Input items: {type:"text", text} for the prompt; {type:"image_url", image_url:{url}, role:"first_frame"|"last_frame"|"reference_image"}; {type:"video_url", video_url:{url}, role:"reference_video"}; {type:"audio_url", audio_url:{url}, role:"reference_audio"}. URLs may be asset://<id>. |
| duration | integer | optional | 2.0: 4–15 seconds, API default 5. 2.5: 4–30 seconds, API default -1 (automatic). An omitted value is explicitly forwarded from duration_default in the catalogue. A 2.5 edit requires -1, held at the model maximum. An explicit website duration keeps the website's selection. |
| resolution | string | optional | 2.0 supports 480p / 720p / 1080p / 4k; 2.5 supports 480p / 720p / 1080p; Fast / Mini support 480p / 720p. Actual resolution selects the price tier. |
| ratio | string | optional | 16:9 / 9:16 / 1:1 / 4:3 / 3:4 / 21:9 / adaptive. |
| generate_audio | boolean | optional | Whether to generate audio (supported models). |
| watermark | boolean | optional | Whether to add a watermark. |
| output_format | string | optional | mp4 or mov, only when the selected model catalogue enables the format. |
| mode | string | optional | LINK42 mode: omni_reference, omni_edit or omni_extend. Validated against enabled model modes and removed before forwarding. |
| omni_reference_task_type | string | optional | Seedance 2.5 provider field only: auto / reference / edit / extend. Do not send it to 2.0. An explicit type checks special constraints earlier; the prompt must still describe that task. |
| seed | integer | optional | Random seed for reproducibility. |
| service_tier | string | optional | Only default. flex (and execution_expires_after) would let the upstream queue the task for hours, past the platform's task limits and pricing, so the request is refused (invalid_request). |
| callback_url | string | optional | Terminal-state callback URL: the platform POSTs an event when the task reaches succeeded / failed / timeout / cancelled, with an X-Signature header you verify with the account's task callback signing secret (see "Signed task callbacks" in the Webhook docs). It is never sent upstream. Configure a Webhook endpoint in the console if you need delivery records and replay. |
| client_request_id | string | optional | Idempotency key (the Idempotency-Key header works too). |
curl https://www.link42.ai/v1/videos \
-H "Authorization: Bearer $LINK42_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "dreamina-seedance-2-0-mini-260615",
"content": [
{"type": "text", "text": "First-person walk through Tokyo streets after rain, neon reflections"},
{"type": "image_url", "image_url": {"url": "asset://1024"}, "role": "first_frame"}
],
"duration": 5,
"resolution": "720p",
"ratio": "16:9",
"generate_audio": true,
"watermark": false
}'{"id": "cgt-2026…", "status": "queued", "created_at": 1788300000}- Only model, content and the video parameters (duration, frames, resolution, ratio, seed, camera_fixed, watermark, generate_audio, return_last_frame, draft, service_tier, omni_reference_task_type, output_format) are sent upstream; callback_url, client_request_id, mode and any other field stay with the platform. The same client_request_id with another body answers 409 idempotency_conflict.
- asset://<id> references only completed uploads owned by the caller. Depending on the upstream account it becomes an asset-library id, image data or a temporary signed link; another user's assets are refused.
- Token-priced video holds include both reference and output video. Without server-verified input duration, the hold reserves the model's total reference limit (15 seconds for 2.0, 30 for 2.5). Automatic output reserves the model maximum. Final settlement uses actual provider token usage, including its minimum-usage rules, and releases the difference.
Reference media and task modes
Text/frame generation and omni references are mutually exclusive. Reference creation, editing and extension use reference_image / reference_video / reference_audio, without first_frame / last_frame. For edit and extend prompts, describe the operation on Video 1 directly; calling it a reference may make the provider classify the task as reference creation.
The 2.0 series accepts up to 9 images, 3 videos and 3 audio clips, with videos and audio each totaling no more than 15 seconds; audio requires an image or video. 2.5 accepts 30 images, 10 videos and 10 audio clips, with videos and audio each totaling no more than 30 seconds, and allows audio-only input. Videos must be MP4/MOV up to 200 MiB; audio must be MP3/WAV up to 15 MiB.
| Mode | Input | Constraints |
|---|---|---|
| Text / frames | Text, or first_frame with optional last_frame | A last frame requires a first frame. 2.5 frame generation requires adaptive ratio. |
| omni_reference | At least one reference image, video or audio clip | 2.0 does not allow audio-only input. Select ratio and duration within model bounds. |
| omni_edit | At least one reference video | 2.5 source video: 4–30 seconds, ratio=adaptive, duration=-1. 2.0 retains its usual ratio/duration options. |
| omni_extend | At least one reference video | 2.5 ratio=adaptive and 4–30 seconds or automatic duration; 2.0 uses 4–15 seconds or automatic duration when enabled. |
- The website checks local clip durations before uploading. API URLs and library files without duration metadata receive final provider validation. A submitted task can still fail when its prompt disagrees with the declared task type; the platform releases the hold for a failed task.
Get a task
GET/v1/videos/{id}
| Field | Type | Description |
|---|---|---|
| status | string | queued / running / succeeded / failed / cancelled / timeout. |
| provider_url | string | Original provider-signed video URL with limited validity. |
| stored_url | string | Signed platform download URL after successful transfer; valid within task retention and refreshed on read. |
| storage_status | string | pending / ready / failed; stored_url is downloadable when ready. |
| seed / resolution / ratio / duration / framespersecond | … | Actual generation parameters. |
| billing | object | Contains status, request_id, frozen_micro_usd, charged_micro_usd and settled_at; charged_micro_usd is the final charge. |
| error | object | Failure reason {code, message}. |
curl https://www.link42.ai/v1/videos/cgt-2026… \
-H "Authorization: Bearer $LINK42_API_KEY"- Poll every 3–5 seconds, or use callback_url to receive the terminal-state notification.
- A task's time limits run from its submission upstream; time spent in the local queue does not count. A task the upstream has not finished 30 minutes after it was submitted is still polled and settled as it finishes upstream. One still unfinished after 6 hours is cancelled upstream and marked timeout: released when the upstream had not started it, charged its hold when the upstream may have run it.
List and cancel
GET /v1/videos?after=&limit=&status= lists tasks with cursor pagination; DELETE /v1/videos/{id} cancels a queued / running task (the held amount is released) or deletes a finished record. The upstream is asked first: a task it already finished successfully is settled as succeeded and the call answers 409 task_already_completed; one it failed ends as failed; while the task's upstream account cannot be reached nothing is cancelled and the hold stays (503 task_cancel_unavailable).
Pricing
tokens ≈ (input video seconds + output seconds) × width × height × fps ÷ 1024; 720p/24fps is roughly 21,600 tokens per second. Overseas Seedance 2.x uses the official per-million-output-token tier for the resolution and whether video input is present; final settlement follows upstream usage. Only successful generations are charged; a task given up after 6 hours while the upstream may still have run it is charged its hold. The account-model rate takes priority, then the account default, then the model default; rates do not stack.
The local queue
When the routed upstream account is already at its concurrency limit the task is not rejected: it waits in the platform's local queue with status local_queued, an id starting with lq-, and a queue_position field carrying its first-in-first-out rank. The estimated cost is already frozen at this point, but nothing has been sent upstream.
A background worker submits queued tasks in order as soon as the account frees a slot. On submission the task is re-keyed to the upstream task id and moves to queued; the original lq- id keeps resolving. If the submission response is lost, status becomes unknown and the hold stays in place while operators reconcile it; do not submit or cancel the job again. A task that waits in the local queue longer than its own maximum duration goes straight to timeout and its hold is released.
| Field | Type | Description |
|---|---|---|
| status | string | local_queued means waiting for upstream capacity; unknown means provider submission needs reconciliation; confirmed submissions move to queued / running / succeeded / failed / cancelled / timeout. |
| queue_position | integer | Rank in the local queue, where 1 means next to be submitted; present only while local_queued. |
- A user may hold only so many tasks in local_queued / unknown / queued / running at once. Beyond that, creating a task answers 429 too_many_running_tasks; wait for one to finish or lower concurrency and retry.
- Cancelling a local_queued task releases the hold immediately. It never reached an upstream, so nothing is charged. An unknown task cannot be cancelled until its submission is reconciled.
Model reference
The first column is the catalogue id you put in `model`. Seedance 1.x and 2.x take their parameters differently: 1.x reads resolution, duration and camera motion from switches appended to the prompt, while 2.x uses structured request fields.
"Asset role" means the role field on an image_url / video_url / audio_url item inside content[]; only the roles listed are meaningful for that model.
| Model id | Name | Upstream | Billing | Fields that differ | Limits and gotchas |
|---|---|---|---|---|---|
| seedance-1-0-pro-fast-251015 | Seedance-1.0 | BytePlus Ark | Per output token (flat rate) | content accepts only text and image_url; resolution, duration and camera motion are prompt suffix switches: --resolution 720p --duration 5 --camerafixed false (the --resolution=720p spelling is accepted too); no generate_audio | One output-token rate; no resolution tiers |
| seedance-1-5-pro-251215 | Seedance-1.5 | BytePlus Ark | Per output token (audio-aware rate) | Same prompt suffix switches as 1.0, plus generate_audio on the request body | generate_audio picks the with-audio or without-audio output rate; when the result omits the field the submitted value is used |
| ep-20260510102134-rjc2n | Seedance-2.0 | Volcengine Ark (endpoint id) | Per output token (resolution tiers) | Structured fields resolution / duration / ratio / generate_audio / watermark / seed; content accepts image_url (role: first_frame, last_frame, reference_image) and video_url (role: reference_video) | An ep- id is an account-level endpoint id and differs per deployment, so the value here is an example rather than a promise — read the real one off the model plaza. The gateway rewrites it to the upstream model doubao-seedance-2-0-260128 (that is, Seedance-2.0) per account mapping. Tier = resolution x whether the request carries video input |
| ep-20260510125313-wl5fq | Seedance-2.0 Fast | Volcengine Ark (endpoint id) | Per output token (resolution tiers) | Same as Seedance-2.0 | The endpoint id differs per deployment and is shown here as an example; it is rewritten to the upstream model doubao-seedance-2-0-fast-260128 (that is, Seedance-2.0 Fast). Same tier rule as Seedance-2.0 |
| ep-20260627145558-xdpxn | Seedance-2.0 Mini | Volcengine Ark (endpoint id) | Per output token (resolution tiers) | Same as Seedance-2.0 | The endpoint id differs per deployment and is shown here as an example; it is rewritten to the upstream model doubao-seedance-2-0-mini-260615 (that is, Seedance-2.0 Mini). Same tier rule as Seedance-2.0 |
| ep-20260808220821-6fpbk | Seedance-2.5 | Volcengine Ark (endpoint id) | Per output token (resolution tiers) | Same as Seedance-2.0 | The endpoint id differs per deployment and is shown here as an example; it is rewritten to the upstream model doubao-seedance-2-5-260628 (that is, Seedance-2.5). Same tier rule as Seedance-2.0 |
| seedance-2 | Seedance 2.0 | Volcengine Ark, Beijing | Native CNY list price converted to USD using the latest checked SAFE quote; output-token resolution tiers | 4–15 seconds; 480p / 720p / 1080p / 4k; ratio, generate_audio, watermark and first-frame references | Upstream doubao-seedance-2-0-260128. Original rates per million tokens: 480p/720p ¥28 with video input or ¥46 without; 1080p ¥31/¥51; 4k ¥16/¥26. Settled on actual usage. |
| seedance-2-0-fast | Seedance 2.0 Fast | Volcengine Ark, Beijing | Native CNY list price converted to USD using the latest checked SAFE quote; output-token resolution tiers | 4–15 seconds; 480p / 720p; ratio, generate_audio, watermark | Upstream doubao-seedance-2-0-fast-260128. Original rates per million tokens: ¥22 with video input or ¥37 without. Provider promotions are not a permanent LINK42 sale price. |
| seedance-2-0-mini | Seedance 2.0 Mini | Volcengine Ark, Beijing | Native CNY list price converted to USD using the latest checked SAFE quote; output-token resolution tiers | 4–15 seconds; 480p / 720p; synchronized audio, frames and references | Upstream doubao-seedance-2-0-mini-260615. Read live prices and capabilities from the marketplace; video input selects its corresponding price tier. |
| seedance-2-5 | Seedance 2.5 | Volcengine Ark, Beijing | Native CNY list price converted to USD using the latest checked SAFE quote; output-token resolution tiers | 4–30 seconds or automatic; 480p / 720p / 1080p; mp4 / mov; reference, edit and extend | Upstream doubao-seedance-2-5-260628. Edit/extend follows the source ratio; editing requires duration=-1. Read live prices from the marketplace. |
| dreamina-seedance-2-0-260128 | Seedance 2.0 | BytePlus Ark | Per output token | 4–15 seconds; 480p / 720p / 1080p / 4k; synchronized audio and multimodal references | 480p/720p: $7/M tokens without video input, $4.3 with video; 1080p: $7.7/$4.7; 4k: $4/$2.4. First-time upstream asset import may slow submission. |
| dreamina-seedance-2-0-fast-260128 | Seedance 2.0 Fast | BytePlus Ark | Per output token | 4–15 seconds; 480p / 720p; synchronized audio and reference media | $5.6/M tokens without video input, $3.3 with video. Eligibility for the provider's limited-time sale depends on account and billing method; operators set platform discounts separately. |
| dreamina-seedance-2-0-mini-260615 | Seedance 2.0 Mini | BytePlus Ark | Per output token | 4–15 seconds; 480p / 720p; synchronized audio and reference media | $3.5/M tokens without video input, $2.1 with video. Eligibility for the provider's limited-time sale depends on account and billing method; operators set platform discounts separately. |
| dreamina-seedance-2-5-260628 | Seedance 2.5 | BytePlus Ark | Per output token | 4–30 seconds; 480p / 720p / 1080p; synchronized audio and multimodal references | 480p/720p: $10.7/M tokens without video input, $6.4 with video; 1080p: $11.7/$7. First-time upstream asset import may slow submission. |
- Whether a request counts as carrying video input follows one strict rule: content[] contains an item whose type is video_url, whose role is reference_video and whose url is non-empty. An image_url alone is not video input and lands in a different price tier.
- The tier is matched on the resolution reported in the result, falling back to the submitted resolution; when neither is available the base video rate applies.
- The four ep- ids above are legacy deployment examples. Domestic catalogue ids are seedance-2, seedance-2-0-fast, seedance-2-0-mini and seedance-2-5; overseas ids use the dreamina- aliases. The live marketplace or GET /v1/models determines what is published.