# 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.

Developer: ByteDance
Model key in the API: `seedance`

## Connect in three steps

1. [Get a key](https://api.cyhub.ai/docs/connection.md?lang=en): Create a key in the dashboard after you confirm your email. One key opens every model.
2. [Check the price](https://api.cyhub.ai/docs/generations.md?lang=en): POST /v1/price shows the cost of a run in advance, without charging you.
3. [Run a task and collect the result](https://api.cyhub.ai/docs/tasks.md?lang=en): POST /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.

```bash
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"
```

```python
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"])
```

```javascript
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();
```

[Get a key](https://cyhub.ai/cabinet/keys)

## Price before the run

Prices as of 15.10.2026: from 39 ₽. POST /v1/price shows the exact price of your settings.

Send the same settings to POST /v1/price: the response shows the price of the run without charging you.

```bash
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 currency
- available_minor: how much your balance has for new tasks right now

## <a id="text_to_video"></a>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.

#### `prompt` (Required)

What happens in the video: 3 to 20,000 characters, several languages are supported.

- Type: String
- Minimum characters: 1
- Maximum characters: 20000

#### `model` (Optional)

Version. 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: String
- Allowed values: `seedance_2` (Pro 2.0)
- Default: `"seedance_2_5"`

#### `quality` (Optional)

Video 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: String
- Allowed values: `480p`, `720p`, `1080p`, `4k`
- Default: `"720p"`

#### `duration` (Optional)

Video length in seconds: 4 to 30 in version 2.5, up to 15 in the 2.0 family. The price is per second.

- Type: Integer
- Minimum: 4
- Maximum: 30
- Default: `5`

#### `generate_audio` (Optional)

Generate sound together with the video.

- Type: Boolean
- Default: `true`

#### `channel` (Optional)

Which 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: String
- Allowed values: `channel_1` (Channel 1), `channel_2` (Channel 2)
- Default: `"channel_1"`

#### `draft` (Optional)

Draft: 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: Boolean
- Default: `false`

#### `aspect_ratio` (Optional)

Aspect ratio. adaptive is available only in version 2.5: the model picks the shape itself from the description.

- Type: String
- Allowed values: `16:9`, `9:16`, `1:1`, `4:3`, `3:4`, `21:9`
- Default: `"16:9"`

#### `web_search` (Optional)

Online search: the model pulls up-to-date information from the internet. Channel 1 only.

- Type: Boolean
- Default: `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`

### 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

```json
{
  "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`.

[Complete generation example](https://api.cyhub.ai/docs/generations.md?lang=en)

### 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.

```json
{
  "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"
      }
    ]
  }
}
```

[How to read the result and download files](https://api.cyhub.ai/docs/tasks.md?lang=en#result)

## <a id="image_to_video"></a>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.

#### `prompt` (Required)

What happens in the video: 3 to 20,000 characters, several languages are supported.

- Type: String
- Minimum characters: 1
- Maximum characters: 20000

#### `model` (Optional)

Version. 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: String
- Allowed values: `seedance_2` (Pro 2.0)
- Default: `"seedance_2_5"`

#### `quality` (Optional)

Video 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: String
- Allowed values: `480p`, `720p`, `1080p`, `4k`
- Default: `"720p"`

#### `duration` (Optional)

Video length in seconds: 4 to 30 in version 2.5, up to 15 in the 2.0 family. The price is per second.

- Type: Integer
- Minimum: 4
- Maximum: 30
- Default: `5`

#### `generate_audio` (Optional)

Generate sound together with the video.

- Type: Boolean
- Default: `true`

#### `channel` (Optional)

Which 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: String
- Allowed values: `channel_1` (Channel 1), `channel_2` (Channel 2)
- Default: `"channel_1"`

#### `draft` (Optional)

Draft: 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: Boolean
- Default: `false`

#### `image_urls` (Required)

One URL: the first frame. Two URLs: the first and the last frames.

- Type: List (String, uri)
- Maximum items: 2

#### `aspect_ratio` (Optional)

Aspect 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: String
- Allowed values: `16:9`, `9:16`, `1:1`, `4:3`, `3:4`, `21:9`
- Default: `"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 |

[How to send files](https://api.cyhub.ai/docs/files.md?lang=en)

### 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

```json
{
  "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`.

[Complete generation example](https://api.cyhub.ai/docs/generations.md?lang=en)

### 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.

```json
{
  "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"
      }
    ]
  }
}
```

[How to read the result and download files](https://api.cyhub.ai/docs/tasks.md?lang=en#result)

## <a id="multimodal"></a>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.

#### `prompt` (Required)

What happens in the video: 3 to 20,000 characters, several languages are supported.

- Type: String
- Minimum characters: 1
- Maximum characters: 20000

#### `model` (Optional)

Version. 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: String
- Allowed values: `seedance_2` (Pro 2.0)
- Default: `"seedance_2_5"`

#### `quality` (Optional)

Video 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: String
- Allowed values: `480p`, `720p`, `1080p`, `4k`
- Default: `"720p"`

#### `duration` (Optional)

Video length in seconds: 4 to 30 in version 2.5, up to 15 in the 2.0 family. The price is per second.

- Type: Integer
- Minimum: 4
- Maximum: 30
- Default: `5`

#### `generate_audio` (Optional)

Generate sound together with the video.

- Type: Boolean
- Default: `true`

#### `channel` (Optional)

Which 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: String
- Allowed values: `channel_1` (Channel 1), `channel_2` (Channel 2)
- Default: `"channel_1"`

#### `draft` (Optional)

Draft: 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: Boolean
- Default: `false`

#### `aspect_ratio` (Optional)

Aspect 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: String
- Allowed values: `16:9`, `9:16`, `1:1`, `4:3`, `3:4`, `21:9`
- Default: `"16:9"`

#### `image_urls` (Optional)

Photo reference URLs: up to 30 in version 2.5, up to 9 in the 2.0 family.

- Type: List (String, uri)
- Maximum items: 30

#### `video_urls` (Optional)

Video 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: 10

#### `audio_urls` (Optional)

Audio 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 |

[How to send files](https://api.cyhub.ai/docs/files.md?lang=en)

### 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

```json
{
  "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`.

[Complete generation example](https://api.cyhub.ai/docs/generations.md?lang=en)

### 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.

```json
{
  "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"
      }
    ]
  }
}
```

[How to read the result and download files](https://api.cyhub.ai/docs/tasks.md?lang=en#result)

## <a id="video_edit"></a>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.

#### `prompt` (Required)

What to change in the video: 3 to 20,000 characters, several languages are supported. The rest of the video stays as it was.

- Type: String
- Minimum characters: 1
- Maximum characters: 20000

#### `model` (Optional)

Version. 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: String
- Allowed values: `seedance_2` (Pro 2.0)
- Default: `"seedance_2_5"`

#### `quality` (Optional)

Video 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: String
- Allowed values: `480p`, `720p`, `1080p`, `4k`
- Default: `"720p"`

#### `duration` (Optional)

Does not apply: the clip comes out as long as your video.

- Type: Integer
- Minimum: 4
- Maximum: 30
- Default: `5`

#### `generate_audio` (Optional)

Generate sound together with the video.

- Type: Boolean
- Default: `true`

#### `channel` (Optional)

Which 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: String
- Allowed values: `channel_1` (Channel 1), `channel_2` (Channel 2)
- Default: `"channel_1"`

#### `draft` (Optional)

Video editing and extension have no draft: leave it false.

- Type: Boolean
- Default: `false`

#### `video_urls` (Required)

The 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: 1

#### `image_urls` (Optional)

Photo reference URLs: up to 30 in version 2.5, up to 9 in the 2.0 family.

- Type: List (String, uri)
- Maximum items: 30

#### `audio_urls` (Optional)

Audio 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 |

[How to send files](https://api.cyhub.ai/docs/files.md?lang=en)

### 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

```json
{
  "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`.

[Complete generation example](https://api.cyhub.ai/docs/generations.md?lang=en)

### 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.

```json
{
  "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"
      }
    ]
  }
}
```

[How to read the result and download files](https://api.cyhub.ai/docs/tasks.md?lang=en#result)

## <a id="video_extend"></a>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.

#### `prompt` (Required)

What 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: String
- Minimum characters: 1
- Maximum characters: 20000

#### `model` (Optional)

Version. 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: String
- Allowed values: `seedance_2` (Pro 2.0)
- Default: `"seedance_2_5"`

#### `quality` (Optional)

Video 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: String
- Allowed values: `480p`, `720p`, `1080p`, `4k`
- Default: `"720p"`

#### `duration` (Optional)

Length 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: Integer
- Minimum: 4
- Maximum: 30
- Default: `5`

#### `generate_audio` (Optional)

Generate sound together with the video.

- Type: Boolean
- Default: `true`

#### `channel` (Optional)

Which 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: String
- Allowed values: `channel_1` (Channel 1), `channel_2` (Channel 2)
- Default: `"channel_1"`

#### `draft` (Optional)

Video editing and extension have no draft: leave it false.

- Type: Boolean
- Default: `false`

#### `video_urls` (Required)

The 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: 1

#### `extend_direction` (Optional)

Which 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: String
- Allowed values: `forward` (After the video), `backward` (Before the video)
- Default: `"forward"`

#### `image_urls` (Optional)

Photo reference URLs: up to 30 in version 2.5, up to 9 in the 2.0 family.

- Type: List (String, uri)
- Maximum items: 30

#### `audio_urls` (Optional)

Audio 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 |

[How to send files](https://api.cyhub.ai/docs/files.md?lang=en)

### 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

```json
{
  "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`.

[Complete generation example](https://api.cyhub.ai/docs/generations.md?lang=en)

### 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.

```json
{
  "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"
      }
    ]
  }
}
```

[How to read the result and download files](https://api.cyhub.ai/docs/tasks.md?lang=en#result)

## See also

- [Seedance 2.0: features and prices](https://api.cyhub.ai/models/seedance-2)
- Other versions: [Seedance 2.5 API](https://api.cyhub.ai/en/models/seedance-2-5/api.md), [Seedance 2.0 Fast API](https://api.cyhub.ai/en/models/seedance-2-fast/api.md), [Seedance 2.0 Mini API](https://api.cyhub.ai/en/models/seedance-2-mini/api.md)
- Similar models: [Kling 3.0 API](https://api.cyhub.ai/en/models/kling-3/api.md), [Kling Motion 3.0 API](https://api.cyhub.ai/en/models/kling-motion/api.md), [Veo 3.1 API](https://api.cyhub.ai/en/models/veo-3-1/api.md), [Wan 3.0 API](https://api.cyhub.ai/en/models/wan-3/api.md), [MiniMax H3 (Hailuo 03) API](https://api.cyhub.ai/en/models/minimax-h3/api.md), [Gemini Omni API](https://api.cyhub.ai/en/models/gemini-omni/api.md)
- [API documentation](https://api.cyhub.ai/docs.md?lang=en)
- [API errors and how to handle them](https://api.cyhub.ai/docs/errors.md?lang=en)
