API и Webhook OmniGate Один REST API и единый формат webhook для WhatsApp, Telegram, MAX, VK, Instagram — и для вашего собственного канала: чата на сайте или мобильного приложения. Подключите канал в кабинете или по API — принимайте и отправляйте сообщения программно.
OmniGate нормализует все мессенджеры к одному формату. Вы создаёте сессию на канал, OmniGate присылает входящие на ваш webhook, а исходящие вы шлёте одним и тем же запросом POST /api/v1/messages — независимо от канала.
Telegram и MAX поддерживают два режима подключения: личный аккаунт и официальный бот по токену (см. параметры каналов). Для салонов есть готовая интеграция с YCLIENTS — уведомления о записи без единой строки кода.
Базовый URL
Все запросы — по HTTPS. Тело запросов и ответы — в формате application/json (UTF-8). Размер тела запроса — до 2 МБ.
Авторизация
Запросы к API авторизуются ключом в заголовке X-API-Key. Поддерживается и форма Authorization: Bearer <ключ>.
Где взять ключ
- Войдите в личный кабинет → раздел API-ключи.
- Нажмите Создать ключ. Полный ключ показывается один раз — сразу сохраните его.
- В списке остаётся только префикс ключа. Потерянный ключ нельзя восстановить — отзовите его и создайте новый.
X-API-Key: og_live_xxxxxxxxxxxxxxxxxxxxxxxx
Если ключ не передан — 401 «нужен X-API-Key». Если ключ неверный или отозван — 401 «неверный или отозванный API-ключ».
Права ключа
При создании ключа можно отметить только те права, которые нужны интеграции. Это полезно, когда ключ уходит подрядчику, стороннему сервису или ИИ-агенту: такой ключ сможет, например, читать переписку, но не отправлять сообщения и не удалять каналы.
| Право | Что открывает |
|---|---|
sessions:read | Просмотр каналов: GET /api/v1/sessions, GET /api/v1/sessions/{id}. |
sessions:write | Создание, изменение и удаление каналов, вход по коду: POST, PATCH, DELETE /api/v1/sessions… |
messages:read | История переписки: GET /api/v1/messages. |
messages:send | Отправка сообщений и файлов: POST /api/v1/messages, POST /api/v1/messages/upload. |
messages:inbound | Приём входящих из своего канала: POST /api/v1/messages/inbound. |
events:read | Поток новых сообщений в реальном времени: GET /api/v1/events (SSE). |
webhook:read | Настройки вебхука и журнал доставок: GET /api/v1/webhook, GET /api/v1/webhook/deliveries. |
webhook:write | Смена адреса и секрета, тест и повтор доставки: PUT /api/v1/webhook, POST /api/v1/webhook/rotate, /test, /deliveries/{id}/retry. |
webchat:read | Список виджетов веб-чата и код вставки: GET /api/v1/webchat. |
webchat:write | Создание, настройка и удаление виджетов: POST, PATCH, DELETE /api/v1/webchat… |
account:read | Тариф, лимиты и текущий расход: GET /api/v1/account. |
403. Ключ без ограничений («полный доступ») работает везде, включая новые эндпоинты.Если у ключа нет нужного права, приходит 403, а в теле — какое право требуется и какие есть у ключа:
{
"ok": false,
"error": "у ключа нет права «messages:send» — выпустите ключ с этим правом в кабинете",
"scope": "messages:send",
"scopes": ["sessions:read", "messages:read"]
}
Журнал обращений
Каждый запрос к /api/v1 попадает в журнал: время, ключ, метод и путь, код ответа и длительность. Журнал виден в кабинете рядом со списком ключей — по нему удобно понять, какая интеграция получила 403 или 429 и когда ключ использовался в последний раз. Записи хранятся 30 дней.
Термины и сущности
| Термин | Что это |
|---|---|
| Канал (channel) | Мессенджер: whatsapp, telegram, max, vk, instagram. |
| Сессия (session) | Подключённый аккаунт канала. У сессии есть id (UUID), status и опциональный webhookUrl. Все сообщения идут через конкретную сессию. |
| chatId | Идентификатор диалога/собеседника внутри канала — куда отправлять ответ. Формат зависит от канала (см. ниже). |
| Входящее (inbound) | Сообщение от собеседника. OmniGate сохраняет его и, если задан webhookUrl, доставляет POST-запросом на ваш сервер. |
| Исходящее (outbound) | Сообщение, которое вы отправляете через POST /api/v1/messages. |
| Webhook | Ваш HTTPS-эндпоинт, на который OmniGate присылает входящие сообщения в реальном времени. |
| API-ключ | Секрет для авторизации запросов. Привязан к вашему аккаунту, видит только ваши сессии. |
sessionId и chatId прямо из входящего webhook и передайте их в POST /api/v1/messages. Не нужно вычислять идентификаторы вручную.Быстрый старт за 5 шагов
- Получите API-ключ в кабинете (раздел «API-ключи»).
- Подключите канал: в кабинете отсканируйте QR (WhatsApp/Telegram) или введите номер и код (MAX). Дождитесь статуса connected.
- Укажите webhookUrl сессии — ваш HTTPS-адрес для входящих.
- Примите тестовое сообщение: напишите на подключённый аккаунт — OmniGate пришлёт его на ваш webhook.
- Ответьте через
POST /api/v1/messages, используяsessionIdиchatIdиз webhook.
curl -X POST https://omnigate.website/api/v1/messages \ -H "X-API-Key: og_live_xxx" \ -H "Content-Type: application/json" \ -d '{ "sessionId": "1f1d…uuid", "chatId": "79991234567", "text": "Привет из OmniGate!" }'
Подключение каналов
Сессия — это подключённый аккаунт. Создать её можно из кабинета (рекомендуется для входа по QR/коду) или через API.
POSTСоздать сессию
| Поле | Тип | Описание |
|---|---|---|
channel обязательно | string | Один из: whatsapp, telegram, max, vk, instagram, webchat. Для своего сайта или приложения принимаются псевдонимы site, web, custom, widget — все они создают канал webchat (см. мост своего канала). |
credentials опц. | object | Параметры доступа канала (см. таблицу). Для WhatsApp/Telegram — пустой объект (вход по QR). |
webhookUrl опц. | string | HTTPS-адрес для входящих. Можно задать позже. Если не задан — сообщения только сохраняются в истории. |
POST /api/v1/sessions X-API-Key: og_live_xxx { "channel": "max", "credentials": { "phone": "79991234567" }, "webhookUrl": "https://your-crm.ru/hook?token=SECRET" }
{ "ok": true, "session": { "id": "1f1d…uuid", "channel": "max", "status": "awaiting_code", "webhookUrl": "https://your-crm.ru/hook?token=SECRET", "hasCredentials": true, "createdAt": 1750000000000 } }
Дальше действуйте по status: для WhatsApp/Telegram опрашивайте сессию и сканируйте QR, для MAX — отправьте SMS-код (см. вход по коду).
402 с описанием лимита. Обновить тариф можно в кабинете.Параметры каналов
| Канал | credentials | Как входит |
|---|---|---|
{} | Скан QR из приложения: Настройки → Связанные устройства. Статус qr → connected. | |
| Telegram личный | {} | Личный аккаунт (userbot). Скан QR: Настройки → Устройства → Подключить устройство. Возможен шаг пароля 2FA. |
| Telegram бот | { "botToken": "123456:AA…" } | Официальный бот. Токен от @BotFather. Подключается сразу, без QR и без телефона. Пишет только тем, кто сам первым написал боту. |
| MAX личный | { "phone": "7999…" } | Личный аккаунт по номеру. SMS-код, затем (если включён) облачный пароль 2FA. |
| MAX бот | { "botToken": "..." } | Официальный бот. Токен от @MasterBot. Подключается сразу по токену. |
| VK | { "groupId": "...", "accessToken": "..." } | Сообщество. Токен с правами на сообщения из настроек сообщества. Подключается сразу. |
{ "igId": "...", "pageAccessToken": "..." } | Через Meta (бизнес-аккаунт + страница Facebook). Подключается сразу. | |
| Свой сайт / приложение webchat | {} — сервер сгенерирует сам | Контейнер для собственного источника сообщений. Учётные данные (в т.ч. publicKey) выдаёт OmniGate; присланные в запросе — игнорируются. Оформление задаётся полями title, color, welcome, webchatEnabled в корне тела запроса. Подключается сразу. См. мост своего канала. |
telegram; режим выбирается наличием botToken в credentials.Статусы сессии и вход по коду
Узнать текущее состояние и QR можно в любой момент:
Ответ: { ok, session, qr }, где qr — data-URL картинки (для WhatsApp/Telegram, пока требуется скан).
| status | Значение |
|---|---|
| created | Запись создана, ещё не запускалась. |
| connecting | Идёт подключение. |
| qr | Нужно отсканировать QR (вернётся в поле qr). |
| awaiting_code | Ожидается код подтверждения (MAX — SMS-код). |
| awaiting_password | Ожидается облачный пароль 2FA (MAX/Telegram). |
| connected | Готово принимать и отправлять сообщения. |
| disconnected | Отключено. |
| error | Ошибка подключения. Создайте сессию заново. |
POSTПодтвердить вход по коду
Передайте code (SMS-код) и, если аккаунт защищён двухфакторным паролем, далее — password. Нужно передать code или password.
POST /api/v1/sessions/1f1d…/code { "code": "12345" } // если включена 2FA, ответ вернёт status: "awaiting_password"
POST /api/v1/sessions/1f1d…/code { "password": "мой_облачный_пароль" } // при успехе status станет "connected"
DELETEОстановить и удалить сессию
Останавливает подключение и удаляет сессию. Ответ: { ok: true }.
Отправка сообщений
Единый эндпоинт для всех каналов. Текст или медиа — в одном запросе.
| Поле | Тип | Описание |
|---|---|---|
sessionId обязательно | string | ID подключённой сессии (статус connected). |
chatId обязательно | string | Кому отправить. Проще всего — взять из входящего webhook (см. формат). |
text текст* | string | Текст сообщения. Обязателен, если нет mediaUrl. |
mediaUrl медиа* | string | Публичный URL файла. Включает режим отправки медиа. |
kind опц. | string | Тип медиа: photo (по умолчанию) или document. |
caption опц. | string | Подпись к медиа. |
* Нужно передать либо text, либо mediaUrl.
Текст
{ "sessionId": "1f1d…uuid", "chatId": "79991234567", "text": "Ваш заказ №1024 готов к выдаче 📦" }
Медиа (фото / документ)
{ "sessionId": "1f1d…uuid", "chatId": "79991234567", "mediaUrl": "https://cdn.your-crm.ru/invoice-1024.pdf", "kind": "document", "caption": "Счёт на оплату" }
Ответ
// 200 { "ok": true, "messageId": "a1b2c3" } // 502 — провайдер не принял сообщение { "ok": false, "error": "описание причины" }
402 с описанием лимита.Формат chatId по каналам
| Канал | chatId |
|---|---|
| MAX | ID чата (число) или номер телефона собеседника (79991234567 / +7…) — OmniGate сам найдёт диалог. |
| Номер телефона собеседника в международном формате без «+». | |
| Telegram | ID диалога/пользователя из входящего сообщения. |
| VK | ID пользователя VK. |
| ID пользователя Instagram (из входящего). | |
| Свой сайт / приложение webchat | Идентификатор собеседника задаёте вы сами — любая строка до 120 символов (client-42, crm-user-77, e-mail, ID из вашей базы). Он и станет ключом диалога в истории и в amoCRM. Виджет на сайте выдаёт свои ID вида v-ab12cd…; при работе через API повторять этот формат не нужно. |
chatId из поля chatId входящего webhook и использовать его как есть для ответа.Мост своего канала: свой сайт или приложение
Не все диалоги приходят из мессенджеров. Чат на вашем сайте, мобильное приложение, виджет в личном кабинете, форма обратной связи, любая внешняя платформа — всё это можно завести в OmniGate как обычный канал. Тогда переписка с такими собеседниками попадает в ту же историю, в тот же кабинет, в те же вебхуки и в то же зеркало amoCRM, что и WhatsApp или Telegram. Никакого отдельного кода под каждый источник — один и тот же формат входящих и исходящих.
Работает это в три шага: создать канал-контейнер, класть в него входящие и отвечать обычной отправкой.
Шаг 1. Создать канал
Тот же POST /api/v1/sessions, только channel — site (псевдонимы web, custom, widget; каноническое имя канала — webchat). Учётные данные генерирует сервер, передавать нечего. Канал подключается сразу, без QR и кодов: status сразу connected.
POST /api/v1/sessions X-API-Key: og_live_xxx { "channel": "site", "title": "Чат на сайте", "webchatEnabled": false, "webhookUrl": "https://your-crm.ru/hook?token=SECRET" }
{ "ok": true, "session": { "id": "255a385c…uuid", "channel": "webchat", "status": "connected", "publicKey": "wc_1fb0a677ee9c308ce7cc76da", "embed": "<script>…</script>" } }
| Что вернулось | Зачем |
|---|---|
session.id | Серверный идентификатор канала. Его вы подставляете в sessionId при приёме и отправке сообщений по API-ключу. Секретный — только для вашего бэкенда. |
publicKey | Публичный ключ виджета (wc_…). Нужен, только если вы ставите на сайт готовый виджет OmniGate: им авторизуются браузерные ручки /webchat/:publicKey/…. Если пишете свой фронт и ходите через API — он вам не понадобится. |
embed | Готовый <script> для вставки на страницу — тот же виджет одной строкой. |
publicKey отдаётся ровно один раз — в ответе на создание канала. Дальше credentials из API вырезаются, и увидеть ключ можно только в кабинете. Сохраните его сразу, если планируете ставить виджет."webchatEnabled": false — если вы не используете виджет OmniGate, а шлёте сообщения со своего бэкенда. Это выключает браузерное окно чата, но не ломает канал: приём по API, история, вебхуки и amoCRM продолжают работать как обычно.Шаг 2. Класть входящие
Каждое сообщение вашего пользователя отправляйте на эту ручку — она серверная, авторизуется вашим X-API-Key.
| Поле | Описание |
|---|---|
sessionId обяз. | ID канала-контейнера из шага 1. |
chatId обяз. | Идентификатор собеседника у вас — любая строка до 120 символов (по нему потом отвечаете и по нему же группируется диалог). |
text | Текст входящего, до 4000 символов. Обязателен, если нет mediaUrl. |
fromName | Имя отправителя (показывается в кабинете и amoCRM), до 80 символов. |
from опц. | Технический идентификатор отправителя. По умолчанию равен chatId. |
mediaUrl, mediaKind | Публичная ссылка на вложение и его тип (photo/video/document). |
webhook опц. | false — не доставлять это входящее на ваш webhookUrl. Синоним: deliverWebhook. Подробнее — в примечании ниже. |
curl -X POST https://omnigate.website/api/v1/messages/inbound \ -H 'X-API-Key: ВАШ_КЛЮЧ' -H 'Content-Type: application/json' \ -d '{"sessionId":"<id>","chatId":"client-42","text":"Здравствуйте!","fromName":"Иван"}' // 200 { "ok": true, "chatId": "client-42" }
Дальше сообщение идёт по тому же конвейеру, что и входящее из мессенджера: попадает в историю, живьём появляется в кабинете, зеркалится в amoCRM (если у канала включено «Зеркалить в amoCRM» и amoCRM подключён по OAuth) и доставляется на ваш webhookUrl — с подписью, SSRF-проверкой и ретраями (до 6 попыток: 2, 4, 8, 16, 32 секунды).
webhookUrl, доставлять их обратно бессмысленно — она получит эхо собственного сообщения. В этом случае добавьте в тело "webhook": false: всё остальное (история, кабинет, amoCRM) отработает как обычно, вебхук просто не будет поставлен в очередь. Вебхук нужен в обратной ситуации — когда сообщения кладёт один сервис (например, фронт сайта), а обрабатывает их другой.Шаг 3. Отвечать
Ответ оператора или вашего бота — обычный POST /api/v1/messages с тем же sessionId и chatId. Исходящее тоже логируется и зеркалится в amoCRM, и — если посетитель сидит в виджете — мгновенно доезжает до него по SSE. Всю переписку можно поднять через GET /api/v1/messages.
POST /webchat/:publicKey/message вызывается прямо из браузера посетителя, поэтому ограничена 30 сообщениями в минуту с одного IP и требует chatId строго вида v-…. Серверная POST /api/v1/messages/inbound ходит с вашего бэкенда по API-ключу, попадает под общий лимит 120 запросов в минуту на ключ и принимает произвольный chatId — можно сразу класть свой ID пользователя из CRM или базы. Если у вас есть собственный бэкенд, используйте вторую.Полный двусторонний мост: ответы менеджера из amoCRM → в ваш канал
Чтобы ответы, написанные менеджером внутри amoCRM, доходили до вашего получателя, задайте у канала Webhook доставки (кабинет → карточка канала → «Вебхук и детали» → «Webhook доставки», либо PATCH /api/v1/sessions/:id { "deliveryWebhookUrl": "https://..." }). OmniGate будет POST-ить туда каждый ответ менеджера — с подписью и ретраями (до 6 попыток) — а вы доставите его своему пользователю.
POST https://ваш-адрес/delivery // подпись: X-OmniGate-Signature (как у входящих) { "event": "outgoing", "direction": "out", "source": "amocrm", "sessionId": "<id>", "chatId": "client-42", "text": "Ответ менеджера", "timestamp": 1789300000000 }
Итого полный цикл кастомного канала: входящее → POST /api/v1/messages/inbound (в amoCRM); ваш ответ → POST /api/v1/messages (в amoCRM); ответ менеджера из amoCRM → на ваш Webhook доставки. Обе стороны видны в amoCRM, и переписка ходит в обе стороны.
Приём сообщений (Webhook)
Если у сессии задан webhookUrl, каждое входящее сообщение OmniGate доставляет на этот адрес POST-запросом с телом application/json. Формат единый для всех каналов.
Формат входящего
| Поле | Тип | Описание |
|---|---|---|
channel | string | Канал, откуда сообщение. |
sessionId | string | ID сессии. Используйте его для ответа. |
chatId | string | Диалог/собеседник — куда отвечать. |
from | string | Отправитель (id / телефон / username). |
text | string | null | Текст сообщения (null, если только вложение). |
attachments | array | Вложения: [{ type, url? }]. Может отсутствовать. |
timestamp | number | Время получения, Unix-время в миллисекундах. |
raw | object | Исходный payload канала «как есть» — на случай, если нужны специфичные поля. |
POST https://your-crm.ru/hook?token=SECRET Content-Type: application/json { "channel": "whatsapp", "sessionId": "1f1d…uuid", "chatId": "79991234567", "from": "79991234567", "text": "Здравствуйте! Заказ ещё актуален?", "attachments": [], "timestamp": 1750000000000, "raw": { /* исходные данные канала */ } }
Требования к вашему эндпоинту
- Принимайте
POSTс телом JSON, отвечайте кодом 2xx (например,200). - Отвечайте быстро — таймаут запроса 10 секунд. Тяжёлую обработку выносите в очередь, а webhook просто подтверждайте.
- Эндпоинт должен быть доступен по HTTPS.
Повторные попытки
Если ваш сервер ответил не-2xx или не ответил за 10 с, OmniGate повторит доставку с нарастающей задержкой — до 6 попыток: через 2, 4, 8, 16 и 32 секунды. После исчерпания попыток сообщение остаётся в истории (его можно забрать через GET /api/v1/messages).
Подпись запроса (проверка подлинности)
Каждая доставка подписана. Заголовки запроса:
| Заголовок | Описание |
|---|---|
X-OmniGate-Timestamp | Unix-время отправки в миллисекундах. |
X-OmniGate-Signature | sha256=<hex> — HMAC-SHA256 от строки timestamp + "." + body, ключ — ваш секрет подписи (раздел «Webhook» кабинета). |
X-OmniGate-Delivery | Уникальный ID доставки — используйте для идемпотентности при повторах. |
const crypto = require('crypto'); function verify(req, rawBody, secret) { const ts = req.headers['x-omnigate-timestamp']; const sig = req.headers['x-omnigate-signature'] || ''; const want = 'sha256=' + crypto.createHmac('sha256', secret) .update(ts + '.' + rawBody).digest('hex'); return crypto.timingSafeEqual(Buffer.from(sig), Buffer.from(want)); }
webhookUrl секретный токен в query-строке (например ?token=SECRET) и проверять его на своей стороне — это работает и без проверки HMAC.Как обновить webhookUrl
Адрес задаётся при создании сессии (webhookUrl) или меняется в кабинете в настройках канала.
История сообщений
| Параметр | Описание |
|---|---|
sessionId опц. | Фильтр по сессии. Без него — по всем вашим сессиям. |
limit опц. | Сколько вернуть. По умолчанию 50, максимум 200. |
before опц. | Курсор пагинации: вернуть записи старше этого created_at (мс). |
{ "ok": true, "messages": [ { "id": 9012, "session_id": "1f1d…uuid", "direction": "in", // in — входящее, out — исходящее "chat_id": "79991234567", "body": "Заказ ещё актуален?", "created_at": 1750000000000 } ] }
Все эндпоинты
База: https://omnigate.website. Авторизация — X-API-Key (кроме служебных webhook-приёмников).
/openapi.json (OpenAPI 3.1): импортируется в Postman и Insomnia, из него генерируются клиенты, его же читают ИИ-агенты. Краткая выжимка для языковых моделей — /llms.txt.| Метод | Путь | Назначение |
|---|---|---|
| POST | /api/v1/sessions | Создать сессию канала |
| GET | /api/v1/sessions | Список сессий со статистикой |
| GET | /api/v1/sessions/{id} | Статус сессии + QR |
| PATCH | /api/v1/sessions/{id} | Вебхуки канала, зеркало в amoCRM, ИИ-агент |
| POST | /api/v1/sessions/{id}/code | Подтвердить код / пароль 2FA |
| POST | /api/v1/sessions/{id}/resolve | Найти chatId по @username (личный Telegram) |
| DEL | /api/v1/sessions/{id} | Остановить и удалить сессию |
| POST | /api/v1/messages | Отправить сообщение (текст/медиа) |
| POST | /api/v1/messages/upload | Загрузить файл (base64) и отправить |
| POST | /api/v1/messages/inbound | Принять входящее из своего канала (мост) |
| GET | /api/v1/messages | История сообщений |
| GET | /api/v1/events | Поток новых сообщений в реальном времени (SSE) |
| GET | /api/v1/webhook | Адрес вебхука и секрет подписи |
| PUT | /api/v1/webhook | Задать или очистить адрес ({ "url": … }) |
| POST | /api/v1/webhook/rotate | Перевыпустить секрет подписи |
| POST | /api/v1/webhook/test | Отправить тестовый подписанный запрос |
| GET | /api/v1/webhook/deliveries | Журнал доставок вебхука |
| POST | /api/v1/webhook/deliveries/{id}/retry | Повторить доставку |
| GET | /api/v1/webchat | Виджеты веб-чата и код вставки |
| POST | /api/v1/webchat | Создать виджет веб-чата |
| PATCH | /api/v1/webchat/{id} | Настроить виджет (заголовок, цвет, приветствие) |
| DEL | /api/v1/webchat/{id} | Удалить виджет |
| GET | /api/v1/account | Тариф, лимиты и расход за месяц |
| POST | /mcp | Тот же API для ИИ-агентов по Model Context Protocol |
MCP для ИИ-агентов
Тот же API открыт по Model Context Protocol: если ваш агент или ИИ-ассистент умеет подключать MCP-серверы, писать обёртки над curl не нужно — он сам увидит список инструментов, их параметры и подсказки, когда какой применять.
Три точки входа для агента
Агенту достаточно один раз показать одну из трёх машиночитаемых точек входа. Дальше вы пишете обычными словами — «отправь Анне, что заказ собран», — а он сам решает, какой запрос сделать.
| Что дать агенту | Адрес | Кому подходит |
|---|---|---|
| MCP-сервер (самое удобное) | https://omnigate.website/mcp | Claude Desktop, Cursor, Cline, VS Code Copilot, n8n — любой клиент с поддержкой MCP |
| Выжимка для ИИ, текстом | /llms.txt | Агент без MCP, но с доступом в интернет: ChatGPT, Gemini, свой агент на LangChain |
| Спека OpenAPI 3.1 | /openapi.json | Postman и Insomnia, генераторы клиентов, разработчик, который пишет интеграцию руками |
X-API-Key из раздела «API» в кабинете. Агенту выдавайте отдельный ключ с минимальными правами (обычно хватает sessions:read, messages:read, messages:send), а не тот, которым живёт ваш бэкенд. Права меняются у уже выпущенного ключа — перевыпускать его и править конфиг агента не нужно, а отзыв ключа отрубает агенту доступ мгновенно.| Параметр | Значение |
|---|---|
| Адрес | https://omnigate.website/mcp |
| Транспорт | Streamable HTTP — одно JSON-RPC 2.0 сообщение в теле POST, ответ обычным application/json |
| Авторизация | тот же заголовок X-API-Key (принимается и Authorization: Bearer) |
| Версии протокола | 2025-11-25, 2025-06-18, 2025-03-26 |
| Методы | initialize, ping, tools/list, tools/call |
| Лимит | 240 JSON-RPC запросов в минуту на аккаунт |
Подключение клиента
Имена полей у разных клиентов немного отличаются, но смысл один — адрес и заголовок с ключом:
{
"mcpServers": {
"omnigate": {
"type": "http",
"url": "https://omnigate.website/mcp",
"headers": { "X-API-Key": "og_live_xxxxxxxxxxxxxxxxxxxxxxxx" }
}
}
}
Инструменты
22 инструмента — по одному на каждый эндпоинт /api/v1:
| Группа | Инструменты |
|---|---|
| Каналы | channels_list, channel_get, channel_create, channel_update, channel_delete, channel_resolve_username, channel_submit_login_code |
| Сообщения | messages_history, message_send, message_send_file, message_receive |
| Вебхук | webhook_get, webhook_set, webhook_rotate_secret, webhook_test, webhook_deliveries, webhook_delivery_retry |
| Веб-чат | webchat_widgets_list, webchat_widget_create, webchat_widget_update, webchat_widget_delete |
| Аккаунт | account_get |
POST /mcp X-API-Key: og_live_xxxxxxxxxxxxxxxxxxxxxxxx Content-Type: application/json { "jsonrpc": "2.0", "id": 1, "method": "tools/call", "params": { "name": "message_send", "arguments": { "sessionId": "3f2b8c1e-0f4a-4b7d-9a2e-1c5d6e7f8a90", "chatId": "79991234567", "text": "Здравствуйте! Заказ уже в пути." } } }
Обычные команды вместо технических
Перезапустите клиент и проверьте подключение первой же фразой — «покажи, какие инструменты OmniGate тебе доступны». Агент ответит списком (channels_list, message_send, messages_history и остальные), и дальше технические слова не нужны:
- Какие у меня подключены каналы и все ли в порядке?
- Напиши в WhatsApp на 79991234567: «Заказ собран, привезём завтра до 12».
- Покажи последние 20 сообщений из телеграм-канала поддержки.
- Куда сейчас уходят входящие? Переключи вебхук на https://мой-сервис.ru/hook.
- Сколько сообщений я израсходовал в этом месяце и сколько каналов оплачено?
- Создай виджет чата для сайта с заголовком «Чем помочь?» и синим цветом.
Две вещи стоит сказать агенту заранее — это экономит круг переписки. chatId не выдумывать: это идентификатор собеседника внутри канала, и брать его нужно из истории сообщений, из входящего вебхука или через channel_resolve_username. Канал должен быть connected: если статус другой, пусть агент сначала посмотрит канал — там может ждать QR-код на пересканирование.
Агент без MCP — одна стартовая фраза
Если ваш клиент MCP не умеет, но умеет ходить в интернет и делать HTTP-запросы, хватит одного стартового сообщения. Скопируйте его целиком и подставьте свой ключ:
Прочитай https://omnigate.website/llms.txt — это описание API сервиса OmniGate, через который у меня подключены мессенджеры. Мой ключ: og_live_xxxxxxxxxxxxxxxxxxxxxxxx, передавай его заголовком X-API-Key. Дальше выполняй мои просьбы про сообщения и каналы через этот API. Если запрос вернёт ошибку — прочитай текст ошибки, там по-русски написано, что делать. chatId не выдумывай: бери его из истории сообщений или из входящего вебхука.
/llms.txt — короткая выжимка того же, что на этой странице: с чего начать, что такое канал и chatId, все эндпоинты, лимиты, права ключа и формат входящего вебхука. Агент прочитает её один раз и дальше будет составлять запросы сам; команды ему пишутся те же, что выше.
Чего агент сделать не сможет
И это намеренно: выпускать новые API-ключи (ключ, выпускающий ключи, обходит любые ограничения прав), менять тариф и платить, заходить в админку, проходить OAuth amoCRM и YCLIENTS. Всё это остаётся за человеком в кабинете. Ещё два ограничения — секрет подписи вебхука и поток событий — описаны ниже.
Что стоит учесть
- Права работают точно так же. Инструмент выполняется от лица владельца ключа тем же кодом, что и REST, поэтому права ключа, лимиты тарифа и рейт-лимит действуют идентично. Обойти их через MCP нельзя.
tools/listуже отфильтрован по правам вашего ключа: чего в списке нет — того ключу не разрешили. Вызовы попадают в тот же журнал обращений с пометкой mcp: перед путём.- Отказ сервиса — не ошибка протокола. Нехватка прав, лимит тарифа, недоступный мессенджер приходят как обычный результат с
isError: trueи текстом на русском, в котором сказано, что делать. Ошибкой JSON-RPC отвечают только нарушения протокола:-32602— неизвестный инструмент,-32601— неизвестный метод,-32700— не разобрать тело. - Секрет подписи вебхука через MCP не выдаётся.
webhook_getвозвращаетhasSecretи последние 4 символа — контекст агента слишком легко утекает. Полный секрет — в кабинете или запросом GET /api/v1/webhook. - SSE-потока среди инструментов нет — поток не укладывается в один вызов. Вместо /api/v1/events опрашивайте
messages_history.
Коды ошибок
| HTTP | Когда |
|---|---|
| 400 | Неверные параметры запроса (нет обязательных полей, неизвестный канал). |
| 401 | Нет ключа, либо ключ неверный/отозванный. |
| 402 | Превышен лимит тарифа (каналы или сообщения за месяц). Обновите тариф. |
| 403 | У ключа нет права на эту операцию. В теле — scope (какое право нужно) и scopes (какие есть у ключа). |
| 404 | Сессия не найдена или принадлежит другому аккаунту. |
| 413 | Сообщение длиннее 4000 символов. |
| 429 | Слишком часто: 120 запросов в минуту на аккаунт (для публичных ручек виджета — 30 сообщений в минуту с одного IP). В ответе — поле retryAfter и заголовок Retry-After в секундах. |
| 502 | Сообщение не принято каналом (см. поле error в ответе). |
Тело ответа при ошибке всегда содержит { "ok": false, "error": "…" }.
Готовая интеграция: amoCRM
OmniGate подключается к amoCRM как чат-канал: входящие из мессенджеров появляются в чатах amoCRM (раздел «Беседы» / «Неразобранное»), ответы менеджеров уходят клиенту обратно в тот же мессенджер. Программировать ничего не нужно — интеграция включается из кабинета.
Подключение
- Кабинет → раздел amoCRM → кнопка «Подключить через amoCRM» → войдите в свой amoCRM и нажмите «Разрешить».
- Подключение выполняется под администратором аккаунта amoCRM и занимает меньше минуты.
Воронки: куда падают заявки
Для каждого канала (номера) можно выбрать свою воронку — новые обращения будут создавать «Неразобранное» именно в ней:
- в разделе amoCRM кабинета — блок «Куда падают заявки» со списком всех каналов;
- или в карточке канала: «Вебхук и детали» → «Воронка amoCRM».
Если воронка не выбрана — обращения идут в воронку по умолчанию.
Что зеркалится
- Входящие текстовые сообщения клиентов — в чат amoCRM.
- Ответы встроенного ИИ-агента — тоже видны в чате amoCRM (как исходящие).
- Ответ менеджера из карточки amoCRM — доставляется клиенту в мессенджер.
- Зеркалирование можно выключить для отдельного канала (галочка в карточке канала).
webhookUrl. Если у канала настроен вебхук — считается, что отвечает ваша внешняя система (через POST /api/v1/messages), и встроенный агент молчит.Готовая интеграция: YCLIENTS
Для салонов и студий, работающих в YCLIENTS, подключение делается без кода — прямо в кабинете. OmniGate сам ловит события записи и рассылает клиентам уведомления и напоминания через любой ваш подключённый канал (WhatsApp, Telegram, MAX, VK).
Как это работает
- Устанавливаете приложение OmniGate из маркетплейса YCLIENTS (или привязываете филиал вручную по его ID и user-токену).
- В кабинете выбираете, через какой канал (сессию) отправлять сообщения клиентам филиала.
- Включаете нужные типы уведомлений и задаёте свои шаблоны текста. Готово — сообщения уходят автоматически.
Типы уведомлений
| Тип | Когда отправляется |
|---|---|
| Создание записи | Клиент записался — сразу подтверждение с датой, услугой и мастером. |
| Изменение записи | Перенос даты/времени или услуги — уведомление об изменениях. |
| Отмена записи | Запись удалили или отменили — сообщение об отмене. |
| Напоминание «до» | За N часов до визита (настраивается) — напоминание прийти. |
| Сообщение «после» | Через N часов после визита — благодарность/просьба об отзыве. |
Шаблоны
Каждый тип уведомления — это свой шаблон с подстановками. Доступные переменные:
| Переменная | Значение |
|---|---|
{client} | Имя клиента |
{date} | Дата визита |
{time} | Время визита |
{service} | Название услуги |
{master} | Имя мастера |
{company} | Название филиала |
{client}, вы записаны на «{service}» к мастеру {master} {date} в {time}. Ждём вас в «{company}»!
409.Примеры интеграции
Node.js — webhook-приёмник и авто-ответ
import express from 'express'; const app = express(); app.use(express.json()); const API = 'https://omnigate.website'; const KEY = process.env.OMNIGATE_KEY; app.post('/hook', async (req, res) => { // 1) проверяем секрет из query-строки if (req.query.token !== process.env.HOOK_SECRET) return res.sendStatus(403); // 2) сразу подтверждаем приём (важно — до тяжёлой логики) res.sendStatus(200); const { sessionId, chatId, text } = req.body; if (!text) return; // 3) отвечаем тем же диалогом await fetch(`${API}/api/v1/messages`, { method: 'POST', headers: { 'X-API-Key': KEY, 'Content-Type': 'application/json' }, body: JSON.stringify({ sessionId, chatId, text: `Вы написали: ${text}` }) }); }); app.listen(8080);
Python — отправка сообщения
import requests requests.post( "https://omnigate.website/api/v1/messages", headers={"X-API-Key": "og_live_xxx"}, json={ "sessionId": "1f1d…uuid", "chatId": "79991234567", "text": "Заявка принята, менеджер свяжется с вами.", }, timeout=30, )
Сценарий для CRM
Типовая интеграция с amoCRM / Битрикс24 / YCLIENTS:
- Входящее с webhook создаёт/находит сделку или клиента по
from/chatId. - Текст сообщения добавляется в карточку как примечание.
- Ответ менеджера из CRM уходит обратно через
POST /api/v1/messagesс тем жеsessionIdиchatId. - Шаблонные уведомления (статус заказа, запись на услугу) шлются тем же эндпоинтом по событию в CRM.