Тема
Язык

Генерация медиа

POST /api/media/generate — асинхронная генерация изображений, видео, TTS, музыки и 3D. Параметры model, prompt, opts. Опрос через GET /api/media/jobs/{id}.

Асинхронная генерация медиа: изображения, видео, озвучка (TTS), распознавание речи, музыка и 3D. Вы создаёте задачу и опрашиваете результат. Полный список моделей — в каталоге media-models; вебхуки, ошибки и биллинг описаны в разделе о вебхуках.

POSThttps://getvibeapi.com/api/media/generate
GEThttps://getvibeapi.com/api/media/jobs/{id}

Параметры создания

ПараметрТипОписание
modelreq.stringНазвание медиамодели, например veo-3.1 или gpt-image-2 (см. каталог).
promptreq.stringТекстовое описание.
optsobjectДополнительные параметры генерации (зависят от модели): разрешение, длительность и так далее.

Создание и опрос

Создание возвращает 202 с { ok: true, jobId, status: "processing" }. Опрашивайте GET /api/media/jobs/{jobId} до status: "success", затем возьмите resultUrls.

# 1. create a generation job
curl https://getvibeapi.com/api/media/generate \
  -H "Authorization: Bearer $GETVIBE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "veo-3.1",
    "prompt": "a cat on a skateboard, slow motion"
  }'
# → {"ok":true,"jobId":"...","status":"processing"}
Оплата зависит от фактического объёма генерации (разрешение, длительность). Если модель недоступна или запрос отклонён, ответ приходит с ok: false и без списания. Цены на сайте носят справочный характер; точная сумма списания возвращается в заголовке x-pv-cost-rub каждого принятого ответа. Тела стримов по умолчанию не меняются; отправьте x-pv-cost: 1, чтобы добавить стоимость в финальное событие usage этого протокола.

Дополнительные параметры (opts)

Помимо model и prompt, дополнительные параметры можно передать в opts. Их набор зависит от модели. Полный машиночитаемый контракт доступен через GET /api/model-capabilities (или GET /api/model-capabilities/{model} для конкретной модели).

Часто используемые дополнительные параметры
ПараметрТипОписание
aspect_ratiostringAspect ratio: 1:1, 16:9, 9:16, 4:3, 3:4.
durationstring|numberДлительность видео в секундах (5, 10, 15).
resolutionstringResolution: 480p, 720p, 1080p, 4K.
image_urlstring (URL)Исходное изображение для I2V / преобразования изображения в изображение.
negative_promptstringЧто исключить из генерации (qwen-image, wan-2-7).
guidancenumberGuidance scale — соответствие промпту (flux-2, qwen-image, seedance).
seednumberSeed для воспроизводимого результата (flux-2).
stabilitynumberСтабильность 0–1 (hailuo, happyhorse, seedance, TTS).
camerastringДвижение камеры, например "pan left" (kling-3.0, hailuo).
first_frame_urlstring (URL)First frame for I2V (kling-3.0, wan-2-7).
last_frame_urlstring (URL)Последний кадр для I2V (seedance, kling-3.0, wan-2-7).
reference_imagestring (URL)Референс стиля/персонажа (happyhorse).
similarity_boostnumberСхожесть голоса 0–1 (ElevenLabs TTS).
speednumberСкорость речи 0.5–2 (ElevenLabs TTS).
Все параметры необязательны, если не указано иное. Неизвестные параметры игнорируются. Полный список с типами, диапазонами и примерами приведён в ответе GET /api/model-capabilities/{model}.

Ваши собственные файлы: base64 вместо ссылки

Параметры URL (image_url, input_urls, mask_url и остальные) — это ссылки, которые загружает провайдер, поэтому они принимают только публичные адреса https://. Встроенная строка data:image/...;base64,… в одном из этих полей отклоняется с 400.

Чтобы отправить собственный файл, используйте вместо этого соответствующее поле *_base64: сервис сохраняет байты, публикует их и передаёт провайдеру полученную ссылку. До 16 файлов на запрос в input_base64.

Встроенные файлы
ПараметрТипОписание
image_base64stringИсходное изображение. Заменяет image_url.
mask_base64stringМаска инпейнтинга (только image/*). Заменяет mask_url.
input_base64string[]Референсы для image-to-image и мультивхода. Заменяет input_urls.
audio_base64stringИсходное аудио. Заменяет audio_url.
video_base64stringИсходное видео. Заменяет video_url.
Значение — это полная строка data:image/png;base64,… вместе с префиксом: тип файла определяется по ней.

Контракт запроса: strict, quote_id, max_price_rub

POST /api/media/generate и POST /api/media/price принимают одно и то же тело запроса, поэтому можно сначала запросить расчёт стоимости, а затем отправить его без изменений. Других полей верхнего уровня нет: неизвестное поле отклоняется на обоих эндпоинтах с 400 и кодом unknown_field, в котором оно названо (field, fields), с strict и без него. Параметры генерации передаются внутри opts.

Поля верхнего уровня
ПараметрТипОписание
modelreq.stringПубличный id модели или один из её маршрутов (base:alias).
promptstringТекст; обязателен только тогда, когда этого требует операция модели.
optsobjectПараметры модели. Точная схема: operations[].requestJsonSchema в GET /v1/model-capabilities/{model}.
strictbooleanСтрогий режим (или заголовок x-getvibe-strict: 1): запрос, который не может быть выполнен в точности в указанном виде (параметр отброшен, значение ограничено допустимым диапазоном, ключ не входит в контракт модели), отклоняется с кодом 422 strict_validation_failed и списком нарушений до расчёта стоимости или списания средств. Документированное поле, которое модель принимает и игнорирует (duration у моделей, использующих длительность исходного материала), не считается нарушением: для него возвращается предупреждение param_ignored.
quote_idstringmq_… из POST /api/media/price. Задача выполняется только по этой цене; устаревшая, использованная или перенаправленная котировка отклоняется с 409/422 до какого-либо запуска.
max_price_rubnumberВерхний предел для этой одной задачи в валюте аккаунта. Если расчётная стоимость выше: 422 media_max_price_exceeded, и ничего не запускается. С задачи с оплатой по факту никогда не списывается больше этого предела.
webhook_urlstringПубличный https URL, принимающий подписанное уведомление о завершении.

Файлы по id (Files API)

Любой исходный файл можно отправить тремя способами: как ссылку (image_url, audio_url, video_url…), как встроенные байты (image_base64, audio_base64, video_base64…) или как id вашего собственного файла из POST /v1/files. Поля id перечислены в requestJsonSchema каждой операции и принимаются в строгом режиме.

ПараметрТипОписание
image_file_idstringВместо image_url.
audio_file_idstringВместо audio_url.
video_file_idstringВместо video_url.
mask_file_idstringВместо mask_url.
first_frame_file_id / last_frame_file_idstringInstead of first_frame_url / last_frame_url.
input_file_idsstring[]Добавляется к input_urls.
reference_*_file_idsstring[]Appended to reference_image_urls / reference_audio_urls / reference_video_urls.

Видео тарифицируется по длительности входного файла

Для моделей, длина вывода которых определяется загруженной дорожкой — kling-ai-avatar, omnihuman-v2, omnihuman-2-0, omnihuman-v1.5, omnihuman-1-5, volcengine-lipsync (audio), kling-motion-control, wan-animate, topaz-video-upscale, p-video-edit (video), lipsync-2-pro, sync-3, react-1 (оба входных файла), — /api/media/price и предварительная проверка max_price_rub в /api/media/generate измеряют длительность этого файла на стороне сервера (link, data: URI, base64 или *_file_id) и рассчитывают стоимость исходя из измеренного количества секунд. Ответ содержит sourceSeconds (для lip-sync — outputSeconds), а в estimateReason указывается, что длительность была измерена. Если файл невозможно прочитать, цена рассчитывается на основе прежнего критерия (одна секунда, оценка из каталога или максимальное значение маршрута), а в estimateReason это указывается. Сумма списания равна ставке за секунду × фактически отрендеренному количеству секунд и никогда не превышает max_price_rub. Параметр opts.duration для этих моделей принимается и игнорируется; возвращается предупреждение param_ignored.

Клонирование голоса

POSThttps://getvibeapi.com/api/media/voices
GEThttps://getvibeapi.com/api/media/voices
POSThttps://getvibeapi.com/api/media/voices/{voice_id}/samples
DELETEhttps://getvibeapi.com/api/media/voices/{voice_id}

Create: { name, consent: true, engine, audio_url | audio_base64 } or several recordings samples: [{ audio_url } | { audio_base64 }, …] (engine: "elevenlabs" only). An ElevenLabs voice is used by voice-clone-tts and by the Voice Changer (elevenlabs-voice-changer). Appending recordings to an ElevenLabs voice is free. Every recording is downloaded and measured before the supplier is called: a refusal changes and charges nothing.

Лимиты и коды ошибок
ПараметрТипОписание
one recording≤ 10 MBwav/mp3, up to 60 s. Larger: 422 voice_sample_too_large / voice_sample_invalid.
recordings per voice≤ 25Считаются уже добавленные. Больше: 422 voice_samples_limit.
voice length≤ 300 sВсе записи вместе, включая уже добавленные. Дольше: 422 voice_samples_limit; короче минимума движка: 422 voice_samples_invalid.
recordings size≤ 50 MBВсе записи одного запроса вместе. Подробнее: 422 voice_samples_too_large.
request body≤ 70 953 644 B50 МБ записей в base64 (×4/3) плюс JSON. Больше: 413 payload_too_large (JSON, с max_body_bytes). Отправляйте длинные наборы частями через …/samples или в виде ссылок audio_url.
additions per 24 h20На клиента. Подробнее: 429 voice_samples_rate_limited.
Прочие ответы: 404 voice_not_found (неизвестный, удалённый или принадлежащий другому аккаунту голос), 409 voice_samples_unsupported (записи можно добавлять только к голосу ElevenLabs), 409 voice_slots_full, 502 voice_samples_failed (поставщик отклонил записи; голос не изменён). Голос ElevenLabs тарифицируется ежемесячно; цены — в GET /api/media/voices (pricing).

Замена голоса и принудительное выравнивание

ПараметрТипОписание
elevenlabs-voice-changermodelopts.voice_id (your ElevenLabs voice) + the source recording opts.audio_url | audio_base64 | audio_file_id, up to 5 minutes. Priced on the measured length: 1 minute = 1000 characters.
forced-alignmentmodelprompt is the transcript, opts.audio_url | audio_base64 | audio_file_id the recording. Result: word timings in resultMeta.words and an SRT file in resultUrls. Priced per 1000 characters of text.

Песочница: неизвестный результат отправки

Когда подтверждение старта от поставщика не приходит, задача остаётся в статусе: "submitting" со stage: "submission_unknown", errorCode: "media_submission_uncertain" и failure.advice: "reconcile_first" — продолжайте опрашивать тот же jobId и не создавайте дубликат. Чтобы проверить этот сценарий бесплатно, отправьте POST /api/media/generate с sandbox-ключом и заголовком x-pv-sandbox-outcome: submission_uncertain. Ответ будет обычным 202 с jobId; при опросе он 60 секунд отвечает как неизвестная отправка, а затем как задача, которая так и не запустилась (failure.code: "submission_not_started", charged: false). Ничего не сохраняется, не отправляется поставщику и не тарифицируется. Обычный ключ с этим заголовком получит 400 sandbox_outcome_requires_sandbox_key.

Распознавание речи (транскрипция)

Тот же эндпоинт, что и для остальной генерации: укажите имя STT-модели в model, оставьте prompt пустой строкой и передайте запись в opts.audio_url. Транскрипт приходит в resultText при GET /api/media/jobs/{id}; resultUrls остаётся пустым — транскрипция не создаёт файл.

# speech-to-text: create the job, then read the transcript
curl https://getvibeapi.com/api/media/generate \
  -H "Authorization: Bearer $GETVIBE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "whisper-large-v3-turbo",
    "prompt": "",
    "opts": {
      "audio_url": "https://example.com/meeting.mp3",
      "language_code": "en"
    }
  }'
# → {"ok":true,"jobId":"JOB_ID","status":"processing","priceRub":0.03}

curl https://getvibeapi.com/api/media/jobs/JOB_ID \
  -H "Authorization: Bearer $GETVIBE_API_KEY"
# → {"status":"success","resultText":"the transcribed text…","resultUrls":[],"priceRub":0.03}

Модели

  • whisper-large-v3-turbo — $0.00025 за минуту аудио. Самый дешёвый и быстрый, 99 языков.
  • nemotron-asr-multilingual — $0.00025 за минуту. Многоязычный ASR от NVIDIA, расставляет знаки препинания самостоятельно.
  • whisper-large-v3 — $0.000563 за минуту. Полноценный Whisper: медленнее, чем turbo, но точнее на шумном аудио.
  • universal-2 — $0.003125 за минуту.
  • speech-to-text — $0.01 за минуту (ElevenLabs Scribe). Поддерживает диаризацию спикеров и теги аудиособытий.

Параметры

ПараметрТипОписание
audio_urlreq.string (URL)Публичная https-ссылка, отдающая файл напрямую. Редиректы и адреса частных сетей отклоняются. Используйте audio_base64, если файл не размещён в интернете.
audio_base64stringЗапись inline в виде data:audio/mpeg;base64,… Заменяет audio_url.
language_codestringКод языка (en, ru, …). Определяется автоматически, если не указан.
duration_minutesnumberДлительность записи в минутах — используется для предварительной оценки стоимости. Итоговая плата рассчитывается по факту (см. ниже).
diarizebooleanДиаризация спикеров (universal-2, speech-to-text).
tag_audio_eventsbooleanРазметка звуковых событий, таких как смех или аплодисменты (распознавание речи).
keytermsstring[]Список подсказок из терминов и имён (speech-to-text; +30 % к цене).

Форматы и ограничения

Принимаются mp3, wav, m4a/mp4, flac, ogg/opus и webm. Размер файла — не более 25 МБ, то есть примерно 26 минут mp3 на 128 кбит/с или несколько часов речи в opus. Всё, что больше, сразу отклоняется с явным сообщением и не тарифицируется; вместо этого разделите запись.

Оплата — за минуту аудио. Для whisper-large-v3-turbo, whisper-large-v3 и nemotron-asr-multilingual итоговая сумма рассчитывается по измеренной длительности записи, взятой из транскрипта, а не по тому, что вы передали в duration_minutes. Минимальная стоимость — одна копейка. Точная сумма всегда возвращается как priceRub в завершённой задаче.

Вебхук готовности (вместо опроса)

Чтобы избежать опроса, зарегистрируйте один адрес mediaWebhookUrl в панели управления. Когда задача завершается (успешно или с ошибкой), сервис делает до пяти попыток доставки POST с телом JSON:

// POST to your mediaWebhookUrl when a job finishes
{
  "jobId": "...",
  "status": "success",            // or "fail"
  "model": "veo-3.1",
  "kind": "video",                // image | video | audio | music | 3d
  "resultUrls": ["https://getvibeapi.com/api/media/file/..."],
  "failMsg": null,
  "createdAt": "2026-06-17T10:00:00.000Z"
}
Подробности доставки, коды ошибок и биллинг описаны в разделе Webhook and media task lifecycle. Кратко: вебхук подписывается заголовками Standard Webhooks, дубликаты возможны, а доставка прекращается после пяти неудачных попыток. Опрос остаётся источником истины.

Получение файла: /api/media/file/{id}/{idx}

GEThttps://getvibeapi.com/api/media/file/{id}/{idx}

URL результата генерации (изображения, видео, аудио или 3D-модели) из resultUrls. Используйте его в том виде, в каком его вернул сервис: он открывается без API-ключа и работает в <img>, <video> или браузере. Провайдер скрыт: вышестоящий адрес определяется на стороне сервера, клиент его никогда не видит.

Параметры пути и строки запроса
ПараметрТипОписание
idreq.string (path)Идентификатор задачи (jobId) из ответа /api/media/jobs/{id}.
idxreq.integer (path)Индекс результата (начиная с 0). Для одного результата — 0.
query paramsкак в resultUrlsНе составляйте URL самостоятельно и не изменяйте параметры, возвращаемые сервисом.
downloadstring (query)download=1 возвращает файл как вложение, имя и расширение которого соответствуют содержимому (.glb для 3D-модели). Без него файл открывается в браузере.
# The signed URL is returned in resultUrls of the /api/media/jobs/{id} response
# or in the webhook body. Opens directly in the browser / <img> — no key needed.
https://getvibeapi.com/api/media/file/JOB_ID/0?sig=HMAC_SIGNATURE
Результаты хранятся 7 дней после завершения задачи (поле resultsExpireAt у /api/media/jobs/{id}). Готовый файл копируется в наше хранилище, и resultUrls переключаются на постоянный адрес вида https://getvibeapi.com/media/r/…; ранее выданный URL /api/media/file/… продолжает работать. Оба поддерживают Range-запросы (перемотку в видео и аудио). Через 7 дней файл удаляется, и по URL возвращается 410 Gone с кодом media_result_expired — скачайте всё нужное до этого момента.
Генерация медиа в GetVibe API — изображения, видео, аудио, музыка, 3D | GetVibe API