seedance-2-0, seedance-2-0-fast, seedance-2-0-mini, and seedance-2-5. Video generation is asynchronous: create a task, save its ID, then query its status and download the result.
This guide describes the interface as of October 29, 2026 (Asia/Shanghai).
Choose the interface
Choose the guide that matches the request format you want to use:
This guide uses LinkModel API keys and the base URL
https://api.linkmodel.ai. It covers LinkModel’s supported fields, not every upstream Volcengine feature. Create and query a task through the same interface; follow that interface’s request and response formats.
All requests require
Authorization: Bearer YOUR_API_KEY. POST requests also require Content-Type: application/json. Your account must have access to the selected model and features. Keep the key on your server, out of public pages, client-side code, and logs. Query tasks with credentials from the account that created them; missing tasks and tasks belonging to another account return 404.
Generate your first video
SetLINKMODEL_API_KEY in your local environment. Examples use placeholder keys, task IDs, and media URLs; replace them before use. Creating a task generates billable usage at your account’s applicable price.
1. Create a task
Onlymodel and content are required. This example also selects a 5-second, 480p video without generated audio or a watermark so the initial result does not depend on those defaults.
200:
id. There is no code or data.task_id wrapper. Acceptance does not mean the video has finished generating. You can use the same request structure with seedance-2-0-fast.
2. Query the task
id from creation, at most 50 characters long, in the path. Do not use a media URL or another platform’s task ID.
Process each query in this order:
- No response or non-200 HTTP status: handle a request error using errors and retries. A query error does not establish that generation failed.
- HTTP
200: inspect the top-levelstatusbelow. HTTP success means the query succeeded, not necessarily the video generation. - Terminal task status: stop polling. Save the video for
succeeded, or record the failure details forfailed.
Start with a 3–5 second polling interval and increase the interval as needed. This is a suggested client strategy, not a completion-time guarantee. If your local wait limit expires, retain the ID and query later; a local timeout does not fail or cancel the task.
3. Save the result
A successful query returns HTTP200. For a completed task, download the URL in content.video_url and save the video promptly. Output URLs do not have a guaranteed fixed lifetime in this guide.
Model support
Availability depends on your account’s enabled features.duration: -1 selects intelligent duration. Under the current default configuration, omitted duration means 5 seconds for 2.0, Fast, and Mini, and intelligent duration for 2.5. Account policies may affect effective parameters; specify a fixed duration and resolution during initial integration.
Reference limits are counted separately and exclude dedicated first and last frames. These are request-validation limits, not guarantees that every combination of formats, file sizes, and media durations will succeed.
4k is not supported. Seedance 2.5 requires the corresponding account permission for 1080p.
Resolution tiers and observed dimensions
resolution selects a tier; it does not necessarily equal the file’s height. These are observed output examples for 16:9, not fixed dimensions guaranteed for every task:
Do not reject a 2.0
480p result solely because its height is not 480 pixels. Inspect the video file for actual dimensions, including other aspect ratios.
Request fields
Top-level fields
Use boolean
false, not the string "false". Omit optional fields you do not need.
Unknown JSON fields return 400. Do not send omni_reference_task_type, callback_url, service_tier, tools, extends, or idempotency_key. Top-level prompt, images, videos, audio, and draft_task_id are also unsupported by this interface.
Content blocks
Every block needstype and only the corresponding content field. Media values must be objects, such as "image_url": {"url": "https://example.com/input.jpg"}, rather than URL strings.
URLs must be nonempty. Use HTTPS media URLs that the server can download directly. Login-protected, expired, or private-network URLs are unsuitable. Supply media using the URL structure shown here.
Choose one input mode
Buildcontent for one of these modes. Do not combine frame input, reference-media input, and Draft conversion in the same request.
Across ordinary generation modes, provide valid text or media; empty text alone is invalid. At most one text block, one first frame, and one last frame are allowed. For images, always specify the intended
role: omission means first frame, not reference image.
Generation examples
The following JSON bodies all use the same POST creation endpoint. Replace media URLs with accessible inputs and select parameters your account can use.First and last frames
This example uses 2.0. For 2.5, omitratio or change it to adaptive. To use only a first frame, remove the last-frame block.
Reference video with Mini
content, respecting the model limits and combination rules. This is a content fragment, not a complete request:
Seedance 2.5 at 1080p
Your account needs Seedance 2.51080p access. These are regular generation requests: omit draft; creating a sample first is not required. A reference video can have a different resolution from the output, such as a 480p input for 1080p output.
- Text to video
- Reference video
videos billing field.
Seedance 2.5 Draft workflow
Draft samples require the corresponding account access and use480p. A successful result with draft: true is still a sample.
Create a sample
Convert an eligible sample
Contact support to confirm that your account and sample are eligible before attempting conversion. Regular1080p generation access does not make every sample convertible. Conversion requires resolution: "1080p"; substituting 720p returns 400.
After support confirms eligibility and the sample reaches succeeded, POST this complete request body to the same creation endpoint. Replace the ID with the successful sample’s LinkModel id:
draft_task.
Conversion follows these rules:
- The sample must belong to your account, match the request model, and have completed successfully. Reference the LinkModel
idreturned when creating the sample. contentmust contain only onedraft_task, without text, images, video, or audio. Do not send top-leveldraft_task_id.duration,ratio,seed, andgenerate_audioare inherited and must be omitted entirely. Passing the same values or explicitnullis rejected.- Do not set
draft: true. You may specifywatermark; it is not one of the inherited fields above.
Query response fields
Clients should tolerate absent optional fields and newly added response fields.
Metadata such as
seed, generate_audio, resolution, ratio, duration, frames, framespersecond, and output_format is returned only when reliable result information is available. The response is not guaranteed to echo the full request. Inspect the video file for actual dimensions, duration, and audio tracks; missing resolution metadata does not mean a 1080p request produced a lower-resolution video.
Errors and retries
There are two separate failure paths: a rejected HTTP request and a failed generation reported by a successful query.HTTP request errors
Rejected requests use an error envelope. For example, querying a nonexistent task returns HTTP404:
Generation failure
A successful HTTP200 query can report a failed task. Handle this separately from an HTTP request error:
message text. Request errors and HTTP 200 responses with status: "failed" are different failure paths.
When to retry
If a POST times out, disconnects, or has an ambiguous result, do not immediately resubmit automatically: the task may already have been accepted. This interface has no public request-idempotency field. Preserve the request time and tracing information, and verify the task outcome to avoid duplicate generation. For query network errors or temporary service errors, retry the same task ID after a delay. When contacting support, provide the task ID, request time, responseX-Request-ID header if present, and redacted request parameters. Never include your API key.