Seedance 2.5
curl --request POST \
--url https://whollyapi.com/api/v1/jobs/createTask \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"model": "<string>",
"input": {
"prompt": "<string>",
"first_frame_url": "<string>",
"last_frame_url": "<string>",
"reference_image_urls": [
"<string>"
],
"reference_video_urls": [
"<string>"
],
"reference_audio_urls": [
"<string>"
],
"generate_audio": true,
"return_last_frame": true,
"resolution": "<string>",
"aspect_ratio": "<string>",
"duration": 123,
"output_format": "<string>",
"web_search": true
}
}
'import requests
url = "https://whollyapi.com/api/v1/jobs/createTask"
payload = {
"model": "<string>",
"input": {
"prompt": "<string>",
"first_frame_url": "<string>",
"last_frame_url": "<string>",
"reference_image_urls": ["<string>"],
"reference_video_urls": ["<string>"],
"reference_audio_urls": ["<string>"],
"generate_audio": True,
"return_last_frame": True,
"resolution": "<string>",
"aspect_ratio": "<string>",
"duration": 123,
"output_format": "<string>",
"web_search": True
}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
model: '<string>',
input: {
prompt: '<string>',
first_frame_url: '<string>',
last_frame_url: '<string>',
reference_image_urls: ['<string>'],
reference_video_urls: ['<string>'],
reference_audio_urls: ['<string>'],
generate_audio: true,
return_last_frame: true,
resolution: '<string>',
aspect_ratio: '<string>',
duration: 123,
output_format: '<string>',
web_search: true
}
})
};
fetch('https://whollyapi.com/api/v1/jobs/createTask', 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://whollyapi.com/api/v1/jobs/createTask",
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>',
'input' => [
'prompt' => '<string>',
'first_frame_url' => '<string>',
'last_frame_url' => '<string>',
'reference_image_urls' => [
'<string>'
],
'reference_video_urls' => [
'<string>'
],
'reference_audio_urls' => [
'<string>'
],
'generate_audio' => true,
'return_last_frame' => true,
'resolution' => '<string>',
'aspect_ratio' => '<string>',
'duration' => 123,
'output_format' => '<string>',
'web_search' => true
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"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://whollyapi.com/api/v1/jobs/createTask"
payload := strings.NewReader("{\n \"model\": \"<string>\",\n \"input\": {\n \"prompt\": \"<string>\",\n \"first_frame_url\": \"<string>\",\n \"last_frame_url\": \"<string>\",\n \"reference_image_urls\": [\n \"<string>\"\n ],\n \"reference_video_urls\": [\n \"<string>\"\n ],\n \"reference_audio_urls\": [\n \"<string>\"\n ],\n \"generate_audio\": true,\n \"return_last_frame\": true,\n \"resolution\": \"<string>\",\n \"aspect_ratio\": \"<string>\",\n \"duration\": 123,\n \"output_format\": \"<string>\",\n \"web_search\": true\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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://whollyapi.com/api/v1/jobs/createTask")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"model\": \"<string>\",\n \"input\": {\n \"prompt\": \"<string>\",\n \"first_frame_url\": \"<string>\",\n \"last_frame_url\": \"<string>\",\n \"reference_image_urls\": [\n \"<string>\"\n ],\n \"reference_video_urls\": [\n \"<string>\"\n ],\n \"reference_audio_urls\": [\n \"<string>\"\n ],\n \"generate_audio\": true,\n \"return_last_frame\": true,\n \"resolution\": \"<string>\",\n \"aspect_ratio\": \"<string>\",\n \"duration\": 123,\n \"output_format\": \"<string>\",\n \"web_search\": true\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://whollyapi.com/api/v1/jobs/createTask")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"model\": \"<string>\",\n \"input\": {\n \"prompt\": \"<string>\",\n \"first_frame_url\": \"<string>\",\n \"last_frame_url\": \"<string>\",\n \"reference_image_urls\": [\n \"<string>\"\n ],\n \"reference_video_urls\": [\n \"<string>\"\n ],\n \"reference_audio_urls\": [\n \"<string>\"\n ],\n \"generate_audio\": true,\n \"return_last_frame\": true,\n \"resolution\": \"<string>\",\n \"aspect_ratio\": \"<string>\",\n \"duration\": 123,\n \"output_format\": \"<string>\",\n \"web_search\": true\n }\n}"
response = http.request(request)
puts response.read_body{
"code": 123,
"msg": "<string>",
"data": {
"taskId": "<string>"
}
}Bytedance
Seedance 2.5
Generate videos using the Bytedance Seedance 2.5 model.
POST
/
api
/
v1
/
jobs
/
createTask
Seedance 2.5
curl --request POST \
--url https://whollyapi.com/api/v1/jobs/createTask \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"model": "<string>",
"input": {
"prompt": "<string>",
"first_frame_url": "<string>",
"last_frame_url": "<string>",
"reference_image_urls": [
"<string>"
],
"reference_video_urls": [
"<string>"
],
"reference_audio_urls": [
"<string>"
],
"generate_audio": true,
"return_last_frame": true,
"resolution": "<string>",
"aspect_ratio": "<string>",
"duration": 123,
"output_format": "<string>",
"web_search": true
}
}
'import requests
url = "https://whollyapi.com/api/v1/jobs/createTask"
payload = {
"model": "<string>",
"input": {
"prompt": "<string>",
"first_frame_url": "<string>",
"last_frame_url": "<string>",
"reference_image_urls": ["<string>"],
"reference_video_urls": ["<string>"],
"reference_audio_urls": ["<string>"],
"generate_audio": True,
"return_last_frame": True,
"resolution": "<string>",
"aspect_ratio": "<string>",
"duration": 123,
"output_format": "<string>",
"web_search": True
}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
model: '<string>',
input: {
prompt: '<string>',
first_frame_url: '<string>',
last_frame_url: '<string>',
reference_image_urls: ['<string>'],
reference_video_urls: ['<string>'],
reference_audio_urls: ['<string>'],
generate_audio: true,
return_last_frame: true,
resolution: '<string>',
aspect_ratio: '<string>',
duration: 123,
output_format: '<string>',
web_search: true
}
})
};
fetch('https://whollyapi.com/api/v1/jobs/createTask', 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://whollyapi.com/api/v1/jobs/createTask",
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>',
'input' => [
'prompt' => '<string>',
'first_frame_url' => '<string>',
'last_frame_url' => '<string>',
'reference_image_urls' => [
'<string>'
],
'reference_video_urls' => [
'<string>'
],
'reference_audio_urls' => [
'<string>'
],
'generate_audio' => true,
'return_last_frame' => true,
'resolution' => '<string>',
'aspect_ratio' => '<string>',
'duration' => 123,
'output_format' => '<string>',
'web_search' => true
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"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://whollyapi.com/api/v1/jobs/createTask"
payload := strings.NewReader("{\n \"model\": \"<string>\",\n \"input\": {\n \"prompt\": \"<string>\",\n \"first_frame_url\": \"<string>\",\n \"last_frame_url\": \"<string>\",\n \"reference_image_urls\": [\n \"<string>\"\n ],\n \"reference_video_urls\": [\n \"<string>\"\n ],\n \"reference_audio_urls\": [\n \"<string>\"\n ],\n \"generate_audio\": true,\n \"return_last_frame\": true,\n \"resolution\": \"<string>\",\n \"aspect_ratio\": \"<string>\",\n \"duration\": 123,\n \"output_format\": \"<string>\",\n \"web_search\": true\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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://whollyapi.com/api/v1/jobs/createTask")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"model\": \"<string>\",\n \"input\": {\n \"prompt\": \"<string>\",\n \"first_frame_url\": \"<string>\",\n \"last_frame_url\": \"<string>\",\n \"reference_image_urls\": [\n \"<string>\"\n ],\n \"reference_video_urls\": [\n \"<string>\"\n ],\n \"reference_audio_urls\": [\n \"<string>\"\n ],\n \"generate_audio\": true,\n \"return_last_frame\": true,\n \"resolution\": \"<string>\",\n \"aspect_ratio\": \"<string>\",\n \"duration\": 123,\n \"output_format\": \"<string>\",\n \"web_search\": true\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://whollyapi.com/api/v1/jobs/createTask")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"model\": \"<string>\",\n \"input\": {\n \"prompt\": \"<string>\",\n \"first_frame_url\": \"<string>\",\n \"last_frame_url\": \"<string>\",\n \"reference_image_urls\": [\n \"<string>\"\n ],\n \"reference_video_urls\": [\n \"<string>\"\n ],\n \"reference_audio_urls\": [\n \"<string>\"\n ],\n \"generate_audio\": true,\n \"return_last_frame\": true,\n \"resolution\": \"<string>\",\n \"aspect_ratio\": \"<string>\",\n \"duration\": 123,\n \"output_format\": \"<string>\",\n \"web_search\": true\n }\n}"
response = http.request(request)
puts response.read_body{
"code": 123,
"msg": "<string>",
"data": {
"taskId": "<string>"
}
}Endpoint
POST /api/v1/jobs/createTask
Authentication
All API requests require a Bearer Token.Authorization: Bearer YOUR_API_KEY
Important Notes
- Image-to-Video (First Frame) and Image-to-Video (First & Last Frames) are mutually exclusive scenarios and cannot be used simultaneously.
Request Body
The request body must be JSON.Top-level parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
model | string | Yes | bytedance/seedance-2-5 | Model name. Must be bytedance/seedance-2-5. |
input | object | Yes | — | Input parameters for the generation task. |
string
required
Must be
bytedance/seedance-2-5.object
required
Input Parameters
Theinput object contains the parameters used to generate the video.string
Use
prompt to describe the video you want to generate.Maximum length: 30000 characters.string
Provide the URL of the image to be used as the first frame for video generation. The value must be an uploaded file URL, not the file content itself.Cannot be used simultaneously with reference_image_urls, reference_video_urls, or reference_audio_urls.
string
Provide the URL of the image to be used as the last frame for video generation. The value must be an uploaded file URL, not the file content itself.
last_frame_url cannot be passed alone; first_frame_url must be provided together with it.string[]
Enter the URL(s) of the reference image(s) to be used for video generation.Supported image formats:
Maximum number of files: The sum of the number of frames at the beginning and end must not exceed
Width and height (px):
Aspect ratio (width/height):
jpegpngwebpbmptiffgif
30 MB Maximum number of files: The sum of the number of frames at the beginning and end must not exceed
30. Width and height (px):
(300, 6000) Aspect ratio (width/height):
0.4 to 2.5string[]
Enter the URL(s) of the reference video(s) to be used for video generation.Maximum reference videos :
Single video requirements
Supported image formats:
Width and height (px):
Aspect ratio (width/height):
Frame rate (FPS): [24, 60]
Total pixels: [640×640=409600, 834×1112=927408]
10 Single video requirements
Supported image formats:
mp4mov
480p720p
- For single video duration beetween
2and30. - Total duration of all videos not exceeding
30seconds.
200 MB. Width and height (px):
(300, 6000) Aspect ratio (width/height):
0.4 to 2.5 Frame rate (FPS): [24, 60]
Total pixels: [640×640=409600, 834×1112=927408]
string[]
Enter the URL(s) of the reference audio(s) to be used for video generation.Maximum reference audios :
Single audio requirements
Supported audio formats:
10 Single audio requirements
Supported audio formats:
wavmp3
- For single audio duration beetween
2and30. - Total duration of all audios not exceeding
30seconds.
15 MB.boolean
default:"true"
Whether to generate audio.Default:
trueNote: Enabling audio will increase the generation costboolean
default:"false"
Whether to return the last frame of the video.Default:
falsestring
Specify the resolution of the generated video.Supported values:
480p720p1080p
720pstring
default:"adaptive"
Video aspect ratio configuration.Supported values:
3:4, 4:3, 1:1, 16:9, 9:16, 21:9, adaptive. Default: adaptivenumber
Generated video duration in seconds.Special value:
Pass
Supported range:
Special value: -1
Pass -1 for automatic duration selection — the model picks a suitable duration itself:- For video-editing tasks, it matches the input video’s length.
- For other task types, it selects a duration within the valid range.
integer Supported range:
4–30, in one-second steps. Default: 5string
default:"mp4"
Use
output_format for the generated output video.Supported formats: Default: mp4boolean
default:"false"
Use online search. Only available for text-to-video.Default:
falseExample Request
{
"model": "bytedance/seedance-2-5",
"input": {
"prompt": "A serene beach at sunset with waves gently crashing on the shore, palm trees swaying in the breeze, and seagulls flying across the orange sky",
"first_frame_url": "https://demo.com/example2.png",
"last_frame_url": "https://demo.com/example3.png",
"reference_image_urls": [
"https://demo.com/example1.png"
],
"reference_video_urls": [
"https://demo.com/example1.mp4"
],
"reference_audio_urls": [
"https://demo.com/example1.mp3"
],
"return_last_frame": false,
"generate_audio": false,
"resolution": "720p",
"aspect_ratio": "16:9",
"duration": 15,
"web_search": false
}
}
Response
Successful Response
number
Response status code.
string
Response message. Contains the error description when the request fails.Example:
successobject
required
The task data object containing task id.
string
required
The unique identifier for this task.Example:
task_123456Query Task Status
After submitting a task, use the unified query endpoint to check the task progress and retrieve the generated results.Get Task Details
Check task status, monitor generation progress, and retrieve results.
Error Response
{
"code": 500,
"msg": "Server Error - An unexpected error occurred while processing the request",
"data": null
}
Response Codes
| Code | Meaning |
|---|---|
200 | Success — the request was successfully processed. |
401 | Unauthorized — authentication credentials are missing or invalid. |
402 | Insufficient Credits — the account does not have enough credits. |
404 | Not Found — the requested resource or interface does not exist. |
408 | Upstream service issue — no result has been returned for over 10 minutes. |
422 | Validation Error — request parameters failed validation. |
429 | Rate Limited — request frequency limit has been exceeded. |
433 | Request Limit — sub-key usage exceeded the limit. |
455 | Service Unavailable — system is undergoing maintenance. |
500 | Server Error — an unexpected error occurred while processing the request. |
501 | Generation Failed — content generation failed. |
505 | Feature Disabled — the requested feature is disabled. |
