Skip to content

Создание задачи генерации видео

Генерация видео в RouteAPI — это асинхронный API задач. Вы отправляете запрос, получаете task_id, опрашиваете задачу до её завершения, а затем скачиваете видео. Все видеомодели платформы — Seedance, Sora, Veo, Wan, Kling, Hailuo, Vidu и другие — вызываются через одни и те же эндпоинты, потому что RouteAPI преобразует ваш запрос в формат, ожидаемый выбранным вышестоящим поставщиком.

Видеомодели присутствуют в GET /v1/models; в supported_endpoint_types отображается openai-video для каналов, работающих через формат видео OpenAI, а на странице модели в консоли значение можно задать для каждой модели. В любом случае берите ID модели из этого списка — см. Модели. Параметры конкретных моделей описаны по поставщикам: Seedance, Hailuo, Wan. Диалект OpenAI/Sora того же API описан в разделе Формат видео OpenAI.

МетодПутьНазначениеГде описано
POST/v1/video/generationsОтправить задачу генерацииЭта страница
GET/v1/video/generations/{task_id}Прочитать запись задачиПолучение задачи видео
POST/v1/videosОтправить задачу генерации (диалект OpenAI)Формат видео OpenAI
GET/v1/videos/{task_id}Прочитать задачу как объект видео OpenAIФормат видео OpenAI
POST/v1/videos/{video_id}/remixСоздать задачу на основе существующего видеоФормат видео OpenAI
GET/v1/videos/{task_id}/contentСкачать байты готового видеоПолучение задачи видео

POST /v1/video/generations и POST /v1/videos — два пути к одной операции с разными диалектами запроса и ответа. Ответ на отправку в обоих случаях — объект видео OpenAI; GET-эндпоинты различаются (запись задачи и объект видео), поэтому каждый путь отправки сочетайте с соответствующим GET.

Как выполняется задача

Section titled “Как выполняется задача”
  1. Отправка — передайте промпт и модель в POST /v1/video/generations (или POST /v1/videos) и сохраните task_id из ответа. На этом шаге оценочная стоимость резервируется на вашем балансе.
  2. Опрос — вызывайте соответствующий GET каждые 10–15 секунд. Генерация обычно занимает от одной до нескольких минут; более высокое разрешение и большая длительность требуют больше времени.
  3. Завершение — когда статус сообщает об успехе, скачайте видео или прочитайте его URL. Если задача завершилась ошибкой или так и не достигла конечного состояния, зарезервированная сумма возвращается.
POST /v1/video/generations

Каждая видеомодель принимает эту общую структуру. Параметры конкретной модели помещаются в metadata; страницы поставщиков перечисляют ключи, которые фактически читает каждый адаптер.

ПолеТипОбязательноОписание
modelstringДаID модели из GET /v1/models
promptstringДаТекстовый промпт. Отсутствующий, пустой или состоящий из пробелов промпт отклоняется с 400
imagestringНетОдно изображение (URL или Base64/data URI). Считается первым элементом images
imagesstring[]НетРеференсные / первые кадры. Смысл зависит от модели
sizestringНетПодсказка размера или разрешения, например 1280x720 или 720p, в зависимости от модели
durationintegerНетДлительность в секундах. RouteAPI отклоняет отрицательные значения и значения больше 3600
secondsstringНетУстаревшая строковая форма длительности. Модели, которые её читают, используют её вместо duration
input_referencestringНетПоле референсного изображения в стиле OpenAI, читается поддерживающими его адаптерами (например, Sora и Wan)
ratiostringНетСоотношение сторон, например 16:9 или 9:16; читается адаптером Seedance
resolutionstringНетУровень выходного разрешения, например 720p или 1080p; читается адаптером Seedance
generate_audiobooleanНетГенерировать звуковую дорожку. В Seedance явный false передаётся, а не отбрасывается
metadataobjectНетПараметры поставщика. В Seedance при совпадении имён значение из metadata важнее значения верхнего уровня

Неизвестные RouteAPI поля верхнего уровня игнорируются; параметры конкретной модели помещайте в metadata.

Эндпоинты отправки также принимают тело multipart/form-data: скалярные поля формы сопоставляются с теми же именами, а файлы загружаются напрямую (например, input_reference для Sora). Неизвестные поля формы становятся записями metadata.

Terminal window
curl https://api.routeapi.ai/v1/video/generations \
-H "Authorization: Bearer $ROUTEAPI_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "seedance-2.0-fast",
"prompt": "An orange cat stretching on a windowsill at sunrise",
"duration": 5,
"resolution": "720p",
"ratio": "16:9",
"generate_audio": false
}'
{
"id": "task_G2RdWGt4t1nck5fYqTjwREKJo8Ze4RAV",
"task_id": "task_G2RdWGt4t1nck5fYqTjwREKJo8Ze4RAV",
"object": "video",
"model": "seedance-2.0-fast",
"status": "queued",
"progress": 0,
"created_at": 1792048458
}

task_id (и его псевдоним id) — это ID задачи RouteAPI; все последующие вызовы используют его. ID задачи вышестоящего поставщика — не то значение, которое нужно опрашивать: если оно вообще видно, то находится в сохранённой полезной нагрузке вышестоящего сервиса (data.data в записи задачи).

Успешная отправка также возвращает заголовок X-New-Api-Other-Ratios с применёнными тарифными множителями — например, {"seconds":5,"size":1} для Sora или {"video_input":0.608695652174} для запроса Seedance с видео на входе. Он полезен при сверке списаний.

После маршрутизации эндпоинты задач отвечают в формате ошибки задач:

{ "code": "invalid_request", "message": "prompt is required", "data": null }
СтатусКодЗначение
400invalid_requestОтсутствует или пустой prompt, поле metadata неверного типа, или тело не удаётся разобрать
400invalid_jsonНеверный JSON в адаптерах, которые сами проверяют тело (Sora и Wan)
400missing_modelОтсутствует model; возвращается адаптерами, которые сами проверяют тело (Sora и Wan). Остальные пути отклоняют запрос без модели до маршрутизации, как ошибку middleware
400invalid_secondsduration / seconds отрицательно или больше 3600
400invalid_sizeМодель не принимает такой размер, например неподдерживаемый размер Sora
400model_price_errorRouteAPI не смог рассчитать цену модели; запрос не отправляется
400model_not_supportedМодель соответствует модели, которую канал больше не обслуживает, например Seedance 1.x
400task_not_existИсходная задача remix неизвестна или принадлежит другому аккаунту
400task_source_unavailableКанал исходной задачи remix удалён, отключён, или адаптер для него отсутствует
403insufficient_user_quota / pre_consume_token_quota_failedБаланс аккаунта или квота ключа не покрывают оценочную стоимость; запрос не отправляется
429—Ёмкость вышестоящего сервиса исчерпана; сообщение заменяется общим текстом «повторите позже»
500build_request_failed, do_request_failed, invalid_responseЗадачу не удалось преобразовать, соединение с вышестоящим сервисом не удалось, или он не вернул ID задачи
500get_channel_failed, task_persistence_failed, gen_relay_info_failedRouteAPI не смог выбрать канал или записать задачу; списание не происходит (резерв возвращается)
502upstream_task_id_missingВышестоящий сервис принял задачу, но не вернул её ID; задача помечается как неуспешная, резерв освобождается
любойfail_to_fetch_taskВышестоящий сервис ответил на отправку статусом, отличным от 200; HTTP-статус берётся у него

Запросы, отклонённые до маршрутизации — отсутствующий или недействительный API Key (401), ограничение по IP, группа без доступа, модель вне списка разрешённых для ключа (403) или модель без доступного канала (503, код model_not_found) — используют стандартное тело ошибки middleware {"error": {"message": ..., "type": "error", "code": ...}}, а не формат задачи.

Сбои, происходящие после отправки (модерация контента, тайм-аут поставщика, отмена), не проявляются как HTTP-ошибки. Они видны как FAILURE в записи задачи вместе с fail_reason, а зарезервированная сумма возвращается.

  • Получение задачи видео — опрос записи, чтение статуса и скачивание результата.
  • Seedance, Hailuo, Wan — параметры и ограничения конкретных моделей.
  • Материалы (Assets) — загрузка переиспользуемых изображений, видео и аудио и ссылки на них через asset://.
  • Частые ошибки — коды состояния, общие для всех эндпоинтов моделей.