Вайб-Маркетолог Вайб-Маркетолог
Получить ключ

Agent API - Вайб-Маркетолог

Справочник API для ИИ-агентов: генерация изображений, видео, озвучки и музыки нейросетями.

API активен · обновлено 2026-10-20
Содержание ▾

Один ключ ко всем нейросетям: видео, изображения, озвучка, музыка, текст — одним POST /generate. Оплата в рублях с баланса личного кабинета. База: https://lk.vibemarketolog.ru/api/agent. Версия документа: 2026-08-13. Живой каталог моделей и цен — GET /capabilities.

Зачем через нас, а не напрямую к провайдерам

Напрямую к провайдерам Через Agent API
Доступ из России нужна зарубежная карта и обход гео-ограничений; часть провайдеров отказывает по региону работает с российского сервера как есть
Оплата отдельный валютный платёж каждому поставщику рубли с одного баланса; юрлицам — счёт и закрывающие документы
Интеграция у каждого свой формат, свои имена полей и свои лимиты один POST /generate на 56 моделей десяти провайдеров, единый формат ошибок
Цена вызова считаете сами по чужому прайсу POST /generate/estimate — точная сумма до списания, бесплатно
Сбой провайдера деньги ушли, разбираться вам возврат на баланс автоматически (поле refunded в статусе)
Результат ссылка провайдера протухает через часы файл остаётся в галерее кабинета, подписанная ссылка живёт 7 дней
Claude / ChatGPT писать своего клиента MCP-коннектор по OAuth 2.1, без единой строки кода
Отказ поставщика по оплате интеграция встала молча у части моделей есть резервный канал, разница в цене возвращается

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

Первый запрос за 3 минуты

  1. Аккаунт — https://lk.vibemarketolog.ru, подтвердите адрес почты (без подтверждения платные вызовы отклоняются).
  2. Баланс — пополнение от 100 ₽ в кабинете. Юрлицам доступен счёт и закрывающие документы.
  3. Ключ — страница https://lk.vibemarketolog.ru/agent (нужен вход в кабинет) → секция «API-ключи для моего агента» → кнопка «+ Создать ключ» → имя подключения, права (read и generate отмечены по умолчанию) и суточный лимит расходов (по умолчанию 500 ₽). Ключ oc_… и webhook_secret показываются один раз — скопируйте сразу. Там же ключ отзывается в один клик и меняется его лимит.
  4. Проверка ключа (бесплатно) — покажет права, лимиты и остаток:
curl -s -H "Authorization: Bearer $TOKEN" https://lk.vibemarketolog.ru/api/agent/me
  1. Смета (бесплатно, ничего не списывает) — то же тело, что у /generate:
curl -s -X POST https://lk.vibemarketolog.ru/api/agent/generate/estimate \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d '{"type":"image","model":"z-image","prompt":"логотип кофейни на белом фоне","strict":true}'
  1. Генерация — тот же запрос на /generate: вернётся generation_id, дальше опрашивайте GET /generation/{id}/status до stage: "complete" и берите display_url.

Полный список моделей и их параметров всегда в GET /capabilities — на него и опирайтесь в коде, а не на этот документ.

Условия, лимиты и документы


Содержание


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

Все запросы требуют Bearer-токен:

Authorization: Bearer <ваш_api_token>

Получить ключ: страница https://lk.vibemarketolog.ru/agent → секция «API-ключи для моего агента» → «+ Создать ключ». Ключ виден ОДИН раз при создании — сохраните его сразу. На сервере хранится только SHA-256 хеш. Вместе с ключом при создании выдаётся webhook_secret (тоже показывается один раз) — им подписываются вебхуки (см. «Верификация подписи»). Доступа к API он не даёт: нужен только чтобы проверить, что вебхук на ваш callback_url отправили мы.

Если секрет не сохранён или ключ выпущен раньше — перевыпустите секрет, не трогая ключ: в разделе «API-ключи» у нужного ключа нажмите кнопку с круговой стрелкой («Перевыпустить секрет подписи вебхуков»). Новый секрет показывается один раз; прежний перестаёт действовать сразу, а сам API-ключ и все интеграции продолжают работать. Тем же способом переводятся на выделенный секрет ключи, созданные до 2026-07-09 (они работают на легаси-схеме подписи).

Проверка ключа

curl -s -H "Authorization: Bearer $TOKEN" \
  https://lk.vibemarketolog.ru/api/agent/me

Ответ содержит права ключа (scopes), лимиты, остатки, статус Яндекс OAuth. Перед платными вызовами используйте бесплатную смету POST /generate/estimate (цена и valid без списания), а куда ушли деньги — GET /usage и GET /usage/operations (раздел «Расходы»).

Срок действия ключа

Новый ключ действует 90 дней (expires_at в /me). Ключ, которым пользуются, продлевается сам (с 09.10.2026): если за последние 30 дней по нему был хотя бы один вызов, при подходе к сроку он получает ещё 90 дней — перевыпускать не нужно. Ключ без вызовов за 30 дней получает разовую отсрочку на 7 дней и уведомление, затем перестаёт работать — выпустите новый в кабинете: «ИИ Агент» → «API ключи». Отозванный ключ не продлевается.

Права ключа (scopes)

Права выбираются галочками при создании ключа в кабинете (раздел «API-ключи» → «Создать ключ»). Уже созданному ключу права не добавляются — нужен новый ключ.

право что открывает как получить
read Все GET-эндпоинты: каталог моделей и цен, баланс, история генераций, статусы, каталог голосов 120 req/min
generate POST /generate, POST /generate/estimate, POST /upload-media 30 req/min
write Изменение объектов аккаунта: бренды и продукты Brand Voice 10 req/min
live живой голос wss /live/sessions (gpt-live-1), 15 ₽/мин посекундно галочка «Живой голос»
llm:proxy прозрачные прокси моделей /anthropic/v1/messages, /openai/v1/responses, /openai/v1/chat/completions, /openai/v1/decisions (GPT-6 Luna), синтез /tts, /tts/stream, свои голоса /voices/my, /voices/clone — платные, по токенам галочка «Модели для агента» (с 20-10-26)

Ключ для ИИ-агента — заготовка в окне создания ключа: read + generate + llm:proxy + live + chatbot. Этого хватает на все методы, которые зовёт агент: /api/agent/* (смета, баланс, генерации, каталог голосов), /openai/*, /anthropic/*, /tts, /live/*, /chatbots. Яндекс (yandex, write) и партнёрский direct — отдельно.

Права существующего ключа меняются без перевыпуска: в списке ключей строка «Права» → «Изменить». Секрет на машине агента остаётся прежним, новые права действуют со следующего запроса. Права, выданные владельцем адресно (direct и служебные), при этом сохраняются.

⚠️ Проверка прав fail-closed: пустой список = НЕТ прав. Если эндпоинт отвечает 403 insufficient_scope — в теле придёт required (какое право нужно) и granted (какие есть). Право yandex до 07-09-26 выбрать было негде, и все ключи получали только read+generate — если ваш ключ старше этой даты и /yandex/* отвечает 403, создайте новый ключ с галочкой «Метрика и Директ».


MCP: подключение в Claude и ChatGPT

Платформа работает как MCP-сервер (Model Context Protocol): Streamable HTTP, JSON-RPC 2.0, версия протокола 2025-06-18. Её можно подключить к claude.ai, ChatGPT или любому MCP-клиенту и генерировать контент без написания кода.

Два эндпоинта

Эндпоинт Авторизация Для кого
POST https://lk.vibemarketolog.ru/mcp OAuth 2.1 (автоматический флоу) или Bearer oc_... Коннекторы claude.ai / ChatGPT и MCP-клиенты с поддержкой OAuth
POST https://lk.vibemarketolog.ru/api/mcp Bearer oc_... из ЛК (https://lk.vibemarketolog.ru/agent); открытые тулзы — без auth Самописные агенты; работает без изменений

Ключи oc_... принимаются на обоих эндпоинтах.

Инструменты MCP (76 для подключения ChatGPT/Claude, версия сервера 1.4.0)

Состав tools/list зависит от прав ключа. С 29-09-26 запись в Яндекс Директ открыта всем подключениям с правом generate и платная: direct_import_campaign — подготовить черновик из своей структуры (группы, ключи, объявления со своими ссылками, минус-слова, быстрые ссылки, регион, бюджет; в Директ ещё не уходит) — бесплатно; direct_publish_campaign — отправить в Директ черновиком (показы запускает человек отправкой на модерацию) — 99 ₽; у черновика запуск и неподтверждённый бюджет отказывают без платы, второй заголовок Директ сейчас не сохраняет; direct_resume_campaign, direct_resume_ads, direct_set_budget, direct_set_bids, direct_add_keywords, direct_add_negatives, direct_update_ad, direct_optimize_apply — 9 ₽ за действие (у последнего плюс 15 ₽ работы ИИ); direct_pause_campaign, direct_pause_ads — бесплатно. Цены — настройки mcp_fee_direct_publish, mcp_fee_direct_edit. REST /direct/* по-прежнему по партнёрскому праву direct. Данные Метрики, Директа и сайтов берутся из подключений пользователя в кабинете (/agi → «Подключения»); если Яндекс не подключён, инструмент так и скажет. Цена каждого платного инструмента написана в начале его description — модель обязана назвать её пользователю до вызова.

Генерация и кабинет (10)

Инструмент Что делает Право
list_capabilities Каталог моделей и цен открытая
get_prices Прайс по моделям открытая
search Поиск по каталогу моделей — открыто; по своим генерациям — с токеном. Формат ChatGPT Deep Research: results[] с id/title/url открытая / read
fetch Карточка модели model:<ключ> — открыто; генерация generation:<id> — с токеном открытая / read
get_balance Текущий баланс и расход подключения за сегодня read
get_usage Куда ушли деньги: расход подключения, всех ключей и аккаунта по дням, категориям, моделям + последние операции с возвратами и request_id (бесплатно) read
list_generations История генераций (limit ≤ 20) read
get_generation_status Статус и результат генерации read
estimate_generation Смета БЕЗ списания (бесплатно) read
generate_content Запуск генерации — СПИСЫВАЕТ рубли; обязателен idempotency_key (повтор с тем же ключом и тем же телом вернёт прошлый ответ с replayed: true без нового списания; тот же ключ с другим телом — 409 idempotency_key_conflict); вернёт status=processing + generation_id generate

Каталог Vibe Landing Kit (3, бесплатно, без авторизации) — стиль и анимации для лендинга

Инструмент Что делает
design_systems Список дизайн-систем (в духе мировых брендов и собственные стили) с нишами, целями и палитрой; с brief — подбор трёх под задачу
get_design_system Запись целиком: токены светлой и тёмной темы (контраст WCAG проверен), OFL-шрифты с кириллицей, компоненты, секции лендинга, форма 152-ФЗ, оси A/B, do/don't, инструкция верстальщику. format: json / css (переменные обеих тем) / md (DESIGN.md)
get_motion_recipe Анимационный рецепт: html + css + ванильный js, prefers-reduced-motion, риск для LCP/CLS; без slug — список

REST-двойники (открыто): GET /design-systems (?q=бриф — подбор), GET /design-systems/{slug} (?format=css|md), GET /motion, GET /motion/{slug}. Исходники каталога и плагин Claude Code — репозиторий vibemarketologru/vibe-landing-kit.

Семантика и Вордстат (5) — те же деньги и лимиты, что у REST-двойников

Инструмент Что делает Цена Право
build_semantics «Семантика для сайта»: ключи Вордстата по блокам лендинга (первый экран, цены, FAQ, форма), частотность, минус-слова; deep — до 500 ключей, сезонность за 24 месяца, заголовки А/Б. dry_run=true — смета 49 ₽ quick / 149 ₽ deep generate
keywords_suggest Частотность и связанные запросы по фразам 49 ₽ за уникальную фразу generate
wordstat_top Популярные запросы с фразой 49 ₽ (повтор за сутки — бесплатно) generate
wordstat_dynamics Динамика спроса по месяцам/неделям 49 ₽ generate
wordstat_regions Спрос по регионам 99 ₽ generate

Начало лендинга (3, бесплатно) — для клиентов без файлов и без MCP prompts (ChatGPT, Claude.ai)

Инструмент Что делает Цена Право
landing_guide Вызывается ПЕРВЫМ при запросе лендинга: маршрут с ценами и вопросы брифа для первого сообщения; skill — полный текст любого навыка бесплатно read
brand_profile Бренды из кабинета: логотип (logo_url), палитра, маскот, голос, товары бесплатно read
upload_file Картинка пользователя на наш адрес: url (публичная ссылка) или content_base64; PNG/JPG/WEBP/GIF до 10 МБ, без SVG, 60 в сутки бесплатно generate
upload_link Файл, приложенный человеком в чат: без code — одноразовая страница lk.vibemarketolog.ru/u/{code} (24 ч, до 10 файлов: PNG/JPG/WEBP/GIF до 10 МБ, MP4/MOV/WEBM до 50 МБ; геометки удаляются); с code — постоянные адреса загруженного бесплатно создать — generate, прочитать — read
media_check Речь в своём ролике или озвучке: распознавание на нашем сервере, сверка с expected_text (совпадение %, повторы, что сказано вместо задуманного), suggested_trim_at бесплатно, 100 в сутки read
video_loop Свой ролик до 20 с: boomerang — бесшовная петля без звука для фона, trim — обрезка по trim_at; H.264 720p, адрес сразу в <video src> бесплатно, 30 в сутки generate

REST-двойники (с 25-09-26, те же лимиты, поля и отказы; счётчики общие с MCP): upload_file → POST /uploads/image, upload_link → POST /uploads/links и GET /uploads/links/{code}, media_check → POST /media/check, video_loop → POST /media/loop, landing_guide → GET /skills/{slug} (landing-ab, landing-media…), brand_profile → GET /brands. Таблица — в разделе «Гипотеза под ключ».

Черновик и превью (с 24-09-26). landing_check сохраняет черновик (draft_id, version, 7 дней) — дальше присылай только patches [{variant a|b|both, find, replace, all?}] (find — точный кусок текущего HTML, ровно одно вхождение; ошибка — черновик не меняется) и b_patches (Б = A + правки); landing_launch / landing_update принимают draft_id вместо HTML. Ответ landing_check содержит preview — снимки первого экрана A и Б на компьютере (1280×800) и телефоне (390×844) с настоящими кадрами и шрифтами, WebP, хранятся 3 дня; preview: false — без снимков. Паспорт дополнительно предупреждает: невидимый fixed-слой у края (iOS 26), loading=lazy у главной картинки, картинки без размеров, анимации в режиме «меньше движения».

landing_launch с dry_run и baseline_cr / target_cr / cpc_rub возвращает sample — сколько визитов на вариант и денег на трафик нужно для вывода, и честно говорит, если цена больше суточного лимита подключения (по умолчанию лимит 2 500 ₽ с 29-09-26, меняется на https://lk.vibemarketolog.ru/agent — кнопка «Изменить лимит» у подключения; #792). landing_status отдаёт test_lead — дошла ли проверочная заявка до владельца; ?v=a / ?v=b — предпросмотр (и для headless-браузера): открывают вариант, но в статистику не идут; для рекламных связок «объявление A → страница A» — ?ad=a / ?ad=b, они считаются отдельно (ab.bundle). Заранее отмеченная галочка согласия блокирует запуск.

get_design_system с format: "css" отдаёт готовые @font-face шрифтов стиля с нашего адреса — страница из веб-чата получает фирменный шрифт без файлов и без CDN (#791).

Гипотеза под ключ (5) — свой HTML лендинга на /w/{slug} с заявками и A/B-тестом (с 24-09-26)

Инструмент Что делает Цена Право
landing_check Паспорт в настоящем браузере на 1280/390/360 px: скролл на телефоне, кнопка на первом экране, форма с согласием 152-ФЗ, политика, внешние CDN, медиа первого экрана, читаемость, H1 бесплатно, 30 в час generate
landing_launch Запуск: адрес, приём заявок в кабинет/Telegram/почту, A/B 50/50 с вердиктом по значимости, проверочная заявка. Паспорт не пройден — деньги не списываются. dry_run=true — смета 990 ₽ generate
landing_update Замена HTML варианта A или Б (паспорт обязателен; идущий тест перезапускается) бесплатно, до 50 правок generate
landing_status Визиты, заявки, конверсия A и Б, z-тест и вердикт; без landing_id — список бесплатно read
landing_pro «Про-версия победителя»: сайт топ-тарифа конструктора по победившему варианту 4 500 ₽ (во время акции конструктора — не дороже её цены) generate

Чат-боты с ИИ (6) — консультант для сайта или лендинга (с 24-09-26)

Инструмент Что делает Цена Право
chatbot_create_site Бот для виджета на сайте: роль, приветствие бесплатно; ответы посетителям — от 2 ₽ по модели бота, абонплаты у бота для сайта нет generate
chatbot_learn До 20 пар «вопрос — ответ» или текстов в базу знаний + обучение одним вызовом; dry_run — смета 5 ₽ за пункт generate
chatbot_learn_site Одна страница (whole_site=false) или обход сайта до 30 страниц 10 ₽ за страницу; обход — 4 ₽ за каждую прочитанную (заслон по верхней границе до работы, списание по факту) generate
chatbot_widget Цвет, сторона, заголовок, подсказка + embed_code и preview бесплатно generate
chatbot_status Список ботов или состояние бота со статистикой бесплатно read
chatbot_conversations Разговоры, переписка, ответ посетителю от оператора (reply — право generate) бесплатно read / generate

Пробным ключам чат-боты закрыты (общий аккаунт). Виджет работает и на лендингах /w/* (песочница — #783). Контакт, оставленный посетителем в чате, уходит владельцу уведомлением в кабинет и Telegram (#785).

Двенадцать навыков Vibe Landing Kit 1.2.0 отдаются через prompts/list: landing-ab (маршрут), hypothesis-lab, landing-brief, landing-media, landing-mobile, landing-law-ru, landing-chatbot, ad-match, brand-to-system, а также gpt-image-25, wow-ad-creative, cyrillic-slides. ChatGPT и Claude.ai получают тот же маршрут, что плагин Claude Code; соседние файлы навыка (snippets.md, templates.md) приходят в prompts/get приложениями в конце текста (#788).

Метрика, Директ, сайты (18) — исполняет тот же движок, что веб-агент /agi

Инструмент Что делает Цена Право
metrika_counters, metrika_goals, metrika_segments, audience_segments Счётчики, цели, сегменты Метрики и Аудиторий бесплатно read
metrika_report Источники трафика, отказы, глубина, конверсии за N дней (days) 19 ₽; пустой отчёт — возврат generate
list_campaigns, list_ads Кампании и объявления Директа пользователя бесплатно read
direct_analyze / direct_optimize / direct_waste / direct_search_queries / campaign_report Экспресс-аудит по правилам (асинхронно, run_id), советы, слив бюджета, реальные запросы, отчёт клиенту 149 / 49 / 49 / 39 / 99 ₽ generate
direct_sitelinks, direct_forecast, content_trends Быстрые ссылки по посадочной, прогноз бюджета, тренды под креативы 29 / 49 / 39 ₽ generate
website_status, website_leads, website_ab_results Сайт конструктора: статус, заявки с форм, итоги A/B бесплатно read

Запись в рекламный кабинет (12, только партнёрские ключи с правом direct): direct_create_campaign, direct_publish_campaign, direct_pause_campaign, direct_resume_campaign, direct_set_budget, direct_add_negatives, direct_add_keywords, direct_set_bids, direct_update_ad, direct_pause_ads, direct_resume_ads, direct_optimize_apply. Через OAuth-подключение ChatGPT/Claude недоступны.

Деньги. Смета и плата резервируются в дневном лимите ПОДКЛЮЧЕНИЯ до вызова, после вызова разница с фактом освобождается; отказ инструмента возвращает плату по исходной операции.

OAuth 2.1-флоу (для /mcp)

Запрос без токена получает 401 с заголовком WWW-Authenticate, где указана resource-метадата /.well-known/oauth-protected-resource/mcp. Дальше клиент выполняет флоу сам:

  1. Dynamic Client Registration (RFC 7591) — POST /oauth/register. Адреса возврата: https://… и, для локальных клиентов (Claude Code), http://localhost:<порт>/… / http://127.0.0.1:<порт>/… по RFC 8252;
  2. PKCE S256 обязателен — GET /oauth/authorize → consent-экран → POST /oauth/token (без code_verifier — 400 invalid_request, с чужим — 400 invalid_grant);
  3. Refresh rotation — refresh-токен ротируется при каждом обновлении.

Метадата authorization-сервера: /.well-known/oauth-authorization-server. Скоупы OAuth: read, generate.

Биллинг и лимит: списания идут с рублёвого баланса владельца аккаунта; дневной лимит по умолчанию — 500 ₽ на подключение. Изменить: https://lk.vibemarketolog.ru/agent → «Подключить к Claude и ChatGPT» → «Подключённые приложения» → «Изменить лимит». Отзыв доступа: там же → «Отозвать».

Пошаговые видео-инструкции для ChatGPT, Claude, Claude Code и Cursor — https://lk.vibemarketolog.ru/connect.

Подключение в Claude (claude.ai)

  1. Профиль внизу слева → Settings → Connectors;
  2. Add → Add custom connector, название любое, адрес https://lk.vibemarketolog.ru/mcp → Continue;
  3. Войдите в Вайб-Маркетолог и нажмите «Разрешить доступ»;
  4. В чате: «+» → Connectors → включите переключатель коннектора.

Доступно на всех тарифах claude.ai (Free — 1 коннектор). В каталоге коннекторов Anthropic нас нет — подключение только по URL.

Подключение в ChatGPT

Нужен тариф Plus, Pro или Business и компьютер. Аватар → Настройки → Безопасность и вход → включить Режим разработчика → Плагины → «+» → Создать MCP-приложение → название «Вайб-Маркетолог», адрес https://lk.vibemarketolog.ru/mcp, аутентификация OAuth → «Создать» → войти и «Разрешить доступ». В чате: «+» → Вайб-Маркетолог. ChatGPT запоминает список инструментов при подключении: после обновления сервера обновите приложение в настройках или подключите заново.

Подключение в Claude Code

claude mcp add --transport http vibemarketolog https://lk.vibemarketolog.ru/mcp

Затем в Claude Code: /mcp → vibemarketolog → Authenticate — откроется браузер со входом и «Разрешить доступ». Без браузера (сервер, CI) — ключом: --header "Authorization: Bearer oc_…".

Поллинг и результат

Генерация асинхронная: после generate_content опрашивайте get_generation_status каждые 10–15 секунд (image ~30–90 сек, video — до 30 минут). Готовый результат — поле display_url: подписанная ссылка вида https://lk.vibemarketolog.ru/files/generation/{id}?expires=…&signature=…, работает БЕЗ логина 7 дней (при каждом опросе статуса выдаётся свежая; файл навсегда остаётся в галерее ЛК). file_url — та же генерация в ЛК под сессией. result_url/result_urls при наличии локальной копии тоже указывают на подписанные ссылки нашего домена; срок действия ссылок продублирован явным полем expires_at (ISO 8601). URL апстрим-провайдеров в ответах API не отдаются.


Навыки для подключённых агентов

Навык — это готовая инструкция «как правильно сделать вот такую работу нашими моделями»: структура промпта, режимы, цены, проверенные приёмы и типичные провалы. Мы держим их на сервере, а не в этой публичной странице, по двум причинам: инструкция обновляется вместе с прайсом и моделями (и не может от них отстать), а доступ к ней получает тот, кто реально подключён.

Навыки доступны только по подключению. Ни один из способов не отдаёт тело навыка анонимно.

Способ 1: Claude Code и claude.ai — через MCP

Подключите наш коннектор (см. раздел «MCP: подключение в Claude и ChatGPT») — и навыки появятся у клиента как готовые промпты. Протокольно это prompts/list и prompts/get; оба требуют авторизации (OAuth-подключение или API-ключ, scope read). Без токена сервер отвечает -32001 Missing token.

curl -s -X POST https://lk.vibemarketolog.ru/api/mcp \
  -H "Authorization: Bearer $VM_TOKEN" -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"prompts/list"}'

Способ 2: любой агент — через Agent API

GET /api/agent/skills            # список: slug, заголовок, описание, теги
GET /api/agent/skills/{slug}     # тело навыка целиком (поле body, markdown)

Scope read. Список дешёвый — его можно звать при старте сессии; тело подтягивайте под конкретную задачу.

Что сейчас в библиотеке

Слаг О чём
gpt-image-25 GPT-Image-2.5: чем Flare отличается от Sunburst, все режимы (генерация, точечная правка, прозрачный фон, форматы), пропорции, цены, типичные ошибки. Начинать отсюда.
cyrillic-slides Презентации и слайды на русском: как держать текст дословно, единый стиль по всей колоде, работа с диаграммами, чего модель не умеет.
wow-ad-creative Рекламные креативы с русским текстом: формула промпта из шести частей, логотип клиента файлом, форматы под площадки, серия вариантов под A/B.

Актуальный список всегда возвращает GET /api/agent/skills — таблица выше может отставать на один релиз, API не отстаёт никогда.


Лимиты и скоупы

Scope Что разрешено Throttle
read Все GET-эндпоинты: каталог моделей и цен, баланс, история генераций, статусы, каталог голосов 120 req/min
generate POST /generate, POST /generate/estimate, POST /upload-media 30 req/min
write Изменение объектов аккаунта: бренды и продукты Brand Voice 10 req/min

🔒 Права выдаются явно (fail-closed). Каждый метод API привязан к своему праву, и ключ получает доступ только к тем методам, права на которые ему выданы. Ключ без прав не может ничего: пустой список больше не означает полный доступ. Новый ключ по умолчанию создаётся с read и generate; остальные права владелец аккаунта выдаёт осознанно на странице ключа. Если метод потребовал права, которого нет, приходит 403 insufficient_scope с полями required (какое право нужно) и granted (какие есть).

🔒 Least privilege для Яндекса. Сырой OAuth-токен (со всеми правами, что владелец выдал на экране согласия — вплоть до почты и Диска) отдаётся только под scope yandex. Ключу с одним read доступны безопасные операции чтения, но не сами доступы к внешним сервисам.

Дневной лимит трат (daily_spend_limit) настраивается на странице токена. Когда лимит достигнут — 429 daily_spend_limit_exceeded. Лимит занимается атомарно, поэтому параллельные запросы его не обходят.

Ограничение по IP (allowed_ips) действует на всех каналах доступа сразу: REST, MCP и проверка ключа.

Все обращения к API — включая неудачные попытки авторизации — фиксируются в журнале с отметкой времени; владелец аккаунта видит их в кабинете, поддержка — по request_id из ответа об ошибке.


Endpoint reference

Метод URL Описание
GET /me Информация о токене, балансы, Yandex OAuth
GET /balance Текущий баланс пользователя
GET /usage Расход: этот ключ (key), все ключи API аккаунта (api), весь аккаунт (account) — с возвратами, по дням, категориям и моделям. ?days=1|7|30|90|0 (free)
GET /usage/operations Каждая платная операция с её возвратами, включая Вордстат, Директ, лендинги, тексты; курсор next_cursor (free)
GET /prices Полный прайс по моделям. price_semantics объявляет, что означает цена каждого источника (в prices — минимум/база, в /capabilities — дефолт-конфигурация, точная сумма — только смета). Разделы: per_second (посекундные ставки с формулой), per_1000_chars (посимвольная озвучка — списание за начатую 1000 знаков; флэт-числа в prices лишь фолбэк), non_generation_tools (платные инструменты вне /generate: direct/, campaigns/, voice/validate), hidden_non_generation_key_names (имена тарифных ключей других подсистем)
GET /capabilities Самоописывающийся каталог: все модели + их параметры + лимиты
GET /health Status check + последние ошибки
GET /generations История генераций; каждый элемент содержит display_url — подписанную ссылку на файл, работает без логина 7 дней (nullable)
POST /generate Запуск генерации (любого типа). strict=true — отклонять несовместимые поля до списания. type=text отвечает синхронно, оплата по фактическим токенам
POST /generate/estimate Dry-run: валидация + цена тела /generate БЕЗ списания (free)
POST /webhook-test Отправить подписанное тестовое событие на ваш callback_url (free)
POST /upload-media Загрузка файла (image / video / audio)
POST /uploads/image Картинка по url (публичная ссылка) или content_base64 → постоянный адрес на нашем домене для image_input и <img src> лендинга; PNG/JPG/WEBP/GIF до 10 МБ, без SVG, 60 в сутки (бесплатно)
POST /uploads/links Одноразовая страница загрузки для человека /u/{code}: kinds[], purpose? (бесплатно)
GET /uploads/links/{code} Что человек загрузил по ссылке: постоянные адреса, pending, failed, hint
POST /media/check Речь в своей генерации против expected_text: совпадение %, повторы, suggested_trim_at, вердикт (бесплатно, 100 в сутки)
POST /media/loop Свой ролик до 20 с: mode=boomerang (петля без звука) или trim (обрезка по trim_at) → mp4 для <video src> (бесплатно, 30 в сутки)
GET /generation/{id}/status Статус + результаты + error_message + cost + refunded
POST /safety-check Pre-action risk assessment (бесплатно)
POST /semantics «Семантика для сайта»: ключи Вордстата по блокам лендинга, минус-слова, заголовки А/Б — 49 ₽ quick / 149 ₽ deep (см. раздел ниже)
GET /voices Каталог голосов ElevenLabs (97 голосов, фильтры: ?gender=female&category=professional&search=calm)
POST /voice/validate Suno Voice: загрузка аудио для клонирования голоса (50₽)
GET /voice/validate-info Suno Voice: получить верификационную фразу (polling, бесплатно)
POST /voice/generate Suno Voice: отправить запись фразы (бесплатно)
GET /voice/status Suno Voice: статус создания голоса → voice_id (polling, бесплатно)
POST /voice/regenerate Suno Voice: перегенерация истёкшей фразы (бесплатно)
GET /voice/list Suno Voice: список ваших кастомных голосов (бесплатно)
GET /chatbots Чат-боты пользователя: Telegram и виджеты сайта, с состоянием подписки
GET /chatbots/{id} Состояние бота словами: работает ли, как настроен, сколько знаний и диалогов
GET /chatbots/{id}/dialogs О чём спрашивают клиенты (последние вопросы, ?limit=1..25)
POST /chatbots Ссылка на создание Telegram-бота. ⚠️ Возвращает create_url — подтверждает человек в окне Telegram, программно этот шаг не пройти
POST /chatbots/site Создать бота-виджет для САЙТА целиком программно (бесплатно). model — слаг из GET /modules → chatbots.models (по умолчанию gpt-6-luna, «Вайб Лайт · GPT-6»); снятые модели отказывают unknown_model со списком доступных
PATCH /chatbots/{id} Настройки бота: имя, описание и меню команд в Telegram, инструкции, приветствие, model — смена модели без пересоздания (переписка, знания, каталог и код виджета сохраняются; с 06-10-26)
PATCH /chatbots/{id}/widget Внешний вид виджета: цвет, позиция, размеры окна, тексты приветствия
GET /chatbots/{id}/embed Код вставки виджета на сайт + ссылка на превью
POST /chatbots/{id}/knowledge Знание в базу бота: текст или пара «вопрос — ответ» (5₽)
POST /chatbots/{id}/train Обучение: разбор страницы по url (10₽) и пересчёт векторов. Без этого шага добавленные знания в ответы не попадают
GET /chatbots/{id}/articles Статьи базы знаний бота
POST /chatbots/{id}/articles Добавить статью (бесплатно): она видна посетителю во вкладке FAQ виджета и сразу становится знанием бота — он отвечает по ней
POST /chatbots/{id}/compare Сравнение моделей на своём вопросе (с 06-10-26): {question ≤1000, models: [2–3 слага]} → compare_id. Модели отвечают параллельно по инструкции, базе знаний и каталогу бота; в переписку ничего не пишется, заказ не оформляется. Списывается цена ответа каждой ПОЛУЧЕННОЙ модели (как обычный ответ), не ответила — бесплатно. Отказ словами — 422 compare_rejected (вопрос, число моделей, деньги, не больше 20 сравнений в час)
GET /chatbots/{id}/compare/{compareId} Ответы сравнения: done, total_rub, charged_rub, items[] {model, display_name, vendor, price_rub, status: pending|running|done|failed|no_money, answer, wants_human, seconds, charged_rub, error}. Опрашивать раз в 2–3 с до done=true; незавершённый ответ гаснет через 5 минут без списания
GET /chatbots/inbox Общая лента по всем ботам одним запросом (с 06-10-26): новые сообщения после ?after= (from: visitor|bot|operator, chatbot_id, conversation_id), waiting[] — разговоры у человека (unanswered, returns_to_ai_in с), unread[] по ботам, next_after/has_more, limit до 200. Без after — последние 50. Ничего не отмечает прочитанным
GET /chatbots/{id}/conversations Разговоры бота списком: номер, клиент, последнее сообщение, сколько непрочитано
GET /chatbots/{id}/conversations/{conversationId} Лента сообщений одного разговора. ?after=<id> — только сообщения новее (для опроса), в ответе last_id для следующего запроса. ⚠️ Чтение отмечает сообщения посетителя прочитанными, как открытие разговора в кабинете
POST /chatbots/{id}/conversations/{conversationId}/reply Ответить клиенту от лица человека (message, до 5000 знаков). Уходит в Telegram или в виджет, разговор переключается на человека
POST /chatbots/{id}/conversations/{conversationId}/toggle Кто отвечает дальше: ИИ или человек. Возвращает answered_by: ai|human
GET /chatbots/{id}/stats Работа бота за неделю (по дням, частые вопросы, время ответа, расход) и лимиты. С 06-10-26: forecast — ответов в день за 30 дн. и by_model[].month_rub «≈ N ₽ в месяц» на каждой модели (без потока — null и пояснение в note), advice — совет сменить модель с причиной числом (kind: vision | failures | savings, suggest_model, month_delta_rub, reason_human) или null
GET /chatbots/{id}/channels Где бот отвечает: каналы и их живость (состояние спрашивается у самого Telegram)
POST /chatbots/{id}/channel/telegram Подключить СУЩЕСТВУЮЩЕГО бота по bot_token целиком программно: проверка токена → канал → вебхук → подписка. ⚠️ Заводит абонплату 990 ₽/мес после пробного периода
POST /chatbots/{id}/channel/telegram/test Жив ли бот и его вебхук
POST /chatbots/{id}/channel/disconnect Отключить канал (channel), вебхук снимается
DELETE /chatbots/{id} Удалить бота вместе с перепиской, знаниями и каналами. Вебхуки снимаются ДО удаления, абонплата закрывается сама
GET /chatbots/{id}/catalog Состояние каталога товаров: позиций, источник, дата обновления, автообновление, цена позиции
POST /chatbots/{id}/catalog/preview Разведка источника и точная смета. Источник — url (фид YML) ИЛИ file (таблица CSV, multipart). Бесплатно
POST /chatbots/{id}/catalog/import Загрузить каталог (items из сметы). 0,3 ₽ за позицию, списание по факту. ⚠️ ЗАМЕНЯЕТ прежние товары бота, текстовые знания не трогает
PATCH /chatbots/{id}/catalog Автообновление каталога (auto_refresh). Раз в сутки 05:40 МСК, цена та же. У каталога из таблицы невозможно: файла у нас не остаётся
POST /chatbots/{id}/catalog/photo-index Подготовка каталога к поиску товара по фото покупателя. Без параметров — смета, с confirm: true — работа. 0,2 ₽ за картинку. Сам поиск по фото бесплатный
GET /chatbots/{id}/rules Правила владельца (hard, style), передача человеку на денежной стадии, пометки наличия и доля соблюдения
PUT /chatbots/{id}/rules Задать правила: hard[] (ответ не уйдёт клиенту), style[] (уйдёт, нарушение посчитается), handoff_on_money, stock_overrides[]
GET /modules Манифест: что платформа открывает внешней оболочке агента — привязка к пространству Коворка, состав разделов, цены из живых источников и что разрешено именно этому ключу

Модели чат-ботов (с 06-10-26). Единый список — GET /modules → chatbots.models[]: slug (постоянный: новая версия модели получает новый слаг, старый остаётся псевдонимом с преемником), title (линейка «Вайб …»), model_name и vendor (настоящая модель и поставщик), display_name («Вайб Лайт · GPT-6» — так показываем людям), hint, price_rub за ответ, tier, vision, search, recommended, available + reason_human. Сейчас: gpt-5-nano Вайб Мини · GPT-5 nano 2 ₽ · gpt-4o-mini Вайб Старт · GPT-4o mini 2 ₽ · deepseek-v4-1-flash Вайб Экспресс · DeepSeek V4.1 Flash 2 ₽ · gpt-6-luna Вайб Лайт · GPT-6 3 ₽ (рекомендуем, по умолчанию) · gemini-3-8-flash Вайб Турбо · Gemini 3.8 Flash 5 ₽ (поиск Google) · gpt-6-1-sol Вайб Мастер · GPT-6.1 Sol 12 ₽ · claude-sonnet-5-5 Вайб Профи · Claude Sonnet 5.5 15 ₽. Сняты с выбора: gpt-5, gpt-4o, gpt-5-mini, claude-haiku-4-5 → Вайб Лайт; gpt-5.5 → Вайб Мастер; claude-sonnet-4-5-20250929, claude-opus-4-8 → Вайб Профи; gemini-3-6-flash, gemini-3-pro-preview → Вайб Турбо — боты на них отвечают преемником по его цене. Если поставщик модели отказал, бот отвечает резервной моделью по той же цене (reason_human об этом говорит); если не ответил и резерв — деньги за ответ возвращаются автоматически. В /modules → chatbots.advice[] — советы сменить модель по всем ботам аккаунта (только с доказанной причиной; пусто — советов нет).

Совет: перед интеграцией сделайте GET /capabilities — там лежит полная JSON-схема всех моделей и их параметров.


Семантика для сайта — POST /semantics

Ключевые запросы из Яндекс Вордстата для рекламного лендинга, разложенные по блокам страницы. Первый шаг перед текстами лендинга и объявлений. Право generate, MCP-двойник — build_semantics.

POST /api/agent/semantics
{
  "topic": "кухни на заказ в Казани",
  "seeds": ["кухни на заказ"],          // до 3 главных фраз, 2–4 слова без города (иначе берутся из topic)
  "depth": "quick",                     // quick — 49 ₽, до 100 ключей; deep — 149 ₽, до 500 ключей + сезонность + заголовки А/Б
  "region_ids": [43],                   // регионы Яндекса: 213 Москва, 2 СПб, 43 Казань; пусто — вся Россия
  "negative_words": ["бу", "авито"],
  "ab_headlines": false,                // заголовки А/Б и для quick
  "dry_run": false,                     // true — смета без списания
  "idempotency_key": "…"                // повтор с тем же ключом отдаёт прошлый ответ без списания
}

Ответ 200: keywords[] {phrase, freq, intent, cluster}, clusters[] {name, block: hero|benefits|pricing|how|faq|proof|lead_form|not_for_landing, intent, head, freq_sum, phrases[], headline_a?, headline_b?}, negative_suggestions[], seasonality[] {month, freq} (deep), live_calls, cached_calls, cost, balance_after. Частотность — показы в месяц по Вордстату; её никогда не придумывает модель, модель только раскладывает фразы по группам.

Деньги. Цена фиксированная за уровень; одинаковые запросы в течение 7 дней берутся из кеша. Вордстат не ответил — 503 wordstat_unavailable и полный возврат; по теме нет ни одной фразы — 422 no_phrases и полный возврат. Не хватает средств — 402 со ссылкой на пополнение; бонусы до подтверждения почты — 402 email_confirmation_required. Не больше 20 сборов в час на аккаунт (429 rate_limited): у Вордстата общая квота проекта.

Гипотеза под ключ — /landings

Агент собирает лендинг сам (Claude Code, Cursor, ChatGPT), а у нас одной командой получает то, чего у него нет: адрес, приём заявок, A/B-тест с честной статистикой и паспорт качества. Цены по решению владельца (24-09-26): запуск 990 ₽, «Про-версия победителя» 4 500 ₽; паспорт, правки и итоги — бесплатно. Настройки agent_landing_launch_price, agent_landing_pro_price. Право generate (чтение итогов — read). Пробные ключи самостоятельной регистрации лендинги не запускают (общий аккаунт — 403 sandbox_not_allowed).

Метод Что делает
POST /landings/check Паспорт без публикации. Тело: html, html_b?, assets?. 30 проверок в час
POST /landings Запуск. title, html, html_b? (отличие от A — ровно одна ось), hypothesis?, slug?, assets?, metrika_counter_id?, baseline_cr? / target_cr? (доля 0…1 или проценты 1–95 — закрепляются в плане теста), crm? (bitrix — заявки лидами в Битрикс24), idempotency_key?, dry_run?
GET /landings Мои запущенные лендинги
GET /landings/{id} Итоги по серверному движку (с 29-09-26): ab {state: insufficient_data|inconclusive|data_quality_issue|winner, verdict (early|inconclusive|srm|winner_a|winner_b — для старых клиентов), verdict_text, unit (visitors|views), a,b: visitors/views/leads/cr, p_value, ci95_pp, srm_p, plan, history, bundle, data_quality, planned_per_variant, left_views/left_leads/left_days}, leads, leads_outside_test {test, preview, unsigned}, crm, sales (Битрикс24: по вариантам leads/in_crm/deals/won/lost/revenue; ok=false — нет данных, а не ноль), ad_url_a/b, next. Победителя объявляет сервер только по закреплённому плану
POST /landings/{id}/update `variant: a
GET /landings/{id}/source Текущий код варианта для правки кусками: `variant=a
POST /landings/{id}/update c patches Правка живой страницы без полного HTML: patches: [{find, replace, all?}], `variant: a
POST /landings/{id}/pro `variant: winner

Файлы и медиа для лендинга (REST-двойники MCP, с 25-09-26). Бесплатно; лимиты и счётчики общие с MCP-инструментами, пробным ключам — 403 sandbox_not_allowed.

Метод Что делает Право
POST /uploads/image url или content_base64 (+ filename?). Скачивание — через SSRF-фильтр на адресе и на каждом редиректе. Тип — по содержимому: PNG/JPG/WEBP/GIF до 10 МБ, SVG → 415 unsupported_type. Ответ {url, mime, bytes, width, height, hint}. Отказы: 422 no_source / bad_url / fetch_failed / bad_file (больше 10 МБ — в том числе после распаковки gzip: приём обрывается на потолке, а не после скачивания), 429 daily_limit (60 файлов в сутки на ключ) / 429 fetch_limit (180 попыток скачать по url в сутки на ключ, неудачные тоже считаются), 500 store_failed (сбой записи на нашей стороне — повторить через минуту). MCP: upload_file generate
POST /uploads/links Страница lk.vibemarketolog.ru/u/{code} для человека (24 ч, до 10 файлов и 150 МБ; видео MP4/MOV/WEBM до 50 МБ; геометки удаляются). kinds: logo, work_photos, product_photos, portrait, team_photos, interior, screenshots, video; purpose до 120 знаков без ссылок и контактов. 30 ссылок в сутки (429 daily_limit). Параллельный вызов того же аккаунта — 429 busy с заголовком Retry-After: 2: повторить через 2 с. MCP: upload_link без code generate
GET /uploads/links/{code} files[] {url, mime, bytes, width, height, name, kind}, pending[] (ролики готовятся 1–2 мин), failed[], expired, hint. Только свои ссылки: чужой или неизвестный код — 404 not_found. Выданные файлы уборка больше не трогает. MCP: upload_link с code read
POST /media/check generation_id, expected_text? → text, similarity_pct, missing, replaced, repeats, speech_end_at, suggested_trim_at, verdict ok|warn, message. Отказ сервиса — 422 media_rejected с текстом, что делать. MCP: media_check read
POST /media/loop generation_id, mode: boomerang|trim, trim_at? → {url, duration, width, height, has_audio, loops_left_today}; H.264 до 720p, файл привязан к генерации и удаляется вместе с ней. MCP: video_loop generate

Медиа и файлы. Свои генерации вставляйте как vm-gen:ID в любом атрибуте (src, srcset, poster) — при запуске номер станет постоянной ссылкой (только свои готовые генерации; чужой номер останется как есть с заметкой в notes). Подписанные display_url и адреса /newuser/file/{id} тоже распознаются. Шрифты, петли видео и аудиофайлы — в assets: [{path, content_base64}]: woff2, woff, png, jpg, webp, gif, ico, mp4, webm, mp3, m4a, ogg, wav; до 6 МБ файл, до 25 МБ вместе, до 40 файлов; тип проверяется по содержимому. SVG не принимаем файлом (открытый напрямую, он исполнял бы скрипты на нашем домене) — встраивайте в разметку. Ссылки в HTML — тем же относительным путём, что path.

Что страница получает. Отдаётся под CSP sandbox плюс строгие правила: скрипты — встроенные и Метрика, сетевые запросы и отправка форм — только к нам и в Метрику, base-uri 'none'. Наш Tailwind и набор анимаций конструктора к импортированной странице НЕ добавляются. Добавляются приёмник заявок (перехватывает любую форму с полями), счётчик Метрики владельца (если указан) и маленькая подпись.

Паспорт. Блокируют запуск: поле пароля или банковской карты, нет meta viewport, нет формы с телефоном или почтой, нет галочки согласия 152-ФЗ, скрипты/стили/шрифты с чужих серверов, нераскрытые ссылки vm-gen:ID (генерация чужая или не готова), горизонтальный скролл на 360/390 px, нет кнопки на первом экране 390×844, браузер не ответил дважды (без него не проверены телефон и первый экран; деньги не списываются). Мобильные предупреждения (с 24-09-26): запрет масштаба в viewport, поля ввода мельче 16 px (iPhone увеличивает страницу), кнопки и ссылки вне текста меньше 44×44, прозрачный фон html/body (Safari iOS 26 красит панели по фону корня), видео с autoplay без muted/playsinline, скролл на 320 px и на телефоне боком (844×390), нет кнопки на первом экране повёрнутого телефона. Проверка идёт в Chrome в две волны окон, не больше трёх паспортов на сервер одновременно. Предупреждения: lang, title, H1, политика, медиа первого экрана, чужие адреса картинок, reduced-motion, мелкий текст, нечитаемые места (их цвет поправляется при запуске автоматически отдельным блоком стилей). Текст поверх картинки, видео или градиента по цвету предков не оценивается. Разметка (с 24-09-26, как у офлайн-паспорта tools/passport.mjs): заранее отмеченная галочка согласия, поле телефона с type="number" или без autocomplete="tel", ссылки t.me вместо telegram.me, @font-face без font-display — предупреждения.

Деньги и надёжность. Одно списание на запуск, журнал landing_launches с уникальным ключом: повтор с тем же idempotency_key (или тем же HTML) отдаёт прошлый результат с replayed: true. Сбой после списания — возврат по исходной операции, сайт и файлы убираются, статус refunded. Проверочная заявка идёт через настоящий приёмник POST /w/{slug}/lead и не попадает в статистику A/B.

Чат-боты: Telegram и виджет для сайта

С 10-09-26 агент может делать с ботом клиента всё то же, что человек в кабинете: создать, настроить, научить, посмотреть переписку с клиентами.

С 20-09-26 бот стал продавцом, а не только консультантом. Четыре вещи, которых не было:

⚠️ Порядок при фотографии важен для цены: сначала бесплатный поиск по каталогу, и только если каталог кадр не узнал — платное распознавание моделью. Поэтому подготовленный каталог экономит владельцу деньги на каждом фото.

Два вида ботов, разный путь создания:

Бот в Telegram Виджет на сайте
Как создаётся POST /chatbots → ссылка → человек подтверждает в Telegram POST /chatbots/site — целиком программно
Почему так Имя и согласие даёт человек в окне Telegram; обойти этот шаг нельзя Виджет живёт на сайте клиента, согласия мессенджера не требует
Абонплата 990 ₽/мес за подключённый Telegram-канал нет
Ответы клиентам платно, по цене модели бота (2–99 ₽) так же

Создать бота в Telegram

curl -X POST https://lk.vibemarketolog.ru/api/agent/chatbots \
  -H "Authorization: Bearer $VIBE_KEY" -H "Content-Type: application/json" \
  -d '{"name": "Кофейня Вайб"}'
{
  "status": "ok",
  "create_url": "https://t.me/newbot/vibemarketolog_bot/kofeinia_vaib_x7q2bot?name=Кофейня%20Вайб",
  "next": "Покажите ссылку человеку. Он подтвердит имя в окне Telegram — бот создастся и появится в его кабинете сам…"
}

Токен бота приходит нам от Telegram: клиент его не видит и никуда не копирует. Ходить в @BotFather не нужно. После подтверждения бот появляется в GET /chatbots.

⚠️ Кабинет клиента должен быть связан с Telegram (карточка «Telegram» в «Подключениях»), иначе мы не поймём, чей это бот, — метод скажет об этом прямым текстом.

Создать виджет для сайта

curl -X POST https://lk.vibemarketolog.ru/api/agent/chatbots/site \
  -H "Authorization: Bearer $VIBE_KEY" -H "Content-Type: application/json" \
  -d '{"title": "Консультант кофейни", "instructions": "Отвечай кратко и по делу…", "model": "gpt-5-mini"}'

В ответе — chatbot_id, uuid и готовый embed_code: строка <script> для вставки на сайт.

Научить бота

Порядок ровно такой, и второй шаг обязателен:

# 1. знание (5 ₽): текст или пара «вопрос — ответ»
curl -X POST .../chatbots/105/knowledge -d '{"question":"Сколько стоит доставка?","content":"По городу 300 ₽…"}'

# 2. обучение — без него знание лежит, но в ответы НЕ попадает
curl -X POST .../chatbots/105/train -d '{}'

# то же с разбором сайта клиента (10 ₽): страница читается и разбивается сама
curl -X POST .../chatbots/105/train -d '{"url":"https://example.com/dostavka","single":true}'

Ответ train содержит knowledge_ready (сколько кусков готово к работе) и failed. Если разбор страницы не удался — деньги возвращаются, и это сказано в тексте ошибки.

Настроить

# витрина бота в Telegram + правила ответов
curl -X PATCH .../chatbots/104 -d '{
  "name": "Кофейня Вайб",
  "description": "Отвечаю на вопросы о меню, доставке и заказах",
  "commands": [{"command": "menu", "description": "Меню и цены"}],
  "instructions": "Ты консультант кофейни…",
  "welcome": "Здравствуйте! Что подсказать?"
}'

# внешний вид виджета на сайте
curl -X PATCH .../chatbots/105/widget -d '{"color":"#7C3AED","position":"right","welcome_title":"Чем помочь?"}'

Названия команд — строчной латиницей (menu, price), описания к ним по-русски: это требование Telegram, и метод отвергнет кириллическую команду до вызова API.

Права ключа

Право Что открывает
read Все GET-эндпоинты: каталог моделей и цен, баланс, история генераций, статусы, каталог голосов
write Изменение объектов аккаунта: бренды и продукты Brand Voice

Как и везде в этом API, права выдаются явно: ключ без write на изменение бота получит insufficient_scope, а не молчаливый отказ.


Расходы: куда ушёл каждый рубль — /usage

Обе ручки бесплатные, нужно право read. Считают по журналу операций ключей — те же числа, что человек видит в кабинете на /agent → «Расходы по API» и в выгрузке CSV. Возвраты вычтены, сутки по Москве.

Три уровня в GET /usage:

Блок Что в нём Когда смотреть
key Только этот ключ: spent (итог), charged, refunded, bonus, operations, by_day, by_category, by_model «Сколько потратил я — этот агент»
api Все ключи API аккаунта, by_key — разбивка по ключам У человека несколько агентов на одном счёте
account Весь аккаунт, разложенный по смыслу: services — работа (кабинет, агент на сайте, API), purchases — тарифы и серверы, bonus_expired — сгоревшие бонусы, manual_debits — ручные списания Почему уменьшился баланс, хотя агент почти ничего не делал

bonus_expired — не трата: бонусы сгорели по сроку. Не называйте их расходом в отчётах человеку.

curl -s -H "Authorization: Bearer $TOKEN" \
  "https://lk.vibemarketolog.ru/api/agent/usage?days=7"
{
  "status": "ok",
  "days": 7,
  "key": {
    "key_id": 176, "spent": 264, "charged": 390, "refunded": 126, "bonus": 264, "operations": 16,
    "by_category": [{ "category": "direct", "label": "Директ и Метрика", "spent": 220, "operations": 14, "share": 83.3 }],
    "by_model": [{ "model": "gpt-image-2.5-flare-edit", "spent": 44, "operations": 2 }]
  },
  "api": { "spent": 5518, "operations": 76, "by_key": [ … ] },
  "account": { "spent": 6885.03, "services": 6885.03, "purchases": 0, "bonus_expired": 0, "manual_debits": 0 },
  "range": { "from": "…T00:00:00+03:00", "to": "…", "tz": "Europe/Moscow" },
  "history_from": "2026-07-14"
}

Период: days=1 (сегодня по Москве), 7, 30 (по умолчанию), 90, 0 — вся история; старый period=today|week|month тоже понимается. Поля total_spent, total_requests, by_day верхнего уровня оставлены для совместимости и устарели: они складывают все списания аккаунта, включая сгорание бонусов и покупки, не вычитают возвраты и режут сутки по UTC — ответ несёт их перечень в deprecated.

GET /usage/operations — операции от новых к старым. Параметры: scope=key (по умолчанию) или api, days, category (text, image, video, audio, live, wordstat, direct, landing, chatbot, presentation, server, other), limit 1–100 (50), cursor — next_cursor прошлого ответа.

{
  "id": 2932, "at": "2026-09-29T18:11:46+03:00", "kind": "charge",
  "category": "wordstat", "category_label": "Вордстат и семантика",
  "title": "Семантика для сайта (быстрая)", "model": null, "call": "POST mcp",
  "charged": 49, "refunded": 0, "spent": 49, "bonus": 49, "refunds": [],
  "generation_id": null, "transaction_id": 64729,
  "request_id": "8c7d04bc-2bbe-49ee-9f3a-16eb994e7086", "restored": true
}

Живой голос — wss /live/sessions (gpt-live-1)

С 24-09-26. Агент сам говорит и слушает во встрече или звонке в реальном времени: слышит собеседников, отвечает голосом, его можно перебить. Думает ваш агент, голос — модель OpenAI gpt-live-1. Ключ OpenAI остаётся у нас, деньги списываются рублями с баланса владельца ключа.

Цена: 15 ₽ за минуту, учёт посекундный (0,25 ₽/с), без округления до минуты.

Адрес wss://lk.vibemarketolog.ru/api/agent/live/sessions
Ключ Authorization: Bearer oc_…, право live
Тестовый режим …/live/sessions?mock=1: OpenAI не подключается, деньги не списываются, звук возвращается эхом, события vibe.* те же
Модели только gpt-live-1 (gpt-live-1-mini у OpenAI нет)
Делегирование только client: думает ваш агент. responses отклоняется кодом delegation_not_allowed
Звук audio/pcm 24000 Гц по умолчанию, 16000 Гц тоже принимается; PCM16 little-endian mono, base64
Голоса 22: родные quartz, ripple, vesper, willow, stone, gleam, meridian, bossa, tempo, beacon, delta, cinder + имена Realtime marin, cedar, alloy, ash, ballad, coral, echo, sage, shimmer, verse. Рекомендуем по кастингу 25-09-26: женские delta, quartz, marin; мужские echo, ripple, beacon. Образцы — https://lk.vibemarketolog.ru/audio/voice-previews/live/<голос>.mp3
Длина сессии до 3600 с, дальше переподключение
Сессий на ключ не больше 2 одновременно
Хранение аудио и расшифровки не сохраняются, только метаданные для счёта

Порядок

  1. POST /live/estimate {"minutes": 45}: бесплатная смета (price_rub, funds_ok, max_minutes_affordable, balance_after, blocker).
  2. Открыть WSS. Отказ приходит до соединения с OpenAI обычным HTTP-ответом с JSON {"error":{"code","message","details"}}:
HTTP code когда
401 unauthorized ключ не принят
403 insufficient_scope у ключа нет права live
403 ip_not_allowed адрес не в списке ключа
402 insufficient_balance на балансе меньше, чем на 1 минуту
402 daily_limit_exceeded суточный лимит ключа не вмещает даже 1 минуту
402 email_confirmation_required бонусные рубли тратятся только после подтверждения почты
402 spending_paused траты аккаунта приостановлены
429 too_many_sessions на ключ уже открыто 2 сессии
503 live_disabled / upstream_unavailable / relay_unavailable временно недоступно
  1. Первым приходит наше событие vibe.session.accepted {session_id, mock, models, delegation, price_per_min_rub, tick_s, max_session_s, balance}.
  2. Первым отправляете session.start (формат Live API). Прокси проверяет модель и делегирование, дальше события идут как есть в обе стороны: session.input_audio.append, session.update, session.thinking.append, session.commentary.append, session.close → session.started, session.output_audio.delta, session.input_transcript.delta, session.output_transcript.delta, session.delegation.created, session.usage.updated, session.closed.

Делегирование client: как агент отвечает голосом

Проверено вызовами 25-09-26. Когда модели нужны данные или размышления, она сама говорит «сейчас уточню» и присылает session.delegation.created {delegation: {id, target: "client"}}. Ваш агент думает и отвечает событием session.thinking.append {delegation_id, content: "текст ответа"} (или session.commentary.append): модель подтверждает …appended и произносит ответ своими словами. Поле называется content, не text. ⚠️ response.item.create и response.create в режиме client OpenAI отклоняет («requires Responses delegation»), они работают только при delegation: responses. Выход звука идёт непрерывно: в паузах приходят кадры тишины.

session.update принимает только delegation. instructions, audio (голос, формат) и tools получают unknown_parameter: всё это задаётся на session.start, для смены нужна новая сессия. session.instructions.append требует delegation_id, то есть работает только внутри делегирования. Входной звук — session.input_audio.append {audio: base64 PCM16 LE mono}, непрерывно, без commit; пауза — session.input_audio.mute / .unmute.

Служебные события прокси (префикс vibe.)

событие поля смысл
vibe.session.accepted см. выше сессия принята, ждём session.start
vibe.billing.tick seconds_total, charged_rub_total, balance_after раз в 60 с (в mock раз в 5 с) списан прирост секунд
vibe.billing.low_balance balance_after, minutes_left денег осталось на 2 минуты или меньше. Предупредите людей во встрече
vibe.session.closing reason, grace_s через grace_s секунд сессия закроется, успейте попрощаться
vibe.session.closed reason, seconds_total, charged_rub_total итог; следом закрывается сокет
error с error.type = "vibe_error" code, message отказ прокси: session_not_started, model_not_allowed, delegation_not_allowed, already_started, start_timeout, upstream_timeout, upstream_unavailable, bad_request

reason: client_close (вы отправили session.close), client_closed (сокет оборван), balance, daily_limit, max_duration, admin, policy, start_timeout, upstream_closed, upstream_error, upstream_timeout, billing_unavailable, relay_restart.

Коды закрытия сокета: 1000 норма · 4402 деньги · 4429 суточный лимит · 4408 длительность или таймаут старта · 4403 модель или делегирование · 4409 администратор · 1011 сбой поставщика или учёта · 1012 перезапуск сервиса.

В mock можно вызвать события вручную: {"type":"vibe.mock.trigger","event":"delegation"} (придёт session.delegation.created, ответ проверяется как у OpenAI), {"type":"vibe.mock.trigger","event":"low_balance"}, {"type":"vibe.mock.trigger","event":"closing","grace_s":5}. Проверка связи: {"type":"vibe.ping"}, в ответ придёт vibe.pong.

Деньги

Право live

Новый ключ: галочка «Живой голос» при создании. У существующего ключа право выдаёт владелец платформы командой php artisan agent:scope <почта> live: право добавится всем ключам этого аккаунта (кроме служебных), перевыпускать ключи не нужно.

Мини-пример (Node.js)

const ws = new WebSocket('wss://lk.vibemarketolog.ru/api/agent/live/sessions', {
  headers: { Authorization: 'Bearer ' + process.env.VIBE_KEY },
});
ws.on('message', (m) => {
  const ev = JSON.parse(m);
  if (ev.type === 'vibe.session.accepted') {
    ws.send(JSON.stringify({ type: 'session.start', session: {
      model: 'gpt-live-1', instructions: 'Ты ассистент на встрече. Говори по-русски.',
      audio: { output: { voice: 'marin' } } } }));
  }
  if (ev.type === 'session.output_audio.delta') playPcm16(ev.delta);   // 24 кГц
  if (ev.type === 'vibe.billing.low_balance') sayGoodbyeSoon();
});
// звук встречи: ws.send(JSON.stringify({ type: 'session.input_audio.append', audio: base64Pcm16 }))

Прокси моделей — тело как у поставщика (с 09-10-26)

Для агентов, которым нужен родной формат поставщика: картинки, инструменты (strict), веб-поиск, effort — без перевода в наш /generate. Шлёте тот же JSON, что OpenAI или Anthropic, на наш адрес, ключом oc_… с правом llm:proxy. Ключи поставщиков — наши, оплата в рублях с баланса ключа.

адрес формат модели
POST /api/agent/anthropic/v1/messages Anthropic Messages claude-haiku-5-5
POST /api/agent/openai/v1/responses OpenAI Responses gpt-6-luna
POST /api/agent/openai/v1/chat/completions OpenAI Chat deepseek-v4-1-flash (он же deepseek-flash); в режиме рассуждений (по умолчанию) DeepSeek на tool_choice: required или конкретную функцию отвечает 400 — используйте auto либо передайте "thinking": {"type": "disabled"} (проверено 09-10-26: тогда принудительный вызов работает)
POST /api/agent/openai/v1/decisions OpenAI Decisions (выбор / да-нет / шкала, ~0,5 с) gpt-6-luna
DELETE /api/agent/openai/v1/responses/{id} удалить свой сохранённый ответ бесплатно

Быстрый синтез коротких фраз — POST /tts/stream и POST /tts (с 09-10-26)

Короткие фразы голосами живого разговора (итог поручения, «что сейчас делаю») — дешевле и быстрее /generate type=voice. Право llm:proxy.

Русские голоса ElevenLabs v4 и свой голос — POST /tts с model (с 10-10-26)

Для уведомлений («готов ответ», «нужен ваш ответ») — лучшие русские голоса без акцента или клон своего голоса. Тот же POST /tts (и /tts/stream — с этими моделями фраза приходит одним телом), право llm:proxy.

model Что это ₽ за 1000 знаков (по факту) Фраза 150 знаков
el-v4-turbo ElevenLabs v4 Turbo — быстрее, русский поддерживает 8 1,20 ₽
el-v4 ElevenLabs v4 — выразительнее 18 2,70 ₽
my-voice свой клонированный голос аккаунта 10 1,50 ₽

Свои голоса аккаунта (право llm:proxy):

Яндекс SpeechKit — POST /tts с model: "yandex" (с 10-10-26)

Самый быстрый и дешёвый русский синтез: фраза 150 знаков приходит целиком за ~0,5 с у поставщика (~1 с через наш API), 1000 знаков — за ~5,5 с. 20 голосов носителей русского, у большинства — интонации (role), шесть голосов LiveTTS — живая разговорная речь для поддержки и продаж. Право llm:proxy.

Цена 3 ₽ за 1000 знаков по факту, минимум 0,30 ₽ за фразу (Яндекс берёт за каждый запрос целиком)
Фраза 40 / 150 / 1000 знаков 0,30 / 0,45 / 3,00 ₽
Текст 1–5000 знаков
Формат pcm (PCM16 24 кГц моно, по умолчанию — без перекодирования) или mp3
Голоса Интонации (role)
marina neutral, friendly, whisper
alena, alexander, anton, ermil, zahar neutral, good
dasha neutral, good, friendly
lera neutral, friendly
masha good, strict, friendly
julia neutral, strict
jane neutral, good, evil
omazh neutral, evil
kirill neutral, strict, good
filipp без интонаций
sofia, vera (LiveTTS) support, casual
irina (LiveTTS) neutral, formal, support, narrator, sales
denis (LiveTTS) neutral, casual, formal, sales
vasily, sergey (LiveTTS) support, sales
curl -X POST https://lk.vibemarketolog.ru/api/agent/tts \
  -H "Authorization: Bearer oc_..." -H "Content-Type: application/json" \
  -d '{"model":"yandex","voice":"kirill","role":"strict","text":"Отчёт по рекламе готов.","format":"mp3"}' -o phrase.mp3

Для файла в галерее (а не потока) — POST /generate с type: "audio", model: "yandex-tts", voice_id, role, speed: 3 ₽ за каждую начатую 1000 знаков (как в кабинете), до 5000 знаков, результат готов за ~1 с.

Живой голос: ровность звука в итоге сессии (с 09-10-26)

В vibe.session.closed есть upstream_audio: chunks, audio_s, gaps_over_200ms (паузы между кусками ВНУТРИ фразы, 200 мс–2 с), gap_max_ms, underruns_480ms_cushion, underrun_total_ms, underrun_max_ms — замер на входе релея от OpenAI, до сети к агенту. Звук не хранится. Работает и в ?mock=1.


Генерация: общая модель

POST /generate

Универсальная точка входа: одинаковый формат для всех типов (image/text/video/voice/music).

⚠️ type: "text" работает иначе остальных: он синхронный и тарифицируется по фактическим токенам. Ответ приходит в том же запросе (никакого поллинга), а деньги списываются не фикс-ценой, а по реальному расходу — см. раздел «Текстовые модели». Все остальные типы — асинхронные, с generation_id и опросом статуса.

Базовые поля:

Поле Тип Обяз. Описание
type string да image | text | video | voice | music
model string да Конкретная модель (см. GET /capabilities)
prompt string да Описание (до 20000 символов)
callback_url string нет URL для webhook-доставки результата (см. ниже)

Остальные параметры — модель-специфичные (см. далее).

Ответ

{
  "status": "processing",
  "generation_id": 5811,
  "task_id": "task_xxx",
  "cost": 196,
  "balance_after": 4504.0
}

generation_id сохраните — по нему опрашиваете статус.

GET /generation/{id}/status

{
  "status": "complete",           // pending | processing | complete | error
  "stage": "complete",            // ЕДИНОЕ поле состояния async-задачи на всех эндпоинтах (generation, voice/status, voiceover/long) — опрашивайте именно его
  "generation_id": 5811,
  "task_id": "task_xxx",
  "model": "grok-itv",
  "type": "video",
  "result_url": "https://...",    // временный URL провайдера — ПРОТУХАЕТ
  "result_urls": ["https://...", "..."],
  "display_url": "https://lk.vibemarketolog.ru/files/generation/5811?expires=…&signature=…", // подписанная, без логина, 7 дней
  "file_url": "https://lk.vibemarketolog.ru/newuser/file/5811",    // та же генерация в ЛК (нужен вход)
  "thumbnail": "https://...",
  "title": null,
  "duration": "10s",
  "cost": 196.0,
  "price_rub": 196.0,             // каноническое поле цены (то же значение, есть во всех ответах — используйте его для предохранителя бюджета)
  "error_message": null,
  "refunded": false,
  "created_at": "2026-05-11T01:50:34+00:00",
  "updated_at": "2026-05-11T01:54:12+00:00"
}

При ошибке error_message содержит человекочитаемую причину; refunded=true означает что деньги уже вернулись на баланс.

Пользователю показывайте display_url — подписанную ссылку, работающую без логина 7 дней (nullable: null, пока файл не сохранён локально; при новом опросе статуса выдаётся свежая). file_url — файл в ЛК под сессией, хранится бессрочно. result_url — временный URL провайдера, протухает; использовать не рекомендуется.


Каталог моделей и цен

Перечень ниже собирается из контракта командой php artisan agent:docs-sync и им же проверяется (--check): это тот же источник, что отдаёт GET /capabilities, поэтому число моделей и цена здесь и в API совпадают по построению, а не по внимательности редактора. Разделы ниже — примеры запросов и подводные камни — остаются рукописными.

Две модели полезно знать до чтения таблицы, потому что они меняют смету в разы: grok-image-2 (3 ₽ за картинку — в шесть раз дешевле соседей по качеству) и gpt-6-luna (30/150 ₽ за 1M токенов — в 20 раз дешевле gpt-6.1-sol на входе).

Модель по умолчанию для изображений — GPT-Image-2.5

Рекомендуем назначать gpt-image-2.5-flare моделью по умолчанию и для создания, и для редактирования изображений. Так же настроен встроенный агент платформы.

Почему именно она:

Когда брать gpt-image-2.5-sunburst: те же деньги (16 ₽), ответ дольше (22–38 с), но выше точность при серии правок — для финальных макетов под публикацию и товарной съёмки.

Для редактирования используйте -edit-варианты того же слага. Если передать image_input в обычный слаг, запрос сам уйдёт в режим правки — референсы не теряются.

Пропорции (обновлено 09-09-26). Доступны auto, 1:1, 16:9, 9:16, 4:5, 3:2, 4:3, 3:4, 5:4, 2:3, 21:9. 16:9 и 9:16 — родные, без подмены на 3:2/2:3 (прежнее ограничение было нашим и снято после замера живыми вызовами). Значение по умолчанию — auto: с image_input оно сохраняет пропорции присланного фото, без image_input кадр подбирает модель по смыслу запроса.

Рекомендуемый набор из трёх ступеней

Так настроен встроенный агент платформы, и то же самое мы советуем внешним агентам: не держите перед моделью десяток названий — держите три ступени с понятной разницей.

Ступень Модель Цена Когда
Самое дешёвое z-image 1,2 ₽ быстрый черновик; промпт не длиннее 1000 знаков
Дёшево grok-image-2 3 ₽ черновики, проверка идеи; умеет 16:9 и 9:16
По умолчанию gpt-image-2.5-flare 16 ₽ всё остальное: русский текст, прозрачный фон, ответ ~20 с
Лучшее gpt-image-2.5-sunburst 16 ₽ финальные материалы под публикацию: та же цена, дольше ответ, точнее серия правок
Актуальные данные nano-banana-2-2k 18 ₽ единственная с доступом в интернет: свежий курс, афиша, реальный факт в кадре; родной 16:9
Перерисовать сцену по референсу gpt-image-2 19 ₽ прошлое поколение: сочиняет по мотивам присланного фото, а не бережёт его. Пропорции — auto (как у исходника), 1:1, 16:9, 9:16, 4:3

Ставьте gpt-image-2.5-flare по умолчанию, а sunburst — как задел «если нужно ещё лучше». Уходить с 2.5 ради пропорции больше не нужно: все ходовые форматы у неё родные.

Правка готового изображения — -edit-варианты семейства 2.5 (22 ₽): они меняют только названное. У grok-image-2 правки по чужому файлу нет вовсе — он умеет дорабатывать лишь собственную прошлую генерацию.

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

Подробный разбор всех режимов — в навыке gpt-image-25 (GET /api/agent/skills/gpt-image-25).

Всего моделей: 72 (изображения 32, видео 22, голос и озвучка 10, музыка 4, текст (оплата по токенам) 4). Цена — та, что спишет POST /generate при дефолтных параметрах. Точная сумма конкретного запроса всегда бесплатна: POST /generate/estimate.

Изображения — 32

Модель Цена Обязательные поля Что это
z-image 1.2 ₽ prompt Fast image generation
nano-banana-pro-1k 14.4 ₽ prompt Nano Banana Pro 1K
nano-banana-pro-2k 16.5 ₽ prompt Nano Banana Pro 2K with text
nano-banana-pro-4k 23 ₽ prompt Nano Banana Pro 4K
nano-banana-2-1k 15 ₽ prompt Gemini 3.1 Flash Image 1K
nano-banana-2-2k 18 ₽ prompt Gemini 3.1 Flash Image 2K
nano-banana-2-4k 25 ₽ prompt Gemini 3.1 Flash Image 4K
nano-banana-21-1k 15 ₽ prompt Nano Banana 2.1 1K (Google, Oct 2026) — newest Flash image model: generation + editing by up to 10 references, strong Cyrillic text
nano-banana-21-2k 18 ₽ prompt Nano Banana 2.1 2K (Google, Oct 2026) — newest Flash image model: generation + editing by up to 10 references, strong Cyrillic text
nano-banana-21-4k 25 ₽ prompt Nano Banana 2.1 4K (Google, Oct 2026) — newest Flash image model: generation + editing by up to 10 references, strong Cyrillic text
nano-banana-2-lite 9 ₽ prompt Gemini 3.1 Flash Lite Image — fast & cheap, txt2img + img2img by reference
gpt-image-1.5 20 ₽ prompt GPT image generation/editing
gpt-image-2 19 ₽ prompt GPT Image 2 (OpenAI, апрель 2026) — прошлое поколение: перерисовывает сцену целиком, хорошо держит русский текст
gpt-image-2-edit 22 ₽ prompt, image_input GPT Image 2 edit — правка по референсам с полной перерисовкой сцены
gpt-image-2.5-flare 16 ₽ prompt GPT Image 2.5 Flare (OpenAI, сентябрь 2026) — быстрая повседневная генерация: безупречный русский текст на картинке, естественный свет и фактуры, прозрачный фон
gpt-image-2.5-flare-edit 22 ₽ prompt, image_input GPT Image 2.5 Flare — точечное редактирование по 1–5 референсам: меняет только названное, лица и фон остаются нетронутыми
gpt-image-2.5-sunburst 16 ₽ prompt GPT Image 2.5 Sunburst (OpenAI, сентябрь 2026) — премиум-уровень для финальных материалов: максимальный контроль над правками, рекламные макеты и товарная съёмка. Отвечает дольше Flare
gpt-image-2.5-sunburst-edit 22 ₽ prompt, image_input GPT Image 2.5 Sunburst — премиум-редактирование по 1–5 референсам для готовых к публикации макетов
seedream-4.5 15 ₽ prompt SeeDream 4.5
seedream-5-lite 15 ₽ prompt SeeDream 5 Lite
seedream-5-lite-edit 18 ₽ prompt, image_input SeeDream 5 Lite image-to-image — быстрое и дешёвое редактирование по 1–10 референсам
seedream-5-pro basic 25 / high 40 ₽ prompt SeeDream 5 Pro (ByteDance) — фотореализм до 2K, точный текст на изображении, мультиязычность
seedream-5-pro-edit basic 28 / high 45 ₽ prompt, image_input SeeDream 5 Pro image-to-image — редактирование по 1–10 референсам
seedream-5-pro-layers basic 7 / high 14 ₽ за файл × (layers + 1); по умолчанию 4 слоя → basic 35 / high 70 ₽ image_input SeeDream 5 Pro Layer Decomposition — разделяет картинку на независимые редактируемые слои (фон, передний план, текст, объекты); результат — несколько PNG: базовое изображение + каждый слой отдельным файлом
grok-image 18 ₽ prompt Grok text-to-image
grok-image-2 3 ₽ prompt Grok Imagine Image 2.0 (xAI) — генерация с нуля, самая доступная модель каталога
grok-image-2-edit 3 ₽ prompt, parent_task_id Grok Imagine Image 2.0 — доработка своей готовой картинки по текстовому описанию
qwen-image-3 7 ₽ prompt Qwen Image 3.0 (Alibaba) — фотореализм и точный текст на картинке, 1K/2K по одной цене
qwen-image-3-edit 7 ₽ prompt, image_input Qwen Image 3.0 image-to-image — редактирование по 1–10 картинкам
qwen-image-3-pro 14 ₽ prompt Qwen Image 3.0 Pro — старшая версия: сложные сцены, вёрстка и надписи
qwen-image-3-pro-edit 14 ₽ prompt, image_input Qwen Image 3.0 Pro image-to-image — точное редактирование по 1–10 картинкам
gemini-omni-character 49 ₽ prompt, image_urls Gemini Omni — консистентный персонаж из 1 фото + описания. Возвращает изображение персонажа; characterId из result_object переиспользуется в gemini-omni-video → character_ids.

Видео — 22

Модель Цена Обязательные поля Что это
gemini-omni-video 149 ₽ prompt Google Gemini Omni Flash 1.1 (с 09-10-26; движок Veo 3) — text/image/video-to-video с нативным синхронным звуком. Кастомный голос передаётся только через персонажа.
grok-ttv 36 ₽ (1-6s) · 196 ₽ (7-10s) · 316 ₽ (11-15s) prompt Grok Imagine 1.5 Text-to-Video (1-15s)
grok-itv 36 ₽ (1-6s) · 196 ₽ (7-10s) · 316 ₽ (11-15s) prompt, image_urls Grok Imagine 1.5 Image-to-Video (1-15s)
grok-extend 144 ₽ prompt, ref_task_id Extend an existing Grok video
grok-upscale 72 ₽ ref_task_id Upscale an existing Grok video
veo3_fast 120 ₽ prompt Veo 3.1 Fast
veo3.1 120 ₽ prompt Veo 3.1 quality
veo3 570 ₽ prompt Veo 3 legacy quality
kling-3.0-std 250 ₽ prompt Kling 3.0 Standard
kling-3.0-pro 549 ₽ prompt Kling 3.0 Pro
minimax-h3 222 ₽ (от 148 ₽) prompt MiniMax H3 (Hailuo 03) — 2K video with built-in stereo audio, 4-15s. Three modes in one model: text-to-video, image-to-video (opening/closing frames) and reference-to-video (image + video + audio references).
pixverse-v6 360p 4 / 540p 6 / 720p 8 / 1080p 15 ₽/сек prompt PixVerse V6 — cheapest per-second video with built-in audio, 3-15s, up to 1080p. Five modes in one model: text-to-video, image-to-video, transition between two frames, reference-to-video (1-7 tagged references) and extend of an existing clip.
seedance-2-5 480p 20 / 720p 45 / 1080p 82 ₽/сек prompt ByteDance Seedance 2.5 — flagship Seedance tier, per-second pricing, up to 30s and 1080p, native audio, image/video/audio references.
seedance-2-fast 708 ₽ prompt ByteDance Seedance 2.0 Fast — RETIRED 17-08-2026, kept for existing integrations; use seedance-2-5 instead.
seedance-2 1188 ₽ prompt ByteDance Seedance 2.0 Quality — RETIRED 17-08-2026, kept for existing integrations; use seedance-2-5 instead.
seedance-2-mini 480p 14 / 720p 31 ₽/сек prompt ByteDance Seedance 2 Mini — budget per-second tier, full features (references, audio, web search)
motion-control-720p 15 ₽/сек, 3–30 с character_image_url, reference_video_url Kling 3.0 Motion Control 720p. Transfer motion and facial expressions from a reference video onto a character image.
motion-control-1080p 22 ₽/сек, 3–30 с character_image_url, reference_video_url Kling 3.0 Motion Control 1080p HD.
omnihuman-1-5 2520 ₽ image_url, audio_url Omnihuman 1.5 (ByteDance) — talking photo: фотография + звуковая дорожка превращаются в видео, где человек на снимке произносит эту речь
volcengine-lipsync 600 ₽ video_url, audio_url Volcengine Lip Sync — готовое видео + новая звуковая дорожка: артикуляция пересобирается под новую озвучку (перевод ролика, замена диктора, правка реплики)
veed-avatar 79 ₽ avatar_id, script VEED talking-head avatar
topview-url-video 149 ₽ source_url TopView URL-to-Video preview/render workflow

Голос и озвучка — 10

Модель Цена Обязательные поля Что это
gemini-flash-tts 8 ₽ / 1000 знаков (за каждую начатую 1000) prompt Google Gemini 3.8 Flash TTS — fast, accurate, expressive text-to-speech and multi-speaker dialogue (upgraded from 3.1 on 2026-10-09). Price per-character: 8₽ per started 1000 chars.
gemini-flash-lite-tts 5 ₽ / 1000 знаков (за каждую начатую 1000) prompt Google Gemini 3.8 Flash Lite TTS — the cheapest Gemini voice: clear text-to-speech and dialogue for notifications, short phrases and bulk voiceovers. Price per-character: 5₽ per started 1000 chars.
gemini-pro-tts 18 ₽ / 1000 знаков (за каждую начатую 1000) prompt Google Gemini 2.5 Pro TTS — studio-quality, high-fidelity text-to-speech and dialogue. Price per-character: 18₽ per started 1000 chars.
el-tts-turbo 8 ₽ / 1000 знаков (за каждую начатую 1000) prompt ElevenLabs Eleven v4 Turbo — fast, natural low-latency text-to-speech (upgraded from Turbo 2.5 on 2026-10-09). Price is per-character: 8₽ per started 1000 chars.
el-tts-multilingual-v2 18 ₽ / 1000 знаков (за каждую начатую 1000) prompt ElevenLabs Eleven v4 — the most expressive ElevenLabs voice model, multi-language (upgraded from Multilingual V2 on 2026-10-09). Price is per-character: 18₽ per started 1000 chars.
el-dialogue-v3 18 ₽ / 1000 знаков (за каждую начатую 1000) prompt ElevenLabs Dialogue v3 multi-speaker conversational audio
my-voice-tts 10 ₽ / 1000 знаков (за каждую начатую 1000) prompt, cloned_voice_id Your cloned voice TTS (MiniMax) — озвучка текстa голосом, клонированным в кабинете. Price per-character: 10₽ per started 1000 chars.
yandex-tts 3 ₽ / 1000 знаков (за каждую начатую 1000) prompt Yandex SpeechKit v3 — instant Russian text-to-speech (a 150-char phrase in ~0.5 s), 20 native Russian voices with intonation roles, incl. LiveTTS conversational voices. Price per-character: 3₽ per started 1000 chars.
el-sound-fx-v2 19 ₽ prompt ElevenLabs Sound FX v2 — generate sound effects from text description
gemini-omni-audio 39 ₽ prompt Gemini Omni — кастомный голос-ассет. Возвращает audioId в result_object; аудиофайл не возвращается.

Музыка — 4

Модель Цена Обязательные поля Что это
suno-v5 89 ₽ prompt Suno V5 with vocals
suno-v5-instrumental 89 ₽ prompt Suno V5 instrumental
suno-v5.5 99 ₽ prompt Suno V5.5 next-gen AI music with vocals
suno-v5.5-instrumental 99 ₽ prompt Suno V5.5 next-gen instrumental music

Текст (оплата по токенам) — 4

Модель Цена Обязательные поля Что это
gpt-6-luna 30 / 150 ₽ за 1M токенов (вход/выход), минимум 0.5 ₽ за вызов prompt GPT-6 Luna — synchronous text generation, billed per actual tokens
claude-haiku-5-5 30 / 150 ₽ за 1M токенов (вход/выход), минимум 0.1 ₽ за вызов prompt Claude Haiku 5.5 — synchronous text generation, billed per actual tokens
gpt-6.1-sol 600 / 3000 ₽ за 1M токенов (вход/выход), минимум 1 ₽ за вызов prompt GPT-6.1 Sol — synchronous text generation, billed per actual tokens
claude-opus-5-5 1200 / 6000 ₽ за 1M токенов (вход/выход), минимум 2 ₽ за вызов prompt Claude Opus 5.5 — synchronous text generation, billed per actual tokens

Снятые модели. gpt-image-1.5 остаётся в каталоге ради совместимости, но провайдер её выключил: 146 попыток, ноль успехов. Запрос по этому имени выполняется на gpt-image-2 (19 ₽), а с image_input — на gpt-image-2-edit (22 ₽); смета возвращает цену фактического исполнителя, поэтому бюджет считайте по ней. В новых интеграциях называйте gpt-image-2.5-flare — она дешевле (16 ₽), сильнее по русскому тексту и умеет прозрачный фон.


Видео-модели — параметры и примеры

⚠️ image-to-video: правильное поле под модель

Самая частая ошибка агентов — слать image_input для видео. image_input существует только для type: image (nano-banana / gpt-image / seedream). Видео-модели его не читают → вы получите чистый text-to-video, а деньги спишутся. Используйте поле из таблицы:

Модель (type: video) Как подать исходную картинку
veo3_fast / veo3.1 / veo3 image_urls: ["..."] + generation_type: "image-to-video"
kling-3.0-std / kling-3.0-pro image_urls: ["..."]
seedance-2 / seedance-2-fast / seedance-2-mini first_frame_url: "..." (опц. last_frame_url), либо reference_image_urls: ["..."]
minimax-h3 reference_image_urls: ["..."] + h3_mode: "image" (1-я картинка — первый кадр, 2-я — последний)
pixverse-v6 image_urls: ["..."] (ровно 1 шт., pv_mode: "image"); переход между кадрами — first_frame_image_url + last_frame_image_url; сцена по референсам — image_references: [...]
grok-itv image_urls: ["..."] (ровно 1 шт., Grok 1.5) — цена считается по duration автоматически
motion-control-720p/1080p character_image_url + reference_video_url
omnihuman-1-5 image_url: "..." + audio_url: "..." (оживление фото — не image_urls!)
volcengine-lipsync video_url: "..." + audio_url: "..." (пересинхрон губ готового видео)

Не уверены, какое поле принимает модель? Сделайте GET /capabilities (required/optional по каждой модели) или POST /generate/estimate с strict=true — он покажет rejected поля без списания.

Grok Imagine 1.5 — TTV / ITV (xAI)

Единый движок grok-imagine-video-1-5-preview. Обе модели: duration 1–15 сек, resolution 480p/720p, параметра mode нет (контент-фильтр включён по умолчанию). Самый доступный способ сделать видео.

# Текст → видео, 10 секунд
curl -X POST https://lk.vibemarketolog.ru/api/agent/generate \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d '{
    "type": "video",
    "model": "grok-ttv",
    "prompt": "cinematic shot of a fox jumping in autumn forest, golden hour",
    "duration": 10,
    "resolution": "720p",
    "aspect_ratio": "16:9"
  }'

# Картинка → видео (image-to-video, до 15 сек)
# Шаг 1 — загружаем картинку
curl -X POST https://lk.vibemarketolog.ru/api/agent/upload-media \
  -H "Authorization: Bearer $TOKEN" -F "file=@hero.png"
# → { "url": "https://lk.vibemarketolog.ru/uploads/agent/123/2026-05-11/.../hero.png" }

# Шаг 2 — запускаем grok-itv с image_urls (ровно 1)
curl -X POST https://lk.vibemarketolog.ru/api/agent/generate \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d '{
    "type": "video",
    "model": "grok-itv",
    "prompt": "camera slowly zooms into product, light flicker",
    "image_urls": ["https://lk.vibemarketolog.ru/uploads/agent/..."],
    "duration": 10,
    "resolution": "720p",
    "aspect_ratio": "16:9"
  }'

Цена по длительности: зовите имена grok-ttv / grok-itv — ступень тарифа выбирается по duration автоматически (≤6 с, 7–10 с, 11–15 с), вы платите ровно за свою длительность. Точная сумма до списания — POST /generate/estimate; границы ступеней — tier_bounds в /capabilities. Имена с числовым суффиксом (grok-ttv-10 и подобные) оставлены только для совместимости со старыми интеграциями и в новых не используются: они берут фиксированную цену ступени независимо от длительности. Форматы (aspect_ratio): auto, 1:1, 16:9, 9:16, 3:2, 2:3. Расширение / апскейл: grok-extend (ref_task_id, extend_at, extend_times), grok-upscale (ref_task_id).

Veo 3.x (Google)

Кинематографическое качество, до 8 сек, нативный звук, до 1080p.

curl -X POST https://lk.vibemarketolog.ru/api/agent/generate \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d '{
    "type": "video",
    "model": "veo3_fast",
    "prompt": "morning fog rolling over a mountain lake, drone shot",
    "aspect_ratio": "16:9",
    "duration": 8,
    "resolution": "720p",
    "generate_audio": true
  }'

# Image-to-video режим:
# Передайте image_urls + generation_type=image-to-video

Seedance 2.5 (ByteDance) — флагман семейства, посекундно

Старший тир Seedance, сменивший Seedance 2.0 в кабинете (17-08-2026). Ролик до 30 секунд одним куском, до 1080p, нативный AI-звук, до 9 reference images, до 3 reference videos / audio, first_frame_url / last_frame_url для image-to-video, aspect_ratio ещё и adaptive, output_format — mp4 или mov. Модель: seedance-2-5.

Цена — посекундная: 480p 20 ₽/сек, 720p 45 ₽/сек, 1080p 82 ₽/сек. Без duration и resolution заказывается минимальный ролик — 4 секунды в 720p (180 ₽).

⚠️ Видео-референс меняет ФОРМУЛУ, а не даёт скидку. С reference_video_urls действует пониженная ставка (480p 13, 720p 28, 1080p 49 ₽/сек), но она умножается на сумму секунд исходника и результата: (input + output) × rate. Длинный исходник делает короткий ролик дороже, чем генерация вообще без референса. Референсные видео обязаны быть загружены через POST /api/agent/upload-media — их длительность мы измеряем сами, суммарно не больше 30 секунд. Точная сумма до списания — POST /generate/estimate.

Все ставки машиночитаемо: GET /capabilities → поля per_second_by_resolution и per_second_by_resolution_with_video_input.

# Ролик 10 секунд в 720p (450 ₽)
curl -X POST https://lk.vibemarketolog.ru/api/agent/generate \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d '{
    "type": "video",
    "model": "seedance-2-5",
    "prompt": "stylish young woman walking through neon-lit Tokyo street at night, slow motion",
    "aspect_ratio": "9:16",
    "duration": 10,
    "resolution": "720p",
    "generate_audio": true
  }'

# Image-to-video через first_frame_url
curl -X POST https://lk.vibemarketolog.ru/api/agent/generate \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d '{
    "type": "video",
    "model": "seedance-2-5",
    "prompt": "the model starts walking towards the camera, smiles",
    "first_frame_url": "https://lk.vibemarketolog.ru/uploads/agent/...",
    "duration": 6,
    "resolution": "1080p",
    "aspect_ratio": "9:16"
  }'

Русская озвучка (NEW). Передайте voiceover_text — русскую реплику диктора, и ролик придёт с закадровым голосом. Собственное русское произношение модели ненадёжно (она искажает слова), поэтому сцена генерируется без говорящих героев, а речь синтезирует наш TTS и подмешивает поверх звука сцены.

Цена — отдельным слоем: 13 ₽ за каждую начатую тысячу знаков сверх стоимости видео. Если синтез не удастся, стоимость слоя вернётся на баланс, а ролик придёт без голоса — за снятое видео деньги не теряются.

curl -X POST https://lk.vibemarketolog.ru/api/agent/generate \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d '{
    "type": "video",
    "model": "seedance-2-5",
    "prompt": "Cozy coffee shop, steam rising over a cup, warm morning light, slow push-in",
    "duration": 10,
    "resolution": "720p",
    "aspect_ratio": "9:16",
    "voiceover_text": "Свежая обжарка каждое утро. Заходите на чашку.",
    "voiceover_voice": "Leda"
  }'

Ограничения: prompt до 30000 знаков, duration 4–30 с, max 9 reference images, max 3 reference videos (суммарно ≤30 с), max 3 reference audio. first_frame_url/last_frame_url и reference_image_urls — взаимоисключающие сценарии, отправляйте что-то одно.

Seedance 2.0 / Fast (ByteDance) — снята с витрины

Убрана из интерфейса кабинета 17-08-2026 в пользу Seedance 2.5, но продолжает работать по API для уже интегрированных агентов. Cinematic-видео, 4-15 сек, до 9 reference images, до 3 reference videos / audio, first_frame_url и last_frame_url для image-to-video. Для новых интеграций берите seedance-2-5: она дешевле на коротких роликах и умеет до 30 секунд.

# Text-to-video, 9:16 для рилсов, Quality 1080p
curl -X POST https://lk.vibemarketolog.ru/api/agent/generate \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d '{
    "type": "video",
    "model": "seedance-2",
    "prompt": "stylish young woman walking through neon-lit Tokyo street at night, slow motion",
    "aspect_ratio": "9:16",
    "duration": 8,
    "resolution": "1080p",
    "generate_audio": true
  }'

# Image-to-video через first_frame_url
curl -X POST https://lk.vibemarketolog.ru/api/agent/generate \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d '{
    "type": "video",
    "model": "seedance-2-fast",
    "prompt": "the model starts walking towards the camera, smiles",
    "first_frame_url": "https://lk.vibemarketolog.ru/uploads/agent/...",
    "duration": 5,
    "resolution": "720p",
    "aspect_ratio": "9:16"
  }'

# С референсами (стиль / звук / движение)
curl -X POST https://lk.vibemarketolog.ru/api/agent/generate \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d '{
    "type": "video",
    "model": "seedance-2",
    "prompt": "...",
    "reference_image_urls": ["https://.../ref1.png", "https://.../ref2.png"],
    "reference_audio_urls": ["https://.../voice.mp3"],
    "duration": 10
  }'

Ограничения: prompt до 20000 chars, duration 4-15с, max 9 reference images, max 3 reference videos (общая длина ≤15с), max 3 reference audio (общая длина ≤15с).

Seedance 2 Mini (ByteDance)

Бюджетный тир Seedance с посекундной оплатой — самый дешёвый способ получить видео от ByteDance. Те же функции, что у Seedance 2.0 (референсы фото/видео/аудио, AI-звук, веб-поиск, first/last frame), но resolution только 480p/720p (без 1080p). duration 4–15с. Модель: seedance-2-mini.

curl -X POST https://lk.vibemarketolog.ru/api/agent/generate \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d '{
    "type": "video",
    "model": "seedance-2-mini",
    "prompt": "first-person kitchen baking vlog, hands only, warm morning light",
    "aspect_ratio": "16:9",
    "duration": 8,
    "resolution": "720p",
    "generate_audio": true
  }'

Форматы: 16:9, 4:3, 1:1, 3:4, 9:16, 21:9. Остальные лимиты — как у Seedance 2.0.

MiniMax H3 (Hailuo 03) — 2K со встроенным звуком

Флагман MiniMax: видео 2560×1440 со встроенной стереодорожкой — звук генерируется вместе с картинкой в одном проходе, отдельная озвучка не нужна. Длительность 4–15 с, prompt до 7000 знаков. Модель: minimax-h3.

Биллинг: per-second, 37 ₽/сек. Полная формула провайдера:

цена = 37 ₽ × (длительность результата + длительность ВХОДНОГО видео) + 11 ₽ × (изображений сверх 5)

Аудио-референсы бесплатны. Точную сумму до списания всегда отдаёт POST /generate/estimate.

Три режима — параметр h3_mode:

h3_mode Что делает Что требует
text (по умолчанию) видео целиком по описанию prompt + aspect_ratio
image оживление опорных кадров: 1-я картинка — начало, 2-я — финал reference_image_urls (1–2). aspect_ratio игнорируется — пропорции берутся из кадра
reference мультимодальная сборка: камера с одного источника, герой со второго, голос из третьего минимум одно из reference_image_urls / reference_video_urls

Режим определяется по фактическому составу входов, а не только по слову клиента: если прислать видео или аудио, запрос уйдёт как reference, даже когда в h3_mode указан text — присланные файлы не выбрасываются молча.

# Режим reference: движение камеры из видео, персонаж из фото, голос из аудио
curl -X POST https://lk.vibemarketolog.ru/api/agent/generate \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d '{
    "type": "video",
    "model": "minimax-h3",
    "h3_mode": "reference",
    "prompt": "Возьми движение камеры из Видео 1, персонажа из Изображения 2, голос из Аудио 3",
    "reference_video_urls": ["https://lk.vibemarketolog.ru/uploads/agent/.../camera.mp4"],
    "reference_image_urls": ["https://lk.vibemarketolog.ru/uploads/agent/.../hero.jpg"],
    "reference_audio_urls": ["https://lk.vibemarketolog.ru/uploads/agent/.../voice.mp3"],
    "duration": 10,
    "aspect_ratio": "16:9"
  }'

Форматы: 21:9, 16:9, 4:3, 1:1, 3:4, 9:16, а в режиме reference ещё и adaptive (пропорции исходника).

Ограничения и подводные камни:

PixVerse V6 — пять режимов и самый дешёвый тариф каталога

Секунда видео от 4 ₽ — самая доступная видео-модель API. Звук генерируется вместе с картинкой (generate_audio: true), длительность 3–15 с, prompt до 5000 знаков, разрешение 360p / 540p / 720p / 1080p. Модель: pixverse-v6.

Биллинг: per-second, тариф — пара «разрешение + звук»:

Разрешение Без звука Со звуком
360p 4 ₽/сек 6 ₽/сек
540p 6 ₽/сек 8 ₽/сек
720p 8 ₽/сек 10 ₽/сек
1080p 15 ₽/сек 19 ₽/сек

Цена = тариф × duration. Режим на цену не влияет: extend оплачивает только запрошенные секунды продолжения, а не длину исходника. Точную сумму до списания отдаёт POST /generate/estimate.

Пять режимов — параметр pv_mode:

pv_mode Что делает Что требует
text (по умолчанию) ролик целиком по описанию prompt + aspect_ratio
image оживление одного фото image_urls — ровно 1 шт. (второе изображение провайдер примет только с template_id)
transition готовый переход между двумя кадрами first_frame_image_url + last_frame_image_url
reference сцена по референсам с именами image_references — 1–7 ссылок
extend продление готового ролика video_url или parent_task_id своей завершённой генерации pixverse-v6

pv_mode можно не указывать — режим выводится из фактического состава входов. aspect_ratio (16:9, 4:3, 1:1, 3:4, 9:16, 2:3, 3:2, 21:9) применяется только в text и reference: в остальных режимах пропорции берутся из исходника.

# Сцена по референсам: имена Image1…Image7 присваиваются автоматически по порядку
curl -X POST https://lk.vibemarketolog.ru/api/agent/generate \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d '{
    "type": "video",
    "model": "pixverse-v6",
    "pv_mode": "reference",
    "prompt": "Персонаж с @Image1 берёт товар с @Image2 и улыбается в камеру",
    "image_references": [
      "https://lk.vibemarketolog.ru/uploads/agent/.../hero.jpg",
      "https://lk.vibemarketolog.ru/uploads/agent/.../product.jpg"
    ],
    "duration": 8,
    "resolution": "720p",
    "generate_audio": true,
    "aspect_ratio": "9:16"
  }'

Ограничения и подводные камни:

Kling 3.0 Motion Control

Перенос движений с reference-видео на загруженного персонажа (танцы / жесты / мимика). Сохраняет черты лица и идентичность героя из фото.

Биллинг: per-second. Цена = ceil(video_duration) × per_sec ₽, где video_duration ограничен 3–30 секундами.

Ограничения:

# Шаг 1 — загружаем фото персонажа
IMG_URL=$(curl -s -X POST https://lk.vibemarketolog.ru/api/agent/upload-media \
  -H "Authorization: Bearer $TOKEN" -F "file=@character.png" | jq -r .url)

# Шаг 2 — загружаем reference-видео с движением (бэкенд ffprobe вернёт duration)
RESP=$(curl -s -X POST https://lk.vibemarketolog.ru/api/agent/upload-media \
  -H "Authorization: Bearer $TOKEN" -F "file=@dance_reference.mp4")
VID_URL=$(echo "$RESP" | jq -r .url)
DUR=$(echo "$RESP" | jq -r .duration)   # например 13.23

# Шаг 3 — запускаем (по умолчанию orient=video — переносит позу/повороты из видео)
curl -X POST https://lk.vibemarketolog.ru/api/agent/generate \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d "{
    \"type\": \"video\",
    \"model\": \"motion-control-720p\",
    \"character_image_url\": \"$IMG_URL\",
    \"reference_video_url\": \"$VID_URL\",
    \"character_orientation\": \"video\",
    \"video_duration\": $DUR,
    \"prompt\": \"smooth dance moves, cinematic lighting\"
  }"

Параметры:

Поле Тип Обязат. Описание
character_image_url url ✅ Фото персонажа (whose face/identity to use)
reference_video_url url ✅ Видео-донор движений
character_orientation enum — video (default, до 30s видео) или image (до 10s видео)
video_duration float — Длительность видео в секундах. Если не передан — backend сам через ffprobe выяснит. Влияет на биллинг
prompt string — Текстовая подсказка, до 2500 chars
model enum ✅ motion-control-720p или motion-control-1080p

Что НЕ передавать: поле background_source (input_video/input_image) — Оператор (Kling 3.0 prod-прокси) его игнорирует, удалено из API ещё в мае 2026.

Kling 3.0 (std / pro)

curl -X POST https://lk.vibemarketolog.ru/api/agent/generate \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d '{
    "type": "video",
    "model": "kling-3.0-pro",
    "prompt": "...",
    "aspect_ratio": "16:9",
    "image_urls": ["https://.../start.png"],
    "duration": 5,
    "sound": true
  }'

VEED Avatar

Говорящая голова из текста.

curl -X POST https://lk.vibemarketolog.ru/api/agent/generate \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d '{
    "type": "video",
    "model": "veed-avatar",
    "avatar_id": "anna_pro",
    "script": "Привет! Расскажу про новинку нашего магазина.",
    "language": "ru",
    "prompt": "AI avatar speech"
  }'

TopView URL-to-Video

Вставка URL продукта → AI создаёт рекламный ролик.

curl -X POST https://lk.vibemarketolog.ru/api/agent/generate \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d '{
    "type": "video",
    "model": "topview-url-video",
    "source_url": "https://example.com/product",
    "video_length": 30,
    "language": "ru",
    "prompt": "promo video"
  }'

Особенность: превью-фаза бесплатна. HD-рендер оплачивается отдельно при подтверждении.


Текстовые модели (type=text)

Добавлено 29-07-2026. Синхронная генерация текста флагманскими моделями. Оплата — по фактическим токенам, а не фикс-ценой за вызов: у текста нет заранее известного «размера ответа».

Чем отличается от остальных типов:

Медиа (image/video/voice/music) Текст (type: "text")
Ответ status: processing + generation_id, дальше поллинг status: complete + готовый text сразу
Цена фикс по прайсу модели по фактическим токенам, минимум 2 ₽ за вызов
Списание сразу вся цена резерв по max_tokens → пересчёт → возврат разницы в том же ответе

Модели и ставки (живой список с ценами — GET /capabilities → text_models):

Модель Вход, ₽/1M токенов Выход, ₽/1M Контекст Потолок ответа
claude-opus-5-5 1200 6000 200 000 8192
gpt-6.1-sol 600 (кеш 30) 3000 1 050 000 8192
gpt-6-luna 30 150 1 050 000 8192

Ориентир: промпт на 1000 токенов с ответом на 300 токенов — около 3 ₽ (Opus 5.5), 1.5 ₽ (GPT-6.1 Sol) и копейки (GPT-6 Luna, но минимум за вызов 0.5 ₽).

Снятые модели (22-09-26). claude-opus-5, gpt-5.6-sol, gpt-5.6-terra, gpt-5.6-luna из каталога убраны, но запрос по их имени (в том числе с префиксом chat-) принимается и выполняется преемником: Opus 5 → claude-opus-5-5, Sol и Terra → gpt-6.1-sol, Luna → gpt-6-luna. Цена — по ставкам преемника, поле model в ответе называет его. С 09-10-26 так же снят gpt-6-sol: запрос по этому имени выполняет gpt-6.1-sol — те же 600 / 3000 ₽ за 1M, а чтение кеша вдвое дешевле (30 ₽ против 60 ₽). Вход длиннее 272 000 токенов у OpenAI дороже — 1200 / 4500 ₽ за 1M (кеш 60 ₽), считаем по этой ставке. У claude-opus-5-5 размышления не отключаются: thinking:false просто не включает показ, экономить — через effort.

Поля запроса:

Поле Тип Обяз. Описание
prompt string да Задание модели (до 200 000 знаков; реальный потолок ставит оценка входных токенов)
system string нет Системная инструкция — роль, тон, формат ответа
max_tokens int нет Потолок ответа. От него считается резерв, поэтому не завышайте без нужды
effort string нет low | medium | high | xhigh | max — глубина работы модели
thinking bool нет Размышления. По умолчанию false: они считаются по ставке вывода и заметно удорожают простые задачи
curl -s -X POST https://lk.vibemarketolog.ru/api/agent/generate \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d '{
    "type": "text",
    "model": "claude-opus-5-5",
    "system": "Ты копирайтер. Пиши по-русски, без эмодзи.",
    "prompt": "Пост для телеграм-канала кофейни про сезонный напиток, 2 абзаца.",
    "max_tokens": 1500
  }'

Ответ:

{
  "status": "complete",
  "generation_id": 26118,
  "type": "text",
  "model": "claude-opus-5-5",
  "text": "Осень пришла в наше меню: встречайте тыквенный латте…",
  "stop_reason": "end_turn",
  "usage": { "input": 69, "output": 289, "cache_read": 0, "cache_write": 0 },
  "cost": 2.28,
  "reserved": 11.48,
  "refunded": 9.2,
  "balance_after": 5977.25
}

Как читать деньги в ответе: reserved — сколько заняли на время работы, cost — сколько реально списали, refunded — сколько вернули на баланс в этом же вызове. Дневной лимит ключа расходуется на cost, а не на reserved.

Смета до списания (бесплатно): POST /generate/estimate с type: "text" возвращает reserve_rub (верхняя граница), estimated_input_tokens, ставки rub_per_1m и предупреждения — например, что промпт длиннее лимита или что резерв не проходит по дневному лимиту ключа.

Что нужно знать:


Изображения / звук / музыка

Изображения

# Z-Image (быстрая)
curl -X POST https://lk.vibemarketolog.ru/api/agent/generate \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d '{"type":"image","model":"z-image","prompt":"cyberpunk warrior, neon","aspect_ratio":"1:1"}'

# Nano Banana Pro 2K с правкой существующего изображения
curl -X POST https://lk.vibemarketolog.ru/api/agent/generate \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d '{
    "type": "image",
    "model": "nano-banana-pro-2k",
    "prompt": "remove the watermark, brighten",
    "image_input": "https://lk.vibemarketolog.ru/uploads/agent/...",
    "aspect_ratio": "16:9"
  }'

# Nano Banana 2 Lite (Gemini 3.1 Flash Lite) — быстро и дёшево, txt2img + img2img
curl -X POST https://lk.vibemarketolog.ru/api/agent/generate \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d '{
    "type": "image",
    "model": "nano-banana-2-lite",
    "prompt": "add a cheerful hat to the character, keep everything else",
    "image_input": "https://lk.vibemarketolog.ru/uploads/agent/...",
    "aspect_ratio": "1:1"
  }'
# ⚠️ Lite поддерживает aspect_ratio только 1:1 / 2:3 / 3:2 / 3:4 / 4:3 / 4:5 / 5:4 / auto
#    (16:9, 9:16, 21:9 автоматически маппятся на ближайший). image_input до 10 шт.

# SeeDream 5 Pro (ByteDance) — фотореализм до 2K, точный текст на картинке
curl -X POST https://lk.vibemarketolog.ru/api/agent/generate \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d '{
    "type": "image",
    "model": "seedream-5-pro",
    "prompt": "рекламный баннер салона красоты, крупный текст «САЛОН КРАСОТЫ»",
    "aspect_ratio": "1:1",
    "quality": "high",
    "output_format": "png"
  }'
# quality: basic=1K (дешевле) / high=2K. output_format: png|jpeg.

# SeeDream 5 Pro Edit — image-to-image по 1–10 референсам
curl -X POST https://lk.vibemarketolog.ru/api/agent/generate \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d '{
    "type": "image",
    "model": "seedream-5-pro-edit",
    "prompt": "объедини товар и фон в один премиальный баннер",
    "image_input": ["https://lk.vibemarketolog.ru/uploads/agent/...", "https://lk.vibemarketolog.ru/uploads/agent/..."],
    "quality": "high"
  }'
# image_input: 1–10 стабильных URL (POST /api/agent/upload-media).

# Qwen Image 3.0 (Alibaba) — 2K по цене 1K, ровный текст на картинке
curl -X POST https://lk.vibemarketolog.ru/api/agent/generate \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d '{
    "type": "image",
    "model": "qwen-image-3",
    "prompt": "витрина кофейни, меловая доска с надписью «КОФЕ 149 ₽», тёплый свет",
    "aspect_ratio": "16:9",
    "resolution": "2K",
    "output_format": "png",
    "negative_prompt": "водяные знаки, лишние надписи",
    "seed": 12345,
    "prompt_extend": true
  }'
# ⚠️ prompt ≤ 800 символов — длиннее отклоняется ДО списания.
# resolution 1K|2K стоит одинаково → берите 2K. prompt_extend=true (по умолчанию):
# модель сама разворачивает короткое описание. seed: 0..2147483647, один и тот же
# сид даёт близкие кадры (серия в одном стиле). Старшая версия — qwen-image-3-pro.

# Qwen Image 3.0 Edit — редактирование по 1–10 картинкам (или qwen-image-3-pro-edit)
curl -X POST https://lk.vibemarketolog.ru/api/agent/generate \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d '{
    "type": "image",
    "model": "qwen-image-3-pro-edit",
    "prompt": "замени содержимое постера на витрине, остальное не трогай",
    "image_input": ["https://lk.vibemarketolog.ru/uploads/agent/..."],
    "resolution": "2K"
  }'

# GPT Image 2 / Grok Image — аналогично

Музыка (Suno V5 / V5.5)

Модели: suno-v5 (89₽), suno-v5-instrumental (89₽), suno-v5.5 (99₽, улучшенное качество), suno-v5.5-instrumental (99₽).

curl -X POST https://lk.vibemarketolog.ru/api/agent/generate \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d '{
    "type": "music",
    "model": "suno-v5.5",
    "prompt": "energetic upbeat pop song about freedom",
    "lyrics": "Verse 1: ...\nChorus: ...",
    "music_style": "pop",
    "style_tags": "upbeat, energetic",
    "vocal_gender": "f",
    "persona_id": "OPTIONAL_CUSTOM_VOICE_ID"
  }'

persona_id — кастомный голос, созданный через POST /voice/validate workflow (см. раздел «Клонирование голоса»).

Gemini Omni — видео + персонаж + голос (Google, движок Veo 3) 🆕

Связанная экосистема: создайте кастомный голос, привяжите его к персонажу, затем подставьте персонажа в видео (character_ids). Голос звучит через персонажа. Русская озвучка по умолчанию.

gemini-omni-video (type: video) — text/image/video-to-video с нативным синхронным звуком. Цена по разрешению: 720p — от 149₽, 1080p — от 299₽, 4K — от 590₽.

Параметр Описание
prompt ✅ описание ролика
image_urls до 7 фото → image-to-video (стабильные URL, POST /upload-media)
video_list [{"url":"...","start":0,"ends":8}] → video-to-video (1 клип ≤100MB, ≤30с; ends-start ≤10с; при видео длительность определяет модель)
character_ids до 3 персонажей из gemini-omni-character (персонаж несёт свой голос)
duration 4 / 6 / 8 / 10
aspect_ratio 16:9 / 9:16
resolution 720p / 1080p / 4k
lang ru (по умолч., русская озвучка) или off
seed число (опц.)

⚠️ Фильтр безопасности Google отклоняет (HTTP 400 PUBLIC_ERROR_UNSAFE_GENERATION) сцены риска — люди на высоте, трюки, оружие, реальные знаменитости. Это касается и текста, и загруженных image_urls/video_list/character_ids: если заблокировано с вложением — причина чаще в самом видео/фото, а не в тексте. Средства автоматически возвращаются.

🎙️ Голос в видео — ТОЛЬКО через персонажа. Не передавайте audio_ids напрямую в gemini-omni-video — Оператор отклоняет это content-policy фильтром («flagged ... violating content policies») для любого голоса. Правильно: создайте персонажа с голосом (gemini-omni-character + audio_ids), затем передайте его character_ids в видео — персонаж говорит этим голосом. Без своего голоса модель озвучивает сама на русском (lang:"ru").

curl -X POST https://lk.vibemarketolog.ru/api/agent/generate \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d '{
    "type":"video","model":"gemini-omni-video",
    "prompt":"Кот-маркетолог презентует AI-платформу, неоновая студия",
    "duration":8,"aspect_ratio":"16:9","resolution":"1080p","lang":"ru",
    "character_ids":["CHAR_ID_FROM_OMNI_CHARACTER"]
  }'

gemini-omni-character (type: image, 49₽) — консистентный персонаж из 1 фото + описания. audio_ids (из gemini-omni-audio) привязывает голос к персонажу. Возвращает изображение; result_object.characterId (в GET /generation/{id}/status) → используйте в видео character_ids.

curl -X POST https://lk.vibemarketolog.ru/api/agent/generate \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d '{"type":"image","model":"gemini-omni-character","prompt":"Дружелюбный кот-маскот, фиолетовый неон","image_urls":["https://.../photo.jpg"],"character_name":"ВайбКот","audio_ids":["AUDIO_ID_FROM_OMNI_AUDIO"]}'

gemini-omni-audio (type: voice, 39₽) — кастомный голос-ассет. prompt = название, audio_id = базовый тембр (30 пресетов: achernar, puck, kore, fenrir, sulafat…). НЕ возвращает аудиофайл — только result_object.audioId → передайте его в gemini-omni-character (audio_ids), а персонажа уже в видео (character_ids).

curl -X POST https://lk.vibemarketolog.ru/api/agent/generate \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d '{"type":"voice","model":"gemini-omni-audio","prompt":"Голос бренда","audio_id":"puck","voice_description":"энергичный молодой мужской голос"}'

Рабочий процесс (голос → персонаж → видео): 1) создать голос (gemini-omni-audio) → audioId; 2) создать персонажа (gemini-omni-character + audio_ids:[audioId]) → characterId (персонаж несёт голос); 3) видео (gemini-omni-video) с character_ids:[characterId]. ⚠️ audio_ids напрямую в видео НЕ передавать — блокируется.

Оживить и Озвучить — Omnihuman 1.5 + Lip-Sync 🆕

Два способа: оживить фото (фото говорит/поёт под аудио) и переозвучить видео (пересинхрон губ под новое аудио). Обе модели — посекундная оплата: списывается ceil(длительность) × тариф (минимум 3 сек). Длительность определяется сервером автоматически по загруженным файлам.

omnihuman-1-5 (type: video) — фото + аудио → видео, где субъект (человек/питомец/аниме) говорит/поёт с точным лип-синком. Длина видео = длине аудио. Тариф: 720p — 32₽/сек, 1080p — 42₽/сек.

Параметр Описание
image_url ✅ портрет ≤10MB (jpeg/png/webp), любое соотношение (POST /upload-media)
audio_url ✅ вокал ≤10MB, <60с (рекомендуется ≤15с)
prompt описание манеры/мимики (опц., ≤1000)
resolution 720 / 1080 (по умолч. 1080)
mask_url маски субъектов от omnihuman-1-5/human-identification — для группового фото (кто именно говорит)
pe_fast_mode true — быстрее за счёт качества
anim_seed число для воспроизводимости (-1 = случайный)
IMG=$(curl -s -X POST https://lk.vibemarketolog.ru/api/agent/upload-media \
  -H "Authorization: Bearer $TOKEN" -F "file=@portrait.jpg" | jq -r .url)
AUD=$(curl -s -X POST https://lk.vibemarketolog.ru/api/agent/upload-media \
  -H "Authorization: Bearer $TOKEN" -F "file=@voice.mp3" | jq -r .url)
curl -X POST https://lk.vibemarketolog.ru/api/agent/generate \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d "{\"type\":\"video\",\"model\":\"omnihuman-1-5\",\"image_url\":\"$IMG\",\"audio_url\":\"$AUD\",\"resolution\":\"1080\",\"prompt\":\"уверенно поёт в микрофон, естественная мимика\"}"

omnihuman-1-5/human-identification (type: video, бесплатно) — служебная детекция субъектов на фото. Возвращает result_object.subject_status (1 — чёткий герой распознан, 0 — лучше взять фото крупным планом). Используйте перед omnihuman-1-5 как проверку пригодности фото; для групповых фото маски подставляются в omnihuman-1-5.mask_url.

curl -X POST https://lk.vibemarketolog.ru/api/agent/generate \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d "{\"type\":\"video\",\"model\":\"omnihuman-1-5/human-identification\",\"image_url\":\"$IMG\"}"
# затем GET /generation/{id}/status → result_object.subject_status

volcengine-lipsync (type: video) — готовое видео + новое аудио → пересинхрон губ. Оплата по max(длина видео, длина аудио). Тариф: Lite — 10₽/сек, Basic — 14₽/сек.

Параметр Описание
video_url ✅ видео ≤500MB (mp4/mov/mkv)
audio_url ✅ вокал ≤10MB
lipsync_mode lite (быстро) / basic (качество, поддерживает open_scenedet)
separate_vocal true — шумоподавление/выделение вокала
open_scenedet сегментация сцен и спикеров (только basic)
align_audio зацикливать видео под длинное аудио (только lite)
align_audio_reverse зацикливание «туда-обратно» (только lite, требует align_audio)
templ_start_seconds старт шаблонного видео, сек (только lite)
VID=$(curl -s -X POST https://lk.vibemarketolog.ru/api/agent/upload-media \
  -H "Authorization: Bearer $TOKEN" -F "file=@clip.mp4" | jq -r .url)
AUD=$(curl -s -X POST https://lk.vibemarketolog.ru/api/agent/upload-media \
  -H "Authorization: Bearer $TOKEN" -F "file=@new_voice.mp3" | jq -r .url)
curl -X POST https://lk.vibemarketolog.ru/api/agent/generate \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d "{\"type\":\"video\",\"model\":\"volcengine-lipsync\",\"video_url\":\"$VID\",\"audio_url\":\"$AUD\",\"lipsync_mode\":\"basic\",\"open_scenedet\":true}"

💡 Посекундная оплата: перед запуском оцените стоимость — длительность × тариф. Например, lip-sync Basic для 3-минутного ролика (180с) ≈ 2520₽. Точная цена возвращается в ответе generate (поле cost).

Голос (ElevenLabs — 4 модели + Google Gemini TTS — 2 модели)

Модели ElevenLabs:

Модели Google Gemini TTS (одиночная озвучка + диалоги, 30 фирменных голосов, эмоции тегами в тексте — см. раздел «Gemini TTS» ниже):

⚠️ ВАЖНО про выбор голоса. Чтобы голос отличался от стандартного, в КАЖДОМ запросе передавайте voice_id. Если его не передать — всегда звучит голос по умолчанию Rachel (женский). Поэтому, если нужен мужской/другой голос, его обязательно надо указать явно.

Как выбрать голос (рабочий процесс):

  1. Получите каталог: GET /api/agent/voices (можно с фильтром ?gender=male).
  2. Возьмите поле id нужного голоса (это либо имя вроде Roger/Brian, либо ID вроде EkK5I93UQWFDigLMpZcX).
  3. Передайте это значение в voice_id при генерации. Принимается и алиас voice — это одно и то же.

TTS (single speaker):

# Сначала подобрать мужской голос:
curl -s -H "Authorization: Bearer $TOKEN" "https://lk.vibemarketolog.ru/api/agent/voices?gender=male" | jq '.voices[].id'

# Затем озвучить им (voice_id = id из каталога):
curl -X POST https://lk.vibemarketolog.ru/api/agent/generate \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d '{
    "type": "voice",
    "model": "el-tts-turbo",
    "prompt": "Привет, мир! Это тестовая озвучка мужским голосом.",
    "voice_id": "Roger",
    "language_code": "ru"
  }'

voice_id — значение поля id из GET /api/agent/voices: имя голоса (Roger, Brian, Bella) или ID (EkK5I93UQWFDigLMpZcX). Без него используется дефолт Rachel. Алиас: voice.

Длинная озвучка (prompt > 5000 знаков, только el-tts-turbo):

Текст от 5001 до 200 000 знаков не отклоняется, а автоматически обрабатывается как «длинная озвучка»: нарезка на куски ~4800 знаков по границам предложений → последовательная озвучка через очередь (с контекстом соседних кусков для плавной интонации) → склейка в один mp3. Цена та же посимвольная (8₽ за каждую начатую 1000 знаков от полного текста: 14 920 знаков = 120₽), списывается при старте, при ошибке возвращается автоматически.

/generate в этом случае возвращает НЕ generation_id, а проект озвучки:

{
  "status": "processing",
  "long_voiceover": true,
  "voiceover_id": 12,
  "chars": 14920,
  "chunks": 4,
  "cost": 120,
  "status_url": "https://lk.vibemarketolog.ru/api/agent/voiceover/long/12",
  "hint": "Poll status_url every 20-30 seconds..."
}

Прогресс и результат — GET /api/agent/voiceover/long/{id} (скоуп read):

curl -s -H "Authorization: Bearer $TOKEN" https://lk.vibemarketolog.ru/api/agent/voiceover/long/12
# processing: {"status":"processing","stage":"processing","chunks_done":2,"chunks_total":4,...}
# готово:     {"status":"complete","generation_id":24001,"display_url":"https://...","duration":812,...}
# ошибка:     {"status":"error","error_message":"...","refunded":true}

Ориентир по времени: ~30–60 секунд на кусок (4 куска ≈ 2–4 минуты). Поллинг каждые 20–30 секунд. idempotency_key поддерживается так же, как в обычном generate. callback_url для длинной озвучки пока не поддерживается — используйте поллинг status_url.

Multilingual TTS (расширенные настройки):

curl -X POST https://lk.vibemarketolog.ru/api/agent/generate \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d '{
    "type": "voice",
    "model": "el-tts-multilingual-v2",
    "prompt": "Привет! Это качественная озвучка.",
    "voice_id": "Bella",
    "stability": 0.5,
    "similarity_boost": 0.75,
    "style": 0.3,
    "speed": 1.0,
    "previous_text": "Текст перед этим абзацем для плавности",
    "next_text": "Текст после для плавности"
  }'

Диалог (мультиспикер):

curl -X POST https://lk.vibemarketolog.ru/api/agent/generate \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d '{
    "type": "voice",
    "model": "el-dialogue-v3",
    "prompt": "placeholder",
    "dialogue": [
      {"voice_id": "JBFqnCBsd6RMkjVDRZzb", "text": "Привет! Как дела?"},
      {"voice_id": "Xb7hH8MSUJpSbSDYk0k2", "text": "Отлично! А у тебя?"},
      {"voice_id": "JBFqnCBsd6RMkjVDRZzb", "text": "[whispers] У меня секрет..."}
    ],
    "stability": 0.5,
    "language_code": "ru"
  }'

Популярные пары: George (JBFqnCBsd6RMkjVDRZzb) ♂ + Alice (Xb7hH8MSUJpSbSDYk0k2) ♀, Rachel ♀ + Brian ♂. Stage directions: [whispers], [laughs], [яростно].

Звуковые эффекты:

curl -X POST https://lk.vibemarketolog.ru/api/agent/generate \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d '{
    "type": "voice",
    "model": "el-sound-fx-v2",
    "prompt": "thunder and heavy rain in a forest",
    "duration_seconds": 8,
    "prompt_influence": 0.7
  }'

Gemini TTS (Google — озвучка и диалоги)

gemini-flash-tts (13₽/1000 знаков) и gemini-pro-tts (18₽/1000 знаков) — синтез речи Google с 30 фирменными голосами, живыми интонациями и эмоциями прямо в тексте. Обе модели умеют одиночную озвучку (1 голос) и диалог (1–2 голоса). Тариф посимвольный — как у el-tts-turbo, но 13/18₽ за начатую 1000 знаков. Лимит 5000 знаков за запрос; больше — авто «длинная озвучка» (см. ниже, voiceover_id+status_url).

30 голосов: Zephyr, Puck, Charon, Kore, Fenrir, Leda, Orus, Aoede, Callirrhoe, Autonoe, Enceladus, Iapetus, Umbriel, Algieba, Despina, Erinome, Algenib, Rasalgethi, Laomedeia, Achernar, Alnilam, Schedar, Gacrux, Pulcherrima, Achird, Zubenelgenubi, Vindemiatrix, Sadachbia, Sadaltager, Sulafat. По умолчанию — Zephyr.

Параметры (все опциональны, кроме prompt):

Одиночная озвучка:

curl -X POST https://lk.vibemarketolog.ru/api/agent/generate \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d '{
    "type": "voice",
    "model": "gemini-flash-tts",
    "prompt": "[радостно] Привет! [шёпотом] А теперь маленький секрет.",
    "voice_name": "Zephyr",
    "style": "Deadpan",
    "temperature": 1
  }'

Диалог (1–2 голоса):

curl -X POST https://lk.vibemarketolog.ru/api/agent/generate \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d '{
    "type": "voice",
    "model": "gemini-pro-tts",
    "prompt": "placeholder",
    "speakers": [
      {"speaker_id": "Speaker 1", "voice_name": "Puck", "style": "Newscaster"},
      {"speaker_id": "Speaker 2", "voice_name": "Kore", "style": "Deadpan"}
    ],
    "dialogue_turns": [
      {"speaker_id": "Speaker 1", "text": "[воодушевлённо] Привет! Как продвигается запуск?"},
      {"speaker_id": "Speaker 2", "text": "[спокойно] Отлично, уже почти всё готово."}
    ]
  }'

Длинная озвучка (prompt > 5000 знаков) работает и для gemini-flash-tts/gemini-pro-tts — тот же посимвольный тариф (13/18₽/1000 от полного текста), тот же ответ voiceover_id+status_url (см. «Длинная озвучка» выше). Точная смета — через POST /generate/estimate и GET /prices.

Мой голос — my-voice-tts (10₽/1000 знаков)

Озвучка текста голосом, клонированным в личном кабинете (MiniMax). Обязательные поля: prompt (текст, ≤5000 знаков) и cloned_voice_id — id вашего клонированного голоса; опционально speed (0.7–1.2). Голос обязан принадлежать владельцу API-ключа, иначе отказ «Голос не найден» с возвратом. Списание — за каждую начатую 1000 знаков (10 ₽), см. per_1000_chars в GET /prices.

Яндекс SpeechKit — yandex-tts (3₽/1000 знаков)

20 русских голосов Яндекса с интонациями: prompt (≤5000 знаков), voice_id — латинское имя голоса (marina по умолчанию), role — интонация голоса, speed (0.7–1.2). Неверная пара голос+интонация отклоняется до списания (422 bad_input). Списание — за каждую начатую 1000 знаков (3 ₽). Голоса и интонации — GET /voices → yandex[]; таблица — в разделе «Яндекс SpeechKit — POST /tts» выше.

Длинный текст (с 11-10-26). prompt длиннее 5000 знаков (до 200 000) обрабатывается как длинная озвучка — так же, как у gemini-*-tts и el-tts-turbo: текст режется по предложениям на куски до 4000 знаков, озвучивается выбранным голосом и интонацией и склеивается в один mp3. Вместо generation_id ответ вернёт voiceover_id и status_url (GET /api/agent/voiceover/long/{id}); кусок в 4000 знаков готов примерно за 30 с (замер: 5216 знаков — 54 с целиком). Цена та же — 3 ₽ за каждую начатую 1000 знаков всего текста, при сбое — полный возврат. Неверная пара голос+интонация → 422 bad_input до списания.

curl -s -X POST https://lk.vibemarketolog.ru/api/agent/generate \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d '{"type":"audio","model":"yandex-tts","prompt":"<текст на 5000+ знаков>","voice_id":"irina","role":"narrator"}'
# → {"status":"processing","long_voiceover":true,"voiceover_id":30,"chunks":2,"cost":18,"status_url":"…/voiceover/long/30"}

Каталог голосов

# Все голоса (97 шт)
curl -s -H "Authorization: Bearer $TOKEN" \
  "https://lk.vibemarketolog.ru/api/agent/voices"

# Фильтры
curl -s -H "Authorization: Bearer $TOKEN" \
  "https://lk.vibemarketolog.ru/api/agent/voices?gender=female&category=professional"

# Только голоса с готовым превью (можно прослушать без генерации)
curl -s -H "Authorization: Bearer $TOKEN" \
  "https://lk.vibemarketolog.ru/api/agent/voices?has_preview=1"

# Поиск
curl -s -H "Authorization: Bearer $TOKEN" \
  "https://lk.vibemarketolog.ru/api/agent/voices?search=calm"

Категории: neutral, character, professional, meditation, announcer.

Превью: аудио-сэмплы голосов (preview_url / ?has_preview=1) в API пока не отдаются — характер голоса описывает поле style, а звучание на русском проверяйте по gender_ru/recommended_ru ниже.

⚠️ Голоса на русском — ВЕРИФИЦИРОВАНО (замеры F0)

Поле gender размечено по английскому звучанию и на русском часть голосов меняет пол. Мы замерили основную частоту (F0) на русском (el-tts-multilingual-v2) — /voices отдаёт по каждому голосу gender_ru (male/female/ambiguous/null — не проверялся), verified_ru (bool) и f0_ru_hz (там, где замер есть). На русском доверяй именно gender_ru.

Расхождения не единичные: у части голосов метка провайдера противоположна тому, что слышно на русском. Поимённые результаты замеров — в ответе GET /voices, поле recommended_ru (male / female / avoid) и f0_ru_hz по каждому голосу. Списки поддерживаются нами и обновляются по мере новых замеров, поэтому берите их из эндпоинта, а не переписывайте в свой код.

Правила для русского:

# Проверенные мужские голоса на русском:
curl -s -H "Authorization: Bearer $TOKEN" \
  "https://lk.vibemarketolog.ru/api/agent/voices?language=ru&gender=male" | jq '.voices[] | {id, gender_ru, verified_ru}'

# Озвучить гарантированно мужским голосом на русском:
curl -X POST https://lk.vibemarketolog.ru/api/agent/generate \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d '{"type":"voice","model":"el-tts-multilingual-v2","prompt":"Текст на русском.","voice_id":"Brian","similarity_boost":0.85,"stability":0.5,"style":0,"language_code":"ru"}'

Клонирование голоса (Suno Voice — 50₽)

Создание кастомного голоса для использования в музыке. Голоса имеют ограниченный срок действия.

Workflow (5 шагов):

1. POST /voice/validate    → task_id     (50₽ — списание)
2. GET  /voice/validate-info?task_id=... → validate_info (фраза для чтения)
3. Записать фразу → загрузить через POST /upload-media
4. POST /voice/generate    → task_id     (бесплатно)
5. GET  /voice/status?task_id=...        → voice_id (бесплатно)
6. Использовать voice_id как persona_id в POST /generate (type=music)

Шаг 1: Загрузка аудио-образца

curl -X POST https://lk.vibemarketolog.ru/api/agent/voice/validate \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d '{
    "voice_url": "https://example.com/my-voice-sample.mp3",
    "vocal_start_s": 0,
    "vocal_end_s": 15,
    "language": "ru"
  }'
# → {"status":"ok","task_id":"abc123","cost":50}

Шаг 2: Получение верификационной фразы (polling)

curl -H "Authorization: Bearer $TOKEN" \
  "https://lk.vibemarketolog.ru/api/agent/voice/validate-info?task_id=abc123"
# → {"stage":"success","validate_info":"Произнесите: ...","task_status":"success"}  // опрашивайте stage

Шаг 3-4: Запись и отправка

# Загрузить запись
curl -X POST https://lk.vibemarketolog.ru/api/agent/upload-media \
  -H "Authorization: Bearer $TOKEN" -F "file=@recorded-phrase.mp3"
# → {"url":"https://lk.../uploads/agent/...mp3"}

# Отправить на создание голоса
curl -X POST https://lk.vibemarketolog.ru/api/agent/voice/generate \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d '{"task_id":"abc123","verify_url":"https://lk.../uploads/agent/...mp3"}'

Шаг 5: Получение voice_id

curl -H "Authorization: Bearer $TOKEN" \
  "https://lk.vibemarketolog.ru/api/agent/voice/status?task_id=def456"
# → {"stage":"complete","voice_id":"persona_xyz","task_status":"complete"}  // stage — единое поле опроса

Использование в музыке:

curl -X POST https://lk.vibemarketolog.ru/api/agent/generate \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d '{"type":"music","model":"suno-v5.5","prompt":"...","persona_id":"persona_xyz"}'

Если голос истёк:

curl -X POST https://lk.vibemarketolog.ru/api/agent/voice/regenerate \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d '{"task_id":"abc123"}'
# Затем повторить шаги 2-5

Upload media

POST /upload-media

Загрузка стабильно-доступного файла. URL действует ~7 дней, хранится на нашем домене.

Лимиты:

Запрос (multipart):

curl -X POST https://lk.vibemarketolog.ru/api/agent/upload-media \
  -H "Authorization: Bearer $TOKEN" \
  -F "file=@/tmp/seed.png"

Ответ (image/audio):

{
  "status": "ok",
  "url": "https://lk.vibemarketolog.ru/uploads/agent/123/2026-05-11/1715387034_a8b2c1.png",
  "kind": "image",
  "mime": "image/png",
  "size": 482103,
  "size_mb": 0.46,
  "expires_at": "2026-05-18T01:50:34+00:00"
}

Ответ (video) — дополнительно содержит duration через ffprobe:

{
  "status": "ok",
  "url": "https://lk.vibemarketolog.ru/uploads/agent/123/2026-05-14/1715387089_b9d2e1.mp4",
  "kind": "video",
  "mime": "video/mp4",
  "size": 5177395,
  "size_mb": 4.94,
  "duration": 13.23,
  "expires_at": "2026-05-21T01:50:34+00:00"
}

Передавай duration в video_duration при POST /generate для motion-control-* — это нужно для per-second биллинга и backend-валидации лимита character_orientation=image (≤10s).

Зачем использовать этот endpoint? Внешние URL (tmpfiles.org, gist, etc.) часто блокируются или истекают раньше чем Оператор успевает скачать файл. Загрузка через /upload-media гарантирует доступность.


Webhook callback

Передайте callback_url в POST /generate — мы пришлём результат сами, как только генерация завершится. Не нужно поллить.

Когда отправляется

Доставка

Headers

Header Значение
Content-Type application/json
User-Agent VibeMarketolog-Webhook/1.0
X-Vibe-Event generation.complete | generation.error
X-Vibe-Signature HMAC-SHA256 от body (см. ниже)
X-Vibe-Token-Id ID вашего API-токена
X-Vibe-Generation generation_id
X-Vibe-Timestamp Unix-время отправки (дубль подписанного timestamp из тела)
X-Vibe-Delivery-Id Идентификатор доставки (дубль delivery_id из тела)
X-Vibe-Signature-Scheme webhook_secret | legacy_token_hash (дубль из тела)

Тело

{
  "event": "generation.complete",
  "generation_id": 5811,
  "task_id": "task_xxx",
  "type": "video",
  "model": "grok-itv",
  "status": "complete",
  "result_url": "https://...",
  "result_urls": ["https://..."],
  "cost": 196.0,
  "price_rub": 196.0,             // каноническое поле цены (то же значение, есть во всех ответах — используйте его для предохранителя бюджета)
  "error_message": null,
  "refunded": false,
  "created_at": "2026-05-11T01:50:34+00:00",
  "completed_at": "2026-05-11T01:54:12+00:00",
  "attempt": 1,
  "delivery_id": "dlv_...",          // стабильный id ДОСТАВКИ: одинаков у всех повторов одного события — ключ дедупликации
  "timestamp": 1770000000,           // unix seconds, момент отправки
  "sent_at": "2026-08-11T01:50:34+03:00",
  "signature_scheme": "webhook_secret",  // либо "legacy_token_hash" = sha256(raw_token) у ключей до 09.07.2026
  "signature_version": 1,
  "delivery_semantics": "at-least-once", // возможны повторы (tries=3, backoff 30/120/600)
  "freshness_window": 600                // рекомендованное окно свежести, секунд
}

Анти-replay поля (delivery_id/timestamp/signature_scheme и их заголовки-дубли) присутствуют в обоих контурах — генерации и agent.message. Источник истины — поля ВНУТРИ тела (оно под подписью); заголовки — удобство до разбора JSON и подделываются, сверяйте их с телом. Рекомендуемый порядок на вашей стороне:

  1. hmac_sha256(raw_body, secret) === X-Vibe-Signature — иначе отбросить;
  2. now − payload.timestamp > 600 — отбросить как устаревшее (защита от replay);
  3. дедуплицировать по payload.delivery_id — доставка at-least-once, повтор несёт тот же id (не путать с generation_id: у одной генерации бывает несколько событий).

Верификация подписи

Подпись считается так:

secret    = ваш webhook_secret        (выдан один раз при создании ключа)
signature = hmac_sha256(request_body, secret)

Легаси-токены (созданные до 2026-07-09, без выделенного webhook_secret) подписываются по старой схеме secret = sha256(your_raw_api_token). Какая схема у вашего ключа — покажет POST /webhook-test (поле secret_formula).

Не сохранили секрет или ключ старый? Кабинет → «API-ключи» → кнопка с круговой стрелкой у нужного ключа. Секрет перевыпускается отдельно от ключа доступа: агент продолжает работать, меняется только значение для проверки подписи. Показывается один раз, прежний умирает сразу — обновите его в конфиге обработчика вебхуков.

Пример Python (новая схема):

import hmac, hashlib

def verify(body_bytes: bytes, webhook_secret: str, header_signature: str) -> bool:
    expected = hmac.new(webhook_secret.encode(), body_bytes, hashlib.sha256).hexdigest()
    return hmac.compare_digest(expected, header_signature)

Пример Node.js (новая схема):

const crypto = require('crypto');

function verify(rawBody, webhookSecret, headerSignature) {
  if (typeof headerSignature !== 'string' || headerSignature.length === 0) return false;
  const expected = crypto.createHmac('sha256', webhookSecret).update(rawBody).digest('hex');
  const a = Buffer.from(expected, 'utf8');
  const b = Buffer.from(headerSignature, 'utf8');
  // timingSafeEqual бросает исключение при разной длине буферов — сначала сверяем длину.
  if (a.length !== b.length) return false;
  return crypto.timingSafeEqual(a, b);
}

Для легаси-ключа замените webhook_secret на sha256(raw_token) (hex).

Важно: проверяйте подпись на raw bytes тела ДО парсинга JSON.


Pre-charge validation и коды ошибок

Все URL-поля (image_urls, reference_image_urls, reference_video_urls, reference_audio_urls, first_frame_url, last_frame_url, character_image_url, reference_video_url) проверяются HEAD-запросом до списания денег. Если хоть один URL недоступен — HTTP 422, баланс не тронут.

🔒 Все передаваемые нам URL (медиа, callback_url, webhook-URL) должны указывать на публичные хосты. Ссылки на приватные, loopback и зарезервированные адреса (127.0.0.1, localhost, 10.x, 192.168.x, 169.254.x/облачная метадата, ::1 и т.п.) — а также редиректы на такие адреса — блокируются на стороне платформы.

Пример отказа

{
  "error": "media_validation_failed",
  "field": "image_urls",
  "url": "https://tmpfiles.org/dl/...",
  "reason": "unreachable",
  "detail": { "ok": false, "code": "unreachable", "http": 404 },
  "hint": "Use POST /api/agent/upload-media to upload the file and get a stable URL."
}

Единый формат ответа об ошибке

Любая ошибка публичного API приходит в одной схеме — её достаточно разобрать один раз:

{
  "status": "error",
  "error": "validation_failed",
  "message": "Поле model обязательно для заполнения. Всего ошибок в запросе: 2 — подробности в поле details.",
  "details": {
    "model": ["Поле model обязательно для заполнения."],
    "type": ["Выбранное значение для type некорректно."]
  },
  "request_id": "0f9c8b7a-2d41-4e6b-9c3a-1b5f7e2d8a04"
}
Поле Всегда есть Назначение
status да всегда error — можно ветвиться, не заглядывая в HTTP-код
error да стабильный машинный код: по нему пишется логика клиента
message да человекочитаемое объяснение на русском: что именно не так и что сделать
details нет разбор по полям (для ошибок валидации)
request_id да назовите его в обращении в поддержку — по нему находится ваш вызов в журнале

Обратная совместимость: у ошибок валидации рядом с details остаётся прежний ключ errors, у 403 insufficient_scope — прежние required и granted, у 402 — required/balance. Существующие интеграции ломать не нужно.

Коды ошибок

Код HTTP Описание
missing_token 401 Заголовок Authorization: Bearer … не передан
invalid_token 401 Ключ недействителен, отозван или истёк
insufficient_scope 403 У ключа нет нужного права; в required — какое именно
ip_not_allowed 403 Адрес запроса не в списке разрешённых для ключа
not_found 404 Метода нет либо объект не принадлежит владельцу ключа
method_not_allowed 405 Метод вызывается другим HTTP-глаголом
validation_failed 422 Поля запроса не прошли проверку; разбор — в details
media_validation_failed 422 URL недоступен / неверный content-type / превышен размер
invalid_url 422 Переданная ссылка ведёт на внутренний или недоступный адрес
unsupported_media_type 415 Mime не из allowed списка при /upload-media
file_too_large 413 Превышен размер при /upload-media
insufficient_balance 402 Не хватает рублей на балансе
email_confirmation_required 402 Бонусными рублями платят только с подтверждённого адреса. Подтвердите почту в кабинете; ничего не списано (charged: 0)
daily_spend_limit_exceeded 429 Дневной лимит трат ключа
rate_limit_exceeded 429 Превышена частота запросов; в retry_after — через сколько секунд повторить
already_running 429 Этот инструмент уже выполняется для вашего аккаунта
key_cooling_down 429 Ключ на паузе: почти все запросы за последние минуты завершились ошибкой. В retry_after — сколько ждать. Причина всегда одна: клиент повторяет неудачный запрос без задержки
model_not_supported 422 Название модели не распознано (обычно опечатка). Актуальный список — GET /capabilities
session_expired 419 Вы обратились к внутреннему эндпоинту кабинета, а не к публичному API. Публичные методы — только под префиксом /api/agent/*
generation_failed 502 Не удалось запустить генерацию; списание, если было, возвращено
tool_failed / ai_unavailable 502 Инструмент или модель не отработали; средства возвращены
wordstat_upstream_unavailable 503 Внешний сервис Wordstat недоступен, запросы к нему приостановлены. В retry_after — когда пробовать снова
internal_error 500 Внутренняя ошибка; повторите позже, при повторении сообщите request_id

Повторы запросов: обязательное правило

Любой ответ 429 и 503 содержит retry_after (и заголовок Retry-After) — ждите указанное время, не повторяйте раньше. Повтор без задержки приводит к key_cooling_down: если у ключа 80 % и больше ответов в пятиминутном окне — серверные сбои или отказы по лимиту (при 20+ обращениях), ключ уходит на паузу от 5 до 30 минут. Ошибки 4xx (валидация, права) на паузу не влияют — по ним можно спокойно исправлять запрос.

Рабочая схема: пауза 1 с → 2 с → 4 с → 8 с, не больше 5 попыток, затем остановка и сообщение человеку. Для долгих операций опрашивайте статус не чаще раза в 10–20 с, а лучше подпишитесь на вебхук (POST /webhook-url) и не опрашивайте вовсе.

Тексты ошибок сознательно не содержат внутренних подробностей (имён классов, таблиц, поставщиков моделей, путей файлов): для диагностики служит request_id.

При ошибке status=error через polling/webhook — error_message содержит причину, refunded=true если деньги вернулись.


Strict-mode — защита от лишних списаний

По умолчанию /generate берёт только релевантные поля, а лишние молча отбрасывает. Чтобы поймать ошибку ДО списания, передайте strict=true:

curl -X POST https://lk.vibemarketolog.ru/api/agent/generate \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d '{"type":"video","model":"veo3_fast","prompt":"...","image_input":["https://..."],"strict":true}'

Ответ HTTP 422, деньги не тронуты:

{
  "error": "unknown_or_incompatible_params",
  "model": "veo3_fast",
  "rejected": ["image_input"],
  "hint": "image_input is for type=image only. For image-to-video use: image_urls[] + generation_type=image-to-video (veo3*), ...",
  "valid_params": ["type","model","prompt","callback_url","strict","aspect_ratio","duration","resolution","image_urls","generation_type","generate_audio","negative_prompt","seed"]
}

Без strict запрос выполнится, но в ответе появится поле ignored_params со списком отброшенных полей — используйте его для самодиагностики.


Dry-run — POST /generate/estimate

Те же поля, что у /generate, но без запуска генерации и без списания. Pre-flight перед платной операцией:

curl -X POST https://lk.vibemarketolog.ru/api/agent/generate/estimate \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d '{"type":"video","model":"veo3_fast","prompt":"...","first_frame_url":"https://..."}'
{
  "valid": true,
  "body_valid": true,
  "funds_ok": true,
  "dry_run": true,
  "model": "veo3_fast",
  "type": "video",
  "estimated_cost_rub": 120,
  "price_rub": 120,
  "applied_tier": null,
  "balance": { "current": 1049, "after": 929 },
  "balance_after": 929,
  "daily_spend": { "limit": 5000, "today": 340, "within_limit": true },
  "validation": {
    "media": { "first_frame_url": [ { "url": "https://...", "ok": true, "code": null, "http": 200 } ] },
    "required_missing": []
  },
  "rejected": [],
  "param_rejections": [],
  "param_adjustments": [],
  "params_validated": true,
  "value_warnings": [],
  "misrouted_media": null,
  "valid_params": ["type","model","prompt","..."],
  "warnings": []
}

price_rub — каноническое поле цены во всех ответах (смета, запуск /generate, статус): используйте именно его для предохранителя бюджета, оно есть везде (estimated_cost_rub/cost оставлены для совместимости). balance_after — остаток после списания, тоже единым именем во всех ответах.

body_valid / funds_ok — раздельные признаки: «тело запроса корректно» и «денег/лимита хватает». valid остаётся их конъюнкцией: по valid:false смотрите, ЧТО чинить — запрос (body_valid:false) или баланс (funds_ok:false).

applied_tier — применённая ступень тарифа для ступенчатых моделей ({key, fixed, bounds}): grok-ttv/itv по duration, gemini-omni-video по resolution, seedream-5-pro по quality. fixed:true = позван легаси-ключ с закреплённой ступенью, duration на цену не влияет. null — у модели нет ступеней. Границы ступеней публикует tier_bounds в /capabilities.

param_rejections — значения параметров, которые модель заведомо отвергнет (напр. aspect_ratio:4:5 у z-image): при непустом списке valid:false, в каждом элементе есть hint с допустимыми значениями — запрос не начинайте, замените значение. param_adjustments — значения, которые платформа молча приведёт к рабочим (напр. output_format:jpeg → png): запрос пройдёт, но результат будет в приведённом варианте.

value_warnings — значение не входит в объявленный enum модели ({field, value, allowed, note}): запрос НЕ отклоняется, но исполнитель может молча взять дефолт/дешёвую ступень («заказал 4K — получил 720p»). Сверьте с applied_tier и почините значение. params_validated:false — модели нет в каталоге, поля запроса вообще не проверялись: «valid» ≠ «параметры проверены».

misrouted_media — медиа-поле, которое эта модель НЕ принимает, и правильное поле вместо него ({field, use_instead[]}): без исправления генерация уйдёт без вашего медиа, а деньги спишутся.

Несуществующий тарифный ключ (grok-ttv-40) — valid:false в смете, а /generate ответит 422 unknown_price_tier (раньше такой ключ проходил «годным» с ценой 0 ₽).

valid:false — смотрите body_valid/funds_ok, param_rejections, warnings, rejected, validation.required_missing. Scope: read.


Приёмка результата — блок acceptance (бесплатно)

Пришлите вместе с POST /generate машинопроверяемые критерии — по готовому файлу платформа выполнит детерминированные проверки и отдаст вердикт в GET /generation/{id}/status (поле acceptance). Кто спеку не прислал — получает прежний ответ байт в байт. Вердикт информационный: статус генерации и деньги не меняет.

curl -X POST https://lk.vibemarketolog.ru/api/agent/generate \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d '{"type":"image","model":"z-image","prompt":"логотип на белом фоне","strict":true,
       "acceptance":{"format":"png","aspect_ratio":"1:1","aspect_ratio_tolerance":0.02,"min_width":1024,"not_blank":true}}'

Поддерживаемые проверки (только исполняемые, список — в /capabilities → acceptance.checks): format (png/jpg/jpeg/webp/gif/mp4/mov/mp3/wav), aspect_ratio "W:H" + aspect_ratio_tolerance (относительный, дефолт 0.02; только изображения), min_width/min_height (px, только изображения), max_file_size_mb, min_file_size_kb, not_blank.

Ответ статуса (только приславшим спеку):

"acceptance": {
  "status": "partial",              // passed | partial | failed | skipped | pending (ещё не complete)
  "checks": [ {"check":"format","passed":true,"actual":"png","expected":"png"},
              {"check":"aspect_ratio","passed":false,"actual":"1024x768 (1.3333)","expected":"1:1 ±0.02"} ],
  "failed_checks": ["aspect_ratio"],
  "unsupported": [],                // ключи спеки, которые платформа исполнить не умеет — честно перечислены
  "note": "Informational verdict: it does not change the generation status or billing."
}

Проверки для видео/аудио ограничены файловыми (format, размеры файла, not_blank) — проверки кадра помечаются passed:null и в вердикт не входят.


Webhook self-test — POST /webhook-test

Проверьте свой listener и верификацию подписи без реальной генерации:

curl -X POST https://lk.vibemarketolog.ru/api/agent/webhook-test \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d '{"callback_url":"https://your-host/webhook"}'
{
  "delivered": true,
  "http_status": 200,
  "response_time_ms": 142,
  "error": null,
  "signature_sent": "9f86d0...",
  "secret_formula": "your webhook_secret (shown once at token creation)",
  "verify": "hmac_sha256(raw_body, webhook_secret) === X-Vibe-Signature header",
  "headers_sent": ["X-Vibe-Event","X-Vibe-Signature","X-Vibe-Token-Id","X-Vibe-Generation","X-Vibe-Timestamp","X-Vibe-Delivery-Id","X-Vibe-Signature-Scheme"],
  "payload_sent": { "event": "webhook.test", "...": "..." }
}

Тестовое событие приходит с X-Vibe-Event: webhook.test. Сверьте signature_sent с тем, что вычисляет ваш код по формуле из раздела «Верификация подписи». Scope: read.


Pixel-fidelity при редактировании изображений

Edit-модели (gpt-image-2.5-flare-edit, gpt-image-2.5-sunburst-edit, gpt-image-2-edit, nano-banana-pro-*, nano-banana-2-*, seedream-4.5, seedream-5-pro-edit, qwen-image-3-edit, qwen-image-3-pro-edit, gpt-image-1.5) делают художественную правку и не сохраняют исходные пиксели байт-в-байт — в GET /capabilities у них стоит preserves_input: false. Для брендинга/логотипов, где нужна точность по гайдлайнам, это учитывайте: модель может слегка перерисовать логотип. Маск-инпейнт (точное сохранение вне маски) пока не поддерживается.

Ближе всего к точечной правке семейство gpt-image-2.5-*-edit (сентябрь 2026): оно меняет только то, о чём просят, и не разрушает лица, фон и надписи вокруг. Формально это по-прежнему художественная правка — preserves_input: false, — но на практике потери вне названной области минимальны.


Входящие сообщения (Inbox) — Bitrix24 и другие каналы

Клиенты пишут вашему агенту из внешних каналов (Bitrix24, Telegram, кастомные интеграции) — платформа доставляет сообщения агенту и возвращает ответ в канал.

Тарификация: доставка сообщений и ответы ВАШЕГО агента (inbox/webhook) — бесплатны (входят в тариф). Если агент не забрал сообщение и ответил авто-ответчик платформы (reply_source=platform) — списание с баланса владельца по прайсу текстового чата (как на /text): фактическая модель, Claude Opus 4.8 — 10₽/ответ, страховочный Sonnet 4.6 — 8₽/ответ. При нехватке баланса или превышении дневного лимита ключа авто-ответчик молчит.

Как это устроено

Сотрудник пишет боту в Bitrix24
  → обработчик канала зовёт POST /agent/message (Bearer oc_ ключ клиента)
  → платформа доставляет сообщение АГЕНТУ (inbox-очередь или webhook)
  → агент отвечает → обработчик получает {reply} → клиент видит ответ в чате

Канал ждёт ответ синхронно до 22 секунд. Агент должен отвечать быстро.

Endpoints для КАНАЛА (обработчик Bitrix24 и т.п.)

Метод URL Что делает
GET /agent/list Список агентов клиента: [{"id":"agent_N","name":"...","online":true}]
POST /agent/message Сообщение агенту → {"reply":"..."} (ждёт ≤22 сек)
GET /agent/message/{id} Добор «опоздавшего» ответа после таймаута

Эти URL живут без префикса /api (точный формат интеграции Bitrix24), но требуют тот же Authorization: Bearer oc_....

# Список агентов клиента
curl -H "Authorization: Bearer oc_..." https://lk.vibemarketolog.ru/agent/list

# Отправить сообщение и получить ответ
curl -X POST https://lk.vibemarketolog.ru/agent/message \
  -H "Authorization: Bearer oc_..." -H "Content-Type: application/json" \
  -d '{
    "agent_id": "agent_123",
    "text": "Сколько стоит доставка?",
    "channel": "bitrix",
    "context": {"portal": "b24-xxx.bitrix24.ru", "dialog_id": "chat42", "user_name": "Иван"}
  }'
# → 200 {"reply": "Доставка по Москве — бесплатно от 3000₽", "message_id": 17}

Таймаут (агент не успел за 22 сек):

{"reply": null, "status": "timeout", "message_id": 17,
 "message": "Агент не ответил за 22 сек. Ответ можно забрать позже: GET /agent/message/17"}

HTTP-код всегда 200 — проверяйте поле reply. Поздний ответ агента сохраняется — заберите его GET /agent/message/{id} → {"status":"replied","reply":"..."}.

Идемпотентность: повторный запрос с тем же context.dialog_id + text в окне ~60 сек вернёт уже созданное сообщение (ретраи канала не плодят дубли). Для полного контроля передавайте заголовок X-Idempotency-Key.

Вложения (vision) — Bitrix24 v2

Канал может передать в POST /agent/message массив attachments (до 5; для картинок — прямые/подписанные URL, TTL ~1 час):

"attachments": [
  {"type": "image", "url": "https://b24.vibem.ru/attach/<token>.jpg", "mime": "image/jpeg", "name": "photo.jpg"},
  {"type": "file",  "url": "https://...", "name": "бриф.pdf"}
]

CRM-действия (actions) — Bitrix24 v2

Агент может вернуть рядом с reply массив actions — машинные команды Bitrix REST, которые исполняет мост (whitelist crm.* на его стороне):

POST /api/agent/inbox/{id}/reply
{
  "reply": "Создал сделку «Заявка от Ивана» на 50 000 ₽.",
  "actions": [
    {"method": "crm.deal.add", "params": {"fields": {"TITLE": "Заявка от Ивана", "OPPORTUNITY": 50000, "CATEGORY_ID": 0}}}
  ]
}

Endpoints для АГЕНТА (как получать и отвечать)

Вариант А — polling inbox (просто, рекомендуется):

Метод URL Что делает
GET /api/agent/inbox?wait=20&limit=10 Забрать новые сообщения (long-poll до 20 сек)
POST /api/agent/inbox/{id}/reply Ответить: {"reply": "текст"}
POST /api/agent/identify Представиться владельцу: {"telegram_bot","host","version","description"} — данные видны в карточке агента на /agent/
# Цикл агента: забирай и отвечай
while true; do
  MSGS=$(curl -s -H "Authorization: Bearer oc_..." \
    "https://lk.vibemarketolog.ru/api/agent/inbox?wait=20")
  # для каждого messages[].id — сформируй ответ и отправь:
  curl -s -X POST -H "Authorization: Bearer oc_..." -H "Content-Type: application/json" \
    -d '{"reply":"Ответ клиенту"}' \
    "https://lk.vibemarketolog.ru/api/agent/inbox/$ID/reply"
done

Правила inbox:

Вариант Б — push webhook (быстрее):

# Один раз: включить push-режим
curl -X POST https://lk.vibemarketolog.ru/api/agent/webhook-url \
  -H "Authorization: Bearer oc_..." -H "Content-Type: application/json" \
  -d '{"url": "https://your-host.example/hook"}'

Платформа будет слать POST с событием agent.message (подпись X-Vibe-Signature — та же схема HMAC, что у webhook callback генераций: hash_hmac('sha256', body, webhook_secret); для легаси-ключей — sha256(raw_token)). URL должен быть публичным https:// — приватные/loopback/зарезервированные адреса отклоняются. Ответьте синхронно за ≤18 сек:

200 {"reply": "текст ответа"}

Если webhook недоступен — сообщение автоматически падает в inbox (вариант А продолжает работать как fallback). Отключить: {"url": null}.

Лимиты

Endpoint Лимит
POST /agent/message 30 req/min на ключ
GET /api/agent/inbox 120 req/min на ключ (с wait=20 это ~3 req/min)
Остальные 120 req/min (read)

Интеграция с Bitrix24 (для пользователей)

  1. Установите приложение «AGI Агенты VibeMarketolog» из Bitrix24.Маркет.
  2. Создайте API-ключ oc_... на странице /agent и вставьте в настройки приложения.
  3. Выберите агента из списка.
  4. Сотрудники пишут боту в чате Bitrix24 — агент отвечает. История диалогов видна на странице /agent/.

Brand Voice — профиль бренда для генераций

Профиль бренда хранит тон, аудиторию, палитру, стоп-слова, фирменный голос и продукты. Передайте brand_id в /generate — и поля профиля подставятся автоматически, но только те, которые принимает схема конкретной модели (GET /capabilities): параметры из запроса всегда выигрывают, ценовые поля (quality/duration/resolution) не подставляются никогда, prompt озвучки и музыки не трогается.

Метод Что делает Scope
GET /api/agent/brands Список брендов с продуктами, активной парой и лимитами read
GET /api/agent/brand/{id} Один бренд read
POST /api/agent/brand Создать/обновить (передайте id) — бесплатно generate или write
DELETE /api/agent/brand/{id} Удалить бренд с продуктами generate или write
POST /api/agent/brand/{id}/product Создать/обновить продукт (type: 0 услуга, 1 товар) generate или write
DELETE /api/agent/product/{id} Удалить продукт generate или write
POST /api/agent/brand/activate {brand_id, product_id} — активная пара (null — выключить) generate или write

С 20-10-26 запись профилей бренда принимает право generate наравне с write: бренд — бесплатная настройка генераций того же аккаунта, и агенту с ключом generate не нужен общий write, чтобы создать бренд, переключить или выключить активную пару. Остальные методы под write (чат-боты, переписка, вебхук) по-прежнему требуют write. Лимит записи — 10 запросов в минуту на ключ.

Поля бренда: name* , industry, description, website, tagline, target_audience, tone_of_voice, avoid_words, palette (массив #RRGGBB, ≤8), voice_id (из GET /voices), voice_model, defaults ({aspect_ratio, output_format, image_model, video_model, audio_model}), reference_images (≤5 URL). Лимиты: 10 брендов / 50 продуктов на аккаунт.

Параметры генерации: brand_id (чужой → 422 brand_not_found ДО списания), product_id (продукт того же бренда), brand_apply: false — отключить инжект даже при активном бренде. Если brand_id не передан, применяется активная пара аккаунта (POST /brand/activate).

Смета бесплатна: POST /generate/estimate с brand_id возвращает applied_brand_fields[] — ровно то, что будет подставлено, без списания. Ответ /generate содержит то же поле.


FAQ для агентов

Q: Что если я закрою терминал во время генерации? A: Генерация продолжается на стороне Оператора. При возврате просто GET /generation/{id}/status — результат подтянется. Альтернатива — указать callback_url в /generate, и мы сами пришлём результат пушем.

Q: Как использовать image-to-video для Grok? A: Модель grok-itv (Grok 1.5 Preview, базовое имя — тир цены по duration) + ровно один image_urls: ["https://..."], duration 1–15. Параметра mode нет. Картинку загрузите через /upload-media.

Q: Можно ли передать ссылку на tmpfiles.org / imgur / pastebin? A: Можно, но НЕ рекомендуется — такие хосты часто блокируются или истекают. Лучше /upload-media — стабильный URL на нашем домене.

Q: Что делать если pre-charge validation сработала ложно (URL рабочий, но мы отказали)? A: Это значит ваш CDN не отдаёт HEAD-запрос или прячет Content-Type. Загрузите файл через /upload-media — это безопаснее.

Q: Webhook не пришёл — что делать? A: Проверьте логи: callback_url должен возвращать 2xx HTTP. Retry: 3 попытки с backoff 30s/120s/600s. После 3-й неудачи мы прекращаем попытки — опросите /generation/{id}/status руками.

Q: Безопасно ли отдавать API-токен агенту? A: Да, если токен с ограниченным scope (generate или read), expiry-датой и желательно IP-whitelist. Учтите: доступы к внешним сервисам отдаются только под отдельный scope yandex — не добавляйте его без необходимости. Полные права (write/autopilot/yandex) выдавайте только проверенным агентам.

Q: Где смотреть свежий список моделей? A: GET /api/agent/capabilities — самоописывающийся каталог с параметрами всех моделей.


Документ обновляется при изменениях API. Последнее обновление: 2026-09-07 (исправлены цены озвучки ElevenLabs, перечень моделей и цен теперь собирается из контракта командой agent:docs-sync). Связь с поддержкой: @centrmedia.


Программное управление рекламой

Кампании Яндекс Директа, автопилот ставок, доступы к рекламным кабинетам и исследование спроса в открытую часть API не входят и предоставляются по партнёрскому соглашению — вместе с договорным SLA, выделенными лимитами запросов и приоритетной поддержкой.

Оставить заявку (имя и контакт, ответим в рабочее время): https://vibemarketolog.ru/api#lead

Или напишите напрямую: @centrmedia


<!-- CHANGELOG-START -->

Журнал обновлений

Формат: одна запись — одна строка, дата в начале. Раньше журнал был одним абзацем на 3950 знаков с тринадцатью суммами подряд, и цена соседней записи читалась как цена вашей модели: seedream-5-pro (25/40 ₽) стояла рядом с семёркой и четырнадцаткой от qwen-image-3. Так же оставались без своей цены ещё одиннадцать моделей. Цены моделей теперь живут в разделе «Каталог моделей и цен», который собирается из контракта.

Полный список моделей и параметров всегда в GET /capabilities, точная цена запроса — в бесплатном POST /generate/estimate.