KovAPIKovAPI
POST https://kovapi.com/v1/videos/generations

Целая длительность 4–30 с, 720P, 16:9 или 9:16. До 30 референсных изображений и 10 аудиофайлов; референсное видео не поддерживается. Без референсного аудио — $2 (400 кредитов), с ним — $3 (600 кредитов) за ролик независимо от длительности. Созданная звуковая дорожка не считается референсным аудио. Предложение временное, постоянная доступность не гарантируется. Время зависит от очереди; проверяйте исходную задачу, не отправляйте повторно. При сбое — полный возврат.

Попробовать в песочнице →

Быстрый старт

Три шага: отправить задачу, опросить её и забрать ссылку на видео. Замените YOUR_API_KEY своим ключом, и команды ниже заработают как есть.

Шаг 1 · Отправка (сразу возвращает id задачи, HTTP 202)

curl
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)

JSON
{
  "id": "img_5c2e8f1a9b3d7e6f0a4c8b2d",
  "object": "video.generation.job",
  "status": "queued",
  "created": 1791281400,
  "model": "seedance-2.5-30s"
}

Шаг 2 · Опрашивайте каждые 5–10 секунд, пока status не станет succeeded или failed

curl
curl https://kovapi.com/v1/videos/jobs/img_5c2e8f1a9b3d7e6f0a4c8b2d \
  -H "Authorization: Bearer YOUR_API_KEY"

Ответ при успехе

JSON
{
  "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: отправить, дождаться, сохранить на диск)

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 позже.

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

Header
Authorization: Bearer YOUR_API_KEY
Content-Type: application/json

Чтобы начать, создайте API-ключ в консоли.

Основные характеристики

Длительность4–30 с
Разрешение720P
Пропорции16:9 / 9:16
Референсные изображениядо 30 · используются как референсы (персонажи, сцена, стиль), но не как кадр
Референсные видеоне поддерживается
Референсное аудиодо 10
Звуквсегда включён; отключить нельзя (audio: false отклоняется)
Оплатаза ролик: одна цена при любой длительности

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

ПараметрТипОбязательныйОписание
modelstringДаModel ID, here seedance-2.5-30s.
promptstringДаОпишите содержание, камеру и действия.
durationintegerНетAny integer from 4 to 30 seconds (default 30). Alias: seconds. Duration does not change the per-clip price.
resolutionstringНет720P
sizestringНетAspect ratio: 16:9 / 9:16 (default 16:9); alias aspect_ratio. 21:9 is not available on this model.
imagestringНетImage-to-video: include a reference image (public URL, data: URI or base64); omit for text-to-video.
imagesarrayНетMultiple reference images, up to 30. Exceeding the cap is rejected, never truncated. Alias: reference_images.
audio_referencestring / arrayНетПубличный HTTPS URL или массив, до 10 файлов; требуется хотя бы одно изображение. MP3/WAV/M4A, до 15 МБ и 30 с каждый. С референсным аудио: $3 (600 кредитов) за ролик.
audiobooleanНетКаждый ролик выходит со звуком, отключить его нельзя; false отклоняется (400), поэтому не передавайте этот параметр.
callback_urlstringНетКуда отправить результат, когда задача завершится; подробнее — в разделе о вебхуках ниже.
nintegerНетКаждая задача создаёт один ролик; передавать параметр не нужно. При значении больше 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.

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

JSON · $3
{
  "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: задача не создаётся, ничего не списывается. О неудаче после того, как задача принята, сообщает эндпоинт задачи, а резерв возвращается полностью. Все коды перечислены в разделе Коды ошибок.

Ошибки при отправке

HTTPcodeПричинаЧто делать
400invalid_requestНедопустимый параметр: длительность, разрешение, пропорция или число референсов выходят за пределы, допустимые для этой модели; промпт слишком длинный; не удаётся прочитать референсное изображение или видео; передан audio: false модели, ролики которой всегда со звуком, и т. п. Что именно не так, указано в message.Исправьте то, что указано в message, и отправьте снова.
400invalid_callback_urlcallback_url — не публичный адрес http(s) или длиннее 2000 символов.Укажите адрес, доступный из интернета.
400model_not_foundID модели написан с ошибкой, model не передан или модель нельзя использовать на этом эндпоинте (например, чат-модель на эндпоинте изображений).Берите ID модели из GET /v1/models или из справочника API.
401invalid_api_keyКлюч не существует, удалён или отключён, либо отключён аккаунт.Проверьте ключ на странице API Keys в консоли.
402insufficient_quotaБаланса не хватает, чтобы зарезервировать стоимость этого запроса. Шлюз сначала резервирует максимально возможную стоимость запроса, поэтому ошибка может возникнуть и при всплеске одновременных вызовов.Если был всплеск запросов, подождите несколько секунд и повторите; в остальных случаях пополните баланс.
429rate_limit_exceededПревышен лимит запросов в минуту, заданный для этого ключа (считается за последние 60 секунд). Заголовка Retry-After нет.Подождите несколько секунд и повторите или увеличьте лимит ключа в консоли.
503model_maintenanceМодель на обслуживании и не принимает запросы; пока идёт обслуживание, другая модель вместо неё не ответит.Повторите, когда обслуживание закончится; ход работ — на странице статуса.
503service_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 · callback_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"}'