Seedance 2.0 API

Одной моделью делает ролик по описанию, из присланного изображения и по изображениям-образцам. Разрешение 480p, 720p, 1080p, 4k, 7 соотношений сторон, от 1:1 до adaptive, описание до 20 000 символов. Модель ByteDance.

Одной моделью делает ролик по описанию, из присланного изображения и по изображениям-образцам. Разрешение 480p, 720p, 7 соотношений сторон, от 1:1 до adaptive, описание до 20 000 символов. Модель ByteDance.

Одной моделью делает ролик по описанию, из присланного изображения и по изображениям-образцам. Разрешение 480p, 720p, 7 соотношений сторон, от 1:1 до adaptive, описание до 20 000 символов. Модель ByteDance.

Seedance 2.0 API работает в России без VPN: один API ключ GEN202, оплата рублями с российской карты, цена до 10% ниже официальной.

Цена: за секунду, 480p — от 15.19 кр. (7,6 ₽ · $0.076), 720p — от 32.65 кр. (16,33 ₽ · $0.1633), 1080p — от 73.48 кр. (36,74 ₽ · $0.3674), 4K — от 167.4 кр. (83,7 ₽ · $0.837).

Цена: за секунду, 480p — от 12.15 кр. (6,08 ₽ · $0.0608), 720p — от 26.12 кр. (13,06 ₽ · $0.1306).

Цена: за секунду, 480p — от 7.79 кр. (3,9 ₽ · $0.039), 720p — от 16.7 кр. (8,35 ₽ · $0.0835).

кр. — кредиты, покупаются за рубли.

Model

Статус

работает

Статус

работает

Статус

работает

Режим

Песочница

Input

Ещё настройки

Чтобы создать видео — войдите и получите 50 кредитов на тесты и любое использование сервиса.

{
  "model": "seedance/2",
  "input": {
    "prompt": "Ginger cat in a white spacesuit floats in zero gravity above Earth. It slowly turns its head toward the camera, front paws drifting; sunlight glints across the helmet visor, the blue planet reflected in the glass. The camera eases backwards, revealing a solar panel at the edge of frame. Cinematic, soft rim light, shallow depth of field.",
    "aspect_ratio": "16:9",
    "resolution": "720p",
    "duration": 4,
    "reference_image_urls": [
      "https://gen202.com/assets/sample-nano-banana-2.jpg"
    ]
  }
}
Output
{
  "code": 200,
  "msg": "success",
  "data": {
    "taskId": "cm8r4t0vk0001s60p2xq7f9ab",
    "model": "seedance/2",
    "state": "success",
    "resultJson": "{\"resultUrls\":[\"https://file.example/result.mp4\"]}",
    "failCode": "",
    "failMsg": "",
    "creditsConsumed": 15.192
  }
}
Input

Ещё настройки

Чтобы создать видео — войдите и получите 50 кредитов на тесты и любое использование сервиса.

{
  "model": "seedance/2-fast",
  "input": {
    "prompt": "Ginger cat in a white spacesuit floats in zero gravity above Earth. It slowly turns its head toward the camera, front paws drifting; sunlight glints across the helmet visor, the blue planet reflected in the glass. The camera eases backwards, revealing a solar panel at the edge of frame. Cinematic, soft rim light, shallow depth of field.",
    "aspect_ratio": "16:9",
    "resolution": "720p",
    "duration": 4,
    "reference_image_urls": [
      "https://gen202.com/assets/sample-nano-banana-2.jpg"
    ]
  }
}
Output
{
  "code": 200,
  "msg": "success",
  "data": {
    "taskId": "cm8r4t0vk0001s60p2xq7f9ab",
    "model": "seedance/2-fast",
    "state": "success",
    "resultJson": "{\"resultUrls\":[\"https://file.example/result.mp4\"]}",
    "failCode": "",
    "failMsg": "",
    "creditsConsumed": 12.15
  }
}
Input

Ещё настройки

Чтобы создать видео — войдите и получите 50 кредитов на тесты и любое использование сервиса.

{
  "model": "seedance/2-mini",
  "input": {
    "prompt": "Ginger cat in a white spacesuit floats in zero gravity above Earth. It slowly turns its head toward the camera, front paws drifting; sunlight glints across the helmet visor, the blue planet reflected in the glass. The camera eases backwards, revealing a solar panel at the edge of frame. Cinematic, soft rim light, shallow depth of field.",
    "aspect_ratio": "16:9",
    "resolution": "720p",
    "duration": 4,
    "reference_image_urls": [
      "https://gen202.com/assets/sample-nano-banana-2.jpg"
    ]
  }
}
Output
{
  "code": 200,
  "msg": "success",
  "data": {
    "taskId": "cm8r4t0vk0001s60p2xq7f9ab",
    "model": "seedance/2-mini",
    "state": "success",
    "resultJson": "{\"resultUrls\":[\"https://file.example/result.mp4\"]}",
    "failCode": "",
    "failMsg": "",
    "creditsConsumed": 7.794
  }
}

Цена Seedance 2.0

Цена за секунду. Списывается фактический расход, о котором сообщил поставщик.

Вариант Скидка от официальной цены Наша цена
480p with video input $0.0844 −10% 15.19 кр. $0.0767,6 ₽
480p no video input $0.1406 −10% 25.31 кр. $0.126512,65 ₽
720p with video input $0.1814 −10% 32.65 кр. $0.163316,33 ₽
720p no video input $0.3024 −10% 54.43 кр. $0.272227,22 ₽
1080p with video input $0.4082 −10% 73.48 кр. $0.367436,74 ₽
1080p no video input $0.6804 −10% 122.47 кр. $0.612461,24 ₽
4K with video input $0.93 −10% 167.4 кр. $0.83783,7 ₽
4K no video input $1.56 −10% 280.8 кр. $1.404140,4 ₽

В среднем на 10% ниже официальной цены поставщика. кр. — кредиты, покупаются за рубли.

Цена за секунду. Списывается фактический расход, о котором сообщил поставщик.

Вариант Скидка от официальной цены Наша цена
480p with video input $0.0675 −10% 12.15 кр. $0.06086,08 ₽
480p no video input $0.1125 −10% 20.25 кр. $0.101310,13 ₽
720p with video input $0.1451 −10% 26.12 кр. $0.130613,06 ₽
720p no video input $0.2419 −10% 43.54 кр. $0.217721,77 ₽

В среднем на 10% ниже официальной цены поставщика. кр. — кредиты, покупаются за рубли.

Цена за секунду. Списывается фактический расход, о котором сообщил поставщик.

Вариант Скидка от официальной цены Наша цена
480P with video $0.0433 −10% 7.79 кр. $0.0393,9 ₽
480P no video $0.0721 −10% 12.98 кр. $0.06496,49 ₽
720P with video $0.0928 −10% 16.7 кр. $0.08358,35 ₽
720P no video $0.1547 −10% 27.85 кр. $0.139213,92 ₽

В среднем на 10% ниже официальной цены поставщика. кр. — кредиты, покупаются за рубли.

На время работы шлюз удерживает ставку выбранного разрешения, умноженную на запрошенную длительность; больше 8424 кредита по этой модели он не удержит ни при каком запросе (выход до 15 с плюс до 15 с видео на входе). Разница между удержанием и фактическим расходом возвращается на баланс тем же запросом состояния, который увидел итог.

Вызов через API

POST https://api.gen202.com/api/v1/jobs/createTask
GET https://api.gen202.com/api/v1/jobs/recordInfo?taskId=…

Ролик делается минуты, поэтому файл не приходит в ответ на запрос. Первый вызов ставит задачу и сразу отвечает её номером, второй по этому номеру отдаёт состояние задачи, а когда она готова — ссылку на результат. Ключ передаётся в обоих запросах заголовком Authorization: Bearer sk-… и выпускается в кабинете. На один ключ шлюз пропускает 30 постановок задачи и 300 запросов состояния в минуту.

Поля запроса

Значения проверяются до обращения к поставщику: поле не из списка модели или значение вне перечисления возвращают 422 и кредитов не тратят.

ПолеТипОбяз.Допустимые значения
model текст обязательное seedance/2
input объект обязательное Параметры генерации — поля из таблицы ниже

Поля input

ПолеТипОбяз.Допустимые значения
prompt текст опц. от 3 до 20 000 символов
first_frame_url ссылка опц. одна ссылка на изображение
last_frame_url ссылка опц. одна ссылка на изображение
reference_image_urls список ссылок опц. до 9 ссылок на изображение
reference_video_urls список ссылок опц. до 3 ссылок на видео
reference_audio_urls список ссылок опц. до 3 ссылок на аудио
return_last_frame да или нет опц. true или false
generate_audio да или нет опц. true или false
resolution значение из списка опц. 480p · 720p · 1080p · 4k
aspect_ratio значение из списка опц. 1:1 · 4:3 · 3:4 · 16:9 · 9:16 · 21:9 · adaptive
duration целое число опц. целое от 4 до 15
web_search да или нет опц. true или false
nsfw_checker да или нет опц. true или false

Ссылка на исходный файл принимается только полным адресом на http или https: не длиннее 2048 символов, на общедоступном сайте, без имени и пароля перед адресом и без порта, кроме 80 и 443. Относительный путь, а также адреса внутри сети — localhost, 127.0.0.1, 10.0.0.5, 192.168.1.2 — и имена без точки шлюз отклоняет ответом 422, к поставщику не обращаясь.

Ответ

Оба запроса отвечают одним конвертом: {"code":…,"msg":…,"data":…}, где code повторяет HTTP-статус, а полезное лежит в data. Тот же конверт приходит и при отказе — разбирать две формы ответа не нужно.

/api/v1/jobs/createTask

ПолеТипЧто в нём
data.taskId строка Номер задачи. Больше в ответе ничего нет и быть не может — работа только началась.

/api/v1/jobs/recordInfo

ПолеТипЧто в нём
data.taskId строка Номер задачи — тот же, что вернул createTask.
data.model строка Имя модели в том виде, в каком его прислал клиент.
data.state строка Состояние задачи: waiting, queuing, generating, success или fail.
data.param строка Параметры, с которыми задача создана, — строкой JSON внутри JSON.
data.resultJson строка Результат строкой JSON внутри JSON: {"resultUrls":["https://…"]} — разбирается вторым разбором. До завершения задачи — пустая строка.
data.failCode строка Код неудачи из таблицы ниже. У остальных задач — пустая строка.
data.failMsg строка Причина неудачи словами. Иначе пустая строка.
data.costTime число Сколько задача заняла, миллисекунды. Пока не завершилась — null.
data.completeTime число Когда завершилась, миллисекунды эпохи Unix. Пока не завершилась — null.
data.createTime число Когда создана, миллисекунды эпохи Unix.
data.updateTime число Когда состояние менялось в последний раз, миллисекунды эпохи Unix.
data.creditsConsumed число Сколько кредитов списано. Ноль, пока задача не завершилась, и ноль у неудачной.

Состояния задачи

Состояние лежит в поле state ответа /api/v1/jobs/recordInfo. Первые три означают, что работа идёт: запрос надо повторить примерно через 3 секунды — чаще спрашивать нечего, столько же ждёт между опросами сам шлюз. Два последних состояния окончательные: после них задача не меняется.

stateЧто происходит
waiting Задача принята и стоит в очереди шлюза; поставщику она ещё не отправлена.
queuing Поставщик задачу принял и поставил в свою очередь.
generating Генерация идёт.
success Готово: ссылки на результат лежат в resultJson, в creditsConsumed — сколько списано.
fail Задача не удалась: причина в failCode и failMsg, удержанные кредиты возвращены целиком.

Опрос не бывает бесконечным: задача на видео живёт не дольше 60 минут, после чего шлюз закрывает её сам состоянием fail и возвращает удержанные кредиты целиком. Причина неудачи приходит двумя полями: failCode из таблицы ниже и failMsg словами.

failCodeЧто произошло
501 Поставщик вернул отказ: генерация не удалась.
408 Результата нет дольше крайнего срока задачи (60 минут для видео).
404 Поставщик не знает такой задачи.
429 Поставщик отбил создание задачи по своему лимиту.
500 Поломка на нашей стороне; подробности остаются в журнале шлюза.

Ссылка на готовый файл живёт 14 дней — столько его хранит поставщик. Файл, который нужен дольше, скачивайте к себе сразу после того, как задача пришла в состояние success.

Отказы

Тело отказа одно на все случаи: {"code":…,"msg":…,"data":null}. Задача, не дошедшая до результата, не тарифицируется — удержанные кредиты возвращаются целиком.

КодАдресКогда
400 /api/v1/jobs/createTask Тело запроса — не разбираемый JSON.
401 /api/v1/jobs/createTask Ключа нет в заголовке Authorization, либо он неверный или отключён.
402 /api/v1/jobs/createTask Свободных кредитов меньше, чем удерживается под задачу.
403 /api/v1/jobs/createTask Аккаунт заблокирован: вызовы модели, пополнение и загрузка файлов ему закрыты. Ключи при этом не отключены — запрет лежит на аккаунте.
413 /api/v1/jobs/createTask Тело запроса больше 512 КиБ.
415 /api/v1/jobs/createTask Тело отправлено не как application/json или заголовок Content-Type не передан.
422 /api/v1/jobs/createTask Поле model пустое или его имени нет в каталоге, input — не объект, поле не из списка модели либо значение вне её перечисления. В сообщении перечислено, что принимается.
429 /api/v1/jobs/createTask Больше 30 запросов в минуту на один ключ либо больше 50 незавершённых задач на аккаунте.
500 /api/v1/jobs/createTask Поломка на нашей стороне. Подробности остаются в журнале шлюза и наружу не уходят.
401 /api/v1/jobs/recordInfo Ключа нет в заголовке Authorization, либо он неверный или отключён.
404 /api/v1/jobs/recordInfo Задачи с таким номером нет или она создана другим аккаунтом.
422 /api/v1/jobs/recordInfo Параметр taskId не передан.
429 /api/v1/jobs/recordInfo Больше 300 запросов в минуту на один ключ.
500 /api/v1/jobs/recordInfo Поломка на нашей стороне. Подробности остаются в журнале шлюза и наружу не уходят.

Пример вызова

task.sh
# 1. Поставить задачу — в ответе придёт её номер
TASK=$(curl -s https://api.gen202.com/api/v1/jobs/createTask \
  -H "Authorization: Bearer sk-ваш-ключ" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "seedance/2",
    "input": {
      "prompt": "Ginger cat in a white spacesuit floats in zero gravity above Earth. It slowly turns its head toward the camera, front paws drifting; sunlight glints across the helmet visor, the blue planet reflected in the glass. The camera eases backwards, revealing a solar panel at the edge of frame. Cinematic, soft rim light, shallow depth of field.",
      "aspect_ratio": "16:9",
      "resolution": "720p",
      "duration": 4,
      "reference_image_urls": [
        "https://gen202.com/assets/sample-nano-banana-2.jpg"
      ]
    }
  }' | jq -r '.data.taskId')

# 2. Спрашивать состояние, пока задача не закончится: waiting, queuing и
#    generating означают «работа идёт», success и fail — окончательные
while true; do
  RECORD=$(curl -s "https://api.gen202.com/api/v1/jobs/recordInfo?taskId=$TASK" \
    -H "Authorization: Bearer sk-ваш-ключ")
  STATE=$(echo "$RECORD" | jq -r '.data.state')
  case "$STATE" in success|fail) break;; esac
  sleep 3
done

# 3. Забрать результат. Ссылка на файл лежит в resultJson — это строка JSON
#    внутри JSON, поэтому её разбирают вторым разбором (fromjson)
echo "$RECORD" | jq -r '.data |
  if .state == "fail"
  then "отказ \(.failCode): \(.failMsg)"
  else .resultJson | fromjson | .resultUrls[0]
  end'
task.py
import json
import time

import requests

headers = {"Authorization": "Bearer sk-ваш-ключ"}

# 1. Поставить задачу — в ответе придёт её номер
created = requests.post(
    "https://api.gen202.com/api/v1/jobs/createTask",
    headers=headers,
    json={
      "model": "seedance/2",
      "input": {
        "prompt": "Ginger cat in a white spacesuit floats in zero gravity above Earth. It slowly turns its head toward the camera, front paws drifting; sunlight glints across the helmet visor, the blue planet reflected in the glass. The camera eases backwards, revealing a solar panel at the edge of frame. Cinematic, soft rim light, shallow depth of field.",
        "aspect_ratio": "16:9",
        "resolution": "720p",
        "duration": 4,
        "reference_image_urls": [
          "https://gen202.com/assets/sample-nano-banana-2.jpg"
        ]
      }
    },
).json()
task_id = created["data"]["taskId"]

# 2. Спрашивать состояние, пока задача не закончится: waiting, queuing и
#    generating означают «работа идёт», success и fail — окончательные
while True:
    task = requests.get(
        "https://api.gen202.com/api/v1/jobs/recordInfo",
        headers=headers,
        params={"taskId": task_id},
    ).json()["data"]
    if task["state"] in ("success", "fail"):
        break
    time.sleep(3)

# 3. Разобрать итог. У неудачи причина в failCode и failMsg
if task["state"] == "fail":
    raise SystemExit("отказ " + task["failCode"] + ": " + task["failMsg"])

# resultJson — строка JSON внутри JSON, поэтому разбор второй
result = json.loads(task["resultJson"])
print(result["resultUrls"][0])
print("списано кредитов:", task["creditsConsumed"])

Пример проходит весь путь: ставит задачу, повторяет запрос состояния раз в 3 секунды, пока задача не закончится, и разбирает ответ до ссылки на файл. Разборов два, потому что поле resultJson — строка JSON внутри JSON. В теле первого запроса стоят обязательные поля модели и значения из её перечислений, поэтому он проходит проверку шлюза как есть. Подставить остаётся только свой ключ. Пример на оболочке разбирает ответ через jq; на Python своего ничего не нужно, кроме requests.

POST https://api.gen202.com/api/v1/jobs/createTask
GET https://api.gen202.com/api/v1/jobs/recordInfo?taskId=…

Ролик делается минуты, поэтому файл не приходит в ответ на запрос. Первый вызов ставит задачу и сразу отвечает её номером, второй по этому номеру отдаёт состояние задачи, а когда она готова — ссылку на результат. Ключ передаётся в обоих запросах заголовком Authorization: Bearer sk-… и выпускается в кабинете. На один ключ шлюз пропускает 30 постановок задачи и 300 запросов состояния в минуту.

Поля запроса

Значения проверяются до обращения к поставщику: поле не из списка модели или значение вне перечисления возвращают 422 и кредитов не тратят.

ПолеТипОбяз.Допустимые значения
model текст обязательное seedance/2-fast
input объект обязательное Параметры генерации — поля из таблицы ниже

Поля input

ПолеТипОбяз.Допустимые значения
prompt текст опц. от 3 до 20 000 символов
first_frame_url ссылка опц. одна ссылка на изображение
last_frame_url ссылка опц. одна ссылка на изображение
reference_image_urls список ссылок опц. до 9 ссылок на изображение
reference_video_urls список ссылок опц. до 3 ссылок на видео
reference_audio_urls список ссылок опц. до 3 ссылок на аудио
return_last_frame да или нет опц. true или false
generate_audio да или нет опц. true или false
resolution значение из списка опц. 480p · 720p
aspect_ratio значение из списка опц. 1:1 · 4:3 · 3:4 · 16:9 · 9:16 · 21:9 · adaptive
duration целое число опц. целое от 4 до 15
web_search да или нет опц. true или false
nsfw_checker да или нет опц. true или false

Ссылка на исходный файл принимается только полным адресом на http или https: не длиннее 2048 символов, на общедоступном сайте, без имени и пароля перед адресом и без порта, кроме 80 и 443. Относительный путь, а также адреса внутри сети — localhost, 127.0.0.1, 10.0.0.5, 192.168.1.2 — и имена без точки шлюз отклоняет ответом 422, к поставщику не обращаясь.

Ответ

Оба запроса отвечают одним конвертом: {"code":…,"msg":…,"data":…}, где code повторяет HTTP-статус, а полезное лежит в data. Тот же конверт приходит и при отказе — разбирать две формы ответа не нужно.

/api/v1/jobs/createTask

ПолеТипЧто в нём
data.taskId строка Номер задачи. Больше в ответе ничего нет и быть не может — работа только началась.

/api/v1/jobs/recordInfo

ПолеТипЧто в нём
data.taskId строка Номер задачи — тот же, что вернул createTask.
data.model строка Имя модели в том виде, в каком его прислал клиент.
data.state строка Состояние задачи: waiting, queuing, generating, success или fail.
data.param строка Параметры, с которыми задача создана, — строкой JSON внутри JSON.
data.resultJson строка Результат строкой JSON внутри JSON: {"resultUrls":["https://…"]} — разбирается вторым разбором. До завершения задачи — пустая строка.
data.failCode строка Код неудачи из таблицы ниже. У остальных задач — пустая строка.
data.failMsg строка Причина неудачи словами. Иначе пустая строка.
data.costTime число Сколько задача заняла, миллисекунды. Пока не завершилась — null.
data.completeTime число Когда завершилась, миллисекунды эпохи Unix. Пока не завершилась — null.
data.createTime число Когда создана, миллисекунды эпохи Unix.
data.updateTime число Когда состояние менялось в последний раз, миллисекунды эпохи Unix.
data.creditsConsumed число Сколько кредитов списано. Ноль, пока задача не завершилась, и ноль у неудачной.

Состояния задачи

Состояние лежит в поле state ответа /api/v1/jobs/recordInfo. Первые три означают, что работа идёт: запрос надо повторить примерно через 3 секунды — чаще спрашивать нечего, столько же ждёт между опросами сам шлюз. Два последних состояния окончательные: после них задача не меняется.

stateЧто происходит
waiting Задача принята и стоит в очереди шлюза; поставщику она ещё не отправлена.
queuing Поставщик задачу принял и поставил в свою очередь.
generating Генерация идёт.
success Готово: ссылки на результат лежат в resultJson, в creditsConsumed — сколько списано.
fail Задача не удалась: причина в failCode и failMsg, удержанные кредиты возвращены целиком.

Опрос не бывает бесконечным: задача на видео живёт не дольше 60 минут, после чего шлюз закрывает её сам состоянием fail и возвращает удержанные кредиты целиком. Причина неудачи приходит двумя полями: failCode из таблицы ниже и failMsg словами.

failCodeЧто произошло
501 Поставщик вернул отказ: генерация не удалась.
408 Результата нет дольше крайнего срока задачи (60 минут для видео).
404 Поставщик не знает такой задачи.
429 Поставщик отбил создание задачи по своему лимиту.
500 Поломка на нашей стороне; подробности остаются в журнале шлюза.

Ссылка на готовый файл живёт 14 дней — столько его хранит поставщик. Файл, который нужен дольше, скачивайте к себе сразу после того, как задача пришла в состояние success.

Отказы

Тело отказа одно на все случаи: {"code":…,"msg":…,"data":null}. Задача, не дошедшая до результата, не тарифицируется — удержанные кредиты возвращаются целиком.

КодАдресКогда
400 /api/v1/jobs/createTask Тело запроса — не разбираемый JSON.
401 /api/v1/jobs/createTask Ключа нет в заголовке Authorization, либо он неверный или отключён.
402 /api/v1/jobs/createTask Свободных кредитов меньше, чем удерживается под задачу.
403 /api/v1/jobs/createTask Аккаунт заблокирован: вызовы модели, пополнение и загрузка файлов ему закрыты. Ключи при этом не отключены — запрет лежит на аккаунте.
413 /api/v1/jobs/createTask Тело запроса больше 512 КиБ.
415 /api/v1/jobs/createTask Тело отправлено не как application/json или заголовок Content-Type не передан.
422 /api/v1/jobs/createTask Поле model пустое или его имени нет в каталоге, input — не объект, поле не из списка модели либо значение вне её перечисления. В сообщении перечислено, что принимается.
429 /api/v1/jobs/createTask Больше 30 запросов в минуту на один ключ либо больше 50 незавершённых задач на аккаунте.
500 /api/v1/jobs/createTask Поломка на нашей стороне. Подробности остаются в журнале шлюза и наружу не уходят.
401 /api/v1/jobs/recordInfo Ключа нет в заголовке Authorization, либо он неверный или отключён.
404 /api/v1/jobs/recordInfo Задачи с таким номером нет или она создана другим аккаунтом.
422 /api/v1/jobs/recordInfo Параметр taskId не передан.
429 /api/v1/jobs/recordInfo Больше 300 запросов в минуту на один ключ.
500 /api/v1/jobs/recordInfo Поломка на нашей стороне. Подробности остаются в журнале шлюза и наружу не уходят.

Пример вызова

task.sh
# 1. Поставить задачу — в ответе придёт её номер
TASK=$(curl -s https://api.gen202.com/api/v1/jobs/createTask \
  -H "Authorization: Bearer sk-ваш-ключ" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "seedance/2-fast",
    "input": {
      "prompt": "Ginger cat in a white spacesuit floats in zero gravity above Earth. It slowly turns its head toward the camera, front paws drifting; sunlight glints across the helmet visor, the blue planet reflected in the glass. The camera eases backwards, revealing a solar panel at the edge of frame. Cinematic, soft rim light, shallow depth of field.",
      "aspect_ratio": "16:9",
      "resolution": "720p",
      "duration": 4,
      "reference_image_urls": [
        "https://gen202.com/assets/sample-nano-banana-2.jpg"
      ]
    }
  }' | jq -r '.data.taskId')

# 2. Спрашивать состояние, пока задача не закончится: waiting, queuing и
#    generating означают «работа идёт», success и fail — окончательные
while true; do
  RECORD=$(curl -s "https://api.gen202.com/api/v1/jobs/recordInfo?taskId=$TASK" \
    -H "Authorization: Bearer sk-ваш-ключ")
  STATE=$(echo "$RECORD" | jq -r '.data.state')
  case "$STATE" in success|fail) break;; esac
  sleep 3
done

# 3. Забрать результат. Ссылка на файл лежит в resultJson — это строка JSON
#    внутри JSON, поэтому её разбирают вторым разбором (fromjson)
echo "$RECORD" | jq -r '.data |
  if .state == "fail"
  then "отказ \(.failCode): \(.failMsg)"
  else .resultJson | fromjson | .resultUrls[0]
  end'
task.py
import json
import time

import requests

headers = {"Authorization": "Bearer sk-ваш-ключ"}

# 1. Поставить задачу — в ответе придёт её номер
created = requests.post(
    "https://api.gen202.com/api/v1/jobs/createTask",
    headers=headers,
    json={
      "model": "seedance/2-fast",
      "input": {
        "prompt": "Ginger cat in a white spacesuit floats in zero gravity above Earth. It slowly turns its head toward the camera, front paws drifting; sunlight glints across the helmet visor, the blue planet reflected in the glass. The camera eases backwards, revealing a solar panel at the edge of frame. Cinematic, soft rim light, shallow depth of field.",
        "aspect_ratio": "16:9",
        "resolution": "720p",
        "duration": 4,
        "reference_image_urls": [
          "https://gen202.com/assets/sample-nano-banana-2.jpg"
        ]
      }
    },
).json()
task_id = created["data"]["taskId"]

# 2. Спрашивать состояние, пока задача не закончится: waiting, queuing и
#    generating означают «работа идёт», success и fail — окончательные
while True:
    task = requests.get(
        "https://api.gen202.com/api/v1/jobs/recordInfo",
        headers=headers,
        params={"taskId": task_id},
    ).json()["data"]
    if task["state"] in ("success", "fail"):
        break
    time.sleep(3)

# 3. Разобрать итог. У неудачи причина в failCode и failMsg
if task["state"] == "fail":
    raise SystemExit("отказ " + task["failCode"] + ": " + task["failMsg"])

# resultJson — строка JSON внутри JSON, поэтому разбор второй
result = json.loads(task["resultJson"])
print(result["resultUrls"][0])
print("списано кредитов:", task["creditsConsumed"])

Пример проходит весь путь: ставит задачу, повторяет запрос состояния раз в 3 секунды, пока задача не закончится, и разбирает ответ до ссылки на файл. Разборов два, потому что поле resultJson — строка JSON внутри JSON. В теле первого запроса стоят обязательные поля модели и значения из её перечислений, поэтому он проходит проверку шлюза как есть. Подставить остаётся только свой ключ. Пример на оболочке разбирает ответ через jq; на Python своего ничего не нужно, кроме requests.

POST https://api.gen202.com/api/v1/jobs/createTask
GET https://api.gen202.com/api/v1/jobs/recordInfo?taskId=…

Ролик делается минуты, поэтому файл не приходит в ответ на запрос. Первый вызов ставит задачу и сразу отвечает её номером, второй по этому номеру отдаёт состояние задачи, а когда она готова — ссылку на результат. Ключ передаётся в обоих запросах заголовком Authorization: Bearer sk-… и выпускается в кабинете. На один ключ шлюз пропускает 30 постановок задачи и 300 запросов состояния в минуту.

Поля запроса

Значения проверяются до обращения к поставщику: поле не из списка модели или значение вне перечисления возвращают 422 и кредитов не тратят.

ПолеТипОбяз.Допустимые значения
model текст обязательное seedance/2-mini
input объект обязательное Параметры генерации — поля из таблицы ниже

Поля input

ПолеТипОбяз.Допустимые значения
prompt текст опц. от 3 до 20 000 символов
first_frame_url ссылка опц. одна ссылка на изображение
last_frame_url ссылка опц. одна ссылка на изображение
reference_image_urls список ссылок опц. до 9 ссылок на изображение
reference_video_urls список ссылок опц. до 3 ссылок на видео
reference_audio_urls список ссылок опц. до 3 ссылок на аудио
generate_audio да или нет опц. true или false
resolution значение из списка опц. 480p · 720p
aspect_ratio значение из списка опц. 1:1 · 4:3 · 3:4 · 16:9 · 9:16 · 21:9 · adaptive
duration целое число опц. целое от 4 до 15
web_search да или нет опц. true или false
nsfw_checker да или нет опц. true или false

Ссылка на исходный файл принимается только полным адресом на http или https: не длиннее 2048 символов, на общедоступном сайте, без имени и пароля перед адресом и без порта, кроме 80 и 443. Относительный путь, а также адреса внутри сети — localhost, 127.0.0.1, 10.0.0.5, 192.168.1.2 — и имена без точки шлюз отклоняет ответом 422, к поставщику не обращаясь.

Ответ

Оба запроса отвечают одним конвертом: {"code":…,"msg":…,"data":…}, где code повторяет HTTP-статус, а полезное лежит в data. Тот же конверт приходит и при отказе — разбирать две формы ответа не нужно.

/api/v1/jobs/createTask

ПолеТипЧто в нём
data.taskId строка Номер задачи. Больше в ответе ничего нет и быть не может — работа только началась.

/api/v1/jobs/recordInfo

ПолеТипЧто в нём
data.taskId строка Номер задачи — тот же, что вернул createTask.
data.model строка Имя модели в том виде, в каком его прислал клиент.
data.state строка Состояние задачи: waiting, queuing, generating, success или fail.
data.param строка Параметры, с которыми задача создана, — строкой JSON внутри JSON.
data.resultJson строка Результат строкой JSON внутри JSON: {"resultUrls":["https://…"]} — разбирается вторым разбором. До завершения задачи — пустая строка.
data.failCode строка Код неудачи из таблицы ниже. У остальных задач — пустая строка.
data.failMsg строка Причина неудачи словами. Иначе пустая строка.
data.costTime число Сколько задача заняла, миллисекунды. Пока не завершилась — null.
data.completeTime число Когда завершилась, миллисекунды эпохи Unix. Пока не завершилась — null.
data.createTime число Когда создана, миллисекунды эпохи Unix.
data.updateTime число Когда состояние менялось в последний раз, миллисекунды эпохи Unix.
data.creditsConsumed число Сколько кредитов списано. Ноль, пока задача не завершилась, и ноль у неудачной.

Состояния задачи

Состояние лежит в поле state ответа /api/v1/jobs/recordInfo. Первые три означают, что работа идёт: запрос надо повторить примерно через 3 секунды — чаще спрашивать нечего, столько же ждёт между опросами сам шлюз. Два последних состояния окончательные: после них задача не меняется.

stateЧто происходит
waiting Задача принята и стоит в очереди шлюза; поставщику она ещё не отправлена.
queuing Поставщик задачу принял и поставил в свою очередь.
generating Генерация идёт.
success Готово: ссылки на результат лежат в resultJson, в creditsConsumed — сколько списано.
fail Задача не удалась: причина в failCode и failMsg, удержанные кредиты возвращены целиком.

Опрос не бывает бесконечным: задача на видео живёт не дольше 60 минут, после чего шлюз закрывает её сам состоянием fail и возвращает удержанные кредиты целиком. Причина неудачи приходит двумя полями: failCode из таблицы ниже и failMsg словами.

failCodeЧто произошло
501 Поставщик вернул отказ: генерация не удалась.
408 Результата нет дольше крайнего срока задачи (60 минут для видео).
404 Поставщик не знает такой задачи.
429 Поставщик отбил создание задачи по своему лимиту.
500 Поломка на нашей стороне; подробности остаются в журнале шлюза.

Ссылка на готовый файл живёт 14 дней — столько его хранит поставщик. Файл, который нужен дольше, скачивайте к себе сразу после того, как задача пришла в состояние success.

Отказы

Тело отказа одно на все случаи: {"code":…,"msg":…,"data":null}. Задача, не дошедшая до результата, не тарифицируется — удержанные кредиты возвращаются целиком.

КодАдресКогда
400 /api/v1/jobs/createTask Тело запроса — не разбираемый JSON.
401 /api/v1/jobs/createTask Ключа нет в заголовке Authorization, либо он неверный или отключён.
402 /api/v1/jobs/createTask Свободных кредитов меньше, чем удерживается под задачу.
403 /api/v1/jobs/createTask Аккаунт заблокирован: вызовы модели, пополнение и загрузка файлов ему закрыты. Ключи при этом не отключены — запрет лежит на аккаунте.
413 /api/v1/jobs/createTask Тело запроса больше 512 КиБ.
415 /api/v1/jobs/createTask Тело отправлено не как application/json или заголовок Content-Type не передан.
422 /api/v1/jobs/createTask Поле model пустое или его имени нет в каталоге, input — не объект, поле не из списка модели либо значение вне её перечисления. В сообщении перечислено, что принимается.
429 /api/v1/jobs/createTask Больше 30 запросов в минуту на один ключ либо больше 50 незавершённых задач на аккаунте.
500 /api/v1/jobs/createTask Поломка на нашей стороне. Подробности остаются в журнале шлюза и наружу не уходят.
401 /api/v1/jobs/recordInfo Ключа нет в заголовке Authorization, либо он неверный или отключён.
404 /api/v1/jobs/recordInfo Задачи с таким номером нет или она создана другим аккаунтом.
422 /api/v1/jobs/recordInfo Параметр taskId не передан.
429 /api/v1/jobs/recordInfo Больше 300 запросов в минуту на один ключ.
500 /api/v1/jobs/recordInfo Поломка на нашей стороне. Подробности остаются в журнале шлюза и наружу не уходят.

Пример вызова

task.sh
# 1. Поставить задачу — в ответе придёт её номер
TASK=$(curl -s https://api.gen202.com/api/v1/jobs/createTask \
  -H "Authorization: Bearer sk-ваш-ключ" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "seedance/2-mini",
    "input": {
      "prompt": "Ginger cat in a white spacesuit floats in zero gravity above Earth. It slowly turns its head toward the camera, front paws drifting; sunlight glints across the helmet visor, the blue planet reflected in the glass. The camera eases backwards, revealing a solar panel at the edge of frame. Cinematic, soft rim light, shallow depth of field.",
      "aspect_ratio": "16:9",
      "resolution": "720p",
      "duration": 4,
      "reference_image_urls": [
        "https://gen202.com/assets/sample-nano-banana-2.jpg"
      ]
    }
  }' | jq -r '.data.taskId')

# 2. Спрашивать состояние, пока задача не закончится: waiting, queuing и
#    generating означают «работа идёт», success и fail — окончательные
while true; do
  RECORD=$(curl -s "https://api.gen202.com/api/v1/jobs/recordInfo?taskId=$TASK" \
    -H "Authorization: Bearer sk-ваш-ключ")
  STATE=$(echo "$RECORD" | jq -r '.data.state')
  case "$STATE" in success|fail) break;; esac
  sleep 3
done

# 3. Забрать результат. Ссылка на файл лежит в resultJson — это строка JSON
#    внутри JSON, поэтому её разбирают вторым разбором (fromjson)
echo "$RECORD" | jq -r '.data |
  if .state == "fail"
  then "отказ \(.failCode): \(.failMsg)"
  else .resultJson | fromjson | .resultUrls[0]
  end'
task.py
import json
import time

import requests

headers = {"Authorization": "Bearer sk-ваш-ключ"}

# 1. Поставить задачу — в ответе придёт её номер
created = requests.post(
    "https://api.gen202.com/api/v1/jobs/createTask",
    headers=headers,
    json={
      "model": "seedance/2-mini",
      "input": {
        "prompt": "Ginger cat in a white spacesuit floats in zero gravity above Earth. It slowly turns its head toward the camera, front paws drifting; sunlight glints across the helmet visor, the blue planet reflected in the glass. The camera eases backwards, revealing a solar panel at the edge of frame. Cinematic, soft rim light, shallow depth of field.",
        "aspect_ratio": "16:9",
        "resolution": "720p",
        "duration": 4,
        "reference_image_urls": [
          "https://gen202.com/assets/sample-nano-banana-2.jpg"
        ]
      }
    },
).json()
task_id = created["data"]["taskId"]

# 2. Спрашивать состояние, пока задача не закончится: waiting, queuing и
#    generating означают «работа идёт», success и fail — окончательные
while True:
    task = requests.get(
        "https://api.gen202.com/api/v1/jobs/recordInfo",
        headers=headers,
        params={"taskId": task_id},
    ).json()["data"]
    if task["state"] in ("success", "fail"):
        break
    time.sleep(3)

# 3. Разобрать итог. У неудачи причина в failCode и failMsg
if task["state"] == "fail":
    raise SystemExit("отказ " + task["failCode"] + ": " + task["failMsg"])

# resultJson — строка JSON внутри JSON, поэтому разбор второй
result = json.loads(task["resultJson"])
print(result["resultUrls"][0])
print("списано кредитов:", task["creditsConsumed"])

Пример проходит весь путь: ставит задачу, повторяет запрос состояния раз в 3 секунды, пока задача не закончится, и разбирает ответ до ссылки на файл. Разборов два, потому что поле resultJson — строка JSON внутри JSON. В теле первого запроса стоят обязательные поля модели и значения из её перечислений, поэтому он проходит проверку шлюза как есть. Подставить остаётся только свой ключ. Пример на оболочке разбирает ответ через jq; на Python своего ничего не нужно, кроме requests.

Остальные модели этого семейства и их поля — в разделе документации Видео.

Что делает нейросеть Seedance 2.0

Seedance 2.0 — видеомодель ByteDance, вышедшая в Китае в начале февраля 2026 года. Она делает ролик со звуком по описанию, по снимку и по готовому видео, а секунда стоит у GEN202 от 7,6 ₽ до 140,4 ₽: цену двигают разрешение и то, приложено ли видео к запросу.

Seedance 2.0 — нейросеть ByteDance: она делает видео со звуком по описанию, снимку или готовому ролику.

Каждый уровень берёт сразу несколько работ: видео из текста, видео из изображения и видео по образцам. Переключателя между ними нет — работу задаёт то, что положено в поля запроса.

Уровней 3, и в поле model у каждого своё имя: seedance/2, seedance/2-fast и seedance/2-mini.

Для запроса хватает одного описания: остальные поля необязательны. Весь набор полей вместе с допустимыми значениями стоит таблицей выше, а вызов целиком разобран в разделе «Seedance».

Как пользоваться Seedance 2.0 и можно ли её скачать

Работают с моделью прямо в браузере: поля заполняют в песочнице выше, а готовый ролик проигрывается там же. Скачать Seedance 2.0 к себе на компьютер нельзя: это не программа, а модель на стороне разработчика. Скачивается результат: готовый ролик забирается в mp4.

За каждую секунду ролика в Seedance 2.0 списывается плата по ставке из таблицы выше. Приветственные кредиты новому счёту начисляют при первом входе, и они засчитываются в стоимость первого ролика. Помесячной подписки за доступ к модели нет — деньги уходят только за поставленные задачи.

Официальный сайт Seedance 2.0 держит сам ByteDance, и GEN202 им не является. Мы открываем ту же модель клиентам из России: запрос уходит на наш адрес, а не за границу.

Без кода Seedance 2.0 запускают в браузере: порядок разобран на странице как пользоваться Seedance в России.

Порядок работы одинаков на всех уровнях, и меняются в нём только значения полей.

  1. Опишите сцену словами. В поле prompt пишут, кто в кадре, что делает и как стоит камера. Главное ставят в начало.
  2. Выберите разрешение и длительность. Поля resolution и duration задают, каким выйдет ролик, и вместе они определяют цену задачи.
  3. Приложите образцы, если они есть. Ссылки на картинки, ролики и звук кладут каждую в своё поле. Без них модель снимает по одному описанию.
  4. Решите, нужен ли звук. Звуковую дорожку включает флаг generate_audio, а сами звуки сцены называют там же, где сюжет.
  5. Проверьте описание коротким роликом. Секунда в низком разрешении стоит меньше. Замысел поэтому сверяют на коротком ролике, а удачное описание повторяют в нужном разрешении.

Чем Fast и Mini отличаются от Seedance 2.0

Различия видны прямо в полях запроса. Первое — разрешение: старший уровень доходит до 4k, а у Fast и Mini потолок 720p.

Второе мельче: поле return_last_frame стоит у Seedance 2.0 и Seedance 2.0 Fast, а у Seedance 2.0 Mini его нет. По нему вместе с готовым роликом приходит его последний кадр.

Прочее у уровней совпадает: длительность, форма кадра, списки образцов и порядок вызова. Расходится цена секунды — она стоит таблицей выше, своя у каждого уровня и у каждого разрешения.

Выпуски Seedance: чем подтверждены их даты

Линейка идёт от первого поколения к нынешнему, и у каждого выпуска своя опора: у одних — публикация в блоге разработчика с датой, у других — карточка модели или строка в таблице моделей BytePlus. В таблице это названо прямо.

Имя у ByteDanceЧем подтверждена датаЧто в нём появилосьНаш адрес
Seedance 1.0технический отчёт в блоге, 11 июня 2025Ролики 1080p по тексту и по картинке с переходами между планами
Seedance 1.5 proпубликация в блоге, 16 декабря 2025Звук и картинка стали собираться одной генерацией
Seedance 2.0карточка модели: «early February 2026», дня нетЕдиное устройство под звук и видео сразу, образцы четырёх видов на входеэта страница, seedance/2
Seedance 2.0 Fastкарточка модели подана 15 апреля 2026Ускоренный вариант того же поколения под быстрый ответэта страница, seedance/2-fast
Seedance 2.0 Miniсвоего объявления нет, только строка в таблице моделейСамый дешёвый вариант поколенияэта страница, seedance/2-mini
Seedance 2.5публикация в блоге, 31 июля 2026Следующее поколение с более длинным роликом за один заходкарточка Seedance 2.5

Как разработчик сам датирует нынешнее поколение, видно по карточке модели: «Seedance 2.0 is a new native multi-modal audio-video generation model, officially released in China in early February 2026». Перевод наш: «Seedance 2.0 — новая родная многомодальная модель, которая делает звук и видео вместе; официально вышла в Китае в начале февраля 2026 года». Дня в этой фразе нет, поэтому и в таблице его нет. Карточка — описание Seedance 2.0 на arXiv.

Про ускоренный вариант там же сказано: «In addition, we provide Seedance 2.0 Fast version, an accelerated variant of Seedance 2.0 designed to boost generation speed for low-latency scenarios». Перевод наш: «Кроме того, мы даём вариант Seedance 2.0 Fast — ускоренную сборку Seedance 2.0 для случаев, где нужен быстрый ответ».

У самого младшего уровня объявления у разработчика нет: он известен по строке в таблице моделей BytePlus, облачной площадки самого ByteDance. Чем три уровня различаются в запросе, разобрано выше на этой же странице, а чем нынешнее поколение отличается от следующего — на странице Seedance 2.5.

Какой длины и в каком разрешении выходит ролик Seedance 2.0

Длина задаётся целым числом секунд в поле duration, от 4 до 15, и этот диапазон один на все уровни.

Разрешение — обычное поле запроса, и меняется оно от вызова к вызову; отдельного имени модели под 4K не заведено.

Форм кадра 7: 1:1, 4:3, 3:4, 16:9, 9:16, 21:9, adaptive.

Что кладут в запрос Seedance 2.0 кроме описания

Образцы разложены по трём полям, и каждое берёт свой вид файла: reference_image_urls — картинки, reference_video_urls — готовые ролики, reference_audio_urls — звук. Пределы у списков разные и стоят в таблице полей.

Первый и последний кадр в эти списки не входят: под них заведены свои поля first_frame_url и last_frame_url, по одной ссылке в каждом.

Звук пишется по флагу generate_audio. Что делать с присланным материалом, объясняют там же, где пишут сюжет, — в поле prompt.

Как выглядит собранное тело запроса, видно в песочнице: форма заполнена допустимыми значениями до первой правки.

Что ByteDance говорит о модели Seedance 2.0

Чем разработчик считает это поколение, сказано первой строкой его страницы: «Seedance 2.0 adopts a unified multimodal audio-video joint generation architecture that supports text, image, audio, and video inputs, leading to the most comprehensive multimodal content reference and editing capabilities in the industry». Перевод наш: «Seedance 2.0 построена на едином многомодальном устройстве, которое делает звук и видео вместе и принимает на вход текст, картинку, звук и ролик, давая самый полный в отрасли набор возможностей брать материал за образец и править его». Страница — страница модели Seedance 2.0.

Там же он называет, чем берёт результат: «Featuring exceptional motion stability and audio-video joint generation, Seedance 2.0 delivers an ultra-realistic immersive experience». Перевод наш: «Благодаря исключительной устойчивости движения и совместной выработке звука и картинки Seedance 2.0 даёт очень достоверное ощущение присутствия». Проверял он модель своим же набором задач: «Below are the results of Seedance 2.0 in internal benchmarks using SeedVideoBench-2.0» — перевод наш: «Ниже — итоги Seedance 2.0 во внутренних проверках на наборе задач SeedVideoBench-2.0». Чисел рядом с этими итогами на странице нет, одни лепестковые диаграммы.

Пределы поколения разработчик выписал в карточке модели: «Seedance 2.0 supports direct generation of audio-video content with durations ranging from 4 to 15 seconds, with native output resolutions of 480p and 720p». Перевод наш: «Seedance 2.0 делает звуко-видео длиной от 4 до 15 секунд с собственным разрешением вывода 480p и 720p». Тот же диапазон длительности стоит в форме GEN202 — от 4 до 15 секунд, — а разрешений в ней больше: карточка подана в апреле 2026 года, старшие разрешения у поколения появились позже.

Нынешний набор разрешений стоит в таблице моделей BytePlus, облачной площадки самого ByteDance: «Resolution: 480p (8-bit color depth), 720p (8-bit color depth), 1080p (8-bit color depth), 4K (10-bit color depth); Frame rate: 24 fps; Duration: 4–15 s; Video format: .mp4». Перевод наш: «Разрешение: 480p с восемью битами на цвет, 720p с восемью, 1080p с восемью и 4K с десятью; частота кадров 24 в секунду; длительность от 4 до 15 секунд; формат .mp4». Все четыре разрешения стоят и у старшего уровня в каталоге GEN202 — 480p, 720p, 1080p и 4k. Таблица — список моделей BytePlus.

Задачи того же уровня перечислены там же строкой: «Multimodal reference-to-video; Reference-to-video; Video editing; Video extension; Image-to-video - First and last frames; Image-to-video - First frame; Text-to-video». Перевод наш: генерация по многомодальным образцам, генерация по образцам, правка видео, доращивание видео, картинка в видео по первому и последнему кадру, картинка в видео по первому кадру и текст в видео.

От чего зависит цена, разработчик объясняет на странице тарифов: «Video pricing is determined by both the token rate and token consumption. Under otherwise identical conditions: A video generated at a higher resolution costs more than one generated at a lower resolution. A video generated with video input costs more than one generated without video input». Перевод наш: «Цена ролика складывается из ставки за токен и расхода токенов. При прочих равных ролик в более высоком разрешении стоит дороже, чем в низком, а ролик с видео на входе — дороже, чем без него». Обе зависимости видны и в нашей таблице цен выше: у каждого уровня по строке на разрешение и по строке на то, приложено видео или нет.

Свою цену за секунду разработчик называет только внутри условий акции: «Seedance 2.0 mini: From 14:00 (UTC+8) on August 7, 2026 through 14:00 (UTC+8) on October 7, 2026, both 480p and 720p output are billed at 60% off the list price. For 720p output, the price starts at approximately USD 0.03 per second». Перевод наш: «Seedance 2.0 mini: с 14:00 по времени UTC+8 7 августа 2026 года по 14:00 7 октября 2026 года выход в 480p и 720p считается со скидкой 60 процентов от прейскурантной цены; для 720p цена начинается примерно от 0,03 доллара за секунду». Это временная цена кабинета BytePlus, и считается она по токенам. В таблице цен GEN202 у того же уровня официальной ценой 720p без видео на входе стоит $0.1547 за секунду — прейскурантное число, без скидки. Страница — тарифы BytePlus.

Цитаты приведены по страницам ByteDance и BytePlus на 15 сентября 2026 года.

О чём ByteDance предупреждает у Seedance 2.0

Настоящее человеческое лицо на вход не принимается ни снимком, ни роликом.

Исключение сделано для прежних выдач самих этих моделей: то, что они выдали по тому же счёту, кладётся на вход как есть.

Готовый 4K приходит в кодировании H.265, и часть проигрывателей и браузеров такой файл не откроет.

Что показали независимые проверки Seedance 2.0

Поколения линейки сравнивает между собой LMArena — площадка слепых попарных сравнений, где человек смотрит два ролика, не зная, чей какой. В арене «картинка в видео» у строки dreamina-seedance-2.0-720p стоит 1474 с допуском 7 при 118 475 голосах, у seedance-v1-pro — 1273 при 34 019 голосах, у seedance-v1-lite — 1185 при 33 734. Разрыв между поколениями там около двухсот пунктов. Таблица — арена «картинка в видео» на LMArena.

В арене правок у этого поколения своя строка: dreamina-seedance-2.0-720p — 1365 с допуском 14 при 3 852 голосах. Таблица — арена правки видео на LMArena.

Из письменных разборов ближе всего к этому поколению два материала на vc.ru. В разборе от 23 июня 2026 года сказано, что старшие разрешения пришли к линейке отдельно от следующего поколения: «Линейка Seedance 2.0 одновременно получила настоящий 4K… Причём это работает уже сейчас, не нужно ждать выхода 2.5». Там же сведены пределы образцов: «В версии 2.0 можно было дать до 9 картинок, 3 видео и 3 аудио». Те же три предела стоят в форме GEN202. Разбор — «Seedance 2.5: 30 секунд видео одним куском — что показал ByteDance».

Второй разбор, от 7 августа 2026 года, называет, чем болели прежние выпуски линейки: «Предыдущие версии страдали известной болезнью диффузионных систем: дрейфом деталей. Стоило камере развернуться, как одежда героя меняла текстуру, а освещение уходило в "мыло"». Про цену у посредников там сказано отдельно: «В среднем один проход обходится от $0.50 до $1.50 в зависимости от разрешения (1080p или 4K) и количества подгруженных референсов» — это чужие площадки, а не наша ставка. Разбор — «Seedance 2.5: детальный обзор нейросети от ByteDance».

Числа арен и оба разбора приведены на 15 сентября 2026 года.

Что при съёмке в Seedance 2.0 выходит не с первой попытки

Ниже — места, которые видно только на съёмке, и обходы, которые для них нашли.

Наблюдения о Seedance 2.0 взяты из разборов с живыми прогонами: JSFILMZ, 9 февраля 2026, Noble Goose, 28 февраля 2026, Atomic Gains, 13 апреля 2026, Matt Loui, 22 апреля 2026.

  • Если в кадре есть зеркало, стекло или мокрый асфальт, отражение может не совпасть с происходящим рядом или раздвоиться.
  • Быстрое движение даётся модели труднее спокойного. Слово «быстро» вместе с частой сменой планов и насыщенным фоном добавляет дрожание и искажения.
  • Из длинного описания выполняется не всё: часть указаний молча не попадает в ролик. Начало описания модель выполняет точнее конца, поэтому главное ставят вперёд, а украшения убирают.
  • Отдельного поля под запреты у модели нет. Слова «без размытия» и «без рук» в описании нередко приводят ровно к тому, что запрещали. Надёжнее назвать нужное: «резко и в фокусе».
  • Присланная картинка не становится первым кадром дословно — сцену модель перерисовывает по-своему. Совпадения добиваются со второй попытки: в описании прямо требуют повторить присланный кадр целиком.
  • Когда заданы и первый кадр, и последний, в месте перехода между ними предмет иногда двоится, а расположение предметов в кадре сбивается.
  • Надписи на вывесках и экранах выходят нечитаемыми. Нужный текст поэтому накладывают на готовый ролик поверх, а не просят у модели.
  • Музыку модель пишет вместе со звуками сцены. От ролика к ролику она не продолжается, а при перемонтаже кусков рвётся. Когда ролик будут резать, музыку просят не добавлять.
  • В ролике из нескольких планов один-два обычно выходят негодными. Их вырезают при монтаже, а не переснимают ролик целиком.

Сложную сцену поэтому снимают не одним роликом, а несколькими короткими и собирают их вместе при монтаже. Готовый ролик при этом кладут на вход следующего — так герои и обстановка не меняются от куска к куску.

Рубли в таблице цен на этой странице — цены GEN202, сервиса доступа к моделям с оплатой из России; у самого ByteDance плата считается за токены и в долларах. Как устроен наш кредит, разобрано на странице цен.

Как купить доступ к Seedance 2.0 в России и сколько стоит секунда

Все уровни Seedance 2.0 — Seedance 2.0, Seedance 2.0 Fast и Seedance 2.0 Mini — покупаются на GEN202 одним порядком: войти, пополнить баланс рублями и создать ключ в кабинете. Счёт у ByteDance, зарубежная карта и VPN для этого не нужны — запрос идёт на наш адрес.

  1. Вход. Счёт открывается по письму или через Яндекс, и на нём сразу лежит 50 кредитов — 3 секунды Seedance 2.0 Mini в 480p, которые вычитаются из цены первого ролика.
  2. Пополнение. Нижний пакет на 500 ₽ приносит 1 000 кредитов: их хватает на 77 секунд Seedance 2.0 Mini в 480p, а на самый короткий ролик Seedance 2.0 в 4K — 4 секунды за 561,6 ₽ — его уже не хватает, и под 4K берут пакет больше.
  3. Ключ. Ключ один на Seedance 2.0, Seedance 2.0 Fast и Seedance 2.0 Mini; какой уровень снимает, задаёт значение поля model, и второй счёт под сравнение уровней не нужен.

У самого дешёвого сочетания — Seedance 2.0 Mini в 480p — секунда ролика из описания стоит 6,49 ₽, у самого дорогого — Seedance 2.0 в 4K — 140,4 ₽; ролик с готовым видео на входе считается дешевле, и полная сетка ставок стоит в таблице цен. Самый короткий ролик Seedance 2.0 Mini — 4 секунды в 480p — стоит 25,96 ₽, самый длинный Seedance 2.0 — 15 секунд в 4K — 2106 ₽.

Кредиты с того же баланса уходят на Kling, Wan, MiniMax, Gemini Omni и Veo и на остальной каталог. Подробный порядок покупки для всей линейки Seedance и то, что в ней даётся бесплатно, — на странице Seedance API.

Официальный канал BytePlus — объявление о выпуске от 14 апреля 2026 года: показано, что модель принимает на вход текст, картинку, звук и видео. Идёт чуть больше минуты.

Частые вопросы

Как вызвать Seedance 2.0 через API из России?
Запрос уходит на api.gen202.com, и это адрес GEN202, а не адрес ByteDance: обращения за границу в вызове Seedance 2.0 нет, поэтому VPN не требуется. В поле model уходит идентификатор выбранного варианта: 2.0 (seedance/2), fast (seedance/2-fast), mini (seedance/2-mini). Порядок вызова Seedance 2.0 с примерами кода разобран в документации.
Сколько стоит Seedance 2.0
Цена за секунду Seedance 2.0 — от 12.98 кр. (6,49 ₽ · $0.0649) до 280.8 кр. (140,4 ₽ · $1.404). У Seedance 2.0 списывается фактический расход, а задача, завершившаяся ошибкой, не тарифицируется вовсе.
Нужны ли VPN и иностранная карта для Seedance 2.0
Ни то, ни другое: обращение к Seedance 2.0 идёт на наш адрес, а расчёты с ByteDance ведём мы, поэтому договариваться с ним клиенту не о чем. Оплата рублями с карты российского банка.
Как подключить Seedance 2.0 API и сделать первый вызов
Войти на сайт и выпустить ключ в кабинете: при первом входе начисляется 50 кредитов, и этот же ключ открывает Seedance 2.0 вместе с остальным каталогом. Собственного ключа ByteDance и договора с ним для вызова Seedance 2.0 не нужно.
Какая компания разработала Seedance 2.0
Seedance 2.0 разработала компания ByteDance: о запуске модели она объявила 12 февраля 2026 года. Это модель генерации видео со звуком — по описанию, по первому и последнему кадру и по образцам.
Есть ли у Seedance 2.0 официальный сайт
Официальная страница модели — Seedance 2.0 на сайте ByteDance Seed, а в приложении ByteDance отдаёт её через Dreamina. Здесь Seedance 2.0 вызывают по API ключу GEN202 и оплачивают рублями.
Seedance 2.0 Fast и Seedance 2.0 Mini — это отдельные модели
Это режимы той же страницы: переключатель стоит в шапке, у каждого своё имя для поля model и своя строка в таблице цен.