Skip to main content
Use LinkModel’s Volcengine-compatible task API with 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

Set LINKMODEL_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

Only model 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.
A successful creation returns HTTP 200:
Save the top-level 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

Use the complete 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:
  1. No response or non-200 HTTP status: handle a request error using errors and retries. A query error does not establish that generation failed.
  2. HTTP 200: inspect the top-level status below. HTTP success means the query succeeded, not necessarily the video generation.
  3. Terminal task status: stop polling. Save the video for succeeded, or record the failure details for failed.
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 HTTP 200. 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.
The timestamps, usage, ID, and URL above illustrate the response format only. See query response fields for optional metadata and failure responses.

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 needs type 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

Build content 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, omit ratio or change it to adaptive. To use only a first frame, remove the last-frame block.

Reference video with Mini

For reference images and audio, add blocks like these to 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.5 1080p 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.
These requests use the applicable “without reference video” and “with reference video” price tiers, respectively, based on actual output usage and your account’s effective prices. Do not add a top-level videos billing field.

Seedance 2.5 Draft workflow

Draft samples require the corresponding account access and use 480p. A successful result with draft: true is still a sample.

Create a sample

Query the returned task ID using the same query endpoint until the sample succeeds.

Convert an eligible sample

Contact support to confirm that your account and sample are eligible before attempting conversion. Regular 1080p 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:
The intentionally omitted generation settings are inherited from the sample. Do not copy the sample-creation request and simply add draft_task. Conversion follows these rules:
  • The sample must belong to your account, match the request model, and have completed successfully. Reference the LinkModel id returned when creating the sample.
  • content must contain only one draft_task, without text, images, video, or audio. Do not send top-level draft_task_id.
  • duration, ratio, seed, and generate_audio are inherited and must be omitted entirely. Passing the same values or explicit null is rejected.
  • Do not set draft: true. You may specify watermark; it is not one of the inherited fields above.
The sample must have all necessary information. Intelligent-duration samples without actual-duration metadata may be rejected. Do not substitute another model’s 1080p tier.

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 HTTP 404:

Generation failure

A successful HTTP 200 query can report a failed task. Handle this separately from an HTTP request error:
Do not base application logic solely on fixed 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, response X-Request-ID header if present, and redacted request parameters. Never include your API key.