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_body
Seedance 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 | dreamina-seedance-2-5-260628 / 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 must use a concrete ratio; image-to-video defaults 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 | Default false. Draft mode is supported by Dreamina Seedance 2.5 and 1.5 Pro, using 480p. Dreamina 2.5 finalization uses 1080p; parameter reuse differs by version. Do not apply these rules to 2.0. For 1.5 Pro, Draft 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 | Successful provider Draft task ID for Dreamina Seedance 2.5 or 1.5 Pro. This is not the MixRoute polling task ID. Dreamina 2.5 Draft IDs expire after seven days. |
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())