Целая длительность 4–30 с, 720P, 16:9 или 9:16. До 30 референсных изображений и 10 аудиофайлов; референсное видео не поддерживается. Без референсного аудио — $2 (400 кредитов), с ним — $3 (600 кредитов) за ролик независимо от длительности. Созданная звуковая дорожка не считается референсным аудио. Предложение временное, постоянная доступность не гарантируется. Время зависит от очереди; проверяйте исходную задачу, не отправляйте повторно. При сбое — полный возврат.
Попробовать в песочнице →Быстрый старт
Три шага: отправить задачу, опросить её и забрать ссылку на видео. Замените YOUR_API_KEY своим ключом, и команды ниже заработают как есть.
Шаг 1 · Отправка (сразу возвращает id задачи, HTTP 202)
curl https://kovapi.com/v1/videos/generations \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model": "seedance-2.5-30s", "prompt": "Путешественник идёт через осенний городок в долине от рассвета до заката, камера следует за ним всю дорогу", "duration": 25, "resolution": "720P", "size": "16:9"}'Ответ (HTTP 202)
{
"id": "img_5c2e8f1a9b3d7e6f0a4c8b2d",
"object": "video.generation.job",
"status": "queued",
"created": 1791281400,
"model": "seedance-2.5-30s"
}Шаг 2 · Опрашивайте каждые 5–10 секунд, пока status не станет succeeded или failed
curl https://kovapi.com/v1/videos/jobs/img_5c2e8f1a9b3d7e6f0a4c8b2d \ -H "Authorization: Bearer YOUR_API_KEY"
Ответ при успехе
{
"id": "img_5c2e8f1a9b3d7e6f0a4c8b2d",
"object": "video.generation.job",
"status": "succeeded",
"created": 1791281400,
"model": "seedance-2.5-30s",
"data": [
{"url": "https://img.kovapi.com/i/8c1f0e5d2b7a49e3a6d0c4f1b9e2a7d5.mp4"}
],
"usage": {"clips": 1, "model": "seedance-2.5-30s"}
}Шаг 3 · data[0].url — это ролик (MP4). Он хранится 15 дней; чтобы пользоваться им дольше, скачайте его в своё хранилище.
Полный пример (Python: отправить, дождаться, сохранить на диск)
import time
import requests
BASE = "https://kovapi.com/v1"
HEADERS = {"Authorization": "Bearer YOUR_API_KEY"}
# 1. отправка
job = requests.post(f"{BASE}/videos/generations", headers=HEADERS, json={
"model": "seedance-2.5-30s",
"prompt": "Путешественник идёт через осенний городок в долине от рассвета до заката, камера следует за ним всю дорогу",
"duration": 25,
"resolution": "720P",
"size": "16:9",
}).json()
if "error" in job:
raise SystemExit(job["error"]["message"])
# 2. опрос каждые 10 секунд, не дольше часа
deadline = time.time() + 3600
while job["status"] not in ("succeeded", "failed") and time.time() < deadline:
time.sleep(10)
job = requests.get(f"{BASE}/videos/jobs/{job['id']}", headers=HEADERS).json()
# 3. скачивание видео
if job["status"] == "succeeded":
url = job["data"][0]["url"]
with open("seedance-2.5-30s.mp4", "wb") as f:
f.write(requests.get(url).content)
print("saved", url)
elif job["status"] == "failed":
print("failed:", job["error"]["code"], job["error"]["message"])
else:
print("still", job["status"], job["id"])Пока задача в очереди, опрос также возвращает queue_position (сколько задач впереди вашей) и eta_seconds (ожидаемое время ожидания). Если ваш лимит ожидания истёк, не отправляйте задачу заново: она никуда не делась, продолжайте опрашивать тот же id позже.
Аутентификация
Authorization: Bearer YOUR_API_KEY Content-Type: application/json
Чтобы начать, создайте API-ключ в консоли.
Основные характеристики
| Длительность | 4–30 с |
| Разрешение | 720P |
| Пропорции | 16:9 / 9:16 |
| Референсные изображения | до 30 · используются как референсы (персонажи, сцена, стиль), но не как кадр |
| Референсные видео | не поддерживается |
| Референсное аудио | до 10 |
| Звук | всегда включён; отключить нельзя (audio: false отклоняется) |
| Оплата | за ролик: одна цена при любой длительности |
Параметры запроса
| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
| model | string | Да | Model ID, here seedance-2.5-30s. |
| prompt | string | Да | Опишите содержание, камеру и действия. |
| duration | integer | Нет | Any integer from 4 to 30 seconds (default 30). Alias: seconds. Duration does not change the per-clip price. |
| resolution | string | Нет | 720P |
| size | string | Нет | Aspect ratio: 16:9 / 9:16 (default 16:9); alias aspect_ratio. 21:9 is not available on this model. |
| image | string | Нет | Image-to-video: include a reference image (public URL, data: URI or base64); omit for text-to-video. |
| images | array | Нет | Multiple reference images, up to 30. Exceeding the cap is rejected, never truncated. Alias: reference_images. |
| audio_reference | string / array | Нет | Публичный HTTPS URL или массив, до 10 файлов; требуется хотя бы одно изображение. MP3/WAV/M4A, до 15 МБ и 30 с каждый. С референсным аудио: $3 (600 кредитов) за ролик. |
| audio | boolean | Нет | Каждый ролик выходит со звуком, отключить его нельзя; false отклоняется (400), поэтому не передавайте этот параметр. |
| callback_url | string | Нет | Куда отправить результат, когда задача завершится; подробнее — в разделе о вебхуках ниже. |
| n | integer | Нет | Каждая задача создаёт один ролик; передавать параметр не нужно. При значении больше 1 всё равно создаётся один ролик, но при отправке резервируется стоимость n роликов, а лишнее возвращается после завершения задачи. |
Цена
Временно доступно · за ролик
| Кредитов за ролик | USD за ролик | |
|---|---|---|
| Без референсного аудио | 400 | $2.00 |
| С референсным аудио | 600 | $3.00 |
Целая длительность 4–30 с, 720P, 16:9 или 9:16. До 30 референсных изображений и 10 аудиофайлов; референсное видео не поддерживается. Без референсного аудио — $2 (400 кредитов), с ним — $3 (600 кредитов) за ролик независимо от длительности. Созданная звуковая дорожка не считается референсным аудио. Предложение временное, постоянная доступность не гарантируется. Время зависит от очереди; проверяйте исходную задачу, не отправляйте повторно. При сбое — полный возврат.
Референсные материалы
Целая длительность 4–30 с, 720P, 16:9 или 9:16. До 30 референсных изображений и 10 аудиофайлов; референсное видео не поддерживается. Без референсного аудио — $2 (400 кредитов), с ним — $3 (600 кредитов) за ролик независимо от длительности. Созданная звуковая дорожка не считается референсным аудио. Предложение временное, постоянная доступность не гарантируется. Время зависит от очереди; проверяйте исходную задачу, не отправляйте повторно. При сбое — полный возврат.
Референсные изображения (не более 30) задают персонажей, сцену и стиль и никогда не используются как кадр; в промпте ссылайтесь на них как @Image1, @Image2.
Реальные человеческие лица подходят в качестве референсных изображений, маскирование не требуется. Пожалуйста, убедитесь, что у вас есть право использовать внешность людей, изображённых на фото.
{
"model": "seedance-2.5-30s",
"prompt": "Follow @Image1 and use @Audio1 as the soundtrack",
"duration": 25, "resolution": "720P", "size": "16:9",
"images": ["https://example.com/reference.png"],
"audio_reference": ["https://example.com/reference.mp3"]
}Требования к контенту
Каждая задача Seedance проходит проверку контента: промпт, файлы-референсы и готовый ролик — и изображение, и звук. Задача, не прошедшая проверку, завершается с content_policy, деньги не списываются.
Когда идёт проверка
При отправке проверяются промпт и референсы; после генерации ролика ещё раз проверяются изображение и звук. Поэтому отказ может прийти через несколько секунд после отправки или только после окончания рендера (это может занять больше получаса). Задача, завершившаяся со status failed и error.code content_policy, не прошла проверку; с вебхуком придёт событие video.failed.
Без оплаты
Отклонённая задача ничего не стоит: сумма, зарезервированная при отправке, полностью возвращается по завершении задачи, а в журнале вызовов она отмечена как неоплаченная.
Звук
Звук (реплики, закадровый текст, пение и эффекты) модель генерирует по промпту, и он проверяется вместе с изображением: реплики, закадровый текст и тексты песен из промпта озвучиваются или поются. Если в ролике не нужны голоса, не пишите в промпте реплики и тексты песен. Эта модель всегда добавляет звук, отключить его нельзя. Загруженное аудио-референс тоже проверяется; музыка, защищённая авторским правом, в качестве референса может быть отклонена.
Что чаще всего отклоняется
- Сексуальный контент, обнажённость или сексуальные намёки, в том числе изображения, созданные или смонтированные с помощью ИИ
- Кровь, жестокость, самоповреждение и насильственные травмы, например огнестрельные ранения и кровотечение
- Огнестрельное оружие, взрывчатка и наркотики
- Любой сексуализированный контент с несовершеннолетними; несовершеннолетние рядом с алкоголем, табаком, наркотиками или в опасных ситуациях тоже отклоняются
- Политики, знаменитости, спортсмены, бизнесмены и другие публичные лица — внешность или голос, включая двойников
- Персонажи и объекты, защищённые авторским правом, например персонажи Disney или Marvel
- Контент с ненавистью или дискриминацией, фейковые новости
Длинные сценарии
Одна сцена с нарушением отклоняет весь ролик, и чаще всего это случается в длинных раскадровочных сценариях: перестрелка или крупный план крови в экшен-сцене, несовершеннолетние, которые пьют или курят, — и весь ролик не пройдёт. Перед отправкой прочитайте сценарий целиком и удалите или перепишите такие сцены.
Реальные люди
Чтобы использовать фото реального человека как референс, нужно право на использование его изображения; принимает ли модель такие референсы, указано выше на этой странице.
После отказа
Повторная отправка того же самого снова будет отклонена. Найдите часть, которая скорее всего нарушает правила, перепишите промпт или замените референс и отправьте заново.
Код ошибки: content_policy · status: failed
upstream_line_unavailable: При перегрузке сервиса или исчерпании доступных ресурсов возвращается upstream_line_unavailable. Неудачные задания не оплачиваются, зарезервированные кредиты возвращаются; повторите попытку позже. Эта ошибка не указывает на конкретную проблему параметров или материалов. Явные ограничения длительности, недоступные материалы и отклонения проверки сохраняют коды duration_rejected, reference_unreadable и content_policy; следуйте соответствующим рекомендациям.
Статус задачи и поля ответа
GET /v1/videos/jobs/{id} возвращает эти статусы; все поля описаны в разделе Асинхронные задачи. Опрашивайте каждые 5–10 секунд или получайте результат вебхуком (см. ниже). Опрос бесплатный, и прочитать задачу может любой ключ того же аккаунта.
| Статус | Что значит |
|---|---|
| queued | В очереди. В ответе есть queue_position (сколько задач впереди) и eta_seconds (ожидаемое время ожидания). |
| processing | Генерируется. |
| succeeded | Готово. Результат в data[0].url, детали оплаты в usage. |
| failed | Ошибка. Причина в error; зарезервированные кредиты возвращаются полностью. |
processingможет снова смениться наqueued: например, при высокой нагрузке, пока готовый ролик скачивается повторно или после перезапуска сервиса. Если задачу не удалось выполнить, шлюз может автоматически запустить рендер заново; сколько бы ни было повторов, задача оплачивается один раз.- Один аккаунт выполняет до 50 задач одновременно; остальные ждут в порядке отправки, а задача, не начавшаяся за 15 минут, завершается ошибкой с полным возвратом. Записи о задачах хранятся 3 дня, ссылки на видео — 15 дней.
Сколько ждать
Целая длительность 4–30 с, 720P, 16:9 или 9:16. До 30 референсных изображений и 10 аудиофайлов; референсное видео не поддерживается. Без референсного аудио — $2 (400 кредитов), с ним — $3 (600 кредитов) за ролик независимо от длительности. Созданная звуковая дорожка не считается референсным аудио. Предложение временное, постоянная доступность не гарантируется. Время зависит от очереди; проверяйте исходную задачу, не отправляйте повторно. При сбое — полный возврат.
Ошибки и возвраты
Ошибка при отправке сразу возвращается как HTTP 4xx / 5xx: задача не создаётся, ничего не списывается. О неудаче после того, как задача принята, сообщает эндпоинт задачи, а резерв возвращается полностью. Все коды перечислены в разделе Коды ошибок.
Ошибки при отправке
| HTTP | code | Причина | Что делать |
|---|---|---|---|
| 400 | invalid_request | Недопустимый параметр: длительность, разрешение, пропорция или число референсов выходят за пределы, допустимые для этой модели; промпт слишком длинный; не удаётся прочитать референсное изображение или видео; передан audio: false модели, ролики которой всегда со звуком, и т. п. Что именно не так, указано в message. | Исправьте то, что указано в message, и отправьте снова. |
| 400 | invalid_callback_url | callback_url — не публичный адрес http(s) или длиннее 2000 символов. | Укажите адрес, доступный из интернета. |
| 400 | model_not_found | ID модели написан с ошибкой, model не передан или модель нельзя использовать на этом эндпоинте (например, чат-модель на эндпоинте изображений). | Берите ID модели из GET /v1/models или из справочника API. |
| 401 | invalid_api_key | Ключ не существует, удалён или отключён, либо отключён аккаунт. | Проверьте ключ на странице API Keys в консоли. |
| 402 | insufficient_quota | Баланса не хватает, чтобы зарезервировать стоимость этого запроса. Шлюз сначала резервирует максимально возможную стоимость запроса, поэтому ошибка может возникнуть и при всплеске одновременных вызовов. | Если был всплеск запросов, подождите несколько секунд и повторите; в остальных случаях пополните баланс. |
| 429 | rate_limit_exceeded | Превышен лимит запросов в минуту, заданный для этого ключа (считается за последние 60 секунд). Заголовка Retry-After нет. | Подождите несколько секунд и повторите или увеличьте лимит ключа в консоли. |
| 503 | model_maintenance | Модель на обслуживании и не принимает запросы; пока идёт обслуживание, другая модель вместо неё не ответит. | Повторите, когда обслуживание закончится; ход работ — на странице статуса. |
| 503 | service_unavailable | Временный сбой на нашей стороне, например при сохранении референсного файла. Задача не создана, ничего не списано. | Повторите чуть позже. |
Неудачные задачи (status — failed)
| code | Когда возникает | Что делать |
|---|---|---|
| content_policy | Видео: промпт, референс или сгенерированный видеоряд либо звук не прошли проверку контента (если отклонён звук, param равен audio). Wan Standard и Prime: исходные материалы не прошли проверку. error.reason — FaceDetectionSuspect (предположительно лицо реального человека) или DataInspectionFailed (отклонён входной контент). В error.message указаны причина и рекомендуемые изменения. Неудачные задания не оплачиваются. | Перепишите промпт или замените референс и только потом отправляйте снова: те же входные данные будут отклонены повторно. |
| duration_rejected | Видео: длительность не принята. Чаще всего референсное аудио или видео длиннее допустимого, пусть даже на долю секунды. | Обрежьте референсное аудио или видео до допустимой длины и отправьте снова: те же входные данные снова не пройдут. |
| reference_unreadable | Видео: модели не удалось скачать референсное изображение, видео или аудио; чаще всего ссылка ведёт на веб-страницу (YouTube, страница облачного диска). | Укажите ссылку, которая ведёт прямо на файл, или загрузите файл в Playground: те же входные данные снова не пройдут. |
| invalid_video_request | Параметры или референсы не приняты при отправке; генерация не начиналась. | Проверьте длительность, формат и референсы и отправьте снова. Оплата не списывается. |
| special_failed | Генерация не удалась, ролик не создан. | Оплата не списывается. Можно отправить задачу повторно без изменений. |
| special_unknown | Не было чёткого ответа, принята ли отправка. Чтобы не генерировать дважды, повторно её не отправляли. | Оплата не списывается. Можно отправить снова. |
| special_fetch | Ролик создан, но файл не удалось получить после нескольких попыток. | Оплата не списывается. Отправьте задачу снова. |
| special_unavailable | Тариф был недоступен, или задача не запустилась за 120 минут. | Оплата не списывается. Попробуйте позже. |
Ориентируйтесь на code, а не на текст message. Любой незнакомый code (или его отсутствие) обрабатывайте как upstream_error: повторная отправка обычно проходит успешно. За каждую неудачную задачу деньги возвращаются полностью.
Вебхуки вместо опроса
Добавьте при отправке callback_url — как только задача завершится, успешно или с ошибкой, шлюз отправит на этот URL ровно то же, что возвращает эндпоинт опроса; запрос подписан, а при неудачной доставке повторяется. Общий адрес для всего аккаунта можно также задать в консоли, в разделе «Настройки → Вебхуки». Документация по вебхукам →
curl https://kovapi.com/v1/videos/generations \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model": "seedance-2.5-30s", "prompt": "Путешественник идёт через осенний городок в долине от рассвета до заката, камера следует за ним всю дорогу", "duration": 25, "resolution": "720P", "size": "16:9", "callback_url": "https://your-domain.com/webhook"}'