KovAPIKovAPI
POST https://kovapi.com/v1/videos/generations

API видео MiniMax H3 Lite: ускоренная MiniMax H3 (меньше шагов сэмплирования), быстрее и дешевле. 480P / 768P, 4–15 секунд и 8 пропорций, родной звук всегда; видео из текста и до 5 референсных изображений (только референсы, не первый кадр). Асинхронные задачи с посекундной оплатой; неудачи не оплачиваются.

Попробовать в песочнице →

Быстрый старт

Три шага: отправить задачу, опросить её и забрать ссылку на видео. Замените YOUR_API_KEY своим ключом, и команды ниже заработают как есть.

Шаг 1 · Отправка (сразу возвращает id задачи, HTTP 202)

curl
curl https://kovapi.com/v1/videos/generations \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model": "minimax-h3-lite", "prompt": "Над чашкой кофе поднимается пар, за окном моросит дождь, камера медленно облетает стол", "duration": 5, "resolution": "768P", "size": "16:9"}'

Ответ (HTTP 202)

JSON
{
  "id": "img_5c2e8f1a9b3d7e6f0a4c8b2d",
  "object": "video.generation.job",
  "status": "queued",
  "created": 1791281400,
  "model": "minimax-h3-lite"
}

Шаг 2 · Опрашивайте каждые 5–10 секунд, пока status не станет succeeded или failed

curl
curl https://kovapi.com/v1/videos/jobs/img_5c2e8f1a9b3d7e6f0a4c8b2d \
  -H "Authorization: Bearer YOUR_API_KEY"

Ответ при успехе

JSON
{
  "id": "img_5c2e8f1a9b3d7e6f0a4c8b2d",
  "object": "video.generation.job",
  "status": "succeeded",
  "created": 1791281400,
  "model": "minimax-h3-lite",
  "data": [
    {"url": "https://img.kovapi.com/i/8c1f0e5d2b7a49e3a6d0c4f1b9e2a7d5.mp4"}
  ],
  "usage": {"clips": 1, "model": "minimax-h3-lite"}
}

Шаг 3 · data[0].url — это ролик (MP4). Он хранится 7 дней; чтобы пользоваться им дольше, скачайте его в своё хранилище.

Полный пример (Python: отправить, дождаться, сохранить на диск)

Python
import time
import requests

BASE = "https://kovapi.com/v1"
HEADERS = {"Authorization": "Bearer YOUR_API_KEY"}

# 1. отправка
job = requests.post(f"{BASE}/videos/generations", headers=HEADERS, json={
    "model": "minimax-h3-lite",
    "prompt": "Над чашкой кофе поднимается пар, за окном моросит дождь, камера медленно облетает стол",
    "duration": 5,
    "resolution": "768P",
    "size": "16:9",
}).json()
if "error" in job:
    raise SystemExit(job["error"]["message"])

# 2. опрос каждые 10 секунд, не дольше часа
deadline = time.time() + 3600
while job["status"] not in ("succeeded", "failed") and time.time() < deadline:
    time.sleep(10)
    job = requests.get(f"{BASE}/videos/jobs/{job['id']}", headers=HEADERS).json()

# 3. скачивание видео
if job["status"] == "succeeded":
    url = job["data"][0]["url"]
    with open("minimax-h3-lite.mp4", "wb") as f:
        f.write(requests.get(url).content)
    print("saved", url)
elif job["status"] == "failed":
    print("failed:", job["error"]["code"], job["error"]["message"])
else:
    print("still", job["status"], job["id"])

Пока задача в очереди, опрос также возвращает queue_position (сколько задач впереди вашей) и eta_seconds (ожидаемое время ожидания). Если ваш лимит ожидания истёк, не отправляйте задачу заново: она никуда не делась, продолжайте опрашивать тот же id позже.

Аутентификация

Header
Authorization: Bearer YOUR_API_KEY
Content-Type: application/json

Чтобы начать, создайте API-ключ в консоли.

Основные характеристики

Длительность4–15 с
Разрешение480P / 768P
Пропорции16:9 / 9:16 / 1:1 / 4:3 / 3:4 / 3:2 / 2:3 / 21:9
Референсные изображениядо 5 · все как референсы, не первый кадр
Референсные видеоне поддерживается
Референсное аудионе поддерживается
Звуквсегда включён; отключить нельзя (audio: false отклоняется)
Длина промптадо 5 000 символов (все языки считаются одинаково)
Оплатапосекундно: цена за секунду × число заказанных секунд

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

JSON-тело запроса POST /v1/videos/generations:

ПараметрТипОбязательныйОписание
modelstringДаID модели: minimax-h3-lite.
promptstringДаОписание того, что происходит в ролике: картинка, работа камеры и движение. До 5 000 символов (все языки считаются одинаково).
durationintegerНетДлительность в секундах: целое число от 4 до 15; по умолчанию 5. Можно также передавать как seconds.
resolutionstringНетРазрешение: 480P / 768P; по умолчанию 768P. Указывайте вместе с буквой P (720 без неё отклоняется).
sizestringНетПропорция: 16:9 / 9:16 / 1:1 / 4:3 / 3:4 / 3:2 / 2:3 / 21:9; по умолчанию 16:9. Можно также передавать как aspect_ratio.
imagesarrayНетРеференсные изображения, до 5: люди или обстановка с них появляются в ролике, но не как первый кадр. Одно изображение можно передать в image. image_role: first_frame отклоняется (для первого кадра используйте minimax-h3).
audiobooleanНетКаждый ролик выходит со звуком, отключить его нельзя; false отклоняется (400), поэтому не передавайте этот параметр.
callback_urlstringНетКуда отправить результат, когда задача завершится; подробнее — в разделе о вебхуках ниже.
nintegerНетКаждая задача создаёт один ролик; передавать параметр не нужно. При значении больше 1 всё равно создаётся один ролик, но при отправке резервируется стоимость n роликов, а лишнее возвращается после завершения задачи.

Другие поля (seed, negative_prompt, fps, watermark и т. п.) дальше не передаются и не влияют на цену; результат всегда в MP4 и возвращается в виде url.

Цена

Оплата посекундно: стоимость = цена секунды для выбранного разрешения × заказанное число секунд. Эта сумма резервируется при отправке, при успехе списывается без изменений, а при ошибке возвращается полностью. 1 кредит = $0.005.

РазрешениеКредитов за секундуUSD за секундуРолик 5 с
480P1$0.005$0.025
768P2.5$0.0125$0.0625

Референсные материалы

  • Все изображения — референсы (до 5): люди или обстановка с них появляются в любом месте ролика; первым кадром они не становятся, image_role: first_frame отклоняется.
  • Референсные аудио и видео не поддерживаются; для них используйте режим референсов minimax-h3. У каждого ролика есть звук.
  • Референсные изображения: JPG / PNG / WEBP (без GIF), до 16 МБ каждое; каждое должно быть 256–5760 px по каждой стороне с соотношением сторон 0,4–2,5. Неподходящее отклоняется с 400 при отправке (reference_image_dimensions для размера) и не оплачивается.
  • Каждое изображение — публичная ссылка на изображение, data: URI или base64, не более 16 MB; несколько изображений передавайте массивом в images. При отправке мы сначала сохраняем изображения у себя, и только потом задача встаёт в очередь; изображение, которое не удаётся прочитать, отклоняется с ошибкой 400, в message указано, какое именно, и ничего не списывается.
  • Референсные материалы, которые мы размещаем у себя, и готовые ролики хранятся 7 дней.

Референсные изображения: люди с них — в ролике

curl
curl https://kovapi.com/v1/videos/generations \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model": "minimax-h3-lite", "prompt": "Девушка с референсного изображения входит на ночную дождливую улицу и с улыбкой оглядывается", "images": ["https://example.com/girl.png"], "duration": 5, "resolution": "768P", "size": "9:16"}'

Изображения — референсы: люди и обстановка с них появляются в ролике, но первым кадром они не становятся. Для первого кадра или первого + последнего используйте minimax-h3.

Статус задачи и поля ответа

GET /v1/videos/jobs/{id} возвращает эти статусы; все поля описаны в разделе Асинхронные задачи. Опрашивайте каждые 5–10 секунд или получайте результат вебхуком (см. ниже). Опрос бесплатный, и прочитать задачу может любой ключ того же аккаунта.

СтатусЧто значит
queuedВ очереди. В ответе есть queue_position (сколько задач впереди) и eta_seconds (ожидаемое время ожидания).
processingГенерируется.
succeededГотово. Результат в data[0].url, детали оплаты в usage.
failedОшибка. Причина в error; зарезервированные кредиты возвращаются полностью.
  • processing может снова смениться на queued: например, при высокой нагрузке, пока готовый ролик скачивается повторно или после перезапуска сервиса. Если задачу не удалось выполнить, шлюз может автоматически запустить рендер заново; сколько бы ни было повторов, задача оплачивается один раз.
  • Один аккаунт выполняет до 50 задач одновременно; остальные ждут в порядке отправки, а задача, не начавшаяся за 15 минут, завершается ошибкой с полным возвратом. Записи о задачах хранятся 3 дня, ссылки на видео — 7 дней.

Сколько ждать

Обычно 2–3 минуты; длинные ролики и часы пик — дольше.

Ошибки и возвраты

Ошибка при отправке сразу возвращается как HTTP 4xx / 5xx: задача не создаётся, ничего не списывается. О неудаче после того, как задача принята, сообщает эндпоинт задачи, а резерв возвращается полностью. Все коды перечислены в разделе Коды ошибок.

Ошибки при отправке

HTTPcodeПричинаЧто делать
400invalid_requestНедопустимый параметр: длительность, разрешение, пропорция или число референсов выходят за пределы, допустимые для этой модели; промпт слишком длинный; не удаётся прочитать референсное изображение или видео; передан audio: false модели, ролики которой всегда со звуком, и т. п. Что именно не так, указано в message.Исправьте то, что указано в message, и отправьте снова.
400invalid_callback_urlcallback_url — не публичный адрес http(s) или длиннее 2000 символов.Укажите адрес, доступный из интернета.
400model_not_foundID модели написан с ошибкой, model не передан или модель нельзя использовать на этом эндпоинте (например, чат-модель на эндпоинте изображений).Берите ID модели из GET /v1/models или из справочника API.
401invalid_api_keyКлюч не существует, удалён или отключён, либо отключён аккаунт.Проверьте ключ на странице API Keys в консоли.
402insufficient_quotaБаланса не хватает, чтобы зарезервировать стоимость этого запроса. Шлюз сначала резервирует максимально возможную стоимость запроса, поэтому ошибка может возникнуть и при всплеске одновременных вызовов.Если был всплеск запросов, подождите несколько секунд и повторите; в остальных случаях пополните баланс.
429rate_limit_exceededПревышен лимит запросов в минуту, заданный для этого ключа (считается за последние 60 секунд). Заголовка Retry-After нет.Подождите несколько секунд и повторите или увеличьте лимит ключа в консоли.
503model_maintenanceМодель на обслуживании и не принимает запросы; пока идёт обслуживание, другая модель вместо неё не ответит.Повторите, когда обслуживание закончится; ход работ — на странице статуса.
503service_unavailableВременный сбой на нашей стороне, например при сохранении референсного файла. Задача не создана, ничего не списано.Повторите чуть позже.

Неудачные задачи (status — failed)

codeКогда возникаетЧто делать
upstream_errorНа этот раз ролик не получился: контент не прошёл проверку, сервис был перегружен, задача ждала 15 минут и так и не запустилась и т. п.; причина указана в message.Обычно повторная отправка проходит успешно.

Ориентируйтесь на code, а не на текст message. Любой незнакомый code (или его отсутствие) обрабатывайте как upstream_error: повторная отправка обычно проходит успешно. За каждую неудачную задачу деньги возвращаются полностью.

Вебхуки вместо опроса

Добавьте при отправке callback_url — как только задача завершится, успешно или с ошибкой, шлюз отправит на этот URL ровно то же, что возвращает эндпоинт опроса; запрос подписан, а при неудачной доставке повторяется. Общий адрес для всего аккаунта можно также задать в консоли, в разделе «Настройки → Вебхуки». Документация по вебхукам →

curl · callback_url
curl https://kovapi.com/v1/videos/generations \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model": "minimax-h3-lite", "prompt": "Над чашкой кофе поднимается пар, за окном моросит дождь, камера медленно облетает стол", "duration": 5, "resolution": "768P", "size": "16:9", "callback_url": "https://your-domain.com/webhook"}'