Seedance API
Одной моделью делает ролик по описанию, из присланного изображения и по изображениям-образцам. Разрешение 480p, 720p, 1080p, 4k, 7 соотношений сторон, от 1:1 до adaptive, описание до 20 000 символов. Модель ByteDance, выпущена в феврале 2026 года.
Одной моделью делает ролик по описанию, из присланного изображения и по изображениям-образцам. Разрешение 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% ниже официальной. От 2 мин 39 с на генерацию. От 2 мин 8 с на генерацию.
Цена: за секунду, 480p — 27.84 кр. (13,92 ₽ · $0.1265), 720p — 59.88 кр. (29,94 ₽ · $0.2722), 1080p — 134.72 кр. (67,36 ₽ · $0.6124), 4K — 308.88 кр. (154,44 ₽ · $1.404).
Цена: за секунду, 480p — 22.27 кр. (11,14 ₽ · $0.1012), 720p — 47.9 кр. (23,95 ₽ · $0.2177).
Цена: за секунду, 480p — 14.28 кр. (7,14 ₽ · $0.0649), 720p — 30.63 кр. (15,32 ₽ · $0.1392).
кр. — кредиты, покупаются за рубли.
работает
работает
работает
Песочница
Ещё настройки
Чтобы создать видео — войдите и получите 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": "1:1", "resolution": "720p", "duration": 4, "reference_image_urls": [ "https://gen202.com/assets/sample-nano-banana-pro.jpg" ] } }
{
"code": 200,
"msg": "success",
"data": {
"taskId": "cm8r4t0vk0001s60p2xq7f9ab",
"model": "seedance/2",
"state": "success",
"resultJson": "{\"resultUrls\":[\"https://file.example/result.mp4\"]}",
"failCode": "",
"failMsg": "",
"creditsConsumed": 239.6
}
}
Ещё настройки
Чтобы создать видео — войдите и получите 50 кредитов на тесты и любое использование сервиса.
{ "model": "seedance/2-fast", "input": { "prompt": "The ginger cat in a white spacesuit from the reference image sits on a snowy mountain peak at dawn, snowflakes drift past. Cinematic, cold blue light.", "aspect_ratio": "1:1", "resolution": "480p", "duration": 4, "reference_image_urls": [ "https://gen202.com/assets/sample-nano-banana-pro.jpg" ] } }
{
"code": 200,
"msg": "success",
"data": {
"taskId": "cm8r4t0vk0001s60p2xq7f9ab",
"model": "seedance/2-fast",
"state": "success",
"resultJson": "{\"resultUrls\":[\"https://file.example/result.mp4\"]}",
"failCode": "",
"failMsg": "",
"creditsConsumed": 89.1
}
}
Ещё настройки
Чтобы создать видео — войдите и получите 50 кредитов на тесты и любое использование сервиса.
{ "model": "seedance/2-mini", "input": { "prompt": "The ginger cat in a white spacesuit from the reference image walks along a sandy beach at sunset, waves roll in behind it. Cinematic, warm light.", "aspect_ratio": "1:1", "resolution": "480p", "duration": 4, "reference_image_urls": [ "https://gen202.com/assets/sample-nano-banana-pro.jpg" ] } }
{
"code": 200,
"msg": "success",
"data": {
"taskId": "cm8r4t0vk0001s60p2xq7f9ab",
"model": "seedance/2-mini",
"state": "success",
"resultJson": "{\"resultUrls\":[\"https://file.example/result.mp4\"]}",
"failCode": "",
"failMsg": "",
"creditsConsumed": 57.2
}
}
Цена Seedance 2.0
Цена за секунду. Списывается фактический расход, о котором сообщил поставщик.
| Вариант | Скидка от официальной цены | Наша цена |
|---|---|---|
| 480p with video input | $0.0844 −10% | 16.71 кр. $0.0768,36 ₽ |
| 480p no video input | $0.1406 −10% | 27.84 кр. $0.126513,92 ₽ |
| 720p with video input | $0.1814 −10% | 35.92 кр. $0.163317,96 ₽ |
| 720p no video input | $0.3024 −10% | 59.88 кр. $0.272229,94 ₽ |
| 1080p with video input | $0.4082 −10% | 80.82 кр. $0.367440,41 ₽ |
| 1080p no video input | $0.6804 −10% | 134.72 кр. $0.612467,36 ₽ |
| 4K with video input | $0.93 −10% | 184.14 кр. $0.83792,07 ₽ |
| 4K no video input | $1.56 −10% | 308.88 кр. $1.404154,44 ₽ |
В среднем на 10% ниже официальной цены поставщика. кр. — кредиты, покупаются за рубли.
Цена за секунду. Списывается фактический расход, о котором сообщил поставщик.
| Вариант | Скидка от официальной цены | Наша цена |
|---|---|---|
| 480p with video input | $0.0675 −10% | 13.37 кр. $0.06076,68 ₽ |
| 480p no video input | $0.1125 −10% | 22.27 кр. $0.101211,14 ₽ |
| 720p with video input | $0.1451 −10% | 28.73 кр. $0.130614,36 ₽ |
| 720p no video input | $0.2419 −10% | 47.9 кр. $0.217723,95 ₽ |
В среднем на 10% ниже официальной цены поставщика. кр. — кредиты, покупаются за рубли.
Цена за секунду. Списывается фактический расход, о котором сообщил поставщик.
| Вариант | Скидка от официальной цены | Наша цена |
|---|---|---|
| 480P with video | $0.0433 −10% | 8.57 кр. $0.0394,29 ₽ |
| 480P no video | $0.0721 −10% | 14.28 кр. $0.06497,14 ₽ |
| 720P with video | $0.0928 −10% | 18.37 кр. $0.08359,19 ₽ |
| 720P no video | $0.1547 −10% | 30.63 кр. $0.139215,32 ₽ |
В среднем на 10% ниже официальной цены поставщика. кр. — кредиты, покупаются за рубли.
Вызов через API
Ролик делается минуты, поэтому файл не приходит в ответ на запрос. Первый вызов
ставит задачу и сразу отвечает её номером, второй по этому номеру отдаёт состояние задачи, а когда
она готова — ссылку на результат. Ключ передаётся в обоих запросах заголовком
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 |
Ссылка на исходный файл принимается только полным адресом на 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.failComment | строка | Наш комментарий к словам модели, по-русски: что произошло. Есть не у всякой неудачи; иначе пустая строка. |
| 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, удержанные кредиты возвращены целиком. |
Задача идёт, пока модель не пришлёт результат или отказ. Причина неудачи приходит двумя полями:
failCode из таблицы ниже и failMsg словами.
| failCode | Что произошло |
|---|---|
| 501 | Поставщик вернул отказ: генерация не удалась. |
| 408 | Модель не приняла задачу за 60 минут или не отвечала сутки. |
| 404 | Поставщик не знает такой задачи. |
| 429 | Поставщик отбил создание задачи по своему лимиту. |
| 500 | Поломка на нашей стороне; подробности остаются в журнале шлюза. |
Слова модели в failMsg бывают непонятны, поэтому к части неудач шлюз
добавляет поле failComment — наш комментарий по-русски о том, что
произошло. У остальных неудач это поле пустое.
| failMsg, пример | failComment |
|---|---|
| Image fetch failed. | Модель не смогла скачать файл из нашего хранилища. Вероятно, это разовый сбой, повторите запрос. Если ошибка повторится — напишите в поддержку: hi@gen202.com |
| File type not supported | По ссылке открывается страница сайта, а не файл. Загрузите сам файл или дайте прямую ссылку на него. |
| image #2: width and height must be between 300px and 6000px (got 262x377) (invalid_asset_material) | Одна из картинок слишком маленькая. Seedance принимает картинки от 300 до 6000 пикселей по каждой стороне. |
| Seedance identified your task as video editing based on your prompt. | Seedance понял запрос как редактирование присланного видео. В песочнице и чате выберите режим «Редактирование видео», в API поставьте пропорции adaptive и длительность −1. |
| Seedance identified your task as video extension based on your prompt. | Seedance решил, что присланное видео нужно продлить. Для этого поставьте пропорции adaptive, а если продлевать не нужно — уберите эту просьбу из промта. |
| generate task timeout. | Модель не успела создать результат и сама остановила задачу. |
| Internal Error | Модель остановилась и не назвала причину. Возможно, она перегружена или временно недоступна. Или запрос отклонён из-за чувствительной темы: нагота и откровенные сцены, дети, известные люди, насилие, чужие персонажи и бренды. |
| The request failed because the input image may contain sensitive information. | Модель отклонила загруженную картинку из-за чувствительной темы. Такие темы: нагота и откровенные сцены, дети, известные люди, насилие, чужие персонажи и бренды. |
| The generated content was filtered by the safety system. | Модель отклонила запрос из-за чувствительной темы. Такие темы: нагота и откровенные сцены, дети, известные люди, насилие, чужие персонажи и бренды. |
| The model provider rejected or dropped the task creation request. | Модель остановилась и не назвала причину. Возможно, она перегружена или временно недоступна. Или запрос отклонён из-за чувствительной темы: нагота и откровенные сцены, дети, известные люди, насилие, чужие персонажи и бренды. |
| No result from the provider within the task deadline. | Модель либо не приняла задачу за 15 минут (у видео — за 60), либо не ответила за сутки. |
Ссылка на готовый файл живёт 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 — не объект, поле не из списка модели либо значение вне её перечисления. В сообщении перечислено, что принимается. Тот же код — если во входе наша ссылка на готовый результат старше 14 дней: файла уже нет, его нужно загрузить заново. И если модель не может выполнить именно это сочетание полей: в сообщении сказано, что поменять, — например, другие файлы-образцы. |
| 429 | /api/v1/jobs/createTask | Больше 30 запросов в минуту на один ключ, больше 50 незавершённых задач на аккаунте либо таймаут: за час 5 запросов к моделям этого вида отклонены из-за чувствительной темы, и запуск всех моделей этого вида приостановлен. У такого отказа в теле есть поле timeout с временем окончания паузы, а в заголовке Retry-After — секунды до него. |
| 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 | Поломка на нашей стороне. Подробности остаются в журнале шлюза и наружу не уходят. |
Пример вызова
# 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": "1:1",
"resolution": "720p",
"duration": 4,
"reference_image_urls": [
"https://gen202.com/assets/sample-nano-banana-pro.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'
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": "1:1",
"resolution": "720p",
"duration": 4,
"reference_image_urls": [
"https://gen202.com/assets/sample-nano-banana-pro.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.
Ролик делается минуты, поэтому файл не приходит в ответ на запрос. Первый вызов
ставит задачу и сразу отвечает её номером, второй по этому номеру отдаёт состояние задачи, а когда
она готова — ссылку на результат. Ключ передаётся в обоих запросах заголовком
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 |
Ссылка на исходный файл принимается только полным адресом на 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.failComment | строка | Наш комментарий к словам модели, по-русски: что произошло. Есть не у всякой неудачи; иначе пустая строка. |
| 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, удержанные кредиты возвращены целиком. |
Задача идёт, пока модель не пришлёт результат или отказ. Причина неудачи приходит двумя полями:
failCode из таблицы ниже и failMsg словами.
| failCode | Что произошло |
|---|---|
| 501 | Поставщик вернул отказ: генерация не удалась. |
| 408 | Модель не приняла задачу за 60 минут или не отвечала сутки. |
| 404 | Поставщик не знает такой задачи. |
| 429 | Поставщик отбил создание задачи по своему лимиту. |
| 500 | Поломка на нашей стороне; подробности остаются в журнале шлюза. |
Слова модели в failMsg бывают непонятны, поэтому к части неудач шлюз
добавляет поле failComment — наш комментарий по-русски о том, что
произошло. У остальных неудач это поле пустое.
| failMsg, пример | failComment |
|---|---|
| Image fetch failed. | Модель не смогла скачать файл из нашего хранилища. Вероятно, это разовый сбой, повторите запрос. Если ошибка повторится — напишите в поддержку: hi@gen202.com |
| File type not supported | По ссылке открывается страница сайта, а не файл. Загрузите сам файл или дайте прямую ссылку на него. |
| image #2: width and height must be between 300px and 6000px (got 262x377) (invalid_asset_material) | Одна из картинок слишком маленькая. Seedance принимает картинки от 300 до 6000 пикселей по каждой стороне. |
| Seedance identified your task as video editing based on your prompt. | Seedance понял запрос как редактирование присланного видео. В песочнице и чате выберите режим «Редактирование видео», в API поставьте пропорции adaptive и длительность −1. |
| Seedance identified your task as video extension based on your prompt. | Seedance решил, что присланное видео нужно продлить. Для этого поставьте пропорции adaptive, а если продлевать не нужно — уберите эту просьбу из промта. |
| generate task timeout. | Модель не успела создать результат и сама остановила задачу. |
| Internal Error | Модель остановилась и не назвала причину. Возможно, она перегружена или временно недоступна. Или запрос отклонён из-за чувствительной темы: нагота и откровенные сцены, дети, известные люди, насилие, чужие персонажи и бренды. |
| The request failed because the input image may contain sensitive information. | Модель отклонила загруженную картинку из-за чувствительной темы. Такие темы: нагота и откровенные сцены, дети, известные люди, насилие, чужие персонажи и бренды. |
| The generated content was filtered by the safety system. | Модель отклонила запрос из-за чувствительной темы. Такие темы: нагота и откровенные сцены, дети, известные люди, насилие, чужие персонажи и бренды. |
| The model provider rejected or dropped the task creation request. | Модель остановилась и не назвала причину. Возможно, она перегружена или временно недоступна. Или запрос отклонён из-за чувствительной темы: нагота и откровенные сцены, дети, известные люди, насилие, чужие персонажи и бренды. |
| No result from the provider within the task deadline. | Модель либо не приняла задачу за 15 минут (у видео — за 60), либо не ответила за сутки. |
Ссылка на готовый файл живёт 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 — не объект, поле не из списка модели либо значение вне её перечисления. В сообщении перечислено, что принимается. Тот же код — если во входе наша ссылка на готовый результат старше 14 дней: файла уже нет, его нужно загрузить заново. И если модель не может выполнить именно это сочетание полей: в сообщении сказано, что поменять, — например, другие файлы-образцы. |
| 429 | /api/v1/jobs/createTask | Больше 30 запросов в минуту на один ключ, больше 50 незавершённых задач на аккаунте либо таймаут: за час 5 запросов к моделям этого вида отклонены из-за чувствительной темы, и запуск всех моделей этого вида приостановлен. У такого отказа в теле есть поле timeout с временем окончания паузы, а в заголовке Retry-After — секунды до него. |
| 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 | Поломка на нашей стороне. Подробности остаются в журнале шлюза и наружу не уходят. |
Пример вызова
# 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": "The ginger cat in a white spacesuit from the reference image sits on a snowy mountain peak at dawn, snowflakes drift past. Cinematic, cold blue light.",
"aspect_ratio": "1:1",
"resolution": "480p",
"duration": 4,
"reference_image_urls": [
"https://gen202.com/assets/sample-nano-banana-pro.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'
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": "The ginger cat in a white spacesuit from the reference image sits on a snowy mountain peak at dawn, snowflakes drift past. Cinematic, cold blue light.",
"aspect_ratio": "1:1",
"resolution": "480p",
"duration": 4,
"reference_image_urls": [
"https://gen202.com/assets/sample-nano-banana-pro.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.
Ролик делается минуты, поэтому файл не приходит в ответ на запрос. Первый вызов
ставит задачу и сразу отвечает её номером, второй по этому номеру отдаёт состояние задачи, а когда
она готова — ссылку на результат. Ключ передаётся в обоих запросах заголовком
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 |
Ссылка на исходный файл принимается только полным адресом на 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.failComment | строка | Наш комментарий к словам модели, по-русски: что произошло. Есть не у всякой неудачи; иначе пустая строка. |
| 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, удержанные кредиты возвращены целиком. |
Задача идёт, пока модель не пришлёт результат или отказ. Причина неудачи приходит двумя полями:
failCode из таблицы ниже и failMsg словами.
| failCode | Что произошло |
|---|---|
| 501 | Поставщик вернул отказ: генерация не удалась. |
| 408 | Модель не приняла задачу за 60 минут или не отвечала сутки. |
| 404 | Поставщик не знает такой задачи. |
| 429 | Поставщик отбил создание задачи по своему лимиту. |
| 500 | Поломка на нашей стороне; подробности остаются в журнале шлюза. |
Слова модели в failMsg бывают непонятны, поэтому к части неудач шлюз
добавляет поле failComment — наш комментарий по-русски о том, что
произошло. У остальных неудач это поле пустое.
| failMsg, пример | failComment |
|---|---|
| Image fetch failed. | Модель не смогла скачать файл из нашего хранилища. Вероятно, это разовый сбой, повторите запрос. Если ошибка повторится — напишите в поддержку: hi@gen202.com |
| File type not supported | По ссылке открывается страница сайта, а не файл. Загрузите сам файл или дайте прямую ссылку на него. |
| image #2: width and height must be between 300px and 6000px (got 262x377) (invalid_asset_material) | Одна из картинок слишком маленькая. Seedance принимает картинки от 300 до 6000 пикселей по каждой стороне. |
| Seedance identified your task as video editing based on your prompt. | Seedance понял запрос как редактирование присланного видео. В песочнице и чате выберите режим «Редактирование видео», в API поставьте пропорции adaptive и длительность −1. |
| Seedance identified your task as video extension based on your prompt. | Seedance решил, что присланное видео нужно продлить. Для этого поставьте пропорции adaptive, а если продлевать не нужно — уберите эту просьбу из промта. |
| generate task timeout. | Модель не успела создать результат и сама остановила задачу. |
| Internal Error | Модель остановилась и не назвала причину. Возможно, она перегружена или временно недоступна. Или запрос отклонён из-за чувствительной темы: нагота и откровенные сцены, дети, известные люди, насилие, чужие персонажи и бренды. |
| The request failed because the input image may contain sensitive information. | Модель отклонила загруженную картинку из-за чувствительной темы. Такие темы: нагота и откровенные сцены, дети, известные люди, насилие, чужие персонажи и бренды. |
| The generated content was filtered by the safety system. | Модель отклонила запрос из-за чувствительной темы. Такие темы: нагота и откровенные сцены, дети, известные люди, насилие, чужие персонажи и бренды. |
| The model provider rejected or dropped the task creation request. | Модель остановилась и не назвала причину. Возможно, она перегружена или временно недоступна. Или запрос отклонён из-за чувствительной темы: нагота и откровенные сцены, дети, известные люди, насилие, чужие персонажи и бренды. |
| No result from the provider within the task deadline. | Модель либо не приняла задачу за 15 минут (у видео — за 60), либо не ответила за сутки. |
Ссылка на готовый файл живёт 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 — не объект, поле не из списка модели либо значение вне её перечисления. В сообщении перечислено, что принимается. Тот же код — если во входе наша ссылка на готовый результат старше 14 дней: файла уже нет, его нужно загрузить заново. И если модель не может выполнить именно это сочетание полей: в сообщении сказано, что поменять, — например, другие файлы-образцы. |
| 429 | /api/v1/jobs/createTask | Больше 30 запросов в минуту на один ключ, больше 50 незавершённых задач на аккаунте либо таймаут: за час 5 запросов к моделям этого вида отклонены из-за чувствительной темы, и запуск всех моделей этого вида приостановлен. У такого отказа в теле есть поле timeout с временем окончания паузы, а в заголовке Retry-After — секунды до него. |
| 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 | Поломка на нашей стороне. Подробности остаются в журнале шлюза и наружу не уходят. |
Пример вызова
# 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": "The ginger cat in a white spacesuit from the reference image walks along a sandy beach at sunset, waves roll in behind it. Cinematic, warm light.",
"aspect_ratio": "1:1",
"resolution": "480p",
"duration": 4,
"reference_image_urls": [
"https://gen202.com/assets/sample-nano-banana-pro.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'
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": "The ginger cat in a white spacesuit from the reference image walks along a sandy beach at sunset, waves roll in behind it. Cinematic, warm light.",
"aspect_ratio": "1:1",
"resolution": "480p",
"duration": 4,
"reference_image_urls": [
"https://gen202.com/assets/sample-nano-banana-pro.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 от 13,92 ₽ до 154,44 ₽: цену двигают разрешение и то, приложено ли видео к запросу.
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 в России.
Порядок работы одинаков на всех уровнях, и меняются в нём только значения полей.
- Опишите сцену словами. В поле prompt пишут, кто в кадре, что делает и как стоит камера. Главное ставят в начало.
- Выберите разрешение и длительность. Поля resolution и duration задают, каким выйдет ролик, и вместе они определяют цену задачи.
- Приложите образцы, если они есть. Ссылки на картинки, ролики и звук кладут каждую в своё поле. Без них модель снимает по одному описанию.
- Решите, нужен ли звук. Звуковую дорожку включает флаг generate_audio, а сами звуки сцены называют там же, где сюжет.
- Проверьте описание коротким роликом. Секунда в низком разрешении стоит меньше. Замысел поэтому сверяют на коротком ролике, а удачное описание повторяют в нужном разрешении.
Чем 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 для этого не нужны — запрос идёт на наш адрес.
- Вход. Счёт открывается по письму или через Яндекс, и на нём сразу лежит 50 кредитов — 3 секунды Seedance 2.0 Mini в 480p, которые вычитаются из цены первого ролика.
- Пополнение. Нижний пакет на 500 ₽ приносит 1 000 кредитов: их хватает на 70 секунд Seedance 2.0 Mini в 480p, а на самый короткий ролик Seedance 2.0 в 4K — 4 секунды за 617,76 ₽ — его уже не хватает, и под 4K берут пакет больше.
- Ключ. Ключ один на Seedance 2.0, Seedance 2.0 Fast и Seedance 2.0 Mini; какой уровень снимает, задаёт значение поля model, и второй счёт под сравнение уровней не нужен.
У самого дешёвого сочетания — Seedance 2.0 Mini в 480p — секунда ролика из описания стоит 7,14 ₽, у самого дорогого — Seedance 2.0 в 4K — 154,44 ₽; ролик с готовым видео на входе считается дешевле, и полная сетка ставок стоит в таблице цен. Самый короткий ролик Seedance 2.0 Mini — 4 секунды в 480p — стоит 28,55 ₽, самый длинный Seedance 2.0 — 15 секунд в 4K — 2316,6 ₽.
Кредиты с того же баланса уходят на Kling, Wan, MiniMax, Gemini Omni и Veo и на остальной каталог. Подробный порядок покупки для всей линейки Seedance и то, что в ней даётся бесплатно, — на странице Seedance API.