Загрузка...

Генерация видео

Генерируйте видео из текстовых промптов через RouterAI API.

RouterAI поддерживает генерацию видео через модели, у которых "video" указан в output_modalities. Генерация асинхронная: вы создаёте задачу, а готовое видео получаете позже — опросом статуса (polling) или через webhook на ваш callback_url.

Полный жизненный цикл:

  1. СозданиеPOST /api/v1/videos возвращает id задачи и polling_url.
  2. Ожидание — опрашивайте статус (GET /api/v1/videos/{id}) или получите webhook, если указали callback_url.
  3. Скачивание — когда статус completed, заберите mp4 через content-эндпоинт.

Поиск моделей

Модели для генерации видео — это модели с "video" в output_modalities. Найти их можно:

  • на странице моделей, отфильтровав по выходным модальностям;
  • запросом общего каталога моделей GET /api/v1/models — видео-модели отличаются значением video в architecture.output_modalities:
curl https://routerai.ru/api/v1/models \
  -H "Authorization: Bearer $ROUTERAI_API_KEY"

Шаг 1. Создание генерации

Отправьте POST /api/v1/videos с обязательными model и prompt. Необязательное поле callback_url — HTTPS-адрес, на который придёт webhook о готовности (см. Шаг 3).

curl https://routerai.ru/api/v1/videos \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $ROUTERAI_API_KEY" \
  -d '{
    "model": "x-ai/grok-imagine-video",
    "prompt": "Кот в скафандре медленно плывёт в невесомости на космической станции, кинематографичный свет",
    "aspect_ratio": "16:9",
    "duration": 4,
    "resolution": "480p",
    "callback_url": "https://example.com/hooks/routerai-video"
  }'

Ответ 202 Accepted — задача принята:

{
  "id": "Cq4gNzomlZDrNyy72GHC",
  "status": "pending",
  "polling_url": "https://routerai.ru/api/v1/videos/Cq4gNzomlZDrNyy72GHC"
}
  • id — идентификатор задачи (используется во всех последующих запросах).
  • status — текущий статус (pending сразу после создания).
  • polling_url — URL для опроса статуса (указывает на домен RouterAI).

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

Параметр Тип Обязателен Описание
model string да Слаг модели (например, bytedance/seedance-2.0).
prompt string да Текстовое описание желаемого видео.
duration integer нет Длительность видео в секундах. Допустимые значения зависят от модели.
resolution string нет Разрешение видео (например, 720p, 1080p). Допустимые значения зависят от модели.
aspect_ratio string нет Соотношение сторон (например, 16:9, 9:16, 1:1). Допустимые значения зависят от модели.
size string нет Точный размер кадра в формате ШИРИНАxВЫСОТА (например, 1280x720) — альтернатива паре resolution + aspect_ratio.
frame_images array нет Опорные кадры для image-to-video (см. ниже).
input_references array нет Референс-изображения для reference-to-video (см. ниже).
seed integer нет Детерминированная генерация: повторный запрос с тем же seed даёт похожий результат (если поддерживается моделью).
generate_audio boolean нет Генерировать ли аудиодорожку (если поддерживается моделью).
negative_prompt string нет Что исключить из видео (если поддерживается моделью).
callback_url string нет HTTPS-адрес для webhook о готовности (см. Шаг 3).

Помимо перечисленных, модель может принимать провайдер-специфичные параметры (например, watermark у Seedance или personGeneration у Veo) — они передаются в корне тела запроса и пробрасываются провайдеру как есть. Какие параметры и значения поддерживает конкретная модель — см. в разделе «Поддержка по моделям» или на странице модели в каталоге.

Изображения на входе

Есть два способа передать изображения, и каждый включает свой режим генерации:

  • frame_images — опорные кадры для image-to-video: у каждого элемента есть frame_typefirst_frame (первый кадр видео) или last_frame (последний).
  • input_references — референс-изображения (персонаж, стиль, объект) для reference-to-video: модель использует их как визуальный ориентир, а не как точные кадры.

url внутри image_url — публично доступный HTTPS-URL или data URI в base64.

Image-to-video (frame_images)

{
  "model": "bytedance/seedance-2.0",
  "prompt": "Персонаж идёт через осенний лес, камера следует за ним",
  "frame_images": [
    {
      "type": "image_url",
      "image_url": { "url": "https://example.com/first-frame.png" },
      "frame_type": "first_frame"
    }
  ],
  "resolution": "1080p"
}

Reference-to-video (input_references)

{
  "model": "bytedance/seedance-2.0",
  "prompt": "Гигантская солнечная вспышка рядом с планетой",
  "input_references": [
    {
      "type": "image_url",
      "image_url": { "url": "https://example.com/style-ref.png" }
    }
  ],
  "resolution": "1080p"
}
Не передавайте `frame_images` и `input_references` в одном запросе: какое из полей возьмёт приоритет — зависит от модели. Выберите один режим. Поддержка обоих полей тоже зависит от модели — сверьтесь со списком ниже.

Поддержка по моделям

Точный набор параметров и допустимых значений у каждой модели свой. Ниже — актуальный список видео-моделей RouterAI (обновляется автоматически из каталога): раскройте модель, чтобы увидеть её параметры и допустимые значения.

Alibaba: HappyHorse 1.0alibaba/happyhorse-1.0

Страница модели

ПараметрТипПо умолчаниюОписание
aspect_ratiostringСоотношение сторон видео. Доступные значения: 16:9, 9:16, 1:1, 4:3, 3:4, 21:9, 9:21.
durationintegerДлительность видео в секундах. Доступные значения: 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15.
resolutionstringРазрешение видео. Доступные значения: 720p, 1080p.
sizestringРазмер кадра в пикселях (ширина×высота). Доступные значения: 1280x720, 720x1280, 720x720, 960x720, 720x960, 1680x720, 720x1680, 1920x1080, 1080x1920, 1080x1080, 1440x1080, 1080x1440, 2520x1080, 1080x2520.
frame_imagesarrayОпорные кадры для image-to-video: массив объектов {"type": "image_url", "image_url": {"url": …}, "frame_type": "first_frame" | "last_frame"}. URL или data URI в base64. Поддерживаемые кадры: первый кадр.
input_referencesarrayРеференс-изображения (персонаж, стиль, объект): массив объектов {"type": "image_url", "image_url": {"url": …}}. URL или data URI в base64.
seedintegerЕсли задан, инференс выполняется детерминированно — повторные запросы с тем же seed и параметрами должны давать одинаковый результат.
Alibaba: HappyHorse 1.1alibaba/happyhorse-1.1

Страница модели

ПараметрТипПо умолчаниюОписание
aspect_ratiostringСоотношение сторон видео. Доступные значения: 16:9, 9:16, 1:1, 4:3, 3:4, 21:9, 9:21.
durationintegerДлительность видео в секундах. Доступные значения: 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15.
resolutionstringРазрешение видео. Доступные значения: 720p, 1080p.
sizestringРазмер кадра в пикселях (ширина×высота). Доступные значения: 1280x720, 720x1280, 720x720, 960x720, 720x960, 1680x720, 720x1680, 1920x1080, 1080x1920, 1080x1080, 1440x1080, 1080x1440, 2520x1080, 1080x2520.
frame_imagesarrayОпорные кадры для image-to-video: массив объектов {"type": "image_url", "image_url": {"url": …}, "frame_type": "first_frame" | "last_frame"}. URL или data URI в base64. Поддерживаемые кадры: первый кадр.
input_referencesarrayРеференс-изображения (персонаж, стиль, объект): массив объектов {"type": "image_url", "image_url": {"url": …}}. URL или data URI в base64.
seedintegerЕсли задан, инференс выполняется детерминированно — повторные запросы с тем же seed и параметрами должны давать одинаковый результат.
Alibaba: Wan 2.6alibaba/wan-2.6

Страница модели

ПараметрТипПо умолчаниюОписание
aspect_ratiostringСоотношение сторон видео. Доступные значения: 16:9, 9:16.
durationintegerДлительность видео в секундах. Доступные значения: 5, 10.
resolutionstringРазрешение видео. Доступные значения: 720p, 1080p.
sizestringРазмер кадра в пикселях (ширина×высота). Доступные значения: 1280x720, 1080x1920, 720x1280, 1920x1080.
frame_imagesarrayОпорные кадры для image-to-video: массив объектов {"type": "image_url", "image_url": {"url": …}, "frame_type": "first_frame" | "last_frame"}. URL или data URI в base64. Поддерживаемые кадры: первый кадр.
input_referencesarrayРеференс-изображения (персонаж, стиль, объект): массив объектов {"type": "image_url", "image_url": {"url": …}}. URL или data URI в base64.
seedintegerЕсли задан, инференс выполняется детерминированно — повторные запросы с тем же seed и параметрами должны давать одинаковый результат.
generate_audiobooleantrueГенерировать ли аудиодорожку.
negative_promptПровайдер-специфичный параметр модели; передаётся провайдеру как есть.
enable_prompt_expansionПровайдер-специфичный параметр модели; передаётся провайдеру как есть.
shot_typeПровайдер-специфичный параметр модели; передаётся провайдеру как есть.
audioПровайдер-специфичный параметр модели; передаётся провайдеру как есть.
Alibaba: Wan 2.7alibaba/wan-2.7

Страница модели

ПараметрТипПо умолчаниюОписание
aspect_ratiostringСоотношение сторон видео. Доступные значения: 16:9, 9:16, 1:1, 4:3, 3:4.
durationintegerДлительность видео в секундах. Доступные значения: 2, 3, 4, 5, 6, 7, 8, 9, 10.
resolutionstringРазрешение видео. Доступные значения: 720p, 1080p.
sizestringРазмер кадра в пикселях (ширина×высота). Доступные значения: 1280x720, 720x1280, 1920x1080, 1080x1920, 720x720, 1080x1080, 960x720, 720x960, 1440x1080, 1080x1440.
frame_imagesarrayОпорные кадры для image-to-video: массив объектов {"type": "image_url", "image_url": {"url": …}, "frame_type": "first_frame" | "last_frame"}. URL или data URI в base64. Поддерживаемые кадры: первый кадр, последний кадр.
input_referencesarrayРеференс-изображения (персонаж, стиль, объект): массив объектов {"type": "image_url", "image_url": {"url": …}}. URL или data URI в base64.
seedintegerЕсли задан, инференс выполняется детерминированно — повторные запросы с тем же seed и параметрами должны давать одинаковый результат.
generate_audiobooleantrueГенерировать ли аудиодорожку.
negative_promptПровайдер-специфичный параметр модели; передаётся провайдеру как есть.
prompt_extendПровайдер-специфичный параметр модели; передаётся провайдеру как есть.
audioПровайдер-специфичный параметр модели; передаётся провайдеру как есть.
ratioПровайдер-специфичный параметр модели; передаётся провайдеру как есть.
last_imageПровайдер-специфичный параметр модели; передаётся провайдеру как есть.
videoПровайдер-специфичный параметр модели; передаётся провайдеру как есть.
videosПровайдер-специфичный параметр модели; передаётся провайдеру как есть.
imagesПровайдер-специфичный параметр модели; передаётся провайдеру как есть.
ByteDance: Seedance 1.5 Probytedance/seedance-1-5-pro

Страница модели

ПараметрТипПо умолчаниюОписание
aspect_ratiostringСоотношение сторон видео. Доступные значения: 1:1, 3:4, 9:16, 9:21, 4:3, 16:9, 21:9.
durationintegerДлительность видео в секундах. Доступные значения: 4, 5, 6, 7, 8, 9, 10, 11, 12.
resolutionstringРазрешение видео. Доступные значения: 480p, 720p, 1080p.
sizestringРазмер кадра в пикселях (ширина×высота). Доступные значения: 480x480, 480x640, 480x854, 480x1120, 640x480, 720x720, 720x960, 720x1280, 720x1680, 854x480, 960x720, 1080x1080, 1080x1440, 1080x1920, 1080x2520, 1120x480, 1280x720, 1440x1080, 1680x720, 1920x1080, 2520x1080.
frame_imagesarrayОпорные кадры для image-to-video: массив объектов {"type": "image_url", "image_url": {"url": …}, "frame_type": "first_frame" | "last_frame"}. URL или data URI в base64. Поддерживаемые кадры: первый кадр, последний кадр.
input_referencesarrayРеференс-изображения (персонаж, стиль, объект): массив объектов {"type": "image_url", "image_url": {"url": …}}. URL или data URI в base64.
seedintegerЕсли задан, инференс выполняется детерминированно — повторные запросы с тем же seed и параметрами должны давать одинаковый результат.
generate_audiobooleantrueГенерировать ли аудиодорожку.
watermarkПровайдер-специфичный параметр модели; передаётся провайдеру как есть.
req_keyПровайдер-специфичный параметр модели; передаётся провайдеру как есть.
ByteDance: Seedance 2.0bytedance/seedance-2.0

Страница модели

ПараметрТипПо умолчаниюОписание
aspect_ratiostringСоотношение сторон видео. Доступные значения: 1:1, 3:4, 9:16, 4:3, 16:9, 21:9, 9:21.
durationintegerДлительность видео в секундах. Доступные значения: 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15.
resolutionstringРазрешение видео. Доступные значения: 480p, 720p, 1080p, 4K.
sizestringРазмер кадра в пикселях (ширина×высота). Доступные значения: 480x480, 480x640, 480x854, 640x480, 854x480, 1120x480, 720x720, 720x960, 720x1280, 720x1680, 960x720, 1280x720, 1680x720, 1080x1080, 1080x1440, 1080x1920, 1440x1080, 1920x1080, 2520x1080, 3840x2160, 2160x3840, 2160x2160, 2880x2160, 2160x2880, 5040x2160.
frame_imagesarrayОпорные кадры для image-to-video: массив объектов {"type": "image_url", "image_url": {"url": …}, "frame_type": "first_frame" | "last_frame"}. URL или data URI в base64. Поддерживаемые кадры: первый кадр, последний кадр.
input_referencesarrayРеференс-изображения (персонаж, стиль, объект): массив объектов {"type": "image_url", "image_url": {"url": …}}. URL или data URI в base64.
seedintegerЕсли задан, инференс выполняется детерминированно — повторные запросы с тем же seed и параметрами должны давать одинаковый результат.
generate_audiobooleantrueГенерировать ли аудиодорожку.
watermarkПровайдер-специфичный параметр модели; передаётся провайдеру как есть.
req_keyПровайдер-специфичный параметр модели; передаётся провайдеру как есть.
ByteDance: Seedance 2.0 Fastbytedance/seedance-2.0-fast

Страница модели

ПараметрТипПо умолчаниюОписание
aspect_ratiostringСоотношение сторон видео. Доступные значения: 1:1, 3:4, 9:16, 4:3, 16:9, 21:9, 9:21.
durationintegerДлительность видео в секундах. Доступные значения: 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15.
resolutionstringРазрешение видео. Доступные значения: 480p, 720p.
sizestringРазмер кадра в пикселях (ширина×высота). Доступные значения: 480x480, 480x640, 480x854, 640x480, 854x480, 1120x480, 720x720, 720x960, 720x1280, 720x1680, 960x720, 1280x720, 1680x720.
frame_imagesarrayОпорные кадры для image-to-video: массив объектов {"type": "image_url", "image_url": {"url": …}, "frame_type": "first_frame" | "last_frame"}. URL или data URI в base64. Поддерживаемые кадры: первый кадр, последний кадр.
input_referencesarrayРеференс-изображения (персонаж, стиль, объект): массив объектов {"type": "image_url", "image_url": {"url": …}}. URL или data URI в base64.
seedintegerЕсли задан, инференс выполняется детерминированно — повторные запросы с тем же seed и параметрами должны давать одинаковый результат.
generate_audiobooleantrueГенерировать ли аудиодорожку.
watermarkПровайдер-специфичный параметр модели; передаётся провайдеру как есть.
req_keyПровайдер-специфичный параметр модели; передаётся провайдеру как есть.
Google: Veo 3.1google/veo-3.1

Страница модели

ПараметрТипПо умолчаниюОписание
aspect_ratiostringСоотношение сторон видео. Доступные значения: 16:9, 9:16.
durationintegerДлительность видео в секундах. Доступные значения: 4, 6, 8.
resolutionstringРазрешение видео. Доступные значения: 720p, 1080p, 4K.
sizestringРазмер кадра в пикселях (ширина×высота). Доступные значения: 1280x720, 1080x1920, 1920x1080, 720x1280, 3840x2160, 2160x3840.
frame_imagesarrayОпорные кадры для image-to-video: массив объектов {"type": "image_url", "image_url": {"url": …}, "frame_type": "first_frame" | "last_frame"}. URL или data URI в base64. Поддерживаемые кадры: первый кадр, последний кадр.
input_referencesarrayРеференс-изображения (персонаж, стиль, объект): массив объектов {"type": "image_url", "image_url": {"url": …}}. URL или data URI в base64.
seedintegerЕсли задан, инференс выполняется детерминированно — повторные запросы с тем же seed и параметрами должны давать одинаковый результат.
generate_audiobooleantrueГенерировать ли аудиодорожку.
personGenerationПровайдер-специфичный параметр модели; передаётся провайдеру как есть.
aspectRatioПровайдер-специфичный параметр модели; передаётся провайдеру как есть.
negativePromptПровайдер-специфичный параметр модели; передаётся провайдеру как есть.
conditioningScaleПровайдер-специфичный параметр модели; передаётся провайдеру как есть.
enhancePromptПровайдер-специфичный параметр модели; передаётся провайдеру как есть.
Google: Veo 3.1 Fastgoogle/veo-3.1-fast

Страница модели

ПараметрТипПо умолчаниюОписание
aspect_ratiostringСоотношение сторон видео. Доступные значения: 16:9, 9:16.
durationintegerДлительность видео в секундах. Доступные значения: 4, 6, 8.
resolutionstringРазрешение видео. Доступные значения: 720p, 1080p, 4K.
sizestringРазмер кадра в пикселях (ширина×высота). Доступные значения: 1280x720, 1080x1920, 1920x1080, 720x1280, 3840x2160, 2160x3840.
frame_imagesarrayОпорные кадры для image-to-video: массив объектов {"type": "image_url", "image_url": {"url": …}, "frame_type": "first_frame" | "last_frame"}. URL или data URI в base64. Поддерживаемые кадры: первый кадр, последний кадр.
input_referencesarrayРеференс-изображения (персонаж, стиль, объект): массив объектов {"type": "image_url", "image_url": {"url": …}}. URL или data URI в base64.
seedintegerЕсли задан, инференс выполняется детерминированно — повторные запросы с тем же seed и параметрами должны давать одинаковый результат.
generate_audiobooleantrueГенерировать ли аудиодорожку.
personGenerationПровайдер-специфичный параметр модели; передаётся провайдеру как есть.
aspectRatioПровайдер-специфичный параметр модели; передаётся провайдеру как есть.
negativePromptПровайдер-специфичный параметр модели; передаётся провайдеру как есть.
conditioningScaleПровайдер-специфичный параметр модели; передаётся провайдеру как есть.
enhancePromptПровайдер-специфичный параметр модели; передаётся провайдеру как есть.
Google: Veo 3.1 Litegoogle/veo-3.1-lite

Страница модели

ПараметрТипПо умолчаниюОписание
aspect_ratiostringСоотношение сторон видео. Доступные значения: 16:9, 9:16.
durationintegerДлительность видео в секундах. Доступные значения: 8, 4, 6.
resolutionstringРазрешение видео. Доступные значения: 720p, 1080p.
sizestringРазмер кадра в пикселях (ширина×высота). Доступные значения: 1280x720, 720x1280, 1920x1080, 1080x1920.
frame_imagesarrayОпорные кадры для image-to-video: массив объектов {"type": "image_url", "image_url": {"url": …}, "frame_type": "first_frame" | "last_frame"}. URL или data URI в base64. Поддерживаемые кадры: первый кадр, последний кадр.
seedintegerЕсли задан, инференс выполняется детерминированно — повторные запросы с тем же seed и параметрами должны давать одинаковый результат.
generate_audiobooleantrueГенерировать ли аудиодорожку.
personGenerationПровайдер-специфичный параметр модели; передаётся провайдеру как есть.
aspectRatioПровайдер-специфичный параметр модели; передаётся провайдеру как есть.
negativePromptПровайдер-специфичный параметр модели; передаётся провайдеру как есть.
conditioningScaleПровайдер-специфичный параметр модели; передаётся провайдеру как есть.
enhancePromptПровайдер-специфичный параметр модели; передаётся провайдеру как есть.
Kling: Video v3.0 Prokwaivgi/kling-v3.0-pro

Страница модели

ПараметрТипПо умолчаниюОписание
aspect_ratiostringСоотношение сторон видео. Доступные значения: 16:9, 9:16, 1:1.
durationintegerДлительность видео в секундах. Доступные значения: 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15.
resolutionstringРазрешение видео. Доступные значения: 720p.
sizestringРазмер кадра в пикселях (ширина×высота). Доступные значения: 1280x720, 720x1280, 720x720.
frame_imagesarrayОпорные кадры для image-to-video: массив объектов {"type": "image_url", "image_url": {"url": …}, "frame_type": "first_frame" | "last_frame"}. URL или data URI в base64. Поддерживаемые кадры: первый кадр, последний кадр.
input_referencesarrayРеференс-изображения (персонаж, стиль, объект): массив объектов {"type": "image_url", "image_url": {"url": …}}. URL или data URI в base64.
generate_audiobooleantrueГенерировать ли аудиодорожку.
negative_promptПровайдер-специфичный параметр модели; передаётся провайдеру как есть.
cfg_scaleПровайдер-специфичный параметр модели; передаётся провайдеру как есть.
Kling: Video v3.0 Standardkwaivgi/kling-v3.0-std

Страница модели

ПараметрТипПо умолчаниюОписание
aspect_ratiostringСоотношение сторон видео. Доступные значения: 16:9, 9:16, 1:1.
durationintegerДлительность видео в секундах. Доступные значения: 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15.
resolutionstringРазрешение видео. Доступные значения: 720p.
sizestringРазмер кадра в пикселях (ширина×высота). Доступные значения: 1280x720, 720x1280, 720x720.
frame_imagesarrayОпорные кадры для image-to-video: массив объектов {"type": "image_url", "image_url": {"url": …}, "frame_type": "first_frame" | "last_frame"}. URL или data URI в base64. Поддерживаемые кадры: первый кадр, последний кадр.
input_referencesarrayРеференс-изображения (персонаж, стиль, объект): массив объектов {"type": "image_url", "image_url": {"url": …}}. URL или data URI в base64.
generate_audiobooleantrueГенерировать ли аудиодорожку.
negative_promptПровайдер-специфичный параметр модели; передаётся провайдеру как есть.
cfg_scaleПровайдер-специфичный параметр модели; передаётся провайдеру как есть.
Kling: Video O1kwaivgi/kling-video-o1

Страница модели

ПараметрТипПо умолчаниюОписание
aspect_ratiostringСоотношение сторон видео. Доступные значения: 16:9, 9:16, 1:1.
durationintegerДлительность видео в секундах. Доступные значения: 5, 10.
resolutionstringРазрешение видео. Доступные значения: 720p.
sizestringРазмер кадра в пикселях (ширина×высота). Доступные значения: 1280x720, 720x1280, 720x720.
frame_imagesarrayОпорные кадры для image-to-video: массив объектов {"type": "image_url", "image_url": {"url": …}, "frame_type": "first_frame" | "last_frame"}. URL или data URI в base64. Поддерживаемые кадры: первый кадр, последний кадр.
input_referencesarrayРеференс-изображения (персонаж, стиль, объект): массив объектов {"type": "image_url", "image_url": {"url": …}}. URL или data URI в base64.
generate_audiobooleantrueГенерировать ли аудиодорожку.
negative_promptПровайдер-специфичный параметр модели; передаётся провайдеру как есть.
MiniMax: Hailuo 2.3minimax/hailuo-2.3

Страница модели

ПараметрТипПо умолчаниюОписание
aspect_ratiostringСоотношение сторон видео. Доступные значения: 16:9.
durationintegerДлительность видео в секундах. Доступные значения: 6, 10.
resolutionstringРазрешение видео. Доступные значения: 1080p.
sizestringРазмер кадра в пикселях (ширина×высота). Доступные значения: 1920x1080.
frame_imagesarrayОпорные кадры для image-to-video: массив объектов {"type": "image_url", "image_url": {"url": …}, "frame_type": "first_frame" | "last_frame"}. URL или data URI в base64. Поддерживаемые кадры: первый кадр.
input_referencesarrayРеференс-изображения (персонаж, стиль, объект): массив объектов {"type": "image_url", "image_url": {"url": …}}. URL или data URI в base64.
generate_audiobooleanfalseГенерировать ли аудиодорожку.
prompt_optimizerПровайдер-специфичный параметр модели; передаётся провайдеру как есть.
fast_pretreatmentПровайдер-специфичный параметр модели; передаётся провайдеру как есть.
OpenAI: Sora 2 Proopenai/sora-2-pro

Страница модели

ПараметрТипПо умолчаниюОписание
aspect_ratiostringСоотношение сторон видео. Доступные значения: 16:9, 9:16.
durationintegerДлительность видео в секундах. Доступные значения: 4, 8, 12, 16, 20.
resolutionstringРазрешение видео. Доступные значения: 720p, 1080p.
sizestringРазмер кадра в пикселях (ширина×высота). Доступные значения: 1280x720, 1080x1920, 1920x1080, 720x1280.
generate_audiobooleantrueГенерировать ли аудиодорожку.
qualityПровайдер-специфичный параметр модели; передаётся провайдеру как есть.
styleПровайдер-специфичный параметр модели; передаётся провайдеру как есть.
xAI: Grok Imagine Videox-ai/grok-imagine-video

Страница модели

ПараметрТипПо умолчаниюОписание
aspect_ratiostringСоотношение сторон видео. Доступные значения: 16:9, 9:16, 1:1, 4:3, 3:4, 3:2, 2:3.
durationintegerДлительность видео в секундах. Доступные значения: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15.
resolutionstringРазрешение видео. Доступные значения: 480p, 720p.
sizestringРазмер кадра в пикселях (ширина×высота). Доступные значения: 854x480, 1280x720, 480x854, 720x1280, 480x480, 720x720, 640x480, 960x720, 480x640, 720x960, 720x480, 1080x720, 480x720, 720x1080.
frame_imagesarrayОпорные кадры для image-to-video: массив объектов {"type": "image_url", "image_url": {"url": …}, "frame_type": "first_frame" | "last_frame"}. URL или data URI в base64. Поддерживаемые кадры: первый кадр.
input_referencesarrayРеференс-изображения (персонаж, стиль, объект): массив объектов {"type": "image_url", "image_url": {"url": …}}. URL или data URI в base64.

Шаг 2. Поллинг статуса

Опрашивайте статус задачи, пока он не станет терминальным:

curl https://routerai.ru/api/v1/videos/Cq4gNzomlZDrNyy72GHC \
  -H "Authorization: Bearer $ROUTERAI_API_KEY"

Статусы:

Статус Тип Значение
pending промежуточный задача создана
in_progress промежуточный видео генерируется
completed успех готово — можно скачивать
failed терминальная ошибка ошибка генерации (см. поле error)
cancelled терминальная ошибка задача отменена
expired терминальная ошибка срок хранения результата истёк

Ответ для готовой задачи (completed):

{
  "id": "Cq4gNzomlZDrNyy72GHC",
  "status": "completed",
  "polling_url": "https://routerai.ru/api/v1/videos/Cq4gNzomlZDrNyy72GHC",
  "unsigned_urls": [
    "https://routerai.ru/api/v1/videos/Cq4gNzomlZDrNyy72GHC/content?index=0"
  ],
  "usage": { "cost": 18.2 }
}

unsigned_urls — ссылки на content-эндпоинт RouterAI; по ним скачивается готовое видео (см. Шаг 4).

Вместо опроса в цикле удобнее указать `callback_url` при создании — тогда RouterAI сам уведомит вас о готовности, и поллинг не нужен.

Шаг 3. Webhook о готовности

Если при создании указан callback_url, RouterAI отправит на него POST с JSON-телом, когда задача достигнет терминального статуса (completed, failed, expired, cancelled). Это избавляет от постоянного опроса статуса.

Что приходит

{
  "type": "video.generation.completed",
  "created_at": "2026-01-01T00:00:00.000Z",
  "data": {
    "id": "Cq4gNzomlZDrNyy72GHC",
    "status": "completed",
    "generation_id": "gen-abc123",
    "model": "x-ai/grok-imagine-video",
    "unsigned_urls": [
      "https://routerai.ru/api/v1/videos/Cq4gNzomlZDrNyy72GHC/content?index=0"
    ],
    "usage": { "cost": 18.2 }
  }
}
  • type — тип события, одно из:
    • video.generation.completed
    • video.generation.failed
    • video.generation.expired
    • video.generation.cancelled
  • data.unsigned_urls — ссылки на content-эндпоинт RouterAI (только при completed).
  • data.usage.cost — стоимость в рублях (только при completed).
  • data.error — текст ошибки (для failed/expired).

Заголовки запроса:

Заголовок Значение
Content-Type application/json
X-RouterAI-Timestamp момент отправки, unix-секунды
X-RouterAI-Signature HMAC-SHA256 в hex (см. ниже)

Подпись

Подпись считается над строкой "<timestamp>.<body>", где bodyсырое тело запроса (та же JSON-строка, что пришла):

signature = HMAC_SHA256(secret, "<X-RouterAI-Timestamp>.<raw_body>")

Особенность RouterAI: отдельный секрет не нужен — секретом служит SHA-256-дайджест вашего API-ключа в hex. То есть вы вычисляете секрет прямо из своего ключа:

secret = sha256_hex(ROUTERAI_API_KEY)

Так подпись можно проверить, имея только свой API-ключ. Запрос подписывается ключом, которым была создана задача.

Считайте HMAC именно по полученным байтам тела, а не по результату `JSON.parse` + повторной сериализации — иначе порядок ключей и пробелы изменят дайджест, и сверка ложно не сойдётся.

Как проверить подпись

  1. Прочитайте X-RouterAI-Timestamp и сырое тело запроса (до парсинга JSON).
  2. Вычислите secret = sha256_hex(api_key).
  3. Пересчитайте HMAC_SHA256(secret, "<ts>.<raw_body>") и сравните с X-RouterAI-Signature в постоянном времени (constant-time), не обычным ==.
  4. Проверьте свежесть timestamp (например, ±5 минут) — защита от повторного воспроизведения (replay).

Node.js (Express)

const crypto = require("crypto");

// важно получить сырое тело: app.use(express.raw({ type: "application/json" }))
app.post("/hooks/routerai-video", (req, res) => {
  const apiKey = process.env.ROUTERAI_API_KEY;
  const ts = req.get("X-RouterAI-Timestamp");
  const sig = req.get("X-RouterAI-Signature");
  const rawBody = req.body; // Buffer

  // свежесть метки времени (анти-replay)
  if (Math.abs(Date.now() / 1000 - Number(ts)) > 300) {
    return res.status(401).end();
  }

  // секрет = sha256(api_key) в hex
  const secret = crypto.createHash("sha256").update(apiKey).digest("hex");
  const expected = crypto
    .createHmac("sha256", secret)
    .update(`${ts}.${rawBody}`)
    .digest("hex");

  const ok =
    sig &&
    sig.length === expected.length &&
    crypto.timingSafeEqual(Buffer.from(sig), Buffer.from(expected));
  if (!ok) return res.status(401).end();

  const event = JSON.parse(rawBody.toString("utf8"));
  // ... ваша логика: event.type, event.data.unsigned_urls ...
  res.status(200).end();
});

Python (Flask)

import os, hmac, hashlib, time
from flask import request, abort

@app.post("/hooks/routerai-video")
def routerai_video():
    api_key = os.environ["ROUTERAI_API_KEY"]
    ts = request.headers.get("X-RouterAI-Timestamp", "")
    sig = request.headers.get("X-RouterAI-Signature", "")
    raw = request.get_data()  # bytes, сырое тело

    if abs(time.time() - int(ts)) > 300:
        abort(401)

    # секрет = sha256(api_key) в hex
    secret = hashlib.sha256(api_key.encode()).hexdigest()
    expected = hmac.new(secret.encode(), f"{ts}.".encode() + raw, hashlib.sha256).hexdigest()
    if not hmac.compare_digest(sig, expected):
        abort(401)

    event = request.get_json()
    # ... ваша логика: event["type"], event["data"]["unsigned_urls"] ...
    return "", 200

Доставка и ретраи

  • Доставка считается успешной при ответе HTTP 2xx. Любой другой код или таймаут — неуспех.
  • При неуспехе RouterAI повторяет отправку: до 10 попыток с экспоненциальной задержкой (несколько часов суммарно).
  • Бюджет одной попытки — около 8 секунд (на установку соединения и ответ).
  • Endpoint должен быть публично доступен — RouterAI не подключается к адресам внутри приватных сетей (защита от SSRF).

Шаг 4. Скачивание видео

Когда статус completed, скачайте готовое видео через content-эндпоинт. index — позиция ссылки в массиве unsigned_urls (по умолчанию 0):

curl "https://routerai.ru/api/v1/videos/Cq4gNzomlZDrNyy72GHC/content?index=0" \
  -H "Authorization: Bearer $ROUTERAI_API_KEY" \
  -o video.mp4

Эндпоинт отдаёт бинарный mp4. Если модель вернула несколько видео, в unsigned_urls будет несколько ссылок — скачайте каждую, меняя index (?index=1, ?index=2, …).

Устранение неполадок

Не приходит webhook?

  • Убедитесь, что callback_url — валидный HTTPS-адрес и публично доступен (приватные сети блокируются).
  • Endpoint должен отвечать 2xx; при ошибках/таймаутах RouterAI ретраит, но после исчерпания попыток перестаёт.
  • Webhook отправляется только при терминальном статусе (completed/failed/expired/cancelled).

Подпись не сходится?

  • Считайте HMAC по сырым байтам тела, без JSON.parse + пересериализации.
  • Секрет — это sha256_hex(api_key) именно того ключа, которым создавалась задача, а не сам ключ и не отдельный секрет.
  • Подписываемая строка — "<X-RouterAI-Timestamp>.<raw_body>" (timestamp, точка, тело).

Статус failed или expired?

  • Смотрите data.error (в webhook) или поле error в ответе поллинга.
  • expired означает, что срок хранения результата истёк — создайте задачу заново.