Генерация медиа
POST /api/media/generate — асинхронная генерация изображений, видео, TTS, музыки и 3D. Параметры model, prompt, opts. Опрос через GET /api/media/jobs/{id}.
Асинхронная генерация медиа: изображения, видео, озвучка (TTS), расшифровка речи (STT), музыка и 3D. Создаёте задачу и опрашиваете результат. Полный список моделей — в каталоге медиа-моделей; webhook, ошибки и биллинг — в разделе webhook.
Параметры создания
| Параметр | Тип | Описание |
|---|---|---|
modelобяз. | string | Имя медиа-модели, например veo-3.1 или gpt-image-2 (см. каталог). |
promptобяз. | string | Текстовое описание. |
opts | object | Доп. параметры генерации (зависят от модели): разрешение, длительность и т. п. |
Создание и опрос
Создание возвращает 202 с { ok: true, jobId, status: "processing" }. Опрашивайте GET /api/media/jobs/{jobId} до status: "success", затем заберите resultUrls.
# 1. создать задачу генерации
curl https://plusvibeapi.ru/api/media/generate \
-H "Authorization: Bearer $PLUSVIBE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "veo-3.1",
"prompt": "кот на скейте, замедленная съёмка"
}'
# → {"ok":true,"jobId":"...","status":"processing"}ok: false без списания. Цены на сайте — ориентировочные; точная сумма списания возвращается в заголовке x-pv-cost-rub каждого принятого ответа (в рублях, с учётом нашей маржи). По умолчанию тело потока не меняется; для стоимости в финальном usage-событии передайте x-pv-cost: 1.Расширенные параметры (opts)
Помимо model и prompt, в opts можно передать дополнительные параметры. Набор зависит от модели. Полный машиночитаемый контракт — через GET /api/model-capabilities (или GET /api/model-capabilities/{model} для конкретной модели).
| Параметр | Тип | Описание |
|---|---|---|
aspect_ratio | string | Соотношение сторон: 1:1, 16:9, 9:16, 4:3, 3:4. |
duration | string|number | Длительность видео в секундах (5, 10, 15). |
resolution | string | Разрешение: 480p, 720p, 1080p, 4K. |
image_url | string (URL) | Исходное изображение для I2V / image-to-image. |
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) | Первый кадр для 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 | Маска для inpainting (только 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,…, включая префикс: по нему определяется тип файла.Расшифровка речи (speech-to-text)
Тот же эндпоинт, что и остальная генерация: в model — имя STT-модели, prompt оставьте пустой строкой, а ссылку на запись передайте в opts.audio_url. Готовый текст приходит в поле resultText ответа GET /api/media/jobs/{id}; resultUrls у расшифровки пустой — файла на выходе нет.
# расшифровка речи: создать задачу и дождаться текста
curl https://plusvibeapi.ru/api/media/generate \
-H "Authorization: Bearer $PLUSVIBE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "whisper-large-v3-turbo",
"prompt": "",
"opts": {
"audio_url": "https://example.com/meeting.mp3",
"language_code": "ru"
}
}'
# → {"ok":true,"jobId":"JOB_ID","status":"processing","priceRub":0.03}
curl https://plusvibeapi.ru/api/media/jobs/JOB_ID \
-H "Authorization: Bearer $PLUSVIBE_API_KEY"
# → {"status":"success","resultText":"расшифрованный текст…","resultUrls":[],"priceRub":0.03}Модели
whisper-large-v3-turbo— 0,03 ₽ за минуту записи. Самая дешёвая и самая быстрая, 99 языков.nemotron-asr-multilingual— 0,03 ₽ за минуту. Многоязычная модель NVIDIA, ставит пунктуацию сама.whisper-large-v3— 0,06 ₽ за минуту. Полная версия Whisper: медленнее turbo, точнее на шумной записи.universal-2— 0,36 ₽ за минуту (AssemblyAI).speech-to-text— 0,93 ₽ за минуту (ElevenLabs Scribe). Умеет разделение по говорящим и метки звуковых событий.
Параметры
| Параметр | Тип | Описание |
|---|---|---|
audio_urlобяз. | string (URL) | Публичная https-ссылка, отдающая файл напрямую. Переадресации и внутренние адреса сети не принимаются. Вместо неё можно передать audio_base64. |
audio_base64 | string | Байты записи строкой data:audio/mpeg;base64,… — если файла нет в интернете. Заменяет audio_url. |
language_code | string | Код языка (ru, en, …). Без него язык определяется автоматически. |
duration_minutes | number | Длительность записи в минутах — по ней считается предварительная стоимость до запуска. Итог по факту (см. ниже). |
diarize | boolean | Разделение по говорящим (universal-2, speech-to-text). |
tag_audio_events | boolean | Метки звуковых событий: смех, аплодисменты (speech-to-text). |
keyterms | string[] | Подсказка со списком терминов и имён (speech-to-text; +30% к цене). |
Форматы и ограничения
Принимаются mp3, wav, m4a/mp4, flac, ogg/opus и webm. Размер файла — не более 25 МБ (это примерно 26 минут mp3 128 kbps или несколько часов речи в opus). Файл больше лимита отклоняется сразу, с явным сообщением, и не тарифицируется — режьте запись на части.
whisper-large-v3-turbo, whisper-large-v3 и nemotron-asr-multilingual итоговая сумма считается по фактической длине записи, измеренной по расшифровке, а не по тому, что вы указали в duration_minutes. Минимальное списание — одна копейка. Точная сумма всегда возвращается в priceRub завершённой задачи.Webhook готовности (вместо опроса)
Чтобы не опрашивать задачу, зарегистрируйте в личном кабинете один адрес mediaWebhookUrl. Когда задача завершится (успехом или ошибкой), сервис выполнит до пяти попыток доставки POST с JSON-телом:
// POST на ваш mediaWebhookUrl при завершении задачи
{
"jobId": "...",
"status": "success", // или "fail"
"model": "veo-3.1",
"kind": "video", // image | video | audio | music | 3d
"resultUrls": ["https://plusvibeapi.ru/api/media/file/..."],
"failMsg": null,
"createdAt": "2026-06-17T10:00:00.000Z"
}Получение файла: /api/media/file/{id}/{idx}
URL результата генерации (изображение или видео) из resultUrls. Используйте его как возвращённый сервисом URL: он открывается без API-ключа и подходит для <img>, <video> или браузер. Провайдер скрыт: upstream-адрес резолвится на сервере, клиент его не видит.
| Параметр | Тип | Описание |
|---|---|---|
idобяз. | string (path) | ID задачи (jobId) из ответа /api/media/jobs/{id}. |
idxобяз. | integer (path) | Индекс результата (0-базированный). Для одного результата — 0. |
query-параметры | как в resultUrls | Не конструируйте URL самостоятельно и не изменяйте параметры, возвращённые сервисом. |
# Подписанный URL возвращается в resultUrls ответа /api/media/jobs/{id}
# или в теле webhook. Открывается напрямую в браузере / <img> — без ключа.
https://plusvibeapi.ru/api/media/file/JOB_ID/0?sig=HMAC_SIGNATURECache-Control разрешает браузерное кэширование на 7 дней (cache hit) или 10 минут (fresh fetch). Серверная сторона блокирует обращения к приватным/loopback-адресам (SSRF-защита).