Seedance 2.0 API
Seedance 2.0 video by ByteDance with sound: from a description, from the first and last frames or from references, up to 15 seconds. References can be photos, videos and audio. Your own video can be edited with a description, and on Channel 2 also extended forward or backward. The only Seedance version with 4K. Two channels: the usual one and a usually cheaper one.
For AI assistants:Download .mdAll documentation .mdOpen as text
Connect in three steps
- Get a keyCreate a key in the dashboard after you confirm your email. One key opens every model.
- Check the pricePOST /v1/price shows the cost of a run in advance, without charging you.
- Run a task and collect the resultPOST /v1/tasks starts a task, GET /v1/tasks/{id} shows its status and files.
Ready-to-use code
Replace YOUR_API_KEY with your key. The code starts a task and waits for the result. In cURL, repeat the second request with the id from the first response instead of TASK_ID until status becomes succeeded.
curl -X POST "https://api.cyhub.ai/v1/tasks" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
--data '{
"model": "seedance",
"settings": {
"mode": "text_to_video",
"prompt": "Кот в очках играет на баяне на летней веранде, камера медленно наезжает",
"model": "seedance_2",
"quality": "720p",
"duration": 8,
"aspect_ratio": "16:9"
}
}'
curl "https://api.cyhub.ai/v1/tasks/TASK_ID" \
-H "Authorization: Bearer YOUR_API_KEY"import time
import requests
API = "https://api.cyhub.ai/v1"
HEADERS = {"Authorization": "Bearer YOUR_API_KEY"}
body = {
"model": "seedance",
"settings": {
"mode": "text_to_video",
"prompt": "Кот в очках играет на баяне на летней веранде, камера медленно наезжает",
"model": "seedance_2",
"quality": "720p",
"duration": 8,
"aspect_ratio": "16:9",
},
}
response = requests.post(f"{API}/tasks", json=body, headers=HEADERS, timeout=60)
response.raise_for_status()
task = response.json()
while task["status"] in ("queued", "running"):
time.sleep(5)
task = requests.get(f"{API}/tasks/{task['id']}", headers=HEADERS, timeout=30).json()
print(task["status"], task["result"])const API = "https://api.cyhub.ai/v1";
const HEADERS = { Authorization: "Bearer YOUR_API_KEY", "Content-Type": "application/json" };
const body = {
"model": "seedance",
"settings": {
"mode": "text_to_video",
"prompt": "Кот в очках играет на баяне на летней веранде, камера медленно наезжает",
"model": "seedance_2",
"quality": "720p",
"duration": 8,
"aspect_ratio": "16:9"
}
};
async function main() {
let response = await fetch(`${API}/tasks`, { method: "POST", headers: HEADERS, body: JSON.stringify(body) });
if (!response.ok) throw new Error(await response.text());
let task = await response.json();
while (task.status === "queued" || task.status === "running") {
await new Promise((resolve) => setTimeout(resolve, 5000));
response = await fetch(`${API}/tasks/${task.id}`, { headers: HEADERS });
task = await response.json();
}
console.log(task.status, task.result);
}
main();Price before the run
Prices as of 15.10.2026: from 39 ₽. POST /v1/price shows the exact price of your settings.
| Mode | Price |
|---|---|
| From a description | from 39 ₽ |
| From frames | from 41 ₽ |
| From references with a 2 s file | from 39 ₽ |
| Video edit with a 4 s file | from 50 ₽ |
| Video extension with a 2 s file | from 44 ₽ |
Send the same settings to POST /v1/price: the response shows the price of the run without charging you.
curl -X POST "https://api.cyhub.ai/v1/price" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
--data '{
"model": "seedance",
"settings": {
"mode": "text_to_video",
"prompt": "Кот в очках играет на баяне на летней веранде, камера медленно наезжает",
"model": "seedance_2",
"quality": "720p",
"duration": 8,
"aspect_ratio": "16:9"
}
}'amount_minor: the price of the run in minor units (kopecks for rubles)currency: the wallet currencyavailable_minor: how much your balance has for new tasks right now
Modes
Each mode has its own parameters and examples. The mode is set by the mode field.
- From a description
mode = text_to_video - From frames
mode = image_to_video - From references
mode = multimodal - Video edit
mode = video_edit - Video extension
mode = video_extend
From a description
A video from text alone, no files are sent.
Value of the mode field: text_to_video
This page is about Seedance 2.0: send model = seedance_2. Without the model field the task runs on seedance_2_5.
Price in this mode from 39 ₽.
Parameters
Model parameters go inside settings. Omitted optional fields take their default values.
promptRequiredWhat happens in the video: 3 to 20,000 characters, several languages are supported.
Type: StringMinimum characters: 1Maximum characters: 20000modelOptionalVersion. 2.5 is the newest and makes clips up to 30 seconds, Pro 2.0 is the only one with 4K, Fast 2.0 is fast, Mini 2.0 is the cheapest.
Type: StringAllowed values:seedance_2Default:"seedance_2_5"qualityOptionalVideo quality; the price depends on it. 1080p is available in 2.5 and Pro 2.0, 4K only in Pro 2.0. A draft is always 480p, this field does not apply to it.
Type: StringAllowed values:480p720p1080p4kDefault:"720p"durationOptionalVideo length in seconds: 4 to 30 in version 2.5, up to 15 in the 2.0 family. The price is per second.
Type: IntegerMinimum: 4Maximum: 30Default:5generate_audioOptionalGenerate sound together with the video.
Type: BooleanDefault:truechannelOptionalWhich channel the generation goes through: the model is the same, the price and the checks differ. Channel 1 is the usual one and accepts photos of people. Channel 2 is usually cheaper, but it rejects photos of real people and prohibited subjects, and it has no online search. With a video as input Channel 2 has a price floor that grows with the length of the clip, so with a short video it can cost more. A refusal of a channel is not charged.
Type: StringAllowed values:channel_1channel_2Default:"channel_1"draftOptionalDraft: a low-cost 480p clip to check the scene, motion and sound before paying for high quality. It costs as much as a regular 480p clip, and quality does not apply to it. Only version 2.5 on Channel 2 has drafts: with another version or channel the task is not accepted. If you like the draft, it can be rebuilt once in 1080p with the upscale_draft mode within 7 days after it was made: the scene, motion and sound stay the same, and the rebuild costs as much as a regular 1080p clip.
Type: BooleanDefault:falseaspect_ratioOptionalAspect ratio. adaptive is available only in version 2.5: the model picks the shape itself from the description.
Type: StringAllowed values:16:99:161:14:33:421:9Default:"16:9"web_searchOptionalOnline search: the model pulls up-to-date information from the internet. Channel 1 only.
Type: BooleanDefault:false
Parameters not listed here are not accepted: the response is 422 unknown_setting.
The API sets these settings itself, do not send them: files_as_is = true
Input
Request example
Send this JSON to POST /v1/tasks with your API key. To check the price first, send the same JSON to POST /v1/price.
A video from a description
{
"model": "seedance",
"settings": {
"mode": "text_to_video",
"prompt": "Кот в очках играет на баяне на летней веранде, камера медленно наезжает",
"model": "seedance_2",
"quality": "720p",
"duration": 8,
"aspect_ratio": "16:9"
}
}The price is calculated when the task is accepted, currency RUB.
Output
- MP4 video.
- Generation usually takes a few minutes, longer for long clips and high quality.
- With draft: true you get a 480p draft. Such a task has a draft field: until when it can be rebuilt in 1080p, whether it can be rebuilt now and a ready request for the rebuild.
| Kind | Formats | How many | Note |
|---|---|---|---|
video | mp4 | 1 |
A finished task as GET /v1/tasks/{id} returns it (some fields left out). The caption may sit on the task or on a single file and may be empty; the model picks the file name.
{
"id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"status": "succeeded",
"finished_at": "2026-10-01T12:03:41+00:00",
"result": {
"caption": "Caption of the result: the model and its settings",
"texts": [],
"files_expire_at": "2026-10-08T12:03:41+00:00",
"files_expired": false,
"artifacts": [
{
"index": 0,
"kind": "video",
"filename": "video.mp4",
"size": 12582912,
"caption": "",
"download_path": "/v1/tasks/7c9e6679-7425-40de-944b-e07fc1f90ae7/artifacts/0"
}
]
}
}From frames
The first frame, or the first and the last one: the model animates them by the description.
Value of the mode field: image_to_video
This page is about Seedance 2.0: send model = seedance_2. Without the model field the task runs on seedance_2_5.
Price in this mode from 41 ₽.
Parameters
Model parameters go inside settings. Omitted optional fields take their default values.
promptRequiredWhat happens in the video: 3 to 20,000 characters, several languages are supported.
Type: StringMinimum characters: 1Maximum characters: 20000modelOptionalVersion. 2.5 is the newest and makes clips up to 30 seconds, Pro 2.0 is the only one with 4K, Fast 2.0 is fast, Mini 2.0 is the cheapest.
Type: StringAllowed values:seedance_2Default:"seedance_2_5"qualityOptionalVideo quality; the price depends on it. 1080p is available in 2.5 and Pro 2.0, 4K only in Pro 2.0. A draft is always 480p, this field does not apply to it.
Type: StringAllowed values:480p720p1080p4kDefault:"720p"durationOptionalVideo length in seconds: 4 to 30 in version 2.5, up to 15 in the 2.0 family. The price is per second.
Type: IntegerMinimum: 4Maximum: 30Default:5generate_audioOptionalGenerate sound together with the video.
Type: BooleanDefault:truechannelOptionalWhich channel the generation goes through: the model is the same, the price and the checks differ. Channel 1 is the usual one and accepts photos of people. Channel 2 is usually cheaper, but it rejects photos of real people and prohibited subjects, and it has no online search. With a video as input Channel 2 has a price floor that grows with the length of the clip, so with a short video it can cost more. A refusal of a channel is not charged.
Type: StringAllowed values:channel_1channel_2Default:"channel_1"draftOptionalDraft: a low-cost 480p clip to check the scene, motion and sound before paying for high quality. It costs as much as a regular 480p clip, and quality does not apply to it. Only version 2.5 on Channel 2 has drafts: with another version or channel the task is not accepted. If you like the draft, it can be rebuilt once in 1080p with the upscale_draft mode within 7 days after it was made: the scene, motion and sound stay the same, and the rebuild costs as much as a regular 1080p clip.
Type: BooleanDefault:falseimage_urlsRequiredOne URL: the first frame. Two URLs: the first and the last frames.
Type: List (String, uri)Maximum items: 2aspect_ratioOptionalAspect ratio; it only works in the 2.0 family on Channel 1. In version 2.5, and in every version on Channel 2, the first frame sets the video size and the chosen value is ignored: version 2.5 has a single choice here, adaptive.
Type: StringAllowed values:16:99:161:14:33:421:9Default:"16:9"
Parameters not listed here are not accepted: the response is 422 unknown_setting.
The API sets these settings itself, do not send them: files_as_is = true
Input
- Pictures are URLs of JPEG, PNG, WEBP, BMP, TIFF, GIF files up to 30 MB each, sides from 300 to 6,000 pixels.
- On Channel 2 the frame sets the video size in every version.
| Field | Accepts | Formats | Files | File size up to |
|---|---|---|---|---|
image_urls | Images | jpeg, jpg, png, webp, bmp, tiff, gif | 2 | 30 MB |
Request example
Send this JSON to POST /v1/tasks with your API key. To check the price first, send the same JSON to POST /v1/price.
From the first frame to the last
{
"model": "seedance",
"settings": {
"mode": "image_to_video",
"prompt": "Бутон медленно раскрывается в цветок, мягкий утренний свет",
"model": "seedance_2",
"quality": "1080p",
"aspect_ratio": "9:16",
"image_urls": [
"https://example.com/bud.jpg",
"https://example.com/flower.jpg"
]
}
}The price is calculated when the task is accepted, currency RUB.
Output
- MP4 video.
- Generation usually takes a few minutes, longer for long clips and high quality.
- With draft: true you get a 480p draft. Such a task has a draft field: until when it can be rebuilt in 1080p, whether it can be rebuilt now and a ready request for the rebuild.
| Kind | Formats | How many | Note |
|---|---|---|---|
video | mp4 | 1 |
A finished task as GET /v1/tasks/{id} returns it (some fields left out). The caption may sit on the task or on a single file and may be empty; the model picks the file name.
{
"id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"status": "succeeded",
"finished_at": "2026-10-01T12:03:41+00:00",
"result": {
"caption": "Caption of the result: the model and its settings",
"texts": [],
"files_expire_at": "2026-10-08T12:03:41+00:00",
"files_expired": false,
"artifacts": [
{
"index": 0,
"kind": "video",
"filename": "video.mp4",
"size": 12582912,
"caption": "",
"download_path": "/v1/tasks/7c9e6679-7425-40de-944b-e07fc1f90ae7/artifacts/0"
}
]
}
}From references
Characters, style, motion and sound from your photos, videos and audio in a new clip. At least one photo or video is needed.
Value of the mode field: multimodal
This page is about Seedance 2.0: send model = seedance_2. Without the model field the task runs on seedance_2_5.
Price in this mode from 39 ₽, with a 2 s file.
Parameters
Model parameters go inside settings. Omitted optional fields take their default values.
promptRequiredWhat happens in the video: 3 to 20,000 characters, several languages are supported.
Type: StringMinimum characters: 1Maximum characters: 20000modelOptionalVersion. 2.5 is the newest and makes clips up to 30 seconds, Pro 2.0 is the only one with 4K, Fast 2.0 is fast, Mini 2.0 is the cheapest.
Type: StringAllowed values:seedance_2Default:"seedance_2_5"qualityOptionalVideo quality; the price depends on it. 1080p is available in 2.5 and Pro 2.0, 4K only in Pro 2.0. A draft is always 480p, this field does not apply to it.
Type: StringAllowed values:480p720p1080p4kDefault:"720p"durationOptionalVideo length in seconds: 4 to 30 in version 2.5, up to 15 in the 2.0 family. The price is per second.
Type: IntegerMinimum: 4Maximum: 30Default:5generate_audioOptionalGenerate sound together with the video.
Type: BooleanDefault:truechannelOptionalWhich channel the generation goes through: the model is the same, the price and the checks differ. Channel 1 is the usual one and accepts photos of people. Channel 2 is usually cheaper, but it rejects photos of real people and prohibited subjects, and it has no online search. With a video as input Channel 2 has a price floor that grows with the length of the clip, so with a short video it can cost more. A refusal of a channel is not charged.
Type: StringAllowed values:channel_1channel_2Default:"channel_1"draftOptionalDraft: a low-cost 480p clip to check the scene, motion and sound before paying for high quality. It costs as much as a regular 480p clip, and quality does not apply to it. Only version 2.5 on Channel 2 has drafts: with another version or channel the task is not accepted. If you like the draft, it can be rebuilt once in 1080p with the upscale_draft mode within 7 days after it was made: the scene, motion and sound stay the same, and the rebuild costs as much as a regular 1080p clip.
Type: BooleanDefault:falseaspect_ratioOptionalAspect ratio. adaptive is available only in version 2.5: the model picks the shape itself from the description and the references. On Channel 2 with reference videos this happens in every version, and the chosen value is ignored.
Type: StringAllowed values:16:99:161:14:33:421:9Default:"16:9"image_urlsOptionalPhoto reference URLs: up to 30 in version 2.5, up to 9 in the 2.0 family.
Type: List (String, uri)Maximum items: 30video_urlsOptionalVideo reference URLs: up to 10 in version 2.5, up to 3 in the 2.0 family. Each video goes to the model whole, and its seconds are added to the price.
Type: List (String, uri)Maximum items: 10audio_urlsOptionalAudio reference URLs: up to 10 in version 2.5, up to 3 in the 2.0 family. Audio only together with a photo or a video.
Type: List (String, uri)Maximum items: 10
Parameters not listed here are not accepted: the response is 422 unknown_setting.
The API sets these settings itself, do not send them: files_as_is = true
Input
- Pictures are URLs of JPEG, PNG, WEBP, BMP, TIFF, GIF files up to 30 MB each, sides from 300 to 6,000 pixels.
- Videos are URLs of MP4, MOV files: in version 2.5 up to 200 MB each and no longer than 30 seconds together, in the 2.0 family up to 50 MB and no longer than 15 seconds together. Each one at least 2 seconds, 24 to 60 frames per second and at least 407,696 pixels per frame (for example 640×640 or 480×854).
- Audio files are URLs of WAV, MP3 files up to 15 MB each: in version 2.5 from 2 to 30 seconds and no longer than 30 all together, in the 2.0 family from 2 to 15 seconds and no longer than 15 all together.
- The 2.0 family takes no more than 12 files of all kinds together.
- Files go to the model as they are and whole. The seconds of all reference videos are added to the video length in the price, a part of a second of each video counts as a whole one. On Channel 2 the price with a video is not below a floor that grows with the length of the clip.
- We learn the video length for the price by downloading the video from its URL, so the URL must point straight at the file, without redirects, and serve it quickly. Otherwise the price cannot be calculated and the task is not accepted.
- The description can refer to the files in the order of the URLs of each kind: @image1, @video1, @audio1 and so on.
- On Channel 2 with reference videos the model picks the shape itself in every version.
- To change or extend the video itself, use the video_edit and video_extend modes. Here a video is only a reference, but in version 2.5 on Channel 1 the model may take a description of an edit for an edit and refuse: then choose video_edit.
| Field | Accepts | Formats | Files | File size up to |
|---|---|---|---|---|
image_urls | Images | jpeg, jpg, png, webp, bmp, tiff, gif | 30 | 30 MB |
video_urls | Video | mp4, mov | 10 | 200 MB |
audio_urls | Audio | wav, mp3 | 10 | 15 MB |
Request example
Send this JSON to POST /v1/tasks with your API key. To check the price first, send the same JSON to POST /v1/price.
A voice from audio
{
"model": "seedance",
"settings": {
"mode": "multimodal",
"prompt": "Мужчина с @image1 рассказывает историю у камина голосом с @audio1",
"model": "seedance_2",
"quality": "1080p",
"image_urls": [
"https://example.com/man.jpg"
],
"audio_urls": [
"https://example.com/voice.mp3"
]
}
}The price is calculated when the task is accepted, currency RUB.
Output
- MP4 video.
- Generation usually takes a few minutes, longer for long clips and high quality.
- With draft: true you get a 480p draft. Such a task has a draft field: until when it can be rebuilt in 1080p, whether it can be rebuilt now and a ready request for the rebuild.
| Kind | Formats | How many | Note |
|---|---|---|---|
video | mp4 | 1 |
A finished task as GET /v1/tasks/{id} returns it (some fields left out). The caption may sit on the task or on a single file and may be empty; the model picks the file name.
{
"id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"status": "succeeded",
"finished_at": "2026-10-01T12:03:41+00:00",
"result": {
"caption": "Caption of the result: the model and its settings",
"texts": [],
"files_expire_at": "2026-10-08T12:03:41+00:00",
"files_expired": false,
"artifacts": [
{
"index": 0,
"kind": "video",
"filename": "video.mp4",
"size": 12582912,
"caption": "",
"download_path": "/v1/tasks/7c9e6679-7425-40de-944b-e07fc1f90ae7/artifacts/0"
}
]
}
}Video edit
The model changes your video by the description: replace an object or a character, the background, the style. The rest stays as it was, with the length and shape of the video.
Value of the mode field: video_edit
This page is about Seedance 2.0: send model = seedance_2. Without the model field the task runs on seedance_2_5.
Price in this mode from 50 ₽, with a 4 s file.
Parameters
Model parameters go inside settings. Omitted optional fields take their default values.
promptRequiredWhat to change in the video: 3 to 20,000 characters, several languages are supported. The rest of the video stays as it was.
Type: StringMinimum characters: 1Maximum characters: 20000modelOptionalVersion. 2.5 is the newest and makes clips up to 30 seconds, Pro 2.0 is the only one with 4K, Fast 2.0 is fast, Mini 2.0 is the cheapest.
Type: StringAllowed values:seedance_2Default:"seedance_2_5"qualityOptionalVideo quality; the price depends on it. 1080p is available in 2.5 and Pro 2.0, 4K only in Pro 2.0. A draft is always 480p, this field does not apply to it.
Type: StringAllowed values:480p720p1080p4kDefault:"720p"durationOptionalDoes not apply: the clip comes out as long as your video.
Type: IntegerMinimum: 4Maximum: 30Default:5generate_audioOptionalGenerate sound together with the video.
Type: BooleanDefault:truechannelOptionalWhich channel the generation goes through: the model is the same, the price and the checks differ. Channel 1 is the usual one and accepts photos of people. Channel 2 is usually cheaper, but it rejects photos of real people and prohibited subjects, and it has no online search. With a video as input Channel 2 has a price floor that grows with the length of the clip, so with a short video it can cost more. A refusal of a channel is not charged.
Type: StringAllowed values:channel_1channel_2Default:"channel_1"draftOptionalVideo editing and extension have no draft: leave it false.
Type: BooleanDefault:falsevideo_urlsRequiredThe URL of the video to change. 4 to 30 seconds in version 2.5, up to 15 in the 2.0 family. It is @video1 in the description.
Type: List (String, uri)Maximum items: 1image_urlsOptionalPhoto reference URLs: up to 30 in version 2.5, up to 9 in the 2.0 family.
Type: List (String, uri)Maximum items: 30audio_urlsOptionalAudio reference URLs: up to 10 in version 2.5, up to 3 in the 2.0 family. Audio only together with a photo or a video.
Type: List (String, uri)Maximum items: 10
Parameters not listed here are not accepted: the response is 422 unknown_setting.
The API sets these settings itself, do not send them: files_as_is = true
Input
- The video is a URL of a file (MP4, MOV): in version 2.5 up to 200 MB and no longer than 30 seconds, in the 2.0 family up to 50 MB and no longer than 15 seconds. At least 4 seconds, 24 to 60 frames per second and at least 407,696 pixels per frame (for example 640×640 or 480×854).
- Pictures are URLs of JPEG, PNG, WEBP, BMP, TIFF, GIF files up to 30 MB each, sides from 300 to 6,000 pixels.
- Audio files are URLs of WAV, MP3 files up to 15 MB each: in version 2.5 from 2 to 30 seconds and no longer than 30 all together, in the 2.0 family from 2 to 15 seconds and no longer than 15 all together.
- The 2.0 family takes no more than 12 files of all kinds together.
- The video goes to the model as is and whole: to use another piece, trim the file beforehand. The price follows the length of the video: the new clip has as many seconds, and the input video adds as many again, a part of a second counts as a whole one.
- We learn the video length for the price by downloading the video from its URL, so the URL must point straight at the file, without redirects, and serve it quickly. Otherwise the price cannot be calculated and the task is not accepted.
- In the description your video is @video1, and photos and audio go in the order of their URLs: @image1, @audio1 and so on.
| Field | Accepts | Formats | Files | File size up to |
|---|---|---|---|---|
video_urls | Video | mp4, mov | 1 | 200 MB |
image_urls | Images | jpeg, jpg, png, webp, bmp, tiff, gif | 30 | 30 MB |
audio_urls | Audio | wav, mp3 | 10 | 15 MB |
Request example
Send this JSON to POST /v1/tasks with your API key. To check the price first, send the same JSON to POST /v1/price.
Replace an object in a video
{
"model": "seedance",
"settings": {
"mode": "video_edit",
"prompt": "Замени красный кораблик в @video1 на жёлтую резиновую уточку",
"video_urls": [
"https://example.com/boat.mp4"
],
"model": "seedance_2"
}
}The price is calculated when the task is accepted, currency RUB.
Output
- MP4 video.
- Generation usually takes a few minutes, longer for long clips and high quality.
- A clip of the same length and shape as your video. In version 2.5 the length matches the video exactly, in the 2.0 family it is rounded up to a whole second.
| Kind | Formats | How many | Note |
|---|---|---|---|
video | mp4 | 1 |
A finished task as GET /v1/tasks/{id} returns it (some fields left out). The caption may sit on the task or on a single file and may be empty; the model picks the file name.
{
"id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"status": "succeeded",
"finished_at": "2026-10-01T12:03:41+00:00",
"result": {
"caption": "Caption of the result: the model and its settings",
"texts": [],
"files_expire_at": "2026-10-08T12:03:41+00:00",
"files_expired": false,
"artifacts": [
{
"index": 0,
"kind": "video",
"filename": "video.mp4",
"size": 12582912,
"caption": "",
"download_path": "/v1/tasks/7c9e6679-7425-40de-944b-e07fc1f90ae7/artifacts/0"
}
]
}
}Video extension
The model continues your video with a new part of the chosen length, after the video or before it. Two clips come back: the new part and the same part joined with your video.
Value of the mode field: video_extend
This page is about Seedance 2.0: send model = seedance_2. Without the model field the task runs on seedance_2_5.
Price in this mode from 44 ₽, with a 2 s file.
Parameters
Model parameters go inside settings. Omitted optional fields take their default values.
promptRequiredWhat happens in the new part: 3 to 20,000 characters, several languages are supported. Also write that the video should be extended, and in which direction.
Type: StringMinimum characters: 1Maximum characters: 20000modelOptionalVersion. 2.5 is the newest and makes clips up to 30 seconds, Pro 2.0 is the only one with 4K, Fast 2.0 is fast, Mini 2.0 is the cheapest.
Type: StringAllowed values:seedance_2Default:"seedance_2_5"qualityOptionalVideo quality; the price depends on it. 1080p is available in 2.5 and Pro 2.0, 4K only in Pro 2.0. A draft is always 480p, this field does not apply to it.
Type: StringAllowed values:480p720p1080p4kDefault:"720p"durationOptionalLength of the new part in seconds: 4 to 30 in version 2.5, up to 15 in the 2.0 family. The price is per second, and the seconds of your video are added to it.
Type: IntegerMinimum: 4Maximum: 30Default:5generate_audioOptionalGenerate sound together with the video.
Type: BooleanDefault:truechannelOptionalWhich channel the generation goes through: the model is the same, the price and the checks differ. Channel 1 is the usual one and accepts photos of people. Channel 2 is usually cheaper, but it rejects photos of real people and prohibited subjects, and it has no online search. With a video as input Channel 2 has a price floor that grows with the length of the clip, so with a short video it can cost more. A refusal of a channel is not charged.
Type: StringAllowed values:channel_1channel_2Default:"channel_1"draftOptionalVideo editing and extension have no draft: leave it false.
Type: BooleanDefault:falsevideo_urlsRequiredThe URL of the video to extend. 2 to 30 seconds in version 2.5, up to 15 in the 2.0 family. It is @video1 in the description.
Type: List (String, uri)Maximum items: 1extend_directionOptionalWhich side of your video to join the new part to: forward after the video, backward before it. The model takes the direction from the description, so state it there too.
Type: StringAllowed values:forwardbackwardDefault:"forward"image_urlsOptionalPhoto reference URLs: up to 30 in version 2.5, up to 9 in the 2.0 family.
Type: List (String, uri)Maximum items: 30audio_urlsOptionalAudio reference URLs: up to 10 in version 2.5, up to 3 in the 2.0 family. Audio only together with a photo or a video.
Type: List (String, uri)Maximum items: 10
Parameters not listed here are not accepted: the response is 422 unknown_setting.
The API sets these settings itself, do not send them: files_as_is = true
Input
- The video is a URL of a file (MP4, MOV): in version 2.5 up to 200 MB and no longer than 30 seconds, in the 2.0 family up to 50 MB and no longer than 15 seconds. At least 2 seconds, 24 to 60 frames per second and at least 407,696 pixels per frame (for example 640×640 or 480×854).
- Pictures are URLs of JPEG, PNG, WEBP, BMP, TIFF, GIF files up to 30 MB each, sides from 300 to 6,000 pixels.
- Audio files are URLs of WAV, MP3 files up to 15 MB each: in version 2.5 from 2 to 30 seconds and no longer than 30 all together, in the 2.0 family from 2 to 15 seconds and no longer than 15 all together.
- The 2.0 family takes no more than 12 files of all kinds together.
- The model takes the direction from the description: write that the video should be extended and what happens next, or for an extension backward write "extend backward" and what happened before the start. extend_direction only sets which side of your video we join the new part to.
- On Channel 1 only version 2.5 can extend a video: for the 2.0 family choose Channel 2.
- The video goes to the model as is and whole: to use another piece, trim the file beforehand. The seconds of your video are added to the length of the new part in the price, a part of a second counts as a whole one. On Channel 2 the price is not below a floor that grows with the length of the part.
- We learn the video length for the price by downloading the video from its URL, so the URL must point straight at the file, without redirects, and serve it quickly. Otherwise the price cannot be calculated and the task is not accepted.
- In the description your video is @video1, and photos and audio go in the order of their URLs: @image1, @audio1 and so on.
| Field | Accepts | Formats | Files | File size up to |
|---|---|---|---|---|
video_urls | Video | mp4, mov | 1 | 200 MB |
image_urls | Images | jpeg, jpg, png, webp, bmp, tiff, gif | 30 | 30 MB |
audio_urls | Audio | wav, mp3 | 10 | 15 MB |
Request example
Send this JSON to POST /v1/tasks with your API key. To check the price first, send the same JSON to POST /v1/price.
What happened next
{
"model": "seedance",
"settings": {
"mode": "video_extend",
"prompt": "Продли @video1: кораблик проплывает под мостиком и скрывается за поворотом",
"video_urls": [
"https://example.com/boat.mp4"
],
"duration": 5,
"channel": "channel_2",
"model": "seedance_2"
}
}The price is calculated when the task is accepted, currency RUB.
Output
- MP4 video.
- Generation usually takes a few minutes, longer for long clips and high quality.
- The new part comes first, then the same part joined with your video on the extend_direction side. The joined clip has the frame size of the new part, the sound of your video is kept.
- If joining fails, only the new part comes, with an explanation in texts. The price is the same: the part is ready.
| Kind | Formats | How many | Note |
|---|---|---|---|
video | mp4 | 1 | The new part. |
video | mp4 | 0 or 1 | Your video and the new part as one clip. Absent if joining fails. |
result.texts: An explanation if joining fails.
A finished task as GET /v1/tasks/{id} returns it (some fields left out). The caption may sit on the task or on a single file and may be empty; the model picks the file name.
{
"id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"status": "succeeded",
"finished_at": "2026-10-01T12:03:41+00:00",
"result": {
"caption": "Caption of the result: the model and its settings",
"texts": [
"Text of the result, for example lyrics"
],
"files_expire_at": "2026-10-08T12:03:41+00:00",
"files_expired": false,
"artifacts": [
{
"index": 0,
"kind": "video",
"filename": "video.mp4",
"size": 12582912,
"caption": "",
"download_path": "/v1/tasks/7c9e6679-7425-40de-944b-e07fc1f90ae7/artifacts/0"
},
{
"index": 1,
"kind": "video",
"filename": "video.mp4",
"size": 12582912,
"caption": "",
"download_path": "/v1/tasks/7c9e6679-7425-40de-944b-e07fc1f90ae7/artifacts/1"
}
]
}
}See also
Try Seedance 2.0 through the API
One key opens every CyHUB model. Payment in rubles, and you see the price before the run.
Get an API key