Перейти к основному контенту

Решение: видео-API

Из запроса или одного кадра — готовое видео.

Видео — самый дорогой результат в большинстве продуктов и самый долгий. Обе величины задают три поля в теле запроса, а задача продолжает работать задолго после того, как исчезло соединение, которое её начало.

Задача

Чем видео отличается от любой другой задачи

Видеозапрос — это не медленный запрос картинки. Длительность, разрешение и переключатель звука определяют, сколько вы заплатите и сколько подождёте, и определяют это до того, как появится первый кадр.

01

Длительность и разрешение — это регуляторы цены, а не значения по умолчанию

Большинство видеоэндпоинтов тарифицируются за секунду результата в выбранном разрешении. Перевод duration_seconds с 5 на 10 примерно удваивает сумму, шаг по разрешению удваивает её ещё раз. Оба поля помечены в схеме как влияющие на цену, поэтому оценка должна стоять рядом с элементом управления, а не появляться в счёте.

02

Сгенерированный звук — это другой тариф

Там, где есть generate_audio, этот флаг переводит запрос на другой тариф. Форма, которая его прячет, будет молча отправлять более дорогой вариант каждый раз.

03

HTTP-ответ — это не видео

createTask отвечает 202 Accepted и возвращает taskId в состоянии queued. Генерация продолжается на сервере минутами. Любой код, ждущий на исходном сокете, упрётся в таймаут, пока задача и списание идут своим чередом.

Подход

Сначала зафиксируйте цену, потом отправьте ровно один раз

Запросите оценку точного тела через POST /api/v1/jobs/quote, покажите сумму и отправьте то же тело в createTask вместе с quoteId, expectedCost и сохранённым Idempotency-Key. Цена, изменившаяся между двумя вызовами, вернёт бизнес-код 40901 вместо сюрприза в счёте.

Один вызов создания несёт модель, проверенный ввод и необязательный обратный вызов. HTTP 202 означает «принято», а не «готово».

POST /api/v1/jobs/createTask

POST /api/v1/jobs/createTask
Authorization: Bearer $SPICY_API_KEY
Idempotency-Key: 7b1f0c2e-9a4d-4f31-8c67-2b5e0d9a1c44
Content-Type: application/json
{
  "model": "<publisher>/<model>/text-to-video",
  "input": {
    "prompt": "A slow aerial drift over a misty pine forest at sunrise",
    "duration_seconds": 5,
    "resolution": "1080p",
    "generate_audio": true
  },
  "callBackUrl": "https://example.com/hooks/spicyapi"
}

202 Accepted

HTTP/1.1 202 Accepted
Location: /api/v1/jobs/recordInfo?taskId=job_01k3m8x9q2z4v7n5p6r8s0t1w3

{
  "code": 200,
  "msg": "success",
  "request_id": "req_example_create",
  "data": {
    "taskId": "job_01k3m8x9q2z4v7n5p6r8s0t1w3",
    "state": "queued",
    "estimatedCost": "0.750000"
  }
}

Контракт

Что стоит зафиксировать сразу

API генерации видео: сравнить и подключить — Что стоит зафиксировать сразу
Поле или заголовокЗначение или предел
POST /api/v1/jobs/createTask202 Accepted · state queued
duration_seconds · resolution · generate_audioprice-affecting fields
Idempotency-Key24 h · scoped to one API key
output.assets[].expiresAtsigned URL · results kept 14 days

Проведите по горизонтали, чтобы увидеть все столбцы.

Интеграция

От первого вызова до продакшена

  1. 01Выберите эндпоинт на странице модели и скопируйте значение model как есть; суффикс задачи — его часть.
  2. 02Оцените тело, которое собираетесь отправить, и покажите estimatedCost, quantity и unit рядом с кнопкой отправки.
  3. 03Отправьте с бэкенда с Idempotency-Key, сохраните data.taskId в своей записи и сразу ответьте клиенту.
  4. 04Завершайте по подписанному обратному вызову, держите recordInfo с экспоненциальной паузой как резерв и скачайте файл до истечения ссылки.

Применимость

Когда этот путь подходит

Выбирайте, если

  • Нужны готовые видеофайлы — реклама, трейлеры, петли, короткие ролики — и минуты ожидания на клип приемлемы.
  • Длительность, разрешение и звук выбирает пользователь, и каждая комбинация должна получить цену до подтверждения.

Ищите другое, если

  • Ответ нужен в пределах одного запроса. Текстовые модели отдают поток, видео — нет.
  • Вы рассчитываете отменить задачу на середине. Принятая задача доходит до конечного состояния, назад возвращается только неиспользованный резерв.

Проверки

Что вы можете проверить сами

Каждое поле берётся из опубликованной схемы

Форма на странице модели строится из input_schema этого эндпоинта, и сервер проверяет по тому же документу. Необъявленное поле даёт 400, а не молчаливое отбрасывание.

Оценка — это потолок, а не догадка

createTask резервирует оценочную сумму и возвращает её в cost с settled: false. Итоговое списание никогда не превышает резерв, а при ошибке или истечении срока резерв освобождается полностью.

У каждого ключа свой потолок расходов

Задайте ключу лимит на день, на месяц и за всё время, ограничьте его набором моделей и списком IP, а каждую запись отправляйте с одним и тем же ключом идемпотентности.

Перед запуском

Поведение платформы, которое стоит подтвердить

  • Убедитесь, что эндпоинт доступен сегодня: доступность публикуется по эндпоинтам, а не по семействам.
  • Храните taskId и Idempotency-Key вместе и вне сессии браузера.
  • Проверяйте подпись обратного вызова до чтения тела и считайте доставки повторяемыми.
  • Копируйте готовые файлы в собственное хранилище: результаты хранятся 14 дней.

Частые вопросы

О чём спрашивают на этой странице

Зависит от эндпоинта, запрошенной длительности и текущей очереди — поэтому API асинхронный. Считайте 202 концом своего запроса, а обратный вызов или ограниченный опрос — концом задачи. Синхронного видеоэндпоинта нет.