Документация API
Шлюз даёт HTTP API к пользовательским аккаунтам MAX, WhatsApp и Telegram в формате
GREEN-API. Клиенты и SDK GREEN-API работают со шлюзом, если указать
другой apiUrl. Всё, чего нет в этом документе, шлюз не поддерживает.
Машиночитаемое описание: openapi.json (OpenAPI 3.1).
Быстрый старт
- Получите у администратора шлюза инстанс:
idInstanceиapiTokenInstance. Инстанс — один подключённый аккаунт мессенджера. Администратор создаёт его в панели/admin. Внешняя система создаёт инстансы сама по токену партнёра — см. Подключение SaaS к шлюзу. - Подключите аккаунт: откройте страницу входа qrPage и отсканируйте QR в приложении мессенджера. Для Telegram и WhatsApp есть вход по номеру.
- Дождитесь состояния
authorized(getStateInstance). - Отправьте сообщение:
curl -X POST "https://message.bclife.ru/waInstance1101234567/sendMessage/<apiTokenInstance>" \
-H "Content-Type: application/json" \
-d '{"chatId": "79991234567@c.us", "message": "Здравствуйте!"}'
{"idMessage": "3EB0C767D097B7C7C030"}
- Получайте входящие и статусы: укажите
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} — или /partner/{method} + Authorization: Bearer
GET {apiUrl}/healthz — {"ok": true}
apiUrl—https://message.bclife.ru.idInstance— 10 цифр. Первые две цифры — мессенджер:31MAX,11WhatsApp,41Telegram.apiTokenInstance— 50 hex-символов. Даёт полный доступ к аккаунту: храните как пароль, не показывайте в браузере клиентов и не пишите в логи.- Имена методов не зависят от регистра (
sendMessage=sendmessage). - Тело запроса — JSON до 100 КБ, заголовок
Content-Type: application/json. - Неверный токен —
401, неизвестный инстанс —403.
Ответы и ошибки
Ошибка — JSON {"message": "…"} с HTTP-кодом:
| Код | Когда |
|---|---|
400 |
ошибка в запросе (Validation failed. Details: …); инстанс не авторизован (instance is starting or not authorized); ошибка мессенджера |
401 |
неверный apiTokenInstance или partnerToken |
403 |
инстанса с таким idInstance нет; Partner API — превышен лимит партнёра или мессенджер не разрешён |
404 |
неизвестный метод; не найдены сообщение или импорт |
405 |
метод вызван не тем HTTP-методом (например, GET вместо POST) |
429 |
Partner API: слишком частые запросы; пауза — в заголовке Retry-After |
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 | 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 — отправка по номеру |
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 |
ID вида 3EB0… |
тот же формат | |
| Telegram | 13 цифр, время в миллисекундах | ID сообщения Telegram (50650); в супергруппах и каналах — chatId_ID |
idMessage выдаётся сразу при постановке в очередь и не меняется. Методы, которые принимают
idMessage (quotedMessageId, getMessage, readChat), понимают и этот ID, и ID мессенджера.
Статусы сообщений
sent → delivered → read; ошибки — failed, noAccount (у номера нет аккаунта), notInGroup.
- WhatsApp — настоящие квитанции: сначала
sent, потомdeliveredиread. - MAX и Telegram не сообщают о доставке: после ответа сервера сразу
delivered, потомread. - Сообщение, которое не удалось отправить за 24 часа (например, аккаунт не подключён), получает
failed.
Состояния инстанса
| Состояние | Значение |
|---|---|
notAuthorized |
аккаунт не подключён — нужен вход |
pendingCode |
ждём код из Telegram (расширение шлюза) |
pendingPassword |
ждём пароль 2FA (MAX) или облачный пароль (Telegram) |
starting |
подключение или переподключение |
authorized |
аккаунт подключён, можно отправлять |
blocked |
аккаунт заблокирован мессенджером |
suspended |
временные ограничения (бан WhatsApp, FLOOD_WAIT Telegram) |
Каждое изменение пишется в историю (getStateInstanceHistory) и приходит
уведомлением stateInstanceChanged, если stateWebhook = "yes".
Partner API
Partner API нужен внешним системам (SaaS, CRM), которые сами создают инстансы для своих клиентов.
Партнёр — такая система. Администратор шлюза создаёт партнёра в панели /admin → «Партнёры» и
выдаёт ему токен партнёра (64 hex-символа). Токен показывается один раз; потерян — администратор
выпускает новый.
- Партнёр видит и удаляет только свои инстансы. Чужой
idInstanceотвечает так же, как несуществующий. - Администратор задаёт партнёру лимит инстансов и разрешённые мессенджеры.
- Работа с самим инстансом — обычными методами по
apiTokenInstance, как в GREEN-API.
Токен передаётся одним из двух способов:
{apiUrl}/partner/{method}/{partnerToken} — как в GREEN-API
{apiUrl}/partner/{method} + заголовок Authorization: Bearer {partnerToken} — рекомендуем
Заголовок лучше: токен не попадает в журналы прокси и историю браузера.
| Ответ | Когда |
|---|---|
401 Unauthorized |
токен неверный или отозван, партнёр отключён |
403 {"message": "instance limit reached: 5 of 5"} |
исчерпан лимит инстансов |
403 {"message": "messenger whatsapp is not allowed for this partner"} |
мессенджер не разрешён партнёру |
429 {"message": "too many requests"} + заголовок Retry-After (секунды) |
больше 60 запросов в минуту или 20 createInstance в час |
Отключение партнёра закрывает только Partner API: его инстансы продолжают работать по своим
apiTokenInstance.
У администратора шлюза есть ещё общий токен GATEWAY_PARTNER_TOKEN: он видит все инстансы и не
ограничен лимитами. Это служебный доступ — внешним системам его не выдают.
createInstance
POST /partner/createInstance — создать инстанс. Он сразу принадлежит партнёру.
| Поле | Тип | Описание |
|---|---|---|
name |
string | название для себя, например имя клиента |
messenger |
string | max (по умолчанию), whatsapp, telegram |
maxTransport |
string | только MAX: web (единственный доступный) |
proxyUrl |
string | прокси для подключения к мессенджеру: socks5://… или http://…; потом не меняется |
| …настройки | любые поля setSettings, например webhookUrl |
curl -X POST "https://message.bclife.ru/partner/createInstance" \
-H "Authorization: Bearer <partnerToken>" \
-H "Content-Type: application/json" \
-d '{"name": "Салон на Ленина", "messenger": "whatsapp", "webhookUrl": "https://crm.example.ru/hooks/messenger", "webhookUrlToken": "secret-for-webhook"}'
{"idInstance": 1101234567, "apiTokenInstance": "d75b3a66374942c5b3c019c698abc2067e151558acbd412345", "typeInstance": "whatsapp"}
Сохраните apiTokenInstance у себя: им подписываются все запросы к инстансу.
Telegram-инстанс создаётся, только если на шлюзе задано приложение Telegram
(GATEWAY_TELEGRAM_API_ID, GATEWAY_TELEGRAM_API_HASH).
deleteInstanceAccount
POST /partner/deleteInstanceAccount — выйти из аккаунта и удалить инстанс со всеми данными (журнал,
очереди, сессия). Отменить нельзя.
{"idInstance": 1101234567}
{"deleteInstanceAccount": true}
Если инстанса нет или он чужой: {"deleteInstanceAccount": false, "reason": "Instance not found"}.
getInstances
GET /partner/getInstances — инстансы партнёра. Ответ содержит их токены — не показывайте его
пользователям.
[{"idInstance": 1101234567, "name": "Салон на Ленина", "typeInstance": "whatsapp",
"apiTokenInstance": "d75b…", "stateInstance": "authorized", "timeCreated": "2026-10-25T12:00:00Z"}]
У MAX есть поле maxTransport.
getPartnerInfo
GET /partner/getPartnerInfo — сведения о партнёре: лимит, сколько инстансов создано, какие мессенджеры
разрешены. Расширение шлюза; работает только с токеном партнёра.
{"partnerId": 2, "name": "Салон CRM", "status": "active", "maxInstances": 10, "instances": 3,
"messengers": ["whatsapp", "telegram"]}
maxInstances: 0 — без лимита. Если администратор не ограничил мессенджеры, в messengers — все три.
Подключение SaaS к шлюзу
Пошагово: как внешней системе подключать аккаунты своих клиентов.
1. Получите токен партнёра у администратора шлюза. Храните его только на своём сервере: в переменной окружения или в хранилище секретов. Не кладите его в браузер, мобильное приложение или репозиторий. Проверьте токен:
curl -H "Authorization: Bearer $PARTNER_TOKEN" https://message.bclife.ru/partner/getPartnerInfo
2. Создайте инстанс для клиента (createInstance). Сразу укажите webhookUrl —
адрес вашего сервера для уведомлений — и webhookUrlToken, чтобы отличать настоящие уведомления от
поддельных. Сохраните у себя idInstance и apiTokenInstance.
3. Покажите клиенту QR. Ваш сервер запрашивает qr раз в 2–5 секунд и передаёт картинку в интерфейс клиента. Клиент сканирует QR в приложении мессенджера. Для WhatsApp и Telegram можно войти по номеру: getAuthorizationCode, startAuthorization.
Ссылку qrPage клиенту не отправляйте: в ней apiTokenInstance, а он даёт полный доступ к
аккаунту.
4. Дождитесь подключения. Придёт уведомление stateInstanceChanged со
stateInstance: "authorized". Если webhook не настроен — опрашивайте
getStateInstance.
5. Отправляйте и получайте сообщения: sendMessage, входящие —
incomingMessageReceived, статусы — outgoingMessageStatus. Проверяйте
заголовок Authorization: Bearer <webhookUrlToken> в каждом уведомлении.
6. Клиент ушёл — удалите инстанс (deleteInstanceAccount): шлюз выйдет из аккаунта и сотрёт его данные.
Советы:
- Соблюдайте лимит: getPartnerInfo показывает, сколько инстансов осталось.
- На
429подождите столько секунд, сколько указано вRetry-After, и повторите запрос. - Смена токена без простоя: администратор выпускает второй токен, вы переключаетесь на него, затем администратор отзывает старый.
- Для переписки клиентов ваша система — оператор персональных данных, шлюз — обработчик. Оформите поручение обработки в договоре со шлюзом (152-ФЗ).
Аккаунт
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 |
| 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 — шлюз сам отправляет POST на
webhookUrl; - опрос —
receiveNotification+deleteNotification. Работает, только покаwebhookUrlпуст.
Webhook
POST {webhookUrl}, тело — уведомление в формате раздела Уведомления,Content-Type: application/json.- Если задан
webhookUrlToken— заголовокAuthorization: Bearer <webhookUrlToken>. Проверяйте его. - Успех — любой ответ
2xxза 15 секунд. Иначе повтор через 5 с, 15 с, 30 с, далее раз в минуту, пока уведомление не устареет (24 часа). - Уведомления идут строго по порядку: следующее ждёт, пока не доставлено предыдущее.
webhookUrl— только публичный адрес, адреса локальной сети запрещены.
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):
- отправка файлов, геолокации, контактов, опросов:
sendFileByUrl,sendFileByUpload,uploadFile,sendLocation,sendContact,sendPoll; - скачивание файлов
downloadFile; forwardMessages,editMessage,deleteMessage,sendReaction;- группы:
createGroup,getGroupData, участники и администраторы; lastIncomingMessages,lastOutgoingMessages,setProfilePicture,getAvatarи прочие методы, которых нет в этом документе.
Отличия от GREEN-API
- Расширения шлюза: qrPage, importContacts,
getImportContactsStatus, cancelImportContacts,
уведомление
contactsImportFinished, состояниеpendingCode, поляmaxTransportиproxyUrl. - Partner API: метод getPartnerInfo, токен в заголовке
Authorization: Bearer, у каждого партнёра свой токен, только свои инстансы, лимиты и ограничение частоты. - Webhook подписывается заголовком
Authorization: Bearer <webhookUrlToken>. - Telegram и WhatsApp работают через тот же адрес
waInstance…; мессенджер определяется инстансом. - Шлюз работает от имени пользовательских аккаунтов по неофициальным протоколам: мессенджер может ограничить или заблокировать аккаунт за массовые рассылки. Пишите тем, кто ждёт ваших сообщений, соблюдайте паузы и не рассылайте рекламу без согласия.