Генерация видео
Видео генерируется асинхронно: запрос создаёт задачу, вы опрашиваете её статус и, когда ролик готов, скачиваете его. Модели видео тарифицируются за секунду ролика или за ролик целиком.
Создание задачи
POST/api/v1/videos. Обязательные поля — model и prompt. Необязательные:
duration— длительность в секундах, целое от 1 до 60;resolution—360p,480p,720p,768p,1080p,1K,2Kили4K;aspect_ratio— соотношение сторон;size— точный размерШИРИНАxВЫСОТА, не больше5040x2160;generate_audio—trueилиfalse, нужен ли звук;seed— целое, для повторяемого результата;frame_images— первый или последний кадр: частиimage_urlсframe_typefirst_frameилиlast_frame;input_references— образцы: частиimage_url,video_urlилиaudio_url;upscale_factor(до 4) иcreativity(целое) — для моделей, которые увеличивают видео.
Какие значения подходят модели, видно в её parameters (список моделей). previous_job_id и callback_url не поддерживаются — 422, другие поля модели не передаются.
curl https://infergate.ru/api/v1/videos \
-H "Authorization: Bearer $INFERGATE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "google/veo-3.1",
"prompt": "A cat surfing a wave at sunset",
"duration": 8
}'В ответ придёт 202 Accepted с id задачи и адресом для опроса polling_url:
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"polling_url": "https://infergate.ru/api/v1/videos/3fa85f64-5717-4562-b3fc-2c963f66afa6",
"status": "pending"
}Резерв и оплата
Пока ролик генерируется, на балансе резервируется сумма с запасом — по цене модели и по самому дорогому варианту, который допускает запрос. Чего вы не указали, считается по максимуму: без duration — по самой большой длительности модели, без resolution или с size — по самому дорогому разрешению, без generate_audio: false — по цене со звуком. Видео и аудио во входных данных тоже увеличивают резерв.
Чтобы резерв был меньше, указывайте duration, resolution и, если звук не нужен, generate_audio: false (если во входных данных есть видео или аудио, duration резерв не уменьшает). Когда задача завершится, списывается фактическая стоимость, а остаток резерва возвращается. Если задача не удалась, резерв возвращается полностью.
Статус задачи
GET/api/v1/videos/{id} возвращает состояние задачи. Опрашивать её может только ключ, которым она создана.
pending,processing— генерация идёт, повторите запрос через несколько секунд;completed— ролик готов, ссылка на скачивание — вunsigned_urls;failed,cancelled,expired— задача завершилась без результата, причина — вerror, деньги не списываются.
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"status": "completed",
"unsigned_urls": ["https://infergate.ru/api/v1/videos/3fa85f64-5717-4562-b3fc-2c963f66afa6/content?index=0"]
}Стоимость списывается один раз — при первом опросе, который увидел completed; повторные опросы ничего не стоят. Если в таком ответе есть usage, в нём указана стоимость задачи; итог в любом случае виден в журнале запросов.
Скачивание
GET/api/v1/videos/{id}/content отдаёт готовый ролик в MP4. Если файлов несколько, нужный выбирается параметром index (по умолчанию 0). Скачать ролик может только ключ, которым создана задача.
curl -o video.mp4 "https://infergate.ru/api/v1/videos/3fa85f64-5717-4562-b3fc-2c963f66afa6/content?index=0" \
-H "Authorization: Bearer $INFERGATE_API_KEY"Модели видео
GET/api/v1/videos/models — модели, которые принимает POST/api/v1/videos, с supported_parameters (duration, resolution, aspect_ratio и другие). Цена за единицу, например за секунду, — в media_price. Это ориентир для оценки, а списывается фактическая стоимость задачи.
curl https://infergate.ru/api/v1/videos/models \
-H "Authorization: Bearer $INFERGATE_API_KEY"В parameters — допустимые значения полей запроса:
duration(секунды),resolution,aspect_ratio,sizeиframe_images(какие кадры модель принимает) — списки{"type": "enum", "values": [...]};generate_audioиseed—{"type": "boolean"}, если модель их поддерживает;upscale_factorу моделей, которые увеличивают видео, — диапазон{"type": "range", "min": …, "max": …}.
Если значения для модели неизвестны, поля parameters нет. Например:
"id": "google/veo-3.1",
"parameters": {
"duration": { "type": "enum", "values": [4, 6, 8] },
"resolution": { "type": "enum", "values": ["720p", "1080p", "4K"] },
"aspect_ratio": { "type": "enum", "values": ["16:9", "9:16"] },
"size": { "type": "enum", "values": ["1280x720", "1080x1920", "1920x1080", "720x1280", "3840x2160", "2160x3840"] },
"frame_images": { "type": "enum", "values": ["first_frame", "last_frame"] },
"generate_audio": { "type": "boolean" },
"seed": { "type": "boolean" }
}