Документация

Veo: имя модели и поля запроса

Veo вызывается не через createTask, а своими двумя адресами — теми же, что у поставщика: код, написанный под его generate и record-info, работает со шлюзом сменой адреса и ключа.

POST https://api.gen202.com/api/v1/veo/generate
GET https://api.gen202.com/api/v1/veo/record-info?taskId=…

Первый вызов ставит задачу и сразу отвечает её номером, второй по этому номеру отдаёт состояние, а когда ролик готов — ссылку на файл. Ключ передаётся в обоих запросах заголовком Authorization: Bearer sk-… и выпускается в кабинете.

Уровни Veo

Уровень ставится в поле model; без него шлюз подставит veo/3-fast. Ролик, кадр и длительность у всех трёх задаются одинаково — разница в цене и качестве, цены на уровни — в каталоге.

Идентификатор Модель Страница на сайте
veo/3-lite Veo 3.1 Lite Открыть
veo/3-fast Veo 3.1 Fast Открыть
veo/3 Veo 3.1 Quality Открыть

Поля запроса

Поля лежат в корне тела запроса, а не внутри input. Обязателен один prompt: остальные шлюз подставит сам — теми значениями, что названы в столбце пояснения, и счёт посчитает по ним же.

ПолеТипОбяз.Допустимые значения
prompt текст обязательное не длиннее 20 000 символов · Описание ролика. Пустое — отказ 422 до обращения к поставщику.
imageUrls список ссылок опц. до 3 ссылок на изображение · Картинки на входе. Адрес проверяется теми же правилами, что у остальных моделей: схема, длина и запрет ходить внутрь чужой сети — отказ 422 до обращения к поставщику.
model значение из списка опц. veo/3, veo/3-fast, veo/3-lite · Уровень модели. Без него шлюз подставит veo/3-fast; написание поставщика (veo3_fast) принимается наравне с нашим.
generationType значение из списка опц. TEXT_2_VIDEO, FIRST_AND_LAST_FRAMES_2_VIDEO, REFERENCE_2_VIDEO · Что делать с картинками на входе: развернуть ролик вокруг одной, взять две как первый и последний кадр или до трёх как образцы. Сочетание с уровнем и длительностью проверяет поставщик.
aspect_ratio значение из списка опц. 16:9, 9:16, Auto · Форма кадра. Имя пишется через подчёркивание — так оно записано у поставщика. Не прислано — поле не уходит вовсе, кадр выбирает поставщик.
resolution значение из списка опц. 720p, 1080p, 4k · Разрешение ролика. Без него шлюз подставит 720p.
duration число из списка опц. 4, 6, 8 секунд · Длительность ролика в секундах — по ней считается цена. Без неё шлюз подставит 8.
enableTranslation да или нет опц. true или false · Флаг поставщика. Не прислан — шлюз его не отправляет.
watermark текст опц. не длиннее 20 000 символов · Водяной знак. Предела длины поставщик не называет — стоит наш общий потолок.
callBackUrl текст опц. полный адрес http или https · Адрес, на который шлюз постучится, когда ролик будет готов или отказан. Тело — то же, что отдаёт запрос состояния.

Значение вне списка шлюз отклоняет до обращения к поставщику ответом 422, и кредитов это не стоит. Поля, которых нет в таблице, он молча отбрасывает.

Как узнать готовность

Поля state у Veo нет: состояние приходит числом successFlag — 0 работает, 1 готово (ссылка на файл в response), 2 и 3 отказ, причина в errorMessage. Расчёт закрывается тем же запросом состояния: списание при готовности и возврат при отказе происходят в тот самый record-info, который увидел итог. Пока вы не спросили, кредиты остаются удержанными.

Счёт идёт за секунду видео и известен до запуска целиком — ровно эта сумма удерживается на время работы, и неудачный ролик не стоит ничего. Сочетание, которого нет в продаже (veo/3-lite в 4k), шлюз отклоняет ответом 422, а не считает по выдуманной.

Пример вызова

Показан весь путь: постановка задачи, ожидание с паузой в 3 секунды и ссылка на готовый ролик. Подставить остаётся только свой ключ.

veo.sh
# 1. Поставить задачу — в ответе её номер
TASK=$(curl -s https://api.gen202.com/api/v1/veo/generate \
  -H "Authorization: Bearer sk-ваш-ключ" \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "рыжий кот идёт по подоконнику, мягкий свет",
    "model": "veo/3-fast",
    "resolution": "720p",
    "duration": 8
  }' | jq -r '.data.taskId')

# 2. Спрашивать состояние, пока successFlag не перестанет быть 0
while true; do
  RECORD=$(curl -s "https://api.gen202.com/api/v1/veo/record-info?taskId=$TASK" \
    -H "Authorization: Bearer sk-ваш-ключ")
  FLAG=$(echo "$RECORD" | jq -r '.data.successFlag')
  [ "$FLAG" != "0" ] && break
  sleep 3
done

# 3. Забрать ссылку: 1 — готово, 2 и 3 — отказ
echo "$RECORD" | jq -r '.data.response.resultUrls[0] // .data.errorMessage'
veo.py
import time

import requests

headers = {"Authorization": "Bearer sk-ваш-ключ"}

# 1. Поставить задачу — в ответе её номер
created = requests.post(
    "https://api.gen202.com/api/v1/veo/generate",
    headers=headers,
    json={
        "prompt": "рыжий кот идёт по подоконнику, мягкий свет",
        "model": "veo/3-fast",
        "resolution": "720p",
        "duration": 8,
    },
).json()
task_id = created["data"]["taskId"]

# 2. Спрашивать состояние, пока successFlag не перестанет быть 0
while True:
    record = requests.get(
        "https://api.gen202.com/api/v1/veo/record-info",
        headers=headers,
        params={"taskId": task_id},
    ).json()["data"]
    if record["successFlag"] != 0:
        break
    time.sleep(3)

# 3. Забрать ссылку. Разбор здесь один: у Veo response — объект, а не строка
if record["successFlag"] != 1:
    raise SystemExit("отказ: " + str(record.get("errorMessage")))
print(record["response"]["resultUrls"][0])

Ответ, когда ролик готов

Конверт тот же, что у задач, а внутри — ответ поставщика как есть. Ссылка лежит объектом, а не строкой JSON внутри JSON: разбирать её вторым разбором, как resultJson обычных задач, не нужно.

record-info.json
{
  "code": 200,
  "msg": "success",
  "data": {
    "successFlag": 1,
    "response": { "resultUrls": ["https://file.example/result.mp4"] },
    "errorMessage": null
  }
}

Отказы

Тело отказа одно на все случаи: {"code":…,"msg":…,"data":null} — тот же конверт, что у задач. Ролик, не дошедший до результата, не тарифицируется: удержанные кредиты возвращаются целиком.

КодАдресКогда
401 /api/v1/veo/generate Ни ключа в заголовке Authorization, ни входа по сессии; либо ключ неверный или отключён.
402 /api/v1/veo/generate Свободных кредитов меньше, чем стоит запрошенный ролик. Цена Veo известна до вызова целиком, и удерживается ровно она.
422 /api/v1/veo/generate Пустой prompt; значение model, resolution или duration вне списка; ссылка в imageUrls не прошла проверку адреса; сочетание уровня и разрешения, которого нет в продаже. Сюда же попадает запрос по сессии, назвавший чужой или отключённый ключ учёта.
502 /api/v1/veo/generate Поставщик не ответил или ответил ошибкой. Задача не создаётся, удержание снимается целиком.
503 /api/v1/veo/generate Поставщик перегружен или отбил запрос по своему лимиту. Удержание снимается, повторить можно через несколько секунд — срок назван в заголовке Retry-After.
401 /api/v1/veo/record-info Ни ключа в заголовке Authorization, ни входа по сессии; либо ключ неверный или отключён.
404 /api/v1/veo/record-info Задачи с таким номером нет или она создана другим аккаунтом.
502 /api/v1/veo/record-info Состояние узнать не удалось: поставщик не ответил или ответил ошибкой. Списание при этом не производится: расчёт закрывается по состоянию задачи, а оно осталось неизвестным.
503 /api/v1/veo/record-info Поставщик перегружен. Повторить опрос можно через несколько секунд — срок назван в заголовке Retry-After; удержание остаётся на месте.

Подробнее: отказы — как устроен конверт отказа у остальных маршрутов; баланс и расход — как спросить списание по ключу.

Общее для всех моделей: Как устроена задача — чем отправить и как дождаться · Формат ответа — где в ответе ссылка на файл · Отказы — что означает отказ