Генерация медиа
POST /api/media/generate — асинхронная генерация изображений, видео, TTS, музыки и 3D. Параметры model, prompt, opts. Опрос через GET /api/media/jobs/{id}.
Асинхронная генерация медиа: изображения, видео, озвучка (TTS), распознавание речи, музыка и 3D. Вы создаёте задачу и опрашиваете результат. Полный список моделей — в каталоге media-models; вебхуки, ошибки и биллинг описаны в разделе о вебхуках.
Параметры создания
| Параметр | Тип | Описание |
|---|---|---|
modelreq. | string | Название медиамодели, например veo-3.1 или gpt-image-2 (см. каталог). |
promptreq. | string | Текстовое описание. |
opts | object | Дополнительные параметры генерации (зависят от модели): разрешение, длительность и так далее. |
Создание и опрос
Создание возвращает 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_ratio | string | Aspect ratio: 1:1, 16:9, 9:16, 4:3, 3:4. |
duration | string|number | Длительность видео в секундах (5, 10, 15). |
resolution | string | Resolution: 480p, 720p, 1080p, 4K. |
image_url | string (URL) | Исходное изображение для I2V / преобразования изображения в изображение. |
negative_prompt | string | Что исключить из генерации (qwen-image, wan-2-7). |
guidance | number | Guidance scale — соответствие промпту (flux-2, qwen-image, seedance). |
seed | number | Seed для воспроизводимого результата (flux-2). |
stability | number | Стабильность 0–1 (hailuo, happyhorse, seedance, TTS). |
camera | string | Движение камеры, например "pan left" (kling-3.0, hailuo). |
first_frame_url | string (URL) | First frame for I2V (kling-3.0, wan-2-7). |
last_frame_url | string (URL) | Последний кадр для I2V (seedance, kling-3.0, wan-2-7). |
reference_image | string (URL) | Референс стиля/персонажа (happyhorse). |
similarity_boost | number | Схожесть голоса 0–1 (ElevenLabs TTS). |
speed | number | Скорость речи 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_base64 | string | Исходное изображение. Заменяет image_url. |
mask_base64 | string | Маска инпейнтинга (только image/*). Заменяет mask_url. |
input_base64 | string[] | Референсы для image-to-image и мультивхода. Заменяет input_urls. |
audio_base64 | string | Исходное аудио. Заменяет audio_url. |
video_base64 | string | Исходное видео. Заменяет 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). |
prompt | string | Текст; обязателен только тогда, когда этого требует операция модели. |
opts | object | Параметры модели. Точная схема: operations[].requestJsonSchema в GET /v1/model-capabilities/{model}. |
strict | boolean | Строгий режим (или заголовок x-getvibe-strict: 1): запрос, который не может быть выполнен в точности в указанном виде (параметр отброшен, значение ограничено допустимым диапазоном, ключ не входит в контракт модели), отклоняется с кодом 422 strict_validation_failed и списком нарушений до расчёта стоимости или списания средств. Документированное поле, которое модель принимает и игнорирует (duration у моделей, использующих длительность исходного материала), не считается нарушением: для него возвращается предупреждение param_ignored. |
quote_id | string | mq_… из POST /api/media/price. Задача выполняется только по этой цене; устаревшая, использованная или перенаправленная котировка отклоняется с 409/422 до какого-либо запуска. |
max_price_rub | number | Верхний предел для этой одной задачи в валюте аккаунта. Если расчётная стоимость выше: 422 media_max_price_exceeded, и ничего не запускается. С задачи с оплатой по факту никогда не списывается больше этого предела. |
webhook_url | string | Публичный 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_id | string | Вместо image_url. |
audio_file_id | string | Вместо audio_url. |
video_file_id | string | Вместо video_url. |
mask_file_id | string | Вместо mask_url. |
first_frame_file_id / last_frame_file_id | string | Instead of first_frame_url / last_frame_url. |
input_file_ids | string[] | Добавляется к input_urls. |
reference_*_file_ids | string[] | 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.
Клонирование голоса
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 MB | wav/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 B | 50 МБ записей в base64 (×4/3) плюс JSON. Больше: 413 payload_too_large (JSON, с max_body_bytes). Отправляйте длинные наборы частями через …/samples или в виде ссылок audio_url. |
additions per 24 h | 20 | На клиента. Подробнее: 429 voice_samples_rate_limited. |
Замена голоса и принудительное выравнивание
| Параметр | Тип | Описание |
|---|---|---|
elevenlabs-voice-changer | model | opts.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-alignment | model | prompt 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_base64 | string | Запись inline в виде data:audio/mpeg;base64,… Заменяет audio_url. |
language_code | string | Код языка (en, ru, …). Определяется автоматически, если не указан. |
duration_minutes | number | Длительность записи в минутах — используется для предварительной оценки стоимости. Итоговая плата рассчитывается по факту (см. ниже). |
diarize | boolean | Диаризация спикеров (universal-2, speech-to-text). |
tag_audio_events | boolean | Разметка звуковых событий, таких как смех или аплодисменты (распознавание речи). |
keyterms | string[] | Список подсказок из терминов и имён (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"
}Получение файла: /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 самостоятельно и не изменяйте параметры, возвращаемые сервисом. |
download | string (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_SIGNATUREresultsExpireAt у /api/media/jobs/{id}). Готовый файл копируется в наше хранилище, и resultUrls переключаются на постоянный адрес вида https://getvibeapi.com/media/r/…; ранее выданный URL /api/media/file/… продолжает работать. Оба поддерживают Range-запросы (перемотку в видео и аудио). Через 7 дней файл удаляется, и по URL возвращается 410 Gone с кодом media_result_expired — скачайте всё нужное до этого момента.