> ## Documentation Index
> Fetch the complete documentation index at: https://docs.apimart.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# doubao-seedance-2.0 — генерация видео

>  - Асинхронный режим обработки, возвращает ID задачи для последующих запросов
- Поддержка генерации видео из текста, из изображения (первый кадр / последний кадр)
- Поддержка референсного видео, референсного аудио и видео со звуком
- Поддержка горизонтального, вертикального, квадратного, сверхширокого и адаптивного соотношения сторон 

<RequestExample>
  ```bash cURL theme={null}
  curl --request POST \
    --url https://api.apimart.ai/v1/videos/generations \
    --header 'Authorization: Bearer <token>' \
    --header 'Content-Type: application/json' \
    --data '{
      "model": "doubao-seedance-2.0",
      "prompt": "A kitten yawning at the camera",
      "resolution": "720p",
      "size": "16:9",
      "duration": 5,
      "generate_audio": true
    }'
  ```

  ```python Python theme={null}
  import requests

  url = "https://api.apimart.ai/v1/videos/generations"

  payload = {
      "model": "doubao-seedance-2.0",
      "prompt": "A kitten yawning at the camera",
      "resolution": "720p",
      "size": "16:9",
      "duration": 5,
      "generate_audio": True
  }

  headers = {
      "Authorization": "Bearer <token>",
      "Content-Type": "application/json"
  }

  response = requests.post(url, json=payload, headers=headers)

  print(response.json())
  ```

  ```javascript JavaScript theme={null}
  const url = "https://api.apimart.ai/v1/videos/generations";

  const payload = {
    model: "doubao-seedance-2.0",
    prompt: "A kitten yawning at the camera",
    resolution: "720p",
    size: "16:9",
    duration: 5,
    generate_audio: true
  };

  const headers = {
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json"
  };

  fetch(url, {
    method: "POST",
    headers: headers,
    body: JSON.stringify(payload)
  })
    .then(response => response.json())
    .then(data => console.log(data))
    .catch(error => console.error('Error:', error));
  ```

  ```go Go theme={null}
  package main

  import (
      "bytes"
      "encoding/json"
      "fmt"
      "io/ioutil"
      "net/http"
  )

  func main() {
      url := "https://api.apimart.ai/v1/videos/generations"

      payload := map[string]interface{}{
          "model":          "doubao-seedance-2.0",
          "prompt":         "A kitten yawning at the camera",
          "resolution":     "720p",
          "size":           "16:9",
          "duration":       5,
          "generate_audio": true,
      }

      jsonData, _ := json.Marshal(payload)

      req, _ := http.NewRequest("POST", url, bytes.NewBuffer(jsonData))
      req.Header.Set("Authorization", "Bearer <token>")
      req.Header.Set("Content-Type", "application/json")

      client := &http.Client{}
      resp, err := client.Do(req)
      if err != nil {
          panic(err)
      }
      defer resp.Body.Close()

      body, _ := ioutil.ReadAll(resp.Body)
      fmt.Println(string(body))
  }
  ```

  ```java Java theme={null}
  import java.net.http.HttpClient;
  import java.net.http.HttpRequest;
  import java.net.http.HttpResponse;
  import java.net.URI;

  public class Main {
      public static void main(String[] args) throws Exception {
          String url = "https://api.apimart.ai/v1/videos/generations";

          String payload = """
          {
            "model": "doubao-seedance-2.0",
            "prompt": "A kitten yawning at the camera",
            "resolution": "720p",
            "size": "16:9",
            "duration": 5,
            "generate_audio": true
          }
          """;

          HttpClient client = HttpClient.newHttpClient();
          HttpRequest request = HttpRequest.newBuilder()
              .uri(URI.create(url))
              .header("Authorization", "Bearer <token>")
              .header("Content-Type", "application/json")
              .POST(HttpRequest.BodyPublishers.ofString(payload))
              .build();

          HttpResponse<String> response = client.send(request,
              HttpResponse.BodyHandlers.ofString());

          System.out.println(response.body());
      }
  }
  ```

  ```php PHP theme={null}
  <?php

  $url = "https://api.apimart.ai/v1/videos/generations";

  $payload = [
      "model" => "doubao-seedance-2.0",
      "prompt" => "A kitten yawning at the camera",
      "resolution" => "720p",
      "size" => "16:9",
      "duration" => 5,
      "generate_audio" => true
  ];

  $ch = curl_init($url);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($ch, CURLOPT_POST, true);
  curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload));
  curl_setopt($ch, CURLOPT_HTTPHEADER, [
      "Authorization: Bearer <token>",
      "Content-Type: application/json"
  ]);

  $response = curl_exec($ch);
  curl_close($ch);

  echo $response;
  ?>
  ```

  ```ruby Ruby theme={null}
  require 'net/http'
  require 'json'
  require 'uri'

  url = URI("https://api.apimart.ai/v1/videos/generations")

  payload = {
    model: "doubao-seedance-2.0",
    prompt: "A kitten yawning at the camera",
    resolution: "720p",
    size: "16:9",
    duration: 5,
    generate_audio: true
  }

  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 = payload.to_json

  response = http.request(request)
  puts response.body
  ```

  ```swift Swift theme={null}
  import Foundation

  let url = URL(string: "https://api.apimart.ai/v1/videos/generations")!

  let payload: [String: Any] = [
      "model": "doubao-seedance-2.0",
      "prompt": "A kitten yawning at the camera",
      "resolution": "720p",
      "size": "16:9",
      "duration": 5,
      "generate_audio": true
  ]

  var request = URLRequest(url: url)
  request.httpMethod = "POST"
  request.setValue("Bearer <token>", forHTTPHeaderField: "Authorization")
  request.setValue("application/json", forHTTPHeaderField: "Content-Type")
  request.httpBody = try? JSONSerialization.data(withJSONObject: payload)

  let task = URLSession.shared.dataTask(with: request) { data, response, error in
      if let error = error {
          print("Error: \(error)")
          return
      }

      if let data = data, let responseString = String(data: data, encoding: .utf8) {
          print(responseString)
      }
  }

  task.resume()
  ```

  ```csharp C# theme={null}
  using System;
  using System.Net.Http;
  using System.Text;
  using System.Threading.Tasks;

  class Program
  {
      static async Task Main(string[] args)
      {
          var url = "https://api.apimart.ai/v1/videos/generations";

          var payload = @"{
              ""model"": ""doubao-seedance-2.0"",
              ""prompt"": ""A kitten yawning at the camera"",
              ""resolution"": ""720p"",
              ""size"": ""16:9"",
              ""duration"": 5,
              ""generate_audio"": true
          }";

          using var client = new HttpClient();
          client.DefaultRequestHeaders.Add("Authorization", "Bearer <token>");

          var content = new StringContent(payload, Encoding.UTF8, "application/json");
          var response = await client.PostAsync(url, content);
          var result = await response.Content.ReadAsStringAsync();

          Console.WriteLine(result);
      }
  }
  ```
</RequestExample>

<ResponseExample>
  ```json 200 theme={null}
  {
    "code": 200,
    "data": [
      {
        "status": "submitted",
        "task_id": "task_01KMCGF6BQGN3X28H3KSR50X5T"
      }
    ]
  }
  ```

  ```json 400 theme={null}
  {
    "error": {
      "code": 400,
      "message": "Invalid request parameters",
      "type": "invalid_request_error"
    }
  }
  ```

  ```json 401 theme={null}
  {
    "error": {
      "code": 401,
      "message": "Authentication failed, please check your API key",
      "type": "authentication_error"
    }
  }
  ```

  ```json 402 theme={null}
  {
    "error": {
      "code": 402,
      "message": "Insufficient account balance, please top up and try again",
      "type": "payment_required"
    }
  }
  ```

  ```json 429 theme={null}
  {
    "error": {
      "code": 429,
      "message": "Too many requests, please try again later",
      "type": "rate_limit_error"
    }
  }
  ```

  ```json 500 theme={null}
  {
    "error": {
      "code": 500,
      "message": "Internal server error, please try again later",
      "type": "server_error"
    }
  }
  ```
</ResponseExample>

## Аутентификация

<ParamField header="Authorization" type="string" required>
  Все эндпоинты API требуют аутентификации через Bearer Token

  Получите ваш API Key:

  Перейдите на [страницу управления API Key](https://apimart.ai/keys), чтобы получить ваш API Key

  Добавьте его в заголовок запроса:

  ```
  Authorization: Bearer YOUR_API_KEY
  ```
</ParamField>

## Параметры запроса

<ParamField body="model" type="string" required>
  Имя модели генерации видео

  Поддерживаемые модели:

  * `doubao-seedance-2.0` — стандартная версия, поддерживает текст-в-видео, изображение-в-видео, видео из первого/последнего кадра, референсное видео, референсное аудио и видео со звуком
  * `doubao-seedance-2.0-fast` — быстрая версия, те же функции, что и стандартная, с более высокой скоростью генерации
  * `doubao-seedance-2.0-mini` — мини-версия, те же функции, что и стандартная версия
</ParamField>

<ParamField body="prompt" type="string">
  Описание содержимого видео

  Обязательно для генерации текст-в-видео; необязательно для изображение-в-видео или видео-референс-в-видео

  Рекомендуется чётко указывать объект, действие, движение камеры и стиль для лучших результатов генерации

  <Warning>
    * Длина промпта ограничена 4000 символами, но рекомендуется до 500 символов.
    * Модель `doubao-seedance-2.0-mini` не имеет ограничения на количество символов. Рекомендация: промпты на китайском языке не должны превышать 500 символов, а промпты на английском — 1000 слов. Слишком большой объём текста может привести к рассеиванию информации, и модель может упустить детали, сосредоточившись только на ключевых моментах, из-за чего в видео будут отсутствовать некоторые элементы.
  </Warning>

  Пример: `"A kitten yawning at the camera"`
</ParamField>

<ParamField body="duration" type="integer" default="5">
  Длительность видео (в секундах)

  Поддерживаемый диапазон: от `4` до `15` секунд

  По умолчанию: `5`
</ParamField>

<ParamField body="size" type="string" default="16:9">
  Соотношение сторон видео

  Варианты:

  * `16:9` — горизонтальное
  * `9:16` — вертикальное
  * `1:1` — квадратное
  * `4:3` — традиционное соотношение
  * `3:4` — вертикальное традиционное соотношение
  * `21:9` — сверхширокое
  * `adaptive` — адаптивное (автоматически соответствует входному изображению/видео)

  По умолчанию: `16:9`
</ParamField>

<ParamField body="resolution" type="string" default="720p">
  Разрешение видео

  Варианты:

  * `480p` — стандартное разрешение
  * `720p` — высокое разрешение
  * `1080p` — Full HD (поддерживается только моделью `doubao-seedance-2.0`)
  * `4k` — Ultra HD (поддерживается только моделью `doubao-seedance-2.0`)

  По умолчанию: `720p`
</ParamField>

<ParamField body="seed" type="integer">
  Случайное seed-значение для управления случайностью генерируемого контента

  <Note>
    * При одинаковом запросе разные seed-значения дадут разные результаты
    * При одинаковом запросе одинаковое seed-значение даст похожие результаты, но точная идентичность не гарантируется
  </Note>
</ParamField>

<ParamField body="generate_audio" type="boolean" default="true">
  Генерировать ли аудио (видео со звуком)

  При значении `true` видео будет содержать сгенерированное ИИ сопровождающее аудио

  По умолчанию: `true`
</ParamField>

<ParamField body="return_last_frame" type="boolean" default="false">
  Возвращать ли изображение последнего кадра

  При значении `true` в результате задачи дополнительно будет возвращён URL изображения последнего кадра видео, который можно использовать для непрерывной генерации видео

  По умолчанию: `false`
</ParamField>

<ParamField body="tools" type="array<object>">
  Список инструментов для расширенных возможностей, таких как веб-поиск

  Пример: `[{"type": "web_search"}]`

  <Expandable title="Описание полей">
    <ParamField body="type" type="string" required>
      Тип инструмента

      Варианты:

      * `web_search` — веб-поиск, использует онлайн-информацию при генерации
    </ParamField>
  </Expandable>
</ParamField>

<ParamField body="image_urls" type="array<string>">
  Массив URL изображений для генерации изображение-в-видео

  Поддерживает два формата:

  * Обычный URL изображения: `https://example.com/cat.jpg`
  * URL ассета (одобренный ассет): `asset://asset_a`

  Пример: `["https://example.com/cat.jpg"]` или `["asset://asset_a"]`

  <Note>
    URL ассета поддерживается только моделями `doubao-seedance-2.0` и `doubao-seedance-2.0-fast`. Другие модели не поддерживают его.
  </Note>

  <Warning>
    * `image_urls` и `image_with_roles` нельзя использовать одновременно
    * Максимум 9 референсных изображений
  </Warning>
</ParamField>

<ParamField body="image_with_roles" type="array">
  Массив изображений с ролями, поддерживает указание первого/последнего кадра

  <Note>
    Когда в поле `url` используется URL ассета, поддерживаются только модели `doubao-seedance-2.0` и `doubao-seedance-2.0-fast`. Другие модели не поддерживают его.
  </Note>

  <Expandable title="Описание полей">
    <ParamField body="url" type="string" required>
      URL изображения

      Поддерживает два формата:

      * Обычный URL изображения: `https://example.com/day.jpg`
      * URL ассета (одобренный ассет): `asset://asset_a`

      <Note>
        URL ассета поддерживается только моделями `doubao-seedance-2.0` и `doubao-seedance-2.0-fast`. Другие модели не поддерживают его.
      </Note>
    </ParamField>

    <ParamField body="role" type="string" required>
      Роль изображения

      Варианты:

      * `first_frame` — изображение первого кадра, используется как начальный кадр видео
      * `last_frame` — изображение последнего кадра, используется как конечный кадр видео
      * `reference_image` — референсное портретное изображение (используется с URL ассета)
    </ParamField>
  </Expandable>

  Пример:

  ```json theme={null}
  [
    {"url": "https://example.com/day.jpg", "role": "first_frame"},
    {"url": "https://example.com/night.jpg", "role": "last_frame"}
  ]
  ```

  Формат URL ассета:

  ```json theme={null}
  [
    {"url": "asset://asset_a", "role": "reference_image"}
  ]
  ```

  <Warning>
    * `image_urls` и `image_with_roles` нельзя использовать одновременно
    * При использовании изображений первого/последнего кадра параметры `video_urls` и `audio_urls` недоступны
  </Warning>
</ParamField>

<ParamField body="video_urls" type="array<string>">
  Массив URL референсных видео

  Поддерживает два формата:

  * Обычный URL видео: `https://example.com/reference.mp4`
  * URL ассета (одобренный ассет): `asset://asset_a`

  Пример: `["https://example.com/reference.mp4"]` или `["asset://asset_a"]`

  <Note>
    URL ассета поддерживается только моделями `doubao-seedance-2.0` и `doubao-seedance-2.0-fast`. Другие модели не поддерживают его.
  </Note>

  <Warning>
    * При использовании изображений первого/последнего кадра (`image_with_roles`) референсные видео недоступны
    * Максимум 3 референсных видео, 1.8с \< общая длительность \< 15.2с
    * Разрешение референсного видео должно быть в диапазоне от 480P до 720P
    * Референсные видео не должны содержать реальных людей
  </Warning>
</ParamField>

<ParamField body="audio_urls" type="array<string>">
  Массив URL референсного аудио

  Поддерживает два формата:

  * Обычный URL аудио: `https://example.com/speech.wav`
  * URL ассета (одобренный ассет): `asset://asset_a`

  Пример: `["https://example.com/speech.wav"]` или `["asset://asset_a"]`

  <Note>
    URL ассета поддерживается только моделями `doubao-seedance-2.0` и `doubao-seedance-2.0-fast`. Другие модели не поддерживают его.
  </Note>

  <Warning>
    * При использовании изображений первого/последнего кадра (`image_with_roles`) референсное аудио недоступно
    * Максимум 3 файла референсного аудио, общая длительность не более 15 секунд
    * Референсное аудио должно использоваться вместе с референсными изображениями или референсными видео
  </Warning>
</ParamField>

## Ответ

<ResponseField name="code" type="integer">
  Код состояния ответа, 200 при успехе
</ResponseField>

<ResponseField name="data" type="array">
  Массив данных ответа

  <Expandable title="Элементы массива">
    <ResponseField name="status" type="string">
      Статус задачи, `submitted` при первоначальной отправке
    </ResponseField>

    <ResponseField name="task_id" type="string">
      Уникальный идентификатор задачи для запроса статуса и результатов
    </ResponseField>
  </Expandable>
</ResponseField>

## Сценарии использования

### Сценарий 1: текст-в-видео

```json theme={null}
{
  "model": "doubao-seedance-2.0",
  "prompt": "A kitten yawning at the camera",
  "resolution": "720p",
  "size": "16:9",
  "duration": 5,
  "seed": 42,
  "generate_audio": true
}
```

### Сценарий 2: изображение-в-видео (первый кадр)

```json theme={null}
{
  "model": "doubao-seedance-2.0",
  "prompt": "The kitten stands up and walks toward the camera",
  "image_urls": ["https://example.com/cat.jpg"],
  "duration": 5
}
```

### Сценарий 3: видео из первого/последнего кадра

```json theme={null}
{
  "model": "doubao-seedance-2.0",
  "prompt": "Transition from day to night",
  "image_with_roles": [
    {"url": "https://example.com/day.jpg", "role": "first_frame"},
    {"url": "https://example.com/night.jpg", "role": "last_frame"}
  ],
  "duration": 5
}
```

### Сценарий 4: видео из референсного видео

```json theme={null}
{
  "model": "doubao-seedance-2.0",
  "prompt": "Convert the video style to anime style",
  "video_urls": ["https://example.com/reference.mp4"]
}
```

### Сценарий 5: референсное видео + референсное аудио

```json theme={null}
{
  "model": "doubao-seedance-2.0",
  "prompt": "A scene of a person speaking",
  "video_urls": ["https://example.com/reference.mp4"],
  "audio_urls": ["https://example.com/speech.wav"],
  "size": "16:9",
  "duration": 11
}
```

### Сценарий 6: видео со звуком

```json theme={null}
{
  "model": "doubao-seedance-2.0",
  "prompt": "A man stops a woman and says: \"Remember, you must never point your finger at the moon.\"",
  "generate_audio": true
}
```

### Сценарий 7: непрерывная генерация видео (возврат последнего кадра)

```json theme={null}
{
  "model": "doubao-seedance-2.0",
  "prompt": "The kitten continues walking toward the camera",
  "image_urls": ["https://example.com/last_frame_from_prev.png"],
  "return_last_frame": true
}
```

### Сценарий 8: генерация в быстрой версии

```json theme={null}
{
  "model": "doubao-seedance-2.0-fast",
  "prompt": "City nightscape timelapse photography",
  "size": "21:9",
  "duration": 8
}
```

### Сценарий 9: референсные изображения + референсное видео + референсное аудио (мультимодальное видео)

Сочетайте референсные изображения, референсное видео и референсное аудио, чтобы создать иммерсивное рекламное видео от первого лица. Идеально подходит для продвижения товаров, рекламы брендов и других сценариев, требующих объединения материалов из нескольких источников.

```json theme={null}
{
  "model": "doubao-seedance-2.0",
  "prompt": "Use video 1's first-person perspective throughout, and use audio 1 as the background music throughout. First-person POV fruit tea advertisement for seedance brand 'Peace Apple' apple fruit tea limited edition. First frame is image 1: your hand picks a dewy Aksu red apple with a crisp apple collision sound. 2-4s: quick cut, your hand drops apple chunks into a shaker cup, adds ice and tea base, shakes vigorously, ice collision and shaking sounds sync with upbeat drum beats, background voice: 'Fresh-cut, fresh-shaken'. 4-6s: first-person close-up of the finished product, layered fruit tea poured into a clear cup, your hand gently squeezes cream cap spreading on top, sticks a pink label on the cup, camera zooms in on the layered texture of cream cap and fruit tea. 6-8s: first-person handheld cup raise, you lift the fruit tea from image 2 toward the camera (simulating handing it to the viewer), cup label clearly visible, background voice 'Take a sip of freshness', final frame freezes on image 2. Background voice consistently uses a female tone.",
  "image_urls": [
    "https://example.com/tea_pic1.jpg",
    "https://example.com/tea_pic2.jpg"
  ],
  "video_urls": ["https://example.com/tea_video1.mp4"],
  "audio_urls": ["https://example.com/tea_audio1.mp3"],
  "generate_audio": true,
  "size": "16:9",
  "duration": 11
}
```

### Сценарий 10: изображение-в-видео с URL ассета

Одобренные ассеты виртуальных аватаров можно передавать напрямую как референсные изображения без повторной загрузки и повторной модерации.

```json theme={null}
{
  "model": "doubao-seedance-2.0",
  "prompt": "The character walks naturally on a city street under bright sunshine",
  "image_urls": ["asset://asset_a"],
  "duration": 5,
  "resolution": "720p"
}
```

### Сценарий 11: указание референсного портрета с URL ассета (image\_with\_roles)

```json theme={null}
{
  "model": "doubao-seedance-2.0",
  "prompt": "Using the reference portrait, the character walks elegantly toward the camera",
  "image_with_roles": [
    {
      "url": "asset://asset_a",
      "role": "reference_image"
    }
  ],
  "resolution": "720p",
  "duration": 5
}
```

### Сценарий 12: быстрая версия + URL ассета для изображение-в-видео

```json theme={null}
{
  "model": "doubao-seedance-2.0-fast",
  "prompt": "The character strolls in a park with a gentle breeze",
  "image_urls": ["asset://asset_a"],
  "duration": 5,
  "resolution": "720p"
}
```

### Сценарий 13: изображение через URL ассета + референсное видео (перенос движений)

Сочетайте одобренный портретный ассет с референсным видео, чтобы заставить персонажа выполнять заданные движения.

```json theme={null}
{
  "model": "doubao-seedance-2.0",
  "prompt": "The character dances to the rhythm of the reference video with smooth and natural movements",
  "image_urls": ["https://example.com/dance_reference.jpg", "asset://asset_a"],
  "video_urls": ["https://example.com/dance_reference.mp4", "asset://asset_a"],
  "duration": 8,
  "resolution": "720p"
}
```

<Note>
  **Запрос результатов задачи**

  Генерация видео — это асинхронная задача, которая при отправке возвращает `task_id`. Используйте эндпоинт [Получение статуса задачи](/ru/api-reference/tasks/status), чтобы запросить прогресс и результаты генерации.
</Note>

## Отличия от версии 1.5 Pro

| Функция                     | 1.5 Pro                           | 2.0 / 2.0 fast                                      |
| --------------------------- | --------------------------------- | --------------------------------------------------- |
| Разрешение                  | 480p/720p/1080p                   | **480p/720p/1080p/4k** (fast только 480p/720p)      |
| Диапазон длительности       | 4-12 с                            | **5-15 с**                                          |
| Длительность по умолчанию   | 5 с                               | **5 с**                                             |
| Параметр соотношения сторон | `aspect_ratio`                    | **`size`** (новая опция `adaptive`)                 |
| Генерация аудио             | Параметр `audio`                  | **Параметр `generate_audio`**                       |
| Референсное видео           | Не поддерживается                 | **Поддерживается через `video_urls`**               |
| Референсное аудио           | Не поддерживается                 | **Поддерживается через `audio_urls`**               |
| Изображение-в-видео         | `image_urls` / `image_with_roles` | **`image_urls` / `image_with_roles`**               |
| Видео со звуком             | Не поддерживается                 | **Поддерживается через `generate_audio`**           |
| Непрерывное видео           | Не поддерживается                 | **Поддерживается через `return_last_frame`**        |
| Быстрая версия              | Не поддерживается                 | **Поддерживается через `doubao-seedance-2.0-fast`** |
