seedance-2.5-ext Video Generation
curl --request POST \
--url https://toapis.com/v1/videos/generations \
--header 'Authorization: <authorization>' \
--header 'Content-Type: application/json' \
--data '
{
"model": "<string>",
"prompt": "<string>",
"seconds": 123,
"size": "<string>",
"resolution": "<string>",
"reference_image": "<string>",
"reference_images": [
"<string>"
],
"video_with_roles": [
{}
],
"audio_with_roles": [
{}
],
"callback_url": "<string>",
"client_business_id": "<string>",
"trace_id": "<string>"
}
'import requests
url = "https://toapis.com/v1/videos/generations"
payload = {
"model": "<string>",
"prompt": "<string>",
"seconds": 123,
"size": "<string>",
"resolution": "<string>",
"reference_image": "<string>",
"reference_images": ["<string>"],
"video_with_roles": [{}],
"audio_with_roles": [{}],
"callback_url": "<string>",
"client_business_id": "<string>",
"trace_id": "<string>"
}
headers = {
"Authorization": "<authorization>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: '<authorization>', 'Content-Type': 'application/json'},
body: JSON.stringify({
model: '<string>',
prompt: '<string>',
seconds: 123,
size: '<string>',
resolution: '<string>',
reference_image: '<string>',
reference_images: ['<string>'],
video_with_roles: [{}],
audio_with_roles: [{}],
callback_url: '<string>',
client_business_id: '<string>',
trace_id: '<string>'
})
};
fetch('https://toapis.com/v1/videos/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://toapis.com/v1/videos/generations",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'model' => '<string>',
'prompt' => '<string>',
'seconds' => 123,
'size' => '<string>',
'resolution' => '<string>',
'reference_image' => '<string>',
'reference_images' => [
'<string>'
],
'video_with_roles' => [
[
]
],
'audio_with_roles' => [
[
]
],
'callback_url' => '<string>',
'client_business_id' => '<string>',
'trace_id' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: <authorization>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://toapis.com/v1/videos/generations"
payload := strings.NewReader("{\n \"model\": \"<string>\",\n \"prompt\": \"<string>\",\n \"seconds\": 123,\n \"size\": \"<string>\",\n \"resolution\": \"<string>\",\n \"reference_image\": \"<string>\",\n \"reference_images\": [\n \"<string>\"\n ],\n \"video_with_roles\": [\n {}\n ],\n \"audio_with_roles\": [\n {}\n ],\n \"callback_url\": \"<string>\",\n \"client_business_id\": \"<string>\",\n \"trace_id\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "<authorization>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://toapis.com/v1/videos/generations")
.header("Authorization", "<authorization>")
.header("Content-Type", "application/json")
.body("{\n \"model\": \"<string>\",\n \"prompt\": \"<string>\",\n \"seconds\": 123,\n \"size\": \"<string>\",\n \"resolution\": \"<string>\",\n \"reference_image\": \"<string>\",\n \"reference_images\": [\n \"<string>\"\n ],\n \"video_with_roles\": [\n {}\n ],\n \"audio_with_roles\": [\n {}\n ],\n \"callback_url\": \"<string>\",\n \"client_business_id\": \"<string>\",\n \"trace_id\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://toapis.com/v1/videos/generations")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = '<authorization>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"model\": \"<string>\",\n \"prompt\": \"<string>\",\n \"seconds\": 123,\n \"size\": \"<string>\",\n \"resolution\": \"<string>\",\n \"reference_image\": \"<string>\",\n \"reference_images\": [\n \"<string>\"\n ],\n \"video_with_roles\": [\n {}\n ],\n \"audio_with_roles\": [\n {}\n ],\n \"callback_url\": \"<string>\",\n \"client_business_id\": \"<string>\",\n \"trace_id\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"id": "tsk_vid_xxx",
"object": "generation.task",
"model": "seedance-2.5-ext",
"status": "in_progress",
"progress": 10,
"created_at": 1781577600
}
seedance-ext
seedance-2.5-ext Video Generation
Generate videos with the seedance-2.5-ext model, supporting reference images, reference videos, and reference audios
POST
/
v1
/
videos
/
generations
seedance-2.5-ext Video Generation
curl --request POST \
--url https://toapis.com/v1/videos/generations \
--header 'Authorization: <authorization>' \
--header 'Content-Type: application/json' \
--data '
{
"model": "<string>",
"prompt": "<string>",
"seconds": 123,
"size": "<string>",
"resolution": "<string>",
"reference_image": "<string>",
"reference_images": [
"<string>"
],
"video_with_roles": [
{}
],
"audio_with_roles": [
{}
],
"callback_url": "<string>",
"client_business_id": "<string>",
"trace_id": "<string>"
}
'import requests
url = "https://toapis.com/v1/videos/generations"
payload = {
"model": "<string>",
"prompt": "<string>",
"seconds": 123,
"size": "<string>",
"resolution": "<string>",
"reference_image": "<string>",
"reference_images": ["<string>"],
"video_with_roles": [{}],
"audio_with_roles": [{}],
"callback_url": "<string>",
"client_business_id": "<string>",
"trace_id": "<string>"
}
headers = {
"Authorization": "<authorization>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: '<authorization>', 'Content-Type': 'application/json'},
body: JSON.stringify({
model: '<string>',
prompt: '<string>',
seconds: 123,
size: '<string>',
resolution: '<string>',
reference_image: '<string>',
reference_images: ['<string>'],
video_with_roles: [{}],
audio_with_roles: [{}],
callback_url: '<string>',
client_business_id: '<string>',
trace_id: '<string>'
})
};
fetch('https://toapis.com/v1/videos/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://toapis.com/v1/videos/generations",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'model' => '<string>',
'prompt' => '<string>',
'seconds' => 123,
'size' => '<string>',
'resolution' => '<string>',
'reference_image' => '<string>',
'reference_images' => [
'<string>'
],
'video_with_roles' => [
[
]
],
'audio_with_roles' => [
[
]
],
'callback_url' => '<string>',
'client_business_id' => '<string>',
'trace_id' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: <authorization>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://toapis.com/v1/videos/generations"
payload := strings.NewReader("{\n \"model\": \"<string>\",\n \"prompt\": \"<string>\",\n \"seconds\": 123,\n \"size\": \"<string>\",\n \"resolution\": \"<string>\",\n \"reference_image\": \"<string>\",\n \"reference_images\": [\n \"<string>\"\n ],\n \"video_with_roles\": [\n {}\n ],\n \"audio_with_roles\": [\n {}\n ],\n \"callback_url\": \"<string>\",\n \"client_business_id\": \"<string>\",\n \"trace_id\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "<authorization>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://toapis.com/v1/videos/generations")
.header("Authorization", "<authorization>")
.header("Content-Type", "application/json")
.body("{\n \"model\": \"<string>\",\n \"prompt\": \"<string>\",\n \"seconds\": 123,\n \"size\": \"<string>\",\n \"resolution\": \"<string>\",\n \"reference_image\": \"<string>\",\n \"reference_images\": [\n \"<string>\"\n ],\n \"video_with_roles\": [\n {}\n ],\n \"audio_with_roles\": [\n {}\n ],\n \"callback_url\": \"<string>\",\n \"client_business_id\": \"<string>\",\n \"trace_id\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://toapis.com/v1/videos/generations")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = '<authorization>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"model\": \"<string>\",\n \"prompt\": \"<string>\",\n \"seconds\": 123,\n \"size\": \"<string>\",\n \"resolution\": \"<string>\",\n \"reference_image\": \"<string>\",\n \"reference_images\": [\n \"<string>\"\n ],\n \"video_with_roles\": [\n {}\n ],\n \"audio_with_roles\": [\n {}\n ],\n \"callback_url\": \"<string>\",\n \"client_business_id\": \"<string>\",\n \"trace_id\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"id": "tsk_vid_xxx",
"object": "generation.task",
"model": "seedance-2.5-ext",
"status": "in_progress",
"progress": 10,
"created_at": 1781577600
}
seedance-2.5-ext is the promotional-channel model in the Seedance 2.5 family, supporting text-to-video and multimodal reference generation:
- Text-to-video and reference-image generation
- Combined generation with reference videos and reference audios (video editing, extension, and first/last-frame modes are not supported)
- The API is asynchronous: submitting returns a
generation.task; fetch results via the video task status endpoint.
Authentication
string
required
All requests require a Bearer Token. Get your key from the API Key management page and add it to the request header:
Authorization: Bearer YOUR_API_KEY
Body
string
default:"seedance-2.5-ext"
required
ToAPIs public model name. Always use
seedance-2.5-ext.string
Describe the scene, camera movement, subject actions, style, and sound atmosphere. When referencing assets, use tags like “image 1”, “video 1”, or “audio 1” in array order.
integer
Output video duration in seconds, from
10 to 30. The compatible field duration is also accepted; do not pass both.15 seconds is not supported when the request carries reference videos, reference audios, or more than 10 reference images. Text-only requests and requests with at most 10 images are unaffected.string
Output aspect ratio. Supported:
16:9, 9:16, 4:3, 3:4, 1:1. The compatible field aspect_ratio is also accepted.string
default:"720p"
Output resolution. Fixed to
720p.string
Public URL of a single reference image. For multiple images use
reference_images.string[]
Array of reference image URLs, up to
30. You can also use image_with_roles with role set to reference_image.object[]
Array of reference videos, up to
10. Each item contains:url: publicly accessible video URLrole: fixed toreference_video
object[]
Array of reference audios, up to
10. Each item contains:url: publicly accessible audio URLrole: fixed toreference_audio
string
ToAPIs task completion callback URL. See Task Webhooks.
string
Your order number or business task ID. Stored with the task; you can also query it via
GET /v1/videos/generations/{client_business_id}.string
Custom trace ID for request tracking.
Media Combination Rules
| Request content | Supported | Notes |
|---|---|---|
| Prompt only | Yes | Text-to-video |
| Up to 10 reference images | Yes | Low-cost upstream |
| 11–30 reference images | Yes | 15 seconds not supported |
| Reference video / reference audio | Yes | 15 seconds not supported; audio requires at least one image or video |
| First / last frame | No | Frame mode is not supported |
| Video edit / extend | No | Use seedance-2-5 instead |
Request Examples
Text-to-Video
curl --request POST \
--url https://toapis.com/v1/videos/generations \
--header 'Authorization: Bearer YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"model": "seedance-2.5-ext",
"prompt": "Cinematic product close-up, camera slowly pushing in, natural indoor ambience.",
"seconds": 10,
"size": "16:9",
"resolution": "720p"
}'
Reference Image
curl --request POST \
--url https://toapis.com/v1/videos/generations \
--header 'Authorization: Bearer YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"model": "seedance-2.5-ext",
"prompt": "The person in image 1 walks into a rainy night street, camera follows.",
"seconds": 12,
"size": "9:16",
"reference_images": [
"https://example.com/character.png"
]
}'
Video and Audio Combined Reference
curl --request POST \
--url https://toapis.com/v1/videos/generations \
--header 'Authorization: Bearer YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"model": "seedance-2.5-ext",
"prompt": "Use the character in image 1, the camera movement in video 1, and the rhythm of audio 1.",
"seconds": 14,
"size": "16:9",
"reference_images": [
"https://example.com/character.png"
],
"video_with_roles": [
{"url": "https://example.com/motion.mp4", "role": "reference_video"}
],
"audio_with_roles": [
{"url": "https://example.com/rhythm.mp3", "role": "reference_audio"}
]
}'
Response
string
Task ID for status queries.
string
Returned when provided in the request.
string
Fixed to
generation.task.string
The model used for this request.
string
queued, in_progress, completed, or failed.integer
Task progress from
0 to 100.integer
Creation timestamp.
{
"id": "tsk_vid_xxx",
"object": "generation.task",
"model": "seedance-2.5-ext",
"status": "in_progress",
"progress": 10,
"created_at": 1781577600
}