Seedance API
Интегрируйте генерацию видео в свой продукт с помощью моделей Seedance 2.5 и Seedance 2.0, асинхронных задач, вебхуков и тарификации на основе кредитов.
https://api.seevio.aiСодержание
Введение
API позволяет программно отправлять задачи на генерацию видео для моделей Seedance 2.5 и Seedance 2.0. Seedance 2.5 — рекомендуемая модель, поддерживающая генерацию текста в видео, изображения в видео (по первому кадру или по первому и последнему кадрам), а также мультимодальные референсы. Генерация выполняется асинхронно: вы создаете задачу, мгновенно получаете её ID, а затем забираете готовое видео через поллинг эндпоинта задачи или с помощью вебхука.
Асинхронные задачи
Поллинг (опрос статуса) отлично подходит для разработки и простых интеграций.
Поддержка вебхуков
Вебхуки рекомендуются для использования в продакшене, так как они избавляют от необходимости частого опроса и автоматически уведомляют ваш сервис, когда задача переходит в финальный статус.
Контроль баланса
Кредиты резервируются в момент отправки задачи. При успешной генерации зарезервированные кредиты списываются, а в случае ошибки или таймаута — автоматически возвращаются на баланс.
Аутентификация
Создайте API-ключ в панели управления и передавайте его в качестве Bearer-токена в заголовке каждого запроса. Полный ключ показывается только один раз при его создании.
Authorization: Bearer sk_live_xxxxxxxxИспользуйте ключи sk_live_ для рабочего (production) трафика.
Используйте ключи sk_test_ для тестирования интеграции в песочнице с аналогичной схемой работы API.
Если ключ отсутствует, недействителен или отозван, возвращается ошибка invalid_api_key с кодом HTTP 401.
Быстрый старт
Сначала отправьте задачу на генерацию. После того как задача будет принята, выберите один из способов получения результата: опрашивайте эндпоинт задачи (поллинг) или настройте получение финального статуса через вебхук.
Создайте асинхронную задачу генерации видео и мгновенно получите её ID.
curl https://api.seevio.ai/v1/videos/generations \
-H "Authorization: Bearer sk_live_xxx" \
-H "Content-Type: application/json" \
-d '{
"model": "seedance-2-5",
"callback_url": "https://your-domain.com/api/seedance/webhook",
"input": {
"prompt": "a cat surfing on a neon wave, cinematic lighting",
"generation_type": "text-to-video",
"duration": 5,
"aspect_ratio": "16:9",
"resolution": "1080p",
"generate_audio": true,
"watermark": false,
"web_search": false,
"return_last_frame": false
}
}'Периодически запрашивайте статус через эндпоинт задачи, если в вашей интеграции предпочтителен явный опрос.
curl https://api.seevio.ai/v1/tasks/3f2aK9mR7xQp4TnZ8bLc6YwH \
-H "Authorization: Bearer sk_live_xxx"Передайте callback_url при создании задачи, чтобы получать уведомления об успешном завершении или ошибках и сразу обновлять статус в своей базе данных.
export async function POST(request: Request) {
const callbackData = await request.json();
if (callbackData.status === "completed") {
const videoUrl = callbackData.data.results[0];
// Save the video URL or update your own task record here.
}
if (callbackData.status === "failed") {
const errorMessage = callbackData.data.failed_reason;
// Mark your own task record as failed here.
}
return new Response(null, { status: 200 });
}Создание задачи
Создайте задачу на генерацию видео с помощью запроса POST /v1/videos/generations. Тело запроса должно содержать корневое поле model, необязательный callback_url и объект input с промптом и настройками генерации.
/v1/videos/generationscurl https://api.seevio.ai/v1/videos/generations \
-H "Authorization: Bearer sk_live_xxx" \
-H "Content-Type: application/json" \
-d '{
"model": "seedance-2-5",
"callback_url": "https://your-domain.com/api/seedance/webhook",
"input": {
"prompt": "a cat surfing on a neon wave, cinematic lighting",
"generation_type": "text-to-video",
"duration": 5,
"aspect_ratio": "16:9",
"resolution": "1080p",
"generate_audio": true,
"watermark": false,
"web_search": false,
"return_last_frame": false
}
}'Режимы генерации
Параметр generation_type определяет, какие медиафайлы принимаются на вход и как модель должна их интерпретировать.
Задайте значение seedance-2-5 для параметра model, чтобы создавать видео с разрешением 480p, 720p или 1080p длительностью от 4 до 30 секунд.
- Текст-в-видео с поддержкой соотношений сторон: адаптивное (adaptive), 16:9, 9:16, 1:1, 4:3, 3:4 или 21:9
- Изображение-в-видео по одному первому кадру или по двум кадрам (первому и последнему); соотношение сторон должно быть adaptive
- Референс-в-видео: до 30 изображений, 10 видеофайлов и 10 аудиофайлов (суммарно не более 50 материалов)
- Длительность каждого референсного видео или аудио должна составлять от 2 до 30 секунд; общая длительность всех видео и аудио по отдельности не должна превышать 30 секунд
- Поддерживается использование только аудиореференса, а также параметр return_last_frame; параметр seed не поддерживается
| Режим | Обязательные медиа | Необязательные медиа | Примечание |
|---|---|---|---|
text-to-video | prompt | duration, aspect_ratio, resolution, seed | Только текстовый промпт. Параметры image_urls, video_urls и audio_urls указывать не нужно. |
image-to-video | prompt + массив image_urls (1–2 URL изображений) | duration, aspect_ratio, resolution, seed | Параметр image_urls должен быть массивом. Передайте 1 URL для первого кадра или 2 URL для первого и последнего кадров. Видео и аудио игнорируются. |
reference-to-video | prompt + минимум один референс (изображение, видео или аудио) | изображения, видео и аудио в пределах установленных лимитов | Seedance 2.5 поддерживает референсы, состоящие только из аудио. Для Seedance 2.0 при передаче аудио обязательно добавьте хотя бы одно изображение или видео. |
text-to-videoИспользуйте режим текст-в-видео, если единственным источником для генерации является текстовый промпт.
curl https://api.seevio.ai/v1/videos/generations \
-H "Authorization: Bearer sk_live_xxx" \
-H "Content-Type: application/json" \
-d '{
"model": "seedance-2-5",
"callback_url": "https://your-domain.com/api/seedance/webhook",
"input": {
"prompt": "a cinematic drone shot over a futuristic coastal city at sunrise",
"generation_type": "text-to-video",
"duration": 5,
"aspect_ratio": "16:9",
"resolution": "1080p",
"generate_audio": true,
"watermark": false,
"web_search": false,
"return_last_frame": false
}
}'image-to-videoИспользуйте режим изображение-в-видео, если массив input.image_urls содержит от 1 до 2 URL-адресов изображений: один URL задает первый кадр, два URL задают первый и последний кадры. Референсные видео и аудио в этом режиме игнорируются.
curl https://api.seevio.ai/v1/videos/generations \
-H "Authorization: Bearer sk_live_xxx" \
-H "Content-Type: application/json" \
-d '{
"model": "seedance-2-5",
"input": {
"prompt": "the subject turns toward camera, soft studio motion",
"generation_type": "image-to-video",
"image_urls": ["https://your.cdn.com/first-frame.jpg"],
"duration": 5,
"resolution": "720p"
}
}'reference-to-videoИспользуйте режим референс-в-видео для более точного управления генерацией с помощью референсных изображений, видео и аудио. Модель Seedance 2.5 поддерживает аудио в качестве единственного референса; для Seedance 2.0 при передаче аудио требуется приложить как минимум одно изображение или видео.
Лимиты на материалы
- Seedance 2.5: до 30 референсных изображений
- Seedance 2.5: до 10 референсных видео, каждое от 2 до 30 секунд, общая длительность <= 30 секунд
- Seedance 2.5: до 10 референсных аудиофайлов, каждый от 2 до 30 секунд, общая длительность <= 30 секунд
- Seedance 2.5: максимум 50 медиафайлов всех типов суммарно
- Для версий Seedance 2.0 действуют прежние лимиты: до 9 изображений, до 3 видео, до 3 аудиофайлов и до 15 секунд на группу видео/аудио
Поддерживаемые комбинации входных данных
curl https://api.seevio.ai/v1/videos/generations \
-H "Authorization: Bearer sk_live_xxx" \
-H "Content-Type: application/json" \
-d '{
"model": "seedance-2-5",
"input": {
"prompt": "use the product from image 1 and the camera motion from the reference video",
"generation_type": "reference-to-video",
"image_urls": ["https://your.cdn.com/product.jpg"],
"video_urls": ["https://your.cdn.com/camera-motion.mp4"],
"audio_urls": [],
"duration": 8,
"resolution": "720p"
}
}'Параметры запроса
Имена параметров, значения enum, пути эндпоинтов и примеры являются строгой частью спецификации API. Описание работы каждого поля приведено ниже.
Заголовки
| Заголовок | Обязательное | Описание | Пример |
|---|---|---|---|
Authorization | Да | API-ключ в формате Bearer для авторизации запроса. | Bearer sk_live_xxx |
Content-Type | Да | Все запросы на запись используют формат JSON. | application/json |
Параметры верхнего уровня
| Поле | Тип | Обязательное | По умолчанию | Диапазон / Enum | Режимы | Пример |
|---|---|---|---|---|---|---|
modelВерсия модели для генерации. Укажите seedance-2-5 для Seedance 2.5, seedance-2-0 для Seedance 2.0, seedance-2-0-fast для Seedance 2.0 Fast или seedance-2-0-mini для Seedance 2.0 Mini. | string | Да | - | seedance-2-5 | seedance-2-0 | seedance-2-0-fast | seedance-2-0-mini | все | seedance-2-5 |
callback_urlЭндпоинт HTTPS, на который будут отправляться уведомления об успешном завершении или ошибках генерации. | string | Нет | - | HTTPS-URL, без приватных подсетей | все | https://your-domain.com/hook |
inputНастройки генерации и исходные медиафайлы. | object | Да | - | - | все | - |
input.* поля
| Поле | Тип | Обязательное | По умолчанию | Диапазон / Enum | Режимы | Пример |
|---|---|---|---|---|---|---|
input.promptТекстовое описание видео, которое необходимо сгенерировать. | string | Да | - | непустая строка | все | a cat surfing |
input.generation_typeРежим генерации. По умолчанию используется text-to-video. | string | Нет | text-to-video | text-to-video | image-to-video | reference-to-video | - | image-to-video |
input.image_urlsДоступные из интернета URL-адреса изображений. В режиме image-to-video передайте 1 изображение для первого кадра или 2 изображения для первого и последнего кадров. В режиме reference-to-video Seedance 2.5 принимает до 30 изображений, а Seedance 2.0 — до 9. | string[] | Зависит от условий | [] | Изображение-в-видео: 1 или 2 изображения. Референс-в-видео: до 30 для Seedance 2.5; до 9 для Seedance 2.0. | image-to-video / reference-to-video | ["https://.../a.jpg"] |
input.video_urlsДоступные из интернета референсные видео (только для режима reference-to-video). Seedance 2.5 принимает до 10 видеофайлов длительностью от 2 до 30 секунд каждый, суммарное время воспроизведения не более 30 секунд. Seedance 2.0 принимает до 3 видео с суммарным временем воспроизведения не более 15 секунд. | string[] | Нет | [] | Seedance 2.5: до 10 видео, каждое 2–30 секунд, общая длительность <= 30 секунд. Seedance 2.0: до 3 видео, общая длительность <= 15 секунд. | reference-to-video | [] |
input.audio_urlsДоступные из интернета референсные аудиофайлы (только для режима reference-to-video). Seedance 2.5 принимает до 10 аудиофайлов длительностью от 2 до 30 секунд каждый, суммарное время воспроизведения не более 30 секунд, и поддерживает использование только аудио без других медиа. Seedance 2.0 принимает до 3 аудиофайлов с суммарным временем воспроизведения не более 15 секунд. | string[] | Нет | [] | Seedance 2.5: до 10 аудиофайлов, каждый 2–30 секунд, общая длительность <= 30 секунд. Seedance 2.0: до 3 аудиофайлов, общая длительность <= 15 секунд. | reference-to-video | [] |
input.durationДлительность готового видео в секундах. | int | Нет | 5 | Seedance 2.5: 4–30 секунд. Seedance 2.0: 4–15 секунд. | все | 5 |
input.aspect_ratioСоотношение сторон готового видео. Значение adaptive позволяет сервису автоматически подобрать оптимальное соотношение. Режим image-to-video в модели Seedance 2.5 поддерживает только значение adaptive. | string | Нет | adaptive | 16:9 | 4:3 | 1:1 | 3:4 | 9:16 | 21:9 | adaptive | все | 16:9 |
input.resolutionРазрешение готового видео. | string | Нет | 720p | Seedance 2.5: 480p | 720p | 1080p. Seedance 2.0: 480p | 720p | 1080p | 4k (в зависимости от версии). | все | 720p |
input.generate_audioУказывает, должна ли модель генерировать аудиодорожку (если поддерживается). | boolean | Нет | true | true | false | все | true |
input.watermarkДобавлять ли водяной знак на видео. | boolean | Нет | false | true | false | все | false |
input.web_searchРазрешить ли использование поиска в вебе для улучшения генерации (если поддерживается). | boolean | Нет | false | true | false | все | false |
input.return_last_frameУказывает, нужно ли возвращать URL последнего кадра видео, если он доступен. | boolean | Нет | false | true | false | все | false |
input.seedСид для детерминированной генерации (поддерживается только в версиях Seedance 2.0). Модель Seedance 2.5 не поддерживает этот параметр, его указывать не нужно. | int | Нет | -1 | -1 или 0-4294967295 | все | -1 |
Стоимость генерации в кредитах зависит от разрешения, длительности, выбранной модели и наличия видео в референсах. Значение credits, возвращаемое в ответе при создании задачи, показывает точную сумму резерва для этой операции.
Тарифная сеткаОтвет сервера
Пример успешного ответа на запрос POST /v1/videos/generations. Такой ответ означает, что задача принята в обработку, а кредиты зарезервированы. Используйте полученный taskId для опроса статуса через GET /v1/tasks/:id или для сопоставления с входящим вебхуком.
Успешный ответ на запрос POST /v1/videos/generations
{
"taskId": "3f2aK9mR...",
"credits": 100
}Статус задачи
Используйте запрос GET /v1/tasks/:id, чтобы узнать текущий статус задачи. Рекомендуемая частота опроса — не чаще одного раза в 10 секунд. Для рабочих систем лучше использовать вебхуки.
curl https://api.seevio.ai/v1/tasks/3f2aK9mR7xQp4TnZ8bLc6YwH \
-H "Authorization: Bearer sk_live_xxx"Ответ для успешно завершенной задачи
{
"id": "3f2aK9mR...",
"status": "completed",
"created_at": 1781234567,
"model": "seedance-2-5",
"billing_status": "charged",
"credits": 100,
"failed_reason": null,
"data": {
"results": ["https://cdn.seevio.ai/.../x.mp4"],
"video_expires_at": "2026-06-13T10:00:00Z",
"last_frame_url": null,
"processing_time": 48
}
}Ответ для невыполненной задачи
{
"id": "3f2aK9mR...",
"status": "failed",
"created_at": 1781234567,
"model": "seedance-2-5",
"billing_status": "refunded",
"credits": 100,
"failed_reason": "provider_failed"
}| Значение | Описание статуса |
|---|---|
status=queued | Задача принята и ожидает отправки в очередь или обработки. |
status=generating | Модель обрабатывает задачу и генерирует видео. |
status=completed | Генерация успешно завершена, URL готового видео доступен в data.results. |
status=failed | Ошибка генерации или превышено время ожидания (таймаут). |
billing_status=reserved | Кредиты зарезервированы на время выполнения задачи. |
billing_status=charged | Задача успешно выполнена, зарезервированные кредиты списаны. |
billing_status=refunded | Ошибка генерации или таймаут, зарезервированные кредиты возвращены на баланс. |
billing_status=refund_failed | Ошибка при возврате кредитов, требуется вмешательство поддержки. |
По истечении срока, указанного в video_expires_at, объект data.results будет пуст. Скачайте и сохраните файл до того, как закроется окно доступности.
Вебхуки
Если передан параметр callback_url, Seedance отправит JSON-уведомление с результатом выполнения на ваш эндпоинт сразу после завершения генерации (успешного или с ошибкой). Если ваш сервер вернет код, отличный от 2xx, или не ответит в течение 15 секунд, система повторит попытку до 5 раз. При повторных попытках используется тот же task id, поэтому дедуплицируйте запросы на своей стороне. Возвращайте статус 200 сразу после успешного сохранения данных вебхука.
Вебхук об успешном завершении задачи
{
"id": "3f2aK9mR...",
"status": "completed",
"created_at": 1781234567,
"model": "seedance-2-5",
"data": {
"results": ["https://cdn.seevio.ai/.../x.mp4"],
"video_expires_at": "2026-06-13T10:00:00Z",
"last_frame_url": null,
"processing_time": 48
}
}Вебхук об ошибке выполнения задачи
{
"id": "3f2aK9mR...",
"status": "failed",
"created_at": 1781234567,
"model": "seedance-2-5",
"data": {
"failed_reason": "provider_failed",
"credits_refunded": 100
}
}export async function POST(request: Request) {
const callbackData = await request.json();
if (callbackData.status === "completed") {
const videoUrl = callbackData.data.results[0];
// Save the video URL or update your own task record here.
}
if (callbackData.status === "failed") {
const errorMessage = callbackData.data.failed_reason;
// Mark your own task record as failed here.
}
return new Response(null, { status: 200 });
}Проверьте структуру данных вебхука, выполните дедупликацию по id, обновите статус задачи в вашей системе и сразу верните ответ.
Параметр callback_url должен использовать протокол HTTPS и не должен указывать на приватные IP-адреса, loopback или link-local диапазоны.
Ошибки
Запросы POST /v1/videos/generations и GET /v1/tasks/:id возвращают этот объект ошибки, когда сам запрос к API завершается неудачно — например, из-за неверных параметров, некорректного API-ключа, нехватки кредитов, превышения лимитов запросов или если задача не найдена. Некоторые ошибки могут содержать дополнительные поля, такие как required, available или retry_after, в зависимости от контекста.
{
"error": {
"code": "insufficient_credits",
"message": "Not enough credits for this task.",
"required": 100,
"available": 12
}
}| Код | HTTP-код | Описание ошибки | Повторить? |
|---|---|---|---|
invalid_request | 400 | Параметры запроса отсутствуют или неверны. | Нет, исправьте параметры запроса. |
invalid_api_key | 401 | API-ключ отсутствует, недействителен или отозван. | Нет, используйте действующий ключ. |
insufficient_credits | 402 | Недостаточно кредитов на балансе. Задача не принята и списание не производилось. | Да, после пополнения баланса. |
forbidden | 403 | У используемого API-ключа недостаточно прав для этого действия. | Нет. |
not_found | 404 | Задача не существует или принадлежит другому пользователю. | Нет. |
rate_limited | 429 | Превышена частота запросов. | Да, учитывая заголовок Retry-After. |
internal_error | 500 | Внутренняя ошибка сервера. | Да, повторите попытку позже. |
Лимиты запросов
Лимиты на количество запросов применяются к каждому API-ключу по методу скользящего окна (sliding window). Для генерации стандартный лимит составляет 100 запросов в минуту; для запросов статуса действуют более мягкие ограничения. Ответы с кодом HTTP 429 всегда содержат заголовок Retry-After.
Генерация
100/мин
Запросы статуса
Более мягкие лимиты
Заголовок 429
Retry-After
Оплата и кредиты
Оплата в API работает по схеме: резервирование при отправке, списание при успешном выполнении и возврат при ошибке. В панели управления в разделе использования доступна история списания кредитов, логи задач и статистика потребления.
Резервирование
Кредиты проверяются и резервируются в момент принятия задачи к исполнению.
Списание
После успешного завершения задачи зарезервированные кредиты окончательно списываются.
Возврат
Если задача завершилась ошибкой или таймаутом, зарезервированные кредиты автоматически возвращаются на баланс.
Контроль расходов в панели управления
Просматривайте логи API, таймлайны выполнения задач, историю транзакций и подробную статистику использования.