Генерация видео
Генерация видео через AI-модели. API предоставляет асинхронный интерфейс для создания видео из текстовых описаний (text-to-video) и референсных изображений (image-to-video / reference-to-video).
Базовый URL: https://api.ru-openrouter.ru/v1/
Обзор
Генерация видео — асинхронный процесс. В отличие от чата или генерации изображений, создание видео может занимать от 30 секунд до нескольких минут.
Типовой workflow:
- Создание задачи —
POST /v1/videos - Проверка статуса —
GET /v1/videos?job_id={jobId} - Скачивание результата —
GET /v1/videos/content?job_id={jobId}
Модели для генерации видео
GET /v1/videos/models
Список моделей, доступных для генерации видео, с указанием поддерживаемых разрешений, соотношений сторон и цен.
curl "https://api.ru-openrouter.ru/v1/videos/models" \
-H "Authorization: Bearer sk_ваш_api_ключ"
Ответ:
{
"object": "list",
"data": [
{
"id": "google/veo-3.1",
"object": "model",
"created": 1719792000,
"owned_by": "google",
"capabilities": {
"can_generate_video": true,
"can_generate_audio": true,
"output_modalities": ["video"]
},
"supported_resolutions": ["720p", "1080p"],
"supported_aspect_ratios": ["16:9", "9:16", "1:1"],
"supported_sizes": ["1280x720", "1920x1080"],
"pricing": {
"prompt": "0.500000000",
"completion": "0.000000000",
"unit": "sec",
"currency": "RUB"
}
}
]
}
| Поле | Тип | Описание |
|---|---|---|
id |
string | ID модели (используется в запросах генерации) |
capabilities.can_generate_video |
boolean | Поддержка генерации видео (всегда true) |
capabilities.can_generate_audio |
boolean | Может генерировать аудио-дорожку |
supported_resolutions |
string[] | Поддерживаемые разрешения: 480p, 720p, 1080p, 1K, 2K, 4K |
supported_aspect_ratios |
string[] | Поддерживаемые соотношения сторон |
supported_sizes |
string[] | Поддерживаемые размеры в пикселях (WIDTHxHEIGHT) |
pricing.unit |
string | Единица тарификации: sec (за секунду) или token |
pricing.currency |
string | Валюта ценообразования (RUB) |
GET /v1/models?filter=video
Альтернативный способ получения списка видео-моделей через общий эндпоинт:
curl "https://api.ru-openrouter.ru/v1/models?filter=video" \
-H "Authorization: Bearer sk_ваш_api_ключ"
Поддерживаемые разрешения
480p— 640×480720p— 1280×7201080p— 1920×10801K— 1024×1024 (или пропорционально)2K— 2560×14404K— 3840×2160
Поддерживаемые соотношения сторон
16:9— широкоформатный ландшафт9:16— вертикальный/портретный1:1— квадратный4:3— стандартный ландшафт3:4— стандартный портретный3:2— фотографический ландшафт2:3— фотографический портретный21:9— ультраширокий9:21— ультравысокий
Генерация видео
POST /v1/videos
Создание задачи генерации видео. Возвращает job_id и polling_url для отслеживания статуса.
Параметры запроса
| Поле | Тип | Обязательный | Описание |
|---|---|---|---|
model |
string | Да | ID модели (например, google/veo-3.1) |
prompt |
string | Да | Текстовое описание желаемого видео |
duration |
integer | Нет | Длительность видео в секундах |
resolution |
string | Нет | Разрешение: 720p, 1080p и др. |
aspect_ratio |
string | Нет | Соотношение сторон: 16:9, 9:16, 1:1 и др. |
size |
string | Нет | Точный размер в формате WIDTHxHEIGHT (например, 1280x720). Альтернатива resolution + aspect_ratio |
frame_images |
array | Нет | Изображения для первого/последнего кадра (image-to-video) |
input_references |
array | Нет | Референсные изображения для стиля (reference-to-video) |
generate_audio |
boolean | Нет | Генерировать аудио-дорожку. По умолчанию true для моделей с поддержкой аудио |
seed |
integer | Нет | Seed для детерминированной генерации (не гарантируется всеми провайдерами) |
provider |
object | Нет | Провайдер-специфичные настройки |
Пример: Text-to-Video
curl -X POST "https://api.ru-openrouter.ru/v1/videos" \
-H "Authorization: Bearer sk_ваш_api_ключ" \
-H "Content-Type: application/json" \
-d '{
"model": "google/veo-3.1",
"prompt": "Золотистый ретривер играет в мяч на солнечном пляже с волнами на заднем плане",
"duration": 5,
"resolution": "720p",
"aspect_ratio": "16:9"
}'
Ответ (202 Accepted):
{
"id": "vid_abc123...",
"generation_id": "vid_xyz789...",
"polling_url": "https://api.ru-openrouter.ru/v1/videos/vid_abc123...",
"status": "pending"
}
Использование изображений
Доступно два способа использования изображений, каждый активирует свой режим генерации:
Image-to-Video (frame_images): указывает первый или последний кадр видео.
{
"model": "alibaba/wan-2.7",
"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": "alibaba/wan-2.7",
"prompt": "Колоссальная солнечная вспышка рядом с планетой",
"input_references": [
{
"type": "image_url",
"image_url": {
"url": "https://example.com/style-ref.png"
}
}
],
"resolution": "1080p"
}
Если переданы оба поля, frame_images имеет приоритет, и запрос обрабатывается как image-to-video.
Провайдер-специфичные параметры
Параметры провайдера передаются через поле provider.options:
{
"model": "google/veo-3.1",
"prompt": "Таймлапс цветущего цветка",
"provider": {
"options": {
"google-vertex": {
"parameters": {
"personGeneration": "allow",
"negativePrompt": "blurry, low quality"
}
}
}
}
}
Дополнительные параметры, не входящие в стандартный список, можно передавать на верхнем уровне — они будут направлены провайдеру напрямую.
Проверка статуса
GET /v1/videos
Получение статуса задачи генерации видео.
Параметры:
| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
job_id |
string | Да | ID задачи, полученный при создании |
curl "https://api.ru-openrouter.ru/v1/videos?job_id=vid_abc123..." \
-H "Authorization: Bearer sk_ваш_api_ключ"
Ответ (в процессе):
{
"id": "vid_abc123...",
"generation_id": "gen-xyz789...",
"polling_url": "https://api.ru-openrouter.ru/v1/videos/vid_abc123...",
"status": "in_progress",
"model_name": "google/veo-3.1",
"created_at": "2026-04-24 12:00:00",
"updated_at": "2026-04-24 12:00:30"
}
Ответ (завершено):
{
"id": "vid_abc123...",
"generation_id": "gen-xyz789...",
"polling_url": "https://api.ru-openrouter.ru/v1/videos/vid_abc123...",
"status": "completed",
"model_name": "google/veo-3.1",
"download_url": "https://api.ru-openrouter.ru/v1/videos/content?job_id=vid_abc123...",
"usage": {
"cost": 16.50,
"is_byok": false
},
"created_at": "2026-04-24 12:00:00",
"updated_at": "2026-04-24 12:01:30"
}
Ответ (ошибка):
{
"id": "vid_abc123...",
"status": "failed",
"error": "Content policy violation",
"created_at": "2026-04-24 12:00:00",
"updated_at": "2026-04-24 12:00:35"
}
Статусы задачи
| Статус | Описание |
|---|---|
pending |
Задача создана и ожидает обработки |
in_progress |
Видео генерируется |
completed |
Видео готово к скачиванию |
failed |
Ошибка генерации (проверьте поле error) |
Скачивание видео
GET /v1/videos/content
Скачивание сгенерированного видео.
Параметры:
| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
job_id |
string | Да | ID завершённой задачи |
index |
integer | Нет | Индекс видео (по умолчанию 0). Используется, если модель сгенерировала несколько вариантов |
curl "https://api.ru-openrouter.ru/v1/videos/content?job_id=vid_abc123..." \
-H "Authorization: Bearer sk_ваш_api_ключ" \
--output video.mp4
Ответ возвращается в формате video/mp4.
История видео
GET /v1/videos/history
Получение списка завершённых и активных задач пользователя.
Параметры:
| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
limit |
integer | 20 |
Количество записей (макс. 100) |
offset |
integer | 0 |
Смещение для пагинации |
curl "https://api.ru-openrouter.ru/v1/videos/history?limit=10" \
-H "Authorization: Bearer sk_ваш_api_ключ"
Ответ:
{
"videos": [
{
"job_id": "vid_abc123...",
"prompt": "Золотистый ретривер играет в мяч...",
"duration": 5,
"resolution": "720p",
"aspect_ratio": "16:9",
"status": "completed",
"model_name": "google/veo-3.1",
"download_url": "/api/v1/videos/content?job_id=vid_abc123...",
"actual_cost_rub": 16.50,
"created_at": "2026-04-24 12:00:00",
"completed_at": "2026-04-24 12:01:30"
}
],
"total": 1
}
Примеры на языках программирования
Python
import requests
import time
import json
API_KEY = "sk_ваш_api_ключ"
BASE_URL = "https://api.ru-openrouter.ru/v1"
headers = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json"
}
# Шаг 1: Создание задачи
payload = {
"model": "google/veo-3.1",
"prompt": "A golden retriever playing fetch on a sunny beach",
"duration": 5,
"resolution": "720p"
}
response = requests.post(f"{BASE_URL}/videos", headers=headers, json=payload)
result = response.json()
job_id = result["id"]
print(f"Job created: {job_id}, status: {result['status']}")
# Шаг 2: Ожидание и проверка статуса
while True:
time.sleep(15)
poll = requests.get(f"{BASE_URL}/videos?job_id={job_id}", headers=headers)
status = poll.json()
print(f"Status: {status['status']}")
if status["status"] == "completed":
# Шаг 3: Скачивание
download = requests.get(
f"{BASE_URL}/videos/content?job_id={job_id}",
headers=headers
)
with open("output.mp4", "wb") as f:
f.write(download.content)
print("Video saved to output.mp4")
break
elif status["status"] == "failed":
print(f"Failed: {status.get('error', 'Unknown error')}")
break
JavaScript
const API_KEY = 'sk_ваш_api_ключ';
const BASE_URL = 'https://api.ru-openrouter.ru/v1';
const headers = {
Authorization: `Bearer ${API_KEY}`,
'Content-Type': 'application/json',
};
// Шаг 1: Создание задачи
const payload = {
model: 'google/veo-3.1',
prompt: 'A golden retriever playing fetch on a sunny beach',
duration: 5,
resolution: '720p',
};
const createRes = await fetch(`${BASE_URL}/videos`, {
method: 'POST',
headers,
body: JSON.stringify(payload),
});
const { id: jobId } = await createRes.json();
console.log(`Job created: ${jobId}`);
// Шаг 2: Ожидание и проверка статуса
while (true) {
await new Promise((r) => setTimeout(r, 15000));
const pollRes = await fetch(`${BASE_URL}/videos?job_id=${jobId}`, { headers });
const status = await pollRes.json();
console.log(`Status: ${status.status}`);
if (status.status === 'completed') {
const downloadRes = await fetch(`${BASE_URL}/videos/content?job_id=${jobId}`, { headers });
const blob = await downloadRes.blob();
// Сохраните blob как файл
console.log('Video ready');
break;
} else if (status.status === 'failed') {
console.error(`Failed: ${status.error}`);
break;
}
}
Рекомендации
- Детальные промпты: описывайте движение, ракурс камеры, освещение и композицию сцены для лучшего результата
- Выбор разрешения: более высокое разрешение увеличивает время генерации и стоимость. Выбирайте разрешение, соответствующее задаче
- Интервал опроса: используйте паузу 15–30 секунд между проверками статуса, чтобы избежать избыточных запросов
- Обработка ошибок: всегда проверяйте статус
failedи анализируйте полеerror - Референсные изображения: при использовании
input_referencesилиframe_imagesубедитесь, что изображения доступны по URL и имеют поддерживаемый формат
Хранение видео
Сгенерированные видео хранятся в течение ограниченного срока. По истечении срока видео автоматически удаляются. Рекомендуется скачивать готовые видео сразу после получения статуса completed.