Seedance
curl --request POST \
--url https://api.mixroute.ai/v1/video/generationsimport requests
url = "https://api.mixroute.ai/v1/video/generations"
response = requests.post(url)
print(response.text)const options = {method: 'POST'};
fetch('https://api.mixroute.ai/v1/video/generations', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.mixroute.ai/v1/video/generations",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.mixroute.ai/v1/video/generations"
req, _ := http.NewRequest("POST", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.mixroute.ai/v1/video/generations")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.mixroute.ai/v1/video/generations")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
response = http.request(request)
puts response.read_bodyVideo Series
Seedance
Seedance video generation parameters, supported values, input constraints, and request examples.
Seedance
curl --request POST \
--url https://api.mixroute.ai/v1/video/generationsimport requests
url = "https://api.mixroute.ai/v1/video/generations"
response = requests.post(url)
print(response.text)const options = {method: 'POST'};
fetch('https://api.mixroute.ai/v1/video/generations', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.mixroute.ai/v1/video/generations",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.mixroute.ai/v1/video/generations"
req, _ := http.NewRequest("POST", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.mixroute.ai/v1/video/generations")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.mixroute.ai/v1/video/generations")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
response = http.request(request)
puts response.read_bodySeedance generates video from text and supported media inputs. Doubao and Dreamina route prefixes use the same parameter names, while capabilities and limits depend on the selected model version.
Route-specific guides: Doubao | Dreamina
Model availability is account-specific. Use the complete ID shown in the Model Marketplace.
POST https://api.mixroute.ai/v1/video/generations
Keep
model, prompt, and asset at the root. Put every provider field inside the single metadata object, including content, duration, ratio, resolution, and generate_audio.Model IDs
| Series | MixRoute IDs |
|---|---|
| Seedance 2.5 | doubao-seedance-2-5-260628 |
| Seedance 2.0 | dreamina-seedance-2-0-260128 / doubao-seedance-2-0-260128 |
| Seedance 2.0 Fast | dreamina-seedance-2-0-fast-260128 / doubao-seedance-2-0-fast-260128 |
| Seedance 2.0 Mini | dreamina-seedance-2-0-mini-260615 / doubao-seedance-2-0-mini-260615 |
Top-Level Fields
| Field | Type | Required | Description |
|---|---|---|---|
model | string | Yes | Complete MixRoute model ID from the model table. |
prompt | string | Yes | MixRoute video prompt. If metadata.content includes a text item, keep both texts consistent. |
asset | boolean | Conditional | MixRoute media-processing switch, not a provider field. Keep it at the root; the text-only examples use false. |
metadata | object | Yes | Container for the provider fields described below. |
Generation Parameters
| Field | Type | Required | Description |
|---|---|---|---|
metadata.content | object[] | Yes | Inputs used to generate the video: text, images, video, audio, or a supported draft task. Text is required for text-only generation; in media-input combinations the provider permits the text item to be omitted. |
metadata.omni_reference_task_type | string | No | Seedance 2.5 only. Default auto; values: auto, reference, edit, extend. Explicit modes enable early task-type validation. A mismatch between the declared mode and the inferred intent can still fail asynchronously. |
metadata.resolution | string | No | Output resolution tier. Supported values and defaults depend on the model version; see the version table. Values are case-sensitive. |
metadata.ratio | string | No | Values: 16:9, 4:3, 1:1, 3:4, 9:16, 21:9, adaptive. Default adaptive for 2.5, 2.0, and 1.5 Pro. For 1.0, text-to-video defaults to 16:9 and image-to-video to adaptive. |
metadata.duration | integer | No | Requested duration in seconds; see the version table. -1 selects the duration automatically on supported versions. Seedance 2.5 defaults to -1, and video editing requires -1. |
metadata.frames | integer | No | Seedance 1.0 Pro/Pro Fast only. Values from 29 through 289 satisfying 25 + 4n, with positive integer n. Takes precedence over duration; output frame rate is 24 fps. |
metadata.generate_audio | boolean | No | Supported by 2.5, 2.0, and 1.5 Pro. Default true: generate synchronized mono audio, including speech, sound effects, or music. false produces a silent video. |
metadata.watermark | boolean | No | Default false. true adds an AI-generated watermark in the lower-right corner; false omits it. |
metadata.output_format | string | No | Seedance 2.5 only. Default mp4; values: mp4, mov. MP4 is intended for general playback; MOV preserves higher color precision for post-production and requires compatible playback software. |
metadata.seed | integer | No | 1.5 Pro and 1.0 only. Range -1 to 2147483647; default -1 means a random seed. Reusing a seed can produce similar results but does not guarantee identical output. |
metadata.camera_fixed | boolean | No | 1.5 Pro and 1.0 only; not available in reference-image mode. Default false. true adds a fixed-camera instruction but does not guarantee a completely stationary camera. |
metadata.return_last_frame | boolean | No | Default false. true returns a watermark-free PNG of the final frame, with the same pixel dimensions as the generated video, in the task result. |
metadata.draft | boolean | No | 1.5 Pro only; default false. Draft mode requires 480p and cannot be combined with return_last_frame=true or offline inference. |
metadata.service_tier | string | No | 1.5 Pro and 1.0 only. Default default for online inference; flex selects offline inference. The tier cannot be changed after submission. The 2.5 and 2.0 families do not support flex. |
metadata.callback_url | string | No | Task-status callback URL. The provider sends POST notifications with its task-query response structure. Statuses include queued, running, succeeded, failed, and expired. |
metadata.execution_expires_after | integer | No | Range 3600-259200 seconds; default 172800 (48 hours), measured from task creation. A task that exceeds this threshold is terminated with status expired. |
metadata.priority | integer | No | 2.5 and 2.0 only. Range 0-9; default 0. Higher values move ahead of lower-priority queued tasks on the same endpoint. Equal priorities remain FIFO; running tasks are not interrupted. Not supported with flex. |
metadata.safety_identifier | string | No | Stable, unique identifier for the end user, limited to 64 English characters. Use a hashed identifier instead of raw personal information. |
metadata.tools | object[] | No | 2.5 and 2.0 only. Each tool requires type; the supported value is web_search. The model decides whether to search. The query result exposes the search count in usage.tool_usage.web_search. |
Version Limits
| Version | Resolution | Default Resolution | Duration | Reference Limits (Images / Videos / Audio) |
|---|---|---|---|---|
| Seedance 2.5 | 480p / 720p / 1080p | 720p | 4-30 s / -1 | 30 / 10 / 10 |
| Seedance 2.0 | 480p / 720p / 1080p / 4k | 720p | 4-15 s / -1 | 9 / 3 / 3 |
| Seedance 2.0 Fast / Mini | 480p / 720p | 720p | 4-15 s / -1 | 9 / 3 / 3 |
| Seedance 1.5 Pro | 480p / 720p / 1080p | 720p | 4-12 s / -1 | - |
| Seedance 1.0 Pro / Pro Fast | 480p / 720p / 1080p | 1080p | 2-12 s | - |
Content Items
| Field | Type | Required | Description |
|---|---|---|---|
metadata.content[].type | string | Yes | text, image_url, video_url, audio_url, or draft_task, depending on model support. |
metadata.content[].text | string | Conditional | Required when type=text. Describes the desired video. The recommended prompt length is at most 500 Chinese characters or 1000 English words; this is guidance, not a hard input limit. |
metadata.content[].image_url.url | string | Conditional | Required for image items. Public URL, Base64 data URL data:image/<format>;base64,..., or an accessible asset:// ID. |
metadata.content[].video_url.url | string | Conditional | Required for video items. Public URL or accessible asset:// ID; video Base64 data URLs are not supported by this input format. |
metadata.content[].audio_url.url | string | Conditional | Required for audio items. Public URL, data:audio/<format>;base64,..., or an accessible asset:// ID. |
metadata.content[].draft_task.id | string | Conditional | 1.5 Pro only. A successful draft task ID, used to reuse its original model, inputs, audio setting, seed, ratio, duration, and camera setting. |
metadata.content[].role | string | Conditional | A single first-frame image may omit the role or use first_frame. First/last-frame interpolation requires two image items with explicit first_frame and last_frame. Reference items use reference_image, reference_video, or reference_audio. |
Media Limits
| Media | Constraints |
|---|---|
| Image | JPEG/PNG/WebP/BMP/TIFF/GIF; 1.5 Pro and later also support HEIC/HEIF. Under 30 MB per image; each dimension 300-6000 px; aspect ratio 0.4-2.5. First-frame input uses one image; first/last-frame input uses two. |
| Video | MP4/MOV; at most 200 MB each, 24-60 fps, aspect ratio 0.4-2.5, dimensions 300-6000 px, and 407696-8295044 total pixels. 2.0: each clip 2-15 s and total at most 15 s. 2.5: each clip 2-30 s and total at most 30 s; editing input must be 4-30 s. |
| Audio | WAV/MP3; at most 15 MB each. 2.0: each clip 2-15 s and total at most 15 s. 2.5: each clip 2-30 s and total at most 30 s. |
| Request | Total JSON request size at most 64 MB, including Base64 overhead. Inputs must meet the model’s media-authorization requirements. |
Scenario Constraints
- First-frame, first/last-frame, and multimodal reference workflows are mutually exclusive. Do not mix frame roles with
reference_*roles. - Seedance 2.5 requires
ratio="adaptive"for first/last-frame input, editing, and extension. Editing requires at least one reference video lasting 4-30 seconds andduration=-1; extension requires a reference video. The optionalomni_reference_task_typecan explicitly selecteditorextendinstead of automatic classification. - Seedance 2.0 audio references require at least one image or video reference. Seedance 2.5 also supports audio-only reference input.
- Legacy versions do not support the full multimodal reference workflow. Seedance 1.0 Pro Fast supports first-frame input, not first/last-frame interpolation.
Examples
SetMIXROUTE_API_KEY before calling the API. Replace media placeholders with accessible inputs. Accepted requests create billable generation tasks; do not automatically resubmit after a submission timeout.
- Text to video
- First and last frames (2.0)
- First frame (2.5)
- Reference image and audio
- Edit video (2.5)
curl --location "https://api.mixroute.ai/v1/video/generations" \
--header "Authorization: Bearer $MIXROUTE_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"model": "dreamina-seedance-2-0-260128",
"prompt": "A professor is teaching a class in a classroom.",
"asset": false,
"metadata": {
"content": [
{
"type": "text",
"text": "A professor is teaching a class in a classroom."
}
],
"duration": 10,
"ratio": "16:9",
"resolution": "720p",
"generate_audio": false
}
}'
curl --location "https://api.mixroute.ai/v1/video/generations" \
--header "Authorization: Bearer $MIXROUTE_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"model": "dreamina-seedance-2-0-260128",
"prompt": "A professor is teaching a class in a classroom.",
"asset": true,
"metadata": {
"content": [
{
"type": "image_url",
"image_url": {
"url": "https://static.freebeatfit.com/aiImageEdit/result/L001510027166320955392/1780060289776-1.png"
},
"role": "first_frame"
},
{
"type": "image_url",
"image_url": {
"url": "https://static.freebeatfit.com/aiImageEdit/result/M1509975287180300288_0004_1780047826.png"
},
"role": "last_frame"
},
{
"type": "text",
"text": "A professor is teaching a class in a classroom."
}
],
"generate_audio": false,
"duration": 10,
"ratio": "16:9"
}
}'
curl --location "https://api.mixroute.ai/v1/video/generations" \
--header "Authorization: Bearer $MIXROUTE_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"model": "doubao-seedance-2-5-260628",
"prompt": "A professor is teaching a class in a classroom.",
"asset": true,
"metadata": {
"content": [
{
"type": "text",
"text": "A professor is teaching a class in a classroom."
},
{
"type": "image_url",
"image_url": {
"url": "https://static.freebeatfit.com/aiImageEdit/result/L001510027166320955392/1780060289776-1.png"
},
"role": "first_frame"
}
],
"ratio": "adaptive",
"duration": 5,
"resolution": "720p",
"generate_audio": false
}
}'
curl --location "https://api.mixroute.ai/v1/video/generations" \
--header "Authorization: Bearer $MIXROUTE_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"model": "dreamina-seedance-2-0-fast-260128",
"prompt": "A professor is teaching a class in a classroom.",
"asset": true,
"metadata": {
"content": [
{
"type": "text",
"text": "A professor is teaching a class in a classroom."
},
{
"type": "image_url",
"image_url": {
"url": "https://static.freebeatfit.com/aiImageEdit/result/L001510027166320955392/1780060289776-1.png"
},
"role": "reference_image"
},
{
"type": "audio_url",
"audio_url": {
"url": "https://example.com/reference.mp3"
},
"role": "reference_audio"
}
],
"duration": 10,
"ratio": "16:9",
"generate_audio": true
}
}'
curl --location "https://api.mixroute.ai/v1/video/generations" \
--header "Authorization: Bearer $MIXROUTE_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"model": "doubao-seedance-2-5-260628",
"prompt": "Change the lighting in Video 1 to sunset and preserve its camera motion.",
"asset": true,
"metadata": {
"content": [
{
"type": "text",
"text": "Change the lighting in Video 1 to sunset and preserve its camera motion."
},
{
"type": "video_url",
"video_url": {
"url": "https://example.com/source.mov"
},
"role": "reference_video"
}
],
"omni_reference_task_type": "edit",
"duration": -1,
"ratio": "adaptive",
"output_format": "mov"
}
}'
Python
import json
import os
import requests
payload = json.loads(r'''
{
"model": "dreamina-seedance-2-0-260128",
"prompt": "A professor is teaching a class in a classroom.",
"asset": false,
"metadata": {
"content": [
{
"type": "text",
"text": "A professor is teaching a class in a classroom."
}
],
"duration": 10,
"ratio": "16:9",
"resolution": "720p",
"generate_audio": false
}
}
''')
response = requests.post(
"https://api.mixroute.ai/v1/video/generations",
headers={"Authorization": "Bearer " + os.environ["MIXROUTE_API_KEY"]},
json=payload,
timeout=60,
)
response.raise_for_status()
print(response.json())