Шлюз мессенджеров API openapi.json

Документация API

Шлюз даёт HTTP API к пользовательским аккаунтам MAX, WhatsApp и Telegram в формате GREEN-API. Клиенты и SDK GREEN-API работают со шлюзом, если указать другой apiUrl. Всё, чего нет в этом документе, шлюз не поддерживает.

Машиночитаемое описание: openapi.json (OpenAPI 3.1).

Быстрый старт

  1. Получите у администратора шлюза инстанс: idInstance и apiTokenInstance. Инстанс — один подключённый аккаунт мессенджера. Администратор создаёт его в панели /admin или методом createInstance.
  2. Подключите аккаунт: откройте страницу входа qrPage и отсканируйте QR в приложении мессенджера. Для Telegram и WhatsApp есть вход по номеру.
  3. Дождитесь состояния authorized (getStateInstance).
  4. Отправьте сообщение:
curl -X POST "https://message.bclife.ru/waInstance1101234567/sendMessage/<apiTokenInstance>" \
  -H "Content-Type: application/json" \
  -d '{"chatId": "79991234567@c.us", "message": "Здравствуйте!"}'
{"idMessage": "3EB0C767D097B7C7C030"}
  1. Получайте входящие и статусы: укажите webhookUrl в setSettings или опрашивайте receiveNotification.

Адреса и авторизация

{apiUrl}/waInstance{idInstance}/{method}/{apiTokenInstance}
{apiUrl}/v3/waInstance{idInstance}/{method}/{apiTokenInstance}     — то же самое, как в GREEN-API v3 для MAX
{apiUrl}/waInstance{idInstance}/deleteNotification/{apiTokenInstance}/{receiptId}
{apiUrl}/partner/{method}/{partnerToken}
GET {apiUrl}/healthz                                               — {"ok": true}

Ответы и ошибки

Ошибка — JSON {"message": "…"} с HTTP-кодом:

Код Когда
400 ошибка в запросе (Validation failed. Details: …); инстанс не авторизован (instance is starting or not authorized); ошибка мессенджера
401 неверный apiTokenInstance или partnerToken
403 инстанса с таким idInstance нет
404 неизвестный метод; не найдены сообщение или импорт
405 метод вызван не тем HTTP-методом (например, GET вместо POST)
469 превышен лимит проверки номеров у MAX — повторите позже
500 внутренняя ошибка; тело больше 100 КБ (request entity too large)
501 метод не поддерживается этим мессенджером
502 мессенджер не ответил вовремя

Методы входа (sendAuthorizationPassword, startAuthorization, sendAuthorizationCode) отвечают 200 даже при неудаче — как в GREEN-API:

{"status": false, "data": {"status": "fail", "reason": "invalid_code"}}
reason Значение
already_registered аккаунт уже подключён
not_ready инстанс ещё запускается — повторите через несколько секунд
invalid_code, code_expired код неверный или устарел
invalid_password неверный пароль
authorization_not_started код или пароль сейчас не ожидаются
rate_limit_exceeded слишком много попыток; в retryAfter — пауза в миллисекундах
invalid_phone_number, blocked_or_deleted номер неверный или заблокирован
not_supported у этого мессенджера такого способа входа нет
timeout прочие ошибки и истечение времени

Мессенджеры и поддержка методов

✔ — работает; Ж — ответ из журнала шлюза (у WhatsApp нет истории на сервере); — — не поддерживается.

Метод MAX WhatsApp Telegram
Аккаунт: getStateInstance, getStateInstanceHistory, getSettings, setSettings, reboot, logout, getWaSettings ✔ ✔ ✔
Вход по QR: qr, qrPage ✔ ✔ ✔
Пароль: sendAuthorizationPassword ✔ (2FA) — ✔ (облачный пароль)
Код по номеру: getAuthorizationCode — ✔ —
Номер + код: startAuthorization, sendAuthorizationCode — — ✔
sendMessage, sendTyping, readChat ✔ ✔ ✔
receiveNotification, deleteNotification, webhook ✔ ✔ ✔
getChatHistory, getMessage, getChats ✔ Ж ✔
getContacts — (501) ✔ ✔
getContactInfo, checkAccount, checkWhatsapp ✔ ✔ ✔
Очереди: showMessagesQueue, clearMessagesQueue, getMessagesCount, getWebhooksCount, clearWebhooksQueue ✔ ✔ ✔
addContact, editContact, deleteContact, importContacts, getImportContactsStatus, cancelImportContacts ✔ — (501) — (501)

typeInstance: v3 — MAX, whatsapp — WhatsApp, telegram — Telegram.

Идентификаторы

chatId

Мессенджер Личный чат Группа По номеру
MAX ID диалога, положительное число (123456789) отрицательное число 79991234567@c.us — отправка по номеру
WhatsApp 79991234567@c.us или LID …@lid …@g.us 79991234567@c.us
Telegram ID пользователя (10000000) -4012345678; супергруппа и канал — -100… 79991234567@c.us — поиск по номеру

Допустимые форматы: число (можно со знаком минус), цифры@c.us, цифры@lid, цифры-цифры@g.us.

LID WhatsApp. WhatsApp заменяет номера на скрытые идентификаторы …@lid. По умолчанию (enableLidMode = "no") шлюз переводит LID в номер, если знает его. С enableLidMode = "yes" LID приходит как есть.

idMessage

Мессенджер Отправленное через API Входящее или отправленное с телефона
MAX 13 цифр, время в миллисекундах (1761140000000) ID сообщения MAX
WhatsApp ID вида 3EB0… тот же формат
Telegram 13 цифр, время в миллисекундах ID сообщения Telegram (50650); в супергруппах и каналах — chatId_ID

idMessage выдаётся сразу при постановке в очередь и не меняется. Методы, которые принимают idMessage (quotedMessageId, getMessage, readChat), понимают и этот ID, и ID мессенджера.

Статусы сообщений

sent → delivered → read; ошибки — failed, noAccount (у номера нет аккаунта), notInGroup.

Состояния инстанса

Состояние Значение
notAuthorized аккаунт не подключён — нужен вход
pendingCode ждём код из Telegram (расширение шлюза)
pendingPassword ждём пароль 2FA (MAX) или облачный пароль (Telegram)
starting подключение или переподключение
authorized аккаунт подключён, можно отправлять
blocked аккаунт заблокирован мессенджером
suspended временные ограничения (бан WhatsApp, FLOOD_WAIT Telegram)

Каждое изменение пишется в историю (getStateInstanceHistory) и приходит уведомлением stateInstanceChanged, если stateWebhook = "yes".

Partner API

Управление инстансами. Адрес: {apiUrl}/partner/{method}/{partnerToken}. Токен задаёт администратор шлюза (GATEWAY_PARTNER_TOKEN); без него методы выключены. Токен даёт доступ ко всем аккаунтам — используйте его только на своём сервере.

createInstance

POST /partner/createInstance/{partnerToken} — создать инстанс.

Поле Тип Описание
name string название для себя
messenger string max (по умолчанию), whatsapp, telegram
maxTransport string только MAX: web (единственный доступный)
proxyUrl string прокси для подключения к мессенджеру: socks5://… или http://…; потом не меняется
…настройки любые поля setSettings, например webhookUrl
{"name": "Салон на Ленина", "messenger": "whatsapp", "webhookUrl": "https://crm.example.ru/hooks/messenger", "webhookUrlToken": "secret-for-webhook"}
{"idInstance": 1101234567, "apiTokenInstance": "d75b3a66374942c5b3c019c698abc2067e151558acbd412345", "typeInstance": "whatsapp"}

Telegram-инстанс создаётся, только если на шлюзе задано приложение Telegram (GATEWAY_TELEGRAM_API_ID, GATEWAY_TELEGRAM_API_HASH).

deleteInstanceAccount

POST /partner/deleteInstanceAccount/{partnerToken} — выйти из аккаунта и удалить инстанс со всеми данными (журнал, очереди, сессия). Отменить нельзя.

{"idInstance": 1101234567}
{"deleteInstanceAccount": true}

Если инстанса нет: {"deleteInstanceAccount": false, "reason": "Instance not found"}.

getInstances

GET /partner/getInstances/{partnerToken} — все инстансы. Ответ содержит токены всех аккаунтов.

[{"idInstance": 1101234567, "name": "Салон на Ленина", "typeInstance": "whatsapp",
  "apiTokenInstance": "d75b…", "stateInstance": "authorized", "timeCreated": "2026-10-25T12:00:00Z"}]

У MAX есть поле maxTransport.

Аккаунт

getStateInstance

GET /waInstance{id}/getStateInstance/{token} → {"stateInstance": "authorized"}. Значения — в разделе Состояния.

getStateInstanceHistory

GET — история состояний, новые первыми (до 100 записей). timestamp — секунды.

[{"stateInstance": "authorized", "timestamp": 1761400000}, {"stateInstance": "starting", "timestamp": 1761399990}]

getSettings

GET — настройки инстанса. Описание полей — в разделе Настройки.

setSettings

POST — изменить настройки. Передавайте только те поля, которые меняете.

{"webhookUrl": "https://crm.example.ru/hooks/messenger", "webhookUrlToken": "secret", "incomingWebhook": "yes"}
{"saveSettings": true}

webhookUrl должен быть публичным адресом http(s): адреса локальной сети и localhost запрещены. wid, typeInstance, maxTransport, proxyUrl здесь не меняются.

reboot

GET — переподключиться к мессенджеру без выхода из аккаунта → {"isReboot": true}.

logout

GET — выйти из аккаунта мессенджера (на телефоне устройство исчезнет) → {"isLogout": true}. Инстанс остаётся, войти можно заново.

getWaSettings

GET — сведения о подключённом аккаунте.

{"avatar": "https://…", "phone": "79991234567", "stateInstance": "authorized", "deviceId": "…"}

Вход в аккаунт

Мессенджер Способы
MAX QR: приложение MAX → «Устройства». Если включена 2FA — состояние pendingPassword, затем sendAuthorizationPassword
WhatsApp QR: «Связанные устройства → Привязка устройства»; или 8-значный код — getAuthorizationCode. На телефоне шлюз виден как «Chrome (Mac OS)»
Telegram QR: «Настройки → Устройства → Подключить устройство» (камерой телефона не сработает); или номер + код — startAuthorization; облачный пароль — pendingPassword

После входа шлюз сам переподключается и после перезапуска входит без QR.

qr

GET — текущий QR-код. Код меняется каждые 20–30 секунд; QR-сессия живёт, пока метод вызывают (не реже раза в минуту).

type message
qrCode PNG в base64 — показать как data:image/png;base64,…
alreadyLogged аккаунт уже подключён
error not_ready (инстанс запускается) или timeout

qrPage

GET — расширение шлюза: готовая HTML-страница входа. Сама обновляет QR каждые 3 секунды и показывает состояние. Ссылка содержит токен — отправляйте её только владельцу аккаунта.

https://message.bclife.ru/waInstance1101234567/qrPage/<apiTokenInstance>

getAuthorizationCode

POST — только WhatsApp: код для «Связать по номеру телефона».

{"phoneNumber": 79991234567}
{"status": true, "code": "ABCD1234"}

При ошибке и у других мессенджеров — {"status": false}.

startAuthorization

POST — только Telegram: начать вход по номеру. Код обычно приходит в приложение Telegram, не по SMS. Состояние станет pendingCode.

{"phoneNumber": 79991234567}
{"status": true, "data": {"status": "success", "reason": ""}}

sendAuthorizationCode

POST — только Telegram: код из Telegram. Если включён облачный пароль, передайте его в password сразу или потом через sendAuthorizationPassword.

{"code": "12345", "password": ""}

sendAuthorizationPassword

POST — пароль 2FA (MAX) или облачный пароль (Telegram) в состоянии pendingPassword.

{"password": "…"}
{"status": true, "data": {"status": "success", "reason": ""}}

Отправка

sendMessage

POST — отправить текст. Сообщение встаёт в очередь, ответ приходит сразу.

Поле Обязательно Описание
chatId да см. chatId
message да текст до 4000 символов (Telegram — до 4096)
quotedMessageId нет idMessage сообщения, на которое отвечаем
typingTime нет показать «печатает» перед отправкой, 1000–20000 мс
{"chatId": "79991234567@c.us", "message": "Напоминаем о записи завтра в 12:00", "typingTime": 2000}
{"idMessage": "3EB0C767D097B7C7C030"}

Если аккаунт не подключён — 400 instance is starting or not authorized. Сообщения уходят строго по очереди, между ними пауза delaySendMessagesMilliseconds (по умолчанию 1000 мс). Результат отправки приходит уведомлениями outgoingAPIMessageReceived и outgoingMessageStatus.

sendTyping

POST — показать собеседнику «печатает».

{"chatId": "79991234567@c.us"}
{"result": true}

Получение уведомлений

Уведомления (входящие сообщения, статусы, смена состояния) копятся в очереди инстанса и хранятся 24 часа. Два способа их получать — выберите один:

Webhook

receiveNotification

GET …/receiveNotification/{token}?receiveTimeout=20 — взять первое уведомление из очереди. Если очередь пуста, запрос ждёт до receiveTimeout секунд (5–60, по умолчанию 5) и возвращает null.

{"receiptId": 15, "body": {"typeWebhook": "incomingMessageReceived", "…": "…"}}

Уведомление остаётся в очереди, пока его не удалят.

deleteNotification

DELETE …/deleteNotification/{token}/{receiptId} — удалить обработанное уведомление → {"result": true} (false — такого уже нет).

Журналы и чаты

getChatHistory

POST — последние сообщения чата, новые первыми. count — 1–1000, по умолчанию 100.

{"chatId": "79991234567@c.us", "count": 20}
[{"type": "incoming", "idMessage": "3A6B…", "timestamp": 1761400000, "typeMessage": "textMessage",
  "chatId": "79991234567@c.us", "chatType": "user", "senderId": "79991234567@c.us", "senderName": "Анна",
  "senderType": "user", "senderContactName": "", "textMessage": "Да, приду",
  "isForwarded": false, "forwardingScore": 0, "isEdited": false, "isDeleted": false},
 {"type": "outgoing", "idMessage": "3EB0…", "timestamp": 1761399000, "typeMessage": "textMessage",
  "chatId": "79991234567@c.us", "chatType": "user", "textMessage": "Напоминаем о записи",
  "statusMessage": "read", "sendByApi": true,
  "isForwarded": false, "forwardingScore": 0, "isEdited": false, "isDeleted": false}]

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

getMessage

POST — одно сообщение: {"chatId": "…", "idMessage": "…"}. Ответ — элемент как в getChatHistory; нет такого — 404 message not found (у WhatsApp).

getChats

GET или POST — список чатов, count — до 1000 (по умолчанию 100): ?count=50 или {"count": 50}.

[{"chatId": "79991234567@c.us", "name": "Анна", "type": "user", "phoneNumber": "79991234567", "unreadCount": 0}]

readChat

POST — отметить прочитанным чат или сообщения до idMessage включительно.

{"chatId": "79991234567@c.us", "idMessage": "3A6B…"}
{"setRead": true}

Контакты и проверка номеров

checkAccount

POST — есть ли у номера аккаунт в мессенджере. Номер — 11–12 цифр. Результат кэшируется на 7 дней; force: true — проверить заново.

{"phoneNumber": 79991234567, "force": false}
{"exist": true, "chatId": "79991234567@c.us", "fromCache": false}

У MAX есть лимит проверок: при его превышении — 469.

checkWhatsapp

POST — то же в формате GREEN-API для WhatsApp: {"phoneNumber": 79991234567} → {"existsWhatsapp": true}. Работает у всех мессенджеров.

getContactInfo

POST — сведения о собеседнике (не о группе): {"chatId": "79991234567@c.us"}.

{"avatar": "", "name": "Анна", "contactName": "Анна Иванова", "chatId": "79991234567@c.us", "chatType": "user",
 "lastSeen": null, "phoneNumber": "79991234567", "phoneNumberTimestamp": 0, "description": ""}

getContacts

GET — адресная книга аккаунта (WhatsApp, Telegram; у MAX — 501).

[{"id": "79991234567@c.us", "name": "Анна", "contactName": "Анна Иванова", "type": "user"}]

addContact

POST — только MAX: добавить номер в контакты аккаунта. Номер — в chatId (79991234567@c.us) или phoneNumber; firstName обязателен, имена — до 100 символов.

{"chatId": "79991234567@c.us", "firstName": "Анна", "lastName": "Иванова"}
{"addContact": true}

Ошибки: 400 Contact …@c.us already exists, 404 …@c.us is not on MAX.

editContact

POST — только MAX: переименовать контакт. Поля как у addContact → {"editContact": true}.

deleteContact

POST — только MAX: {"chatId": "79991234567@c.us"} → {"deleteContact": true}.

importContacts

POST — расширение шлюза, только MAX: загрузить до 10 000 контактов. Импорт идёт в фоне порциями по 50 номеров с паузой 15 секунд и продолжается после перезапуска шлюза. Повторы номеров отбрасываются.

{"contacts": [{"phoneNumber": 79991234567, "firstName": "Анна"}, {"chatId": "79997654321@c.us", "firstName": "Олег", "lastName": "Петров"}]}
{"importId": 1, "status": "running", "total": 2}

Если MAX отвечает ошибкой лимита, импорт ставится на паузу на 2 часа (status: "paused", время продолжения — resumeAt). По окончании приходит уведомление contactsImportFinished.

Импорт контактов не защищает от блокировок: антиспам смотрит, сохранён ли ваш номер у получателя. Телефонная книга — персональные данные, на её загрузку нужно согласие.

getImportContactsStatus

POST — ход импорта: {"importId": 1, "withResults": true}.

{"importId": 1, "status": "done", "total": 2, "processed": 2, "found": 1, "notFound": 1,
 "createdAt": 1761400000, "updatedAt": 1761400030,
 "results": [{"phoneNumber": "79991234567", "exist": true, "chatId": "123456789"},
             {"phoneNumber": "79997654321", "exist": false, "chatId": ""}]}

status: running, paused, done, failed, cancelled. Нет такого импорта — 404.

cancelImportContacts

POST — отменить импорт: {"importId": 1}. Ответ — как у getImportContactsStatus без results.

Очереди

showMessagesQueue

GET — сообщения, которые ещё ждут отправки.

[{"messageID": "3EB0…", "messagesIDs": ["3EB0…"], "type": "sendMessage", "body": {"chatId": "79991234567@c.us", "message": "…"}}]

clearMessagesQueue

GET — удалить все неотправленные сообщения → {"isCleared": true}.

getMessagesCount

GET — сколько сообщений ждёт отправки → {"count": 0}.

getWebhooksCount

GET — сколько уведомлений ждёт доставки → {"count": 3}.

clearWebhooksQueue

GET — удалить все недоставленные уведомления → {"isCleared": true}.

Уведомления

Общие поля: typeWebhook, instanceData (idInstance, wid, typeInstance), timestamp (секунды).

typeWebhook Когда Настройка
incomingMessageReceived входящее сообщение incomingWebhook
outgoingMessageReceived сообщение отправлено с телефона или другого устройства outgoingMessageWebhook
outgoingAPIMessageReceived сообщение, отправленное через API, ушло в мессенджер outgoingAPIMessageWebhook
outgoingMessageStatus статус отправленного сообщения outgoingWebhook
stateInstanceChanged смена состояния инстанса stateWebhook
contactsImportFinished импорт контактов закончен (расширение) всегда

incomingMessageReceived

{
  "typeWebhook": "incomingMessageReceived",
  "instanceData": {"idInstance": 1101234567, "wid": "79990000000@c.us", "typeInstance": "whatsapp"},
  "timestamp": 1761400000,
  "idMessage": "3A6B2C0D…",
  "senderData": {"chatId": "79991234567@c.us", "chatName": "Анна", "chatType": "user",
                 "sender": "79991234567@c.us", "senderName": "Анна", "senderType": "user",
                 "senderContactName": "Анна Иванова", "senderPhoneNumber": 79991234567},
  "messageData": {"typeMessage": "textMessage", "textMessageData": {"textMessage": "Да, приду"}}
}

outgoingMessageReceived и outgoingAPIMessageReceived устроены так же; в senderData.sender — сам аккаунт.

Типы messageData

typeMessage Данные
textMessage textMessageData.textMessage
extendedTextMessage extendedTextMessageData: text, title, description, isForwarded — ссылка или пересланный текст
quotedMessage extendedTextMessageData (text, stanzaId — ID цитаты, participant) и quotedMessage
imageMessage, videoMessage, audioMessage, documentMessage, stickerMessage fileMessageData: caption, fileName, mimeType, downloadUrl
contactMessage contactMessageData: displayName, vcard
locationMessage locationMessageData: latitude, longitude, nameLocation, address
pollMessage pollMessageData: name, options[].optionName, multipleAnswers
reactionMessage extendedTextMessageData.text — эмодзи, quotedMessage.stanzaId — на что реакция
editedMessage editedMessageData: textMessage, stanzaId
deletedMessage deletedMessageData.stanzaId

Файлы: скачивание пока не поддерживается — downloadUrl обычно пустой (заполняется только для фото MAX). Тип, подпись и имя файла приходят.

outgoingMessageStatus

{"typeWebhook": "outgoingMessageStatus", "chatId": "79991234567@c.us",
 "instanceData": {"idInstance": 1101234567, "wid": "79990000000@c.us", "typeInstance": "whatsapp"},
 "timestamp": 1761400005, "idMessage": "3EB0C767D097B7C7C030", "status": "delivered", "sendByApi": true}

status: sent, delivered, read, failed, noAccount, notInGroup; при ошибке есть description.

stateInstanceChanged

{"typeWebhook": "stateInstanceChanged",
 "instanceData": {"idInstance": 1101234567, "wid": "79990000000@c.us", "typeInstance": "whatsapp"},
 "timestamp": 1761400000, "stateInstance": "authorized"}

contactsImportFinished

{"typeWebhook": "contactsImportFinished", "instanceData": {"idInstance": 3101234567, "wid": "", "typeInstance": "v3"},
 "timestamp": 1761400030, "importId": 1, "status": "done", "total": 2, "processed": 2, "found": 1, "error": ""}

Настройки

Флаги — строки "yes" / "no".

Поле По умолчанию Описание
wid — аккаунт (79990000000@c.us), только чтение
typeInstance — v3, whatsapp, telegram, только чтение
webhookUrl "" адрес для уведомлений; пусто — опрос receiveNotification
webhookUrlToken "" значение заголовка Authorization: Bearer …
delaySendMessagesMilliseconds 1000 пауза между отправками, мс
markIncomingMessagesReaded no сразу отмечать входящие прочитанными
markIncomingMessagesReadedOnReply no отмечать прочитанным при ответе через API
incomingWebhook yes уведомления о входящих
outgoingWebhook yes статусы отправленных
outgoingMessageWebhook yes сообщения, отправленные с телефона
outgoingAPIMessageWebhook yes сообщения, отправленные через API
stateWebhook yes смена состояния
editedMessageWebhook, deletedMessageWebhook, pollMessageWebhook yes правки, удаления, опросы
downloadUrlJpeg no поле GREEN-API, на работу шлюза не влияет
keepOnlineStatus MAX yes, иначе no показывать аккаунт «в сети»
enableLidMode no только WhatsApp: не переводить LID в номер
maxTransport web расширение, только MAX, только чтение

Не поддерживается

Эти методы GREEN-API шлюз пока не реализует (ответ 404):

Отличия от GREEN-API