Введение
API отправляет сообщения через подключённые каналы, а входящие передаёт на ваш адрес. Все запросы и ответы в JSON, кодировка UTF-8.
Адрес API: https://api.wabado.ru
Как начать:
- Подключите канал в кабинете или методом создания канала.
- Создайте токен в разделе «Токены API».
- Отправьте сообщение.
- Укажите адрес для входящих.
В кабинете подключённый номер или бот называется каналом. В API его идентификатор: profile_id.
Авторизация
Передавайте токен в заголовке Authorization каждого запроса. Слово Bearer перед токеном необязательно.
Токен показывается один раз при создании. Его можно ограничить отдельными каналами: такой токен работает только с ними и не может создавать каналы и каскады.
curl -X GET 'https://api.wabado.ru/api/profiles' \
-H 'Authorization: ваш-токен'Формат ответов
При успехе status равен done или queued. Время в полях указано в UTC, поле timestamp содержит время ответа в секундах Unix.
При ошибке ответ содержит status: error, код code, понятный текст message и, если нужно подождать, retry_after в секундах. Код ошибки стабилен, текст может меняться.
{
"status": "error",
"code": "profile_not_connected",
"message": "Профиль не подключён: qr_required",
"retry_after": null,
"timestamp": 1793800000
}Ограничения
Количество сообщений не ограничено и на цену не влияет.
| Что | Значение |
|---|---|
| Скорость отправки на канал | 20 сообщений в минуту, в кабинете можно задать до 120. Это защита номера от блокировки |
| Запросы к API на аккаунт | 600 в минуту |
| Очередь канала | 1000 задач |
Файл в b64_file | 15 МБ, в очереди 2 МБ. Большие файлы передавайте ссылкой |
При превышении ответ будет 429, поле retry_after подскажет паузу.
Защита от дублей
Если соединение оборвалось и неясно, ушло ли сообщение, повторите запрос с тем же заголовком Idempotency-Key. В течение 24 часов такой повтор вернёт прежний ответ и не отправит сообщение ещё раз.
curl -X POST 'https://api.wabado.ru/api/sync/message/send?profile_id=8f2c1a70-4d3e-4b6a-9c11-2f7e5d90ab12' \
-H 'Authorization: ваш-токен' \
-H 'Content-Type: application/json' \
-d '{"recipient":"79110000000","body":"Заказ готов"}' \
-H 'Idempotency-Key: order-1024'Статусы канала
| Статус | Что значит |
|---|---|
starting | Запускается |
qr_required | Нужно отсканировать QR |
code_required | Нужен код или пароль |
connected | Подключён, можно отправлять |
reconnecting | Связь восстанавливается |
restricted | Ограничен мессенджером |
logged_out | Вышел из аккаунта или отключён за неоплату |
failed | Ошибка запуска, например неверные ключи |
Создать канал
POST/api/profiles
Создаёт канал и начинает начисление за него. Нужен токен на все каналы и подтверждённая почта.
Тело запроса, JSON
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
name | string | да | Название, до 100 символов |
messenger | string | нет | whatsapp, telegram, max, telegram_bot, max_bot, vk_group. По умолчанию whatsapp |
webhook_url | string | нет | Сразу добавить адрес для событий этого канала |
api_id | string | для telegram | Ключ приложения с my.telegram.org |
api_hash | string | для telegram | Ключ приложения с my.telegram.org |
bot_token | string | для ботов и VK | Токен бота или ключ сообщества |
Поля ответа
| Поле | Тип | Описание |
|---|---|---|
profile | object | Канал, поля описаны в разделе статус канала |
webhook | object | Адрес с секретом, если передан webhook_url |
Ошибки
422 bad_api_keysНеверные ключи или токен422 bad_webhook_urlАдрес webhook не подходит402 insufficient_fundsКаналы отключены за неоплату
curl -X POST 'https://api.wabado.ru/api/profiles' \
-H 'Authorization: ваш-токен' \
-H 'Content-Type: application/json' \
-d '{"name":"Продажи","messenger":"whatsapp"}'{
"status": "done",
"profile": {
"status": "starting",
"authorized": false,
"phone": null,
"profile_id": "8f2c1a70-4d3e-4b6a-9c11-2f7e5d90ab12",
"name": "Продажи",
"messenger": "whatsapp",
"send_limit_per_min": 20,
"last_seen_at": "2026-11-05T09:00:00Z",
"possible_gap_from": null,
"possible_gap_to": null,
"created_at": "2026-11-01T10:00:00Z"
},
"timestamp": 1793800000
}Список каналов
GET/api/profiles
Возвращает каналы аккаунта. Токен с ограничением видит только свои.
Поля ответа
| Поле | Тип | Описание |
|---|---|---|
profiles | array | Список каналов |
curl -X GET 'https://api.wabado.ru/api/profiles' \
-H 'Authorization: ваш-токен'{
"status": "done",
"profiles": [
{
"profile_id": "8f2c1a70-4d3e-4b6a-9c11-2f7e5d90ab12",
"name": "Продажи",
"messenger": "whatsapp",
"status": "connected",
"authorized": true,
"phone": "79110000000",
"send_limit_per_min": 20,
"last_seen_at": "2026-11-05T09:00:00Z",
"possible_gap_from": null,
"possible_gap_to": null,
"created_at": "2026-11-01T10:00:00Z"
}
],
"timestamp": 1793800000
}Статус канала
GET/api/profiles/status
Возвращает состояние канала.
Параметры адреса
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
profile_id | string | да | ID канала |
Поля ответа
| Поле | Тип | Описание |
|---|---|---|
profile_id | string | ID канала |
name | string | Название |
messenger | string | Тип канала |
status | string | См. статусы канала |
authorized | boolean | Канал подключён |
phone | string | Номер аккаунта, если известен |
send_limit_per_min | integer | Скорость отправки |
last_seen_at | string | Последний сигнал от канала |
possible_gap_from | string | Начало периода, когда события могли потеряться из-за перезапуска |
possible_gap_to | string | Конец этого периода |
created_at | string | Дата создания |
Ошибки
404 profile_not_foundКанала нет или он чужой
curl -X GET 'https://api.wabado.ru/api/profiles/status?profile_id=8f2c1a70-4d3e-4b6a-9c11-2f7e5d90ab12' \
-H 'Authorization: ваш-токен'{
"status": "done",
"profile": {
"profile_id": "8f2c1a70-4d3e-4b6a-9c11-2f7e5d90ab12",
"name": "Продажи",
"messenger": "whatsapp",
"status": "connected",
"authorized": true,
"phone": "79110000000",
"send_limit_per_min": 20,
"last_seen_at": "2026-11-05T09:00:00Z",
"possible_gap_from": null,
"possible_gap_to": null,
"created_at": "2026-11-01T10:00:00Z"
},
"timestamp": 1793800000
}Перезапустить канал
POST/api/profiles/restart
Перезапускает соединение. Вход в аккаунт сохраняется.
Параметры адреса
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
profile_id | string | да | ID канала |
Ошибки
404 profile_not_foundКанала нет или он чужой
curl -X POST 'https://api.wabado.ru/api/profiles/restart?profile_id=8f2c1a70-4d3e-4b6a-9c11-2f7e5d90ab12' \
-H 'Authorization: ваш-токен'{
"status": "done",
"detail": "Профиль будет перезапущен в течение нескольких секунд",
"timestamp": 1793800000
}Заменить ключи Telegram
POST/api/profiles/credentials
Сохраняет новые ключи приложения и перезапускает канал. Ключи хранятся зашифрованными и в ответах не возвращаются.
Параметры адреса
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
profile_id | string | да | ID канала |
Тело запроса, JSON
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
api_id | string | да | Новый api_id |
api_hash | string | да | Новый api_hash |
Ошибки
422 bad_api_keysНеверные ключи422 unsupported_by_messengerКанал не Telegram
curl -X POST 'https://api.wabado.ru/api/profiles/credentials?profile_id=8f2c1a70-4d3e-4b6a-9c11-2f7e5d90ab12' \
-H 'Authorization: ваш-токен' \
-H 'Content-Type: application/json' \
-d '{"api_id":"12345","api_hash":"0123456789abcdef0123456789abcdef"}'{
"status": "done",
"detail": "Ключи сохранены, профиль перезапускается",
"timestamp": 1793800000
}Выйти из аккаунта
POST/api/profiles/logout
Выходит из аккаунта мессенджера и удаляет сессию. Канал остаётся и продолжает оплачиваться, пока вы его не удалите.
Параметры адреса
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
profile_id | string | да | ID канала |
Ошибки
503 worker_unavailableКанал сейчас запускается, повторите позже
curl -X POST 'https://api.wabado.ru/api/profiles/logout?profile_id=8f2c1a70-4d3e-4b6a-9c11-2f7e5d90ab12' \
-H 'Authorization: ваш-токен'{
"status": "done",
"detail": "Выход выполнен, сессия удалена",
"timestamp": 1793800000
}Удалить канал
DELETE/api/profiles
Удаляет канал и его сессию. Начисления прекращаются. Отменить нельзя.
Параметры адреса
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
profile_id | string | да | ID канала |
Ошибки
404 profile_not_foundКанала нет или он чужой
curl -X DELETE 'https://api.wabado.ru/api/profiles?profile_id=8f2c1a70-4d3e-4b6a-9c11-2f7e5d90ab12' \
-H 'Authorization: ваш-токен'{
"status": "done",
"detail": "Профиль и его сессия будут удалены",
"timestamp": 1793800000
}Возможности канала
GET/api/capabilities
Показывает, как канал входит в аккаунт и кому может писать.
Параметры адреса
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
profile_id | string | да | ID канала |
Поля ответа
| Поле | Тип | Описание |
|---|---|---|
messenger | string | Тип канала |
capabilities.auth | array | Способы входа: qr, code, pairing_code, password, bot_token |
capabilities.recipient | array | Как указать получателя |
capabilities.write_first | boolean | false, если канал не может писать первым |
curl -X GET 'https://api.wabado.ru/api/capabilities?profile_id=8f2c1a70-4d3e-4b6a-9c11-2f7e5d90ab12' \
-H 'Authorization: ваш-токен'{
"status": "done",
"messenger": "whatsapp",
"capabilities": {
"auth": [
"qr",
"pairing_code"
],
"media_download": "by_token",
"recipient": [
"phone",
"chat_id"
],
"send_text": true,
"send_file": true,
"history": false,
"search": false,
"reply": false,
"reaction": false,
"edit": false,
"delete": false
},
"timestamp": 1793800000
}Получить QR
GET/api/auth/qr
Возвращает QR как картинку в формате data-URL. Код меняется, поэтому запрашивайте его заново раз в несколько секунд, пока статус не станет connected.
Параметры адреса
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
profile_id | string | да | ID канала |
Поля ответа
| Поле | Тип | Описание |
|---|---|---|
qr | string | Картинка, подходит для src тега img |
Ошибки
409 qr_not_readyQR ещё не готов409 already_authorizedКанал уже подключён409 password_requiredНужен пароль двухэтапной проверки
curl -X GET 'https://api.wabado.ru/api/auth/qr?profile_id=8f2c1a70-4d3e-4b6a-9c11-2f7e5d90ab12' \
-H 'Authorization: ваш-токен'{
"status": "done",
"qr": "data:image/png;base64,iVBORw0KGgo…",
"timestamp": 1793800000
}Запросить код
POST/api/auth/code/request
Вход по номеру для WhatsApp и Telegram. WhatsApp возвращает код в ответе: его нужно ввести на телефоне. Telegram присылает код в приложение.
Параметры адреса
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
profile_id | string | да | ID канала |
Тело запроса, JSON
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
phone | string | да | Номер аккаунта |
Поля ответа
| Поле | Тип | Описание |
|---|---|---|
code | string | Код для ввода на телефоне, только WhatsApp |
time_left | integer | Сколько секунд действует код |
sent | boolean | Код отправлен в приложение |
Ошибки
422 bad_phoneНеверный номер422 unsupported_by_messengerКанал не поддерживает вход по коду503 worker_unavailableКанал сейчас запускается, повторите позже
curl -X POST 'https://api.wabado.ru/api/auth/code/request?profile_id=8f2c1a70-4d3e-4b6a-9c11-2f7e5d90ab12' \
-H 'Authorization: ваш-токен' \
-H 'Content-Type: application/json' \
-d '{"phone":"79110000000"}'{
"status": "done",
"code": "ABCD-EFGH",
"time_left": 60,
"sent": false,
"timestamp": 1793800000
}Подтвердить вход
POST/api/auth/code/confirm
Для Telegram и MAX: передаёт код или пароль двухэтапной проверки. Если need_password равно true, повторите запрос с паролем.
Параметры адреса
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
profile_id | string | да | ID канала |
Тело запроса, JSON
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
code | string | нет | Код из приложения |
password | string | нет | Пароль двухэтапной проверки |
Поля ответа
| Поле | Тип | Описание |
|---|---|---|
need_password | boolean | Нужен ещё пароль |
Ошибки
422 bad_codeНеверный код422 bad_passwordНеверный пароль422 unsupported_by_messengerWhatsApp подтверждает код на телефоне503 worker_unavailableКанал сейчас запускается, повторите позже
curl -X POST 'https://api.wabado.ru/api/auth/code/confirm?profile_id=8f2c1a70-4d3e-4b6a-9c11-2f7e5d90ab12' \
-H 'Authorization: ваш-токен' \
-H 'Content-Type: application/json' \
-d '{"code":"12345"}'{
"status": "done",
"need_password": false,
"timestamp": 1793800000
}История входов
GET/api/auth/history
Последние 100 входов и выходов канала.
Параметры адреса
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
profile_id | string | да | ID канала |
Поля ответа
| Поле | Тип | Описание |
|---|---|---|
history[].type | string | login или logout |
history[].reason | string | Причина выхода |
history[].created_at | string | Время |
curl -X GET 'https://api.wabado.ru/api/auth/history?profile_id=8f2c1a70-4d3e-4b6a-9c11-2f7e5d90ab12' \
-H 'Authorization: ваш-токен'{
"status": "done",
"history": [
{
"type": "login",
"reason": "",
"created_at": "2026-11-05T09:00:00Z"
}
],
"timestamp": 1793800000
}Отправить текст
POST/api/sync/message/send
Отправляет сообщение и ждёт результата до 30 секунд. Подходит для единичных сообщений.
Параметры адреса
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
profile_id | string | да | ID канала |
Тело запроса, JSON
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
recipient | string | да, или chat_id | Номер получателя. Telegram принимает и @username |
chat_id | string | да, или recipient | ID чата из уведомления, используйте для ответа |
body | string | да | Текст сообщения |
with_preview | boolean | нет | Показывать предпросмотр ссылок |
Поля ответа
| Поле | Тип | Описание |
|---|---|---|
message_id | string | ID сообщения в мессенджере |
chat_id | string | ID чата, используйте для ответа |
profile_id | string | ID канала |
Ошибки
409 profile_not_connectedКанал не подключён409 profile_restrictedКанал ограничен мессенджером402 insufficient_fundsКаналы отключены за неоплату422 bad_recipientПолучателя нет в мессенджере422 no_recipientНе указан получатель429 send_limitПревышена скорость канала, см.retry_after503 worker_unavailableКанал сейчас запускается, повторите позже504 worker_timeoutНет ответа за 30 секунд. Сообщение могло уйти, проверьте чат перед повтором
curl -X POST 'https://api.wabado.ru/api/sync/message/send?profile_id=8f2c1a70-4d3e-4b6a-9c11-2f7e5d90ab12' \
-H 'Authorization: ваш-токен' \
-H 'Content-Type: application/json' \
-d '{"recipient":"79110000000","body":"Заказ готов"}'{
"status": "done",
"message_id": "3EB0C431A2",
"chat_id": "79110000000@s.whatsapp.net",
"profile_id": "8f2c1a70-4d3e-4b6a-9c11-2f7e5d90ab12",
"timestamp": 1793800000
}Поставить текст в очередь
POST/api/async/message/send
Сразу принимает задачу, отправка идёт с паузами. Итог приходит событием delivery_status с тем же task_id. Очередь хранится только в памяти и не переживает перезапуск сервиса.
Параметры адреса
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
profile_id | string | да | ID канала |
ttl | integer | нет | Сколько секунд задача может ждать, от 1 до 86400, по умолчанию 600 |
timeout_from | integer | нет | Пауза перед отправкой, от, секунд. По умолчанию 1 |
timeout_to | integer | нет | Пауза перед отправкой, до, секунд. Берётся случайное значение из диапазона |
Тело запроса, JSON
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
recipient | string | да, или chat_id | Номер получателя. Telegram принимает и @username |
chat_id | string | да, или recipient | ID чата из уведомления, используйте для ответа |
body | string | да | Текст сообщения |
Поля ответа
| Поле | Тип | Описание |
|---|---|---|
task_id | string | ID задачи |
profile_id | string | ID канала |
Ошибки
409 profile_not_connectedКанал не подключён429 queue_fullОчередь канала заполнена503 queue_unavailableОчередь недоступна, сообщение не принято
curl -X POST 'https://api.wabado.ru/api/async/message/send?profile_id=8f2c1a70-4d3e-4b6a-9c11-2f7e5d90ab12&timeout_from=5&timeout_to=15' \
-H 'Authorization: ваш-токен' \
-H 'Content-Type: application/json' \
-d '{"recipient":"79110000000","body":"Заказ готов"}'{
"status": "queued",
"task_id": "b1946ac92492d2347c6235b4d2611184",
"profile_id": "8f2c1a70-4d3e-4b6a-9c11-2f7e5d90ab12",
"timestamp": 1793800000
}Отправить файл
POST/api/sync/message/file/send
Отправляет файл и ждёт результата.
Параметры адреса
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
profile_id | string | да | ID канала |
Тело запроса, JSON
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
recipient | string | да, или chat_id | Номер получателя. Telegram принимает и @username |
chat_id | string | да, или recipient | ID чата из уведомления, используйте для ответа |
url | string | да, или b64_file | Публичная ссылка на файл |
b64_file | string | да, или url | Файл в base64 |
caption | string | нет | Подпись |
file_name | string | нет | Имя файла |
mimetype | string | нет | Тип файла |
as_document | boolean | нет | Отправить документом, а не картинкой или видео |
Поля ответа
| Поле | Тип | Описание |
|---|---|---|
message_id | string | ID сообщения в мессенджере |
chat_id | string | ID чата, используйте для ответа |
profile_id | string | ID канала |
Ошибки
409 profile_not_connectedКанал не подключён409 profile_restrictedКанал ограничен мессенджером402 insufficient_fundsКаналы отключены за неоплату422 bad_recipientПолучателя нет в мессенджере422 no_recipientНе указан получатель429 send_limitПревышена скорость канала, см.retry_after503 worker_unavailableКанал сейчас запускается, повторите позже422 no_fileНе указан файл422 bad_file_urlФайл по ссылке недоступен413 file_too_largeФайл слишком большой
curl -X POST 'https://api.wabado.ru/api/sync/message/file/send?profile_id=8f2c1a70-4d3e-4b6a-9c11-2f7e5d90ab12' \
-H 'Authorization: ваш-токен' \
-H 'Content-Type: application/json' \
-d '{"recipient":"79110000000","url":"https://example.ru/invoice.pdf","caption":"Ваш счёт"}'{
"status": "done",
"message_id": "3EB0C431A3",
"chat_id": "79110000000@s.whatsapp.net",
"profile_id": "8f2c1a70-4d3e-4b6a-9c11-2f7e5d90ab12",
"timestamp": 1793800000
}Поставить файл в очередь
POST/api/async/message/file/send
Как очередь для текста. Файлы больше 2 МБ передавайте ссылкой в url.
Параметры адреса
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
profile_id | string | да | ID канала |
ttl | integer | нет | Сколько секунд задача может ждать, от 1 до 86400, по умолчанию 600 |
timeout_from | integer | нет | Пауза перед отправкой, от, секунд. По умолчанию 1 |
timeout_to | integer | нет | Пауза перед отправкой, до, секунд. Берётся случайное значение из диапазона |
Тело запроса, JSON
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
recipient | string | да, или chat_id | Номер получателя. Telegram принимает и @username |
chat_id | string | да, или recipient | ID чата из уведомления, используйте для ответа |
url | string | да, или b64_file | Публичная ссылка на файл |
b64_file | string | да, или url | Файл в base64 |
caption | string | нет | Подпись |
file_name | string | нет | Имя файла |
mimetype | string | нет | Тип файла |
as_document | boolean | нет | Отправить документом, а не картинкой или видео |
Поля ответа
| Поле | Тип | Описание |
|---|---|---|
task_id | string | ID задачи |
Ошибки
413 file_too_largeВ очереди файл через b64_file не больше 2 МБ429 queue_fullОчередь канала заполнена
curl -X POST 'https://api.wabado.ru/api/async/message/file/send?profile_id=8f2c1a70-4d3e-4b6a-9c11-2f7e5d90ab12' \
-H 'Authorization: ваш-токен' \
-H 'Content-Type: application/json' \
-d '{"recipient":"79110000000","url":"https://example.ru/invoice.pdf"}'{
"status": "queued",
"task_id": "b1946ac92492d2347c6235b4d2611185",
"profile_id": "8f2c1a70-4d3e-4b6a-9c11-2f7e5d90ab12",
"timestamp": 1793800000
}Скачать входящий файл
GET/api/media/{token}
Входящий файл приходит в уведомлении ссылкой media_url. Запросите её с токеном и profile_id. В ответе будет содержимое файла, а не JSON. Мы файлы не храним, поэтому ссылка работает 7 дней или пока файл есть у мессенджера. Заберите нужные файлы сразу.
curl -X GET 'https://api.wabado.ru/api/media/ТОКЕН_ФАЙЛА?profile_id=8f2c1a70-4d3e-4b6a-9c11-2f7e5d90ab12' \
-H 'Authorization: ваш-токен' \
-o file.pdfДобавить адрес
POST/api/webhooks
Добавляет адрес, на который приходят события. Адрес должен быть публичным и работать по https. Секрет показывается один раз. С параметром profile_id адрес получает события только этого канала.
Параметры адреса
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
profile_id | string | нет | Ограничить одним каналом |
Тело запроса, JSON
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
url | string | да | Адрес вашего сервера |
events | array | нет | Типы событий. По умолчанию все |
chat_types | array | нет | private, group, channel. По умолчанию только private |
Поля ответа
| Поле | Тип | Описание |
|---|---|---|
webhook.id | integer | ID адреса |
webhook.secret | string | Секрет для проверки подписи |
Ошибки
422 bad_webhook_urlАдрес не подходит422 bad_chat_typesНеверный тип чата
curl -X POST 'https://api.wabado.ru/api/webhooks' \
-H 'Authorization: ваш-токен' \
-H 'Content-Type: application/json' \
-d '{"url":"https://example.ru/hook","chat_types":["private","group"]}'{
"status": "done",
"webhook": {
"id": 7,
"url": "https://example.ru/hook",
"secret": "9f86d081884c7d659a2feaa0c55ad015",
"profile_id": null,
"events": "*",
"chat_types": "private,group"
},
"timestamp": 1793800000
}Список адресов
GET/api/webhooks
Возвращает адреса без секретов.
curl -X GET 'https://api.wabado.ru/api/webhooks' \
-H 'Authorization: ваш-токен'{
"status": "done",
"webhooks": [
{
"id": 7,
"profile_id": null,
"url": "https://example.ru/hook",
"events": "*",
"chat_types": "private",
"created_at": "2026-11-05 09:00:00"
}
],
"timestamp": 1793800000
}Выбрать типы чатов
POST/api/webhooks/chat_types
Определяет, сообщения каких чатов приходят на адрес. Отправки через API фильтр не затрагивает. В личных сессиях MAX тип чата неизвестен, поэтому оттуда приходят все сообщения.
Тело запроса, JSON
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
id | integer | да | ID адреса |
chat_types | array | да | private, group, channel |
Ошибки
404 webhook_not_foundАдрес не найден422 bad_chat_typesНеверный тип чата
curl -X POST 'https://api.wabado.ru/api/webhooks/chat_types' \
-H 'Authorization: ваш-токен' \
-H 'Content-Type: application/json' \
-d '{"id":7,"chat_types":["private","channel"]}'{
"status": "done",
"id": 7,
"chat_types": "private,channel",
"timestamp": 1793800000
}Удалить адрес
DELETE/api/webhooks
Удаляет адрес.
Параметры адреса
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
id | integer | да | ID адреса |
Ошибки
404 webhook_not_foundАдрес не найден
curl -X DELETE 'https://api.wabado.ru/api/webhooks?id=7' \
-H 'Authorization: ваш-токен'{
"status": "done",
"timestamp": 1793800000
}События
Мы отправляем POST с JSON. Общие поля: event_type, profile_id, messenger, occurred_at, event_id, sequence.
Типы событий
| Поле | Тип | Описание |
|---|---|---|
incoming_message | сообщение | Входящее сообщение |
outgoing_message_phone | сообщение | Исходящее, отправленное с телефона |
outgoing_message_api | отправка | Исходящее, отправленное через API, без текста |
delivery_status | статус | data.status: sent, delivered, read, played, failed, expired. У задач очереди есть data.task_id. Telegram сообщает только о прочтении |
authorization_status | аккаунт | data.authorized, data.phone, data.reason |
profile_status | канал | data.status, data.reason |
restriction_status | канал | Мессенджер ограничил аккаунт: data.restricted, data.reason |
incoming_call | звонок | Входящий звонок, только WhatsApp |
cascade_status | каскад | Итог по получателю, см. каскады |
Поля сообщения
| Поле | Тип | Описание |
|---|---|---|
chat_id | string | ID чата |
chat_phone | string | Номер собеседника, если известен. В WhatsApp chat_id бывает в формате @lid |
message_id | string | ID сообщения |
data.type | string | text, image, video, audio, document, sticker, location, contact, reaction, other |
data.text | string | Текст |
data.caption | string | Подпись к файлу |
data.media_url | string | Ссылка на файл |
data.file_name | string | Имя файла |
data.mimetype | string | Тип файла |
data.chat_type | string | private, group, channel, в сессиях MAX отсутствует |
data.is_group | boolean | Сообщение из группы или канала |
data.sender | string | ID отправителя |
data.sender_alt | string | Другой ID отправителя, например username |
data.sender_name | string | Имя отправителя |
data.reply_to | string | ID сообщения, на которое ответили |
{
"event_type": "incoming_message",
"profile_id": "8f2c1a70-4d3e-4b6a-9c11-2f7e5d90ab12",
"messenger": "telegram",
"occurred_at": 1793800000,
"chat_id": "1985011953",
"message_id": "36210860",
"data": {
"type": "text",
"text": "Здравствуйте",
"caption": null,
"file_name": null,
"mimetype": null,
"media_url": null,
"is_group": false,
"chat_type": "private",
"sender": "1985011953",
"sender_alt": "ivan",
"sender_name": "Иван",
"reply_to": null
},
"event_id": "evt_359c83c6bc0f2a377e34758d",
"sequence": 70
}Доставка и повторы
Ответьте кодом 2xx в течение 10 секунд, иначе мы повторим запрос: всего до 8 попыток через 0, 2, 6, 14, 30, 62, 126 и 254 секунды, с отклонением до 15%. Содержимое хранится только на это время.
Повторы и обрывы возможны, поэтому отбрасывайте дубли по event_id. Порядок восстанавливайте по sequence.
Проверка подписи
Мы передаём заголовки X-Event-Id, X-Timestamp и X-Signature. Подпись содержит sha256= и HMAC-SHA256 от строки X-Timestamp.тело, ключ это секрет адреса. Отклоняйте запросы с неверной подписью.
$body = file_get_contents('php://input');
$expected = 'sha256=' . hash_hmac(
'sha256',
$_SERVER['HTTP_X_TIMESTAMP'] . '.' . $body,
$secret
);
if (!hash_equals($expected, $_SERVER['HTTP_X_SIGNATURE'] ?? '')) {
http_response_code(403);
exit;
}
$event = json_decode($body, true);Недоставленные события
GET/api/events/missed
Если адрес не ответил на все попытки, текст удаляется, а служебные данные хранятся 30 дней. Сам текст можно посмотреть в телефоне.
Параметры адреса
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
profile_id | string | нет | Только этот канал |
limit | integer | нет | От 1 до 500, по умолчанию 100 |
Поля ответа
| Поле | Тип | Описание |
|---|---|---|
events[].event_id | string | ID события |
events[].event_type | string | Тип |
events[].chat_id | string | Чат |
events[].message_id | string | Сообщение |
events[].has_media | boolean | Был файл |
events[].occurred_at | string | Время события |
events[].failed_at | string | Время последней неудачи |
curl -X GET 'https://api.wabado.ru/api/events/missed' \
-H 'Authorization: ваш-токен'{
"status": "done",
"events": [
{
"event_id": "evt_359c83c6bc0f2a377e34758d",
"profile_id": "8f2c1a70-4d3e-4b6a-9c11-2f7e5d90ab12",
"messenger": "telegram",
"message_id": "36210860",
"chat_id": "1985011953",
"event_type": "incoming_message",
"has_media": false,
"occurred_at": "2026-11-05T09:00:00Z",
"failed_at": "2026-11-05T09:04:20Z"
}
],
"timestamp": 1793800000
}Отметить обработанными
POST/api/events/missed/ack
Убирает события из списка недоставленных.
Тело запроса, JSON
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
event_ids | array | да | От 1 до 500 значений |
Поля ответа
| Поле | Тип | Описание |
|---|---|---|
acknowledged | integer | Сколько событий отмечено |
Ошибки
422 bad_event_idsНеверный список
curl -X POST 'https://api.wabado.ru/api/events/missed/ack' \
-H 'Authorization: ваш-токен' \
-H 'Content-Type: application/json' \
-d '{"event_ids":["evt_359c83c6bc0f2a377e34758d"]}'{
"status": "done",
"acknowledged": 1,
"timestamp": 1793800000
}Как работает каскад
Каскад отправляет сообщение через каналы по порядку. Следующий канал используется, если отправка не удалась. Если у шага wait_minutes больше 0, то и если за это время не пришло подтверждение.
WhatsApp подтверждает доставку и прочтение, Telegram только прочтение, MAX подтверждения не передаёт. Поэтому ожидание для Telegram и MAX может привести к повторному сообщению.
В каскаде работают WhatsApp, Telegram и MAX. Все методы требуют токен на все каналы. Рассылки из таблицы запускаются в кабинете.
Создать шаблон
POST/api/cascades
Сохраняет цепочку каналов и текст. Переменные пишутся как {{имя}}.
Тело запроса, JSON
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
name | string | да | Название, до 100 символов |
steps | array | да | От 1 до 5 шагов |
steps[].profile_id | string | да | Канал, без повторов в цепочке |
steps[].body | string | в шаге 1 | Текст до 4000 символов. Пусто: как в первом шаге |
steps[].wait_minutes | integer | нет | Ждать подтверждение, от 0 до 10080 минут |
Ошибки
422 bad_stepsОшибка в шагах422 bad_nameНеверное название
curl -X POST 'https://api.wabado.ru/api/cascades' \
-H 'Authorization: ваш-токен' \
-H 'Content-Type: application/json' \
-d '{"name":"Заказ готов","steps":[{"profile_id":"8f2c1a70-4d3e-4b6a-9c11-2f7e5d90ab12","body":"Привет, {{имя}}! Заказ готов","wait_minutes":0},{"profile_id":"1b7d9e24-6c3f-4a15-8e02-c4f8a1d07e33","body":"Привет, {{имя}}! Заказ готов","wait_minutes":0}]}'{
"status": "done",
"id": 12,
"timestamp": 1793800000
}Список шаблонов
GET/api/cascades
Возвращает шаблоны аккаунта.
curl -X GET 'https://api.wabado.ru/api/cascades' \
-H 'Authorization: ваш-токен'{
"status": "done",
"cascades": [
{
"id": 12,
"name": "Заказ готов",
"steps": [
{
"profile_id": "8f2c1a70-4d3e-4b6a-9c11-2f7e5d90ab12",
"body": "Привет, {{имя}}! Заказ готов",
"wait_minutes": 0
},
{
"profile_id": "1b7d9e24-6c3f-4a15-8e02-c4f8a1d07e33",
"body": "Привет, {{имя}}! Заказ готов",
"wait_minutes": 0
}
],
"created_at": "2026-11-05T09:00:00Z"
}
],
"timestamp": 1793800000
}Удалить шаблон
DELETE/api/cascades
Запущенные каскады продолжат работу.
Параметры адреса
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
id | integer | да | ID шаблона |
Ошибки
404 cascade_not_foundШаблон не найден
curl -X DELETE 'https://api.wabado.ru/api/cascades?id=12' \
-H 'Authorization: ваш-токен'{
"status": "done",
"timestamp": 1793800000
}Запустить каскад
POST/api/cascades/send
Запускает каскад на одного получателя. Итог приходит событием cascade_status: в data будут broadcast_id, recipient_id, phone, status, step, code. Статусы: sent, delivered, failed, unknown. unknown значит, что сообщение могло уйти, но подтверждения нет. Незапущенный каскад истекает через час. Поддерживает Idempotency-Key.
Тело запроса, JSON
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
recipient | string | да | Номер получателя |
cascade_id | integer | да, или steps | ID шаблона |
steps | array | да, или cascade_id | Шаги, как при создании шаблона |
vars | object | если есть переменные | Значения переменных |
Поля ответа
| Поле | Тип | Описание |
|---|---|---|
broadcast_id | integer | ID запуска |
Ошибки
404 cascade_not_foundШаблон не найден422 bad_recipientНеверный номер422 missing_varsНе хватает значений вvars429 queue_fullБольше 2000 незавершённых получателей402 insufficient_fundsКаналы отключены за неоплату
curl -X POST 'https://api.wabado.ru/api/cascades/send' \
-H 'Authorization: ваш-токен' \
-H 'Content-Type: application/json' \
-d '{"cascade_id":12,"recipient":"79110000000","vars":{"имя":"Анна"}}'{
"status": "queued",
"broadcast_id": 345,
"timestamp": 1793800000
}Ход каскада
GET/api/cascades/status
Показывает состояние запуска. Данные хранятся 7 дней после завершения.
Параметры адреса
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
id | integer | да | ID запуска |
Поля ответа
| Поле | Тип | Описание |
|---|---|---|
run_status | string | running, done, cancelled |
recipients[].state | string | pending, sending, waiting, sent, delivered, failed, cancelled, unknown |
recipients[].step | integer | Номер шага с нуля |
recipients[].error_code | string | Код последней ошибки |
Ошибки
404 not_foundЗапуск не найден
curl -X GET 'https://api.wabado.ru/api/cascades/status?id=345' \
-H 'Authorization: ваш-токен'{
"status": "done",
"run_status": "running",
"recipients": [
{
"phone": "79110000000",
"state": "waiting",
"step": 0,
"error_code": null
}
],
"timestamp": 1793800000
}Коды ошибок
Общие ошибки. Ошибки отдельных методов описаны рядом с ними.
| HTTP | Код | Что значит |
|---|---|---|
| 400 | bad_json | Тело запроса не является JSON |
| 400 | no_profile_id | Не указан profile_id |
| 401 | no_token | Нет токена |
| 401 | bad_token | Токен неверен или отозван |
| 402 | insufficient_funds | Каналы отключены за неоплату |
| 403 | account_blocked | Аккаунт заблокирован |
| 403 | email_not_verified | Почта не подтверждена |
| 403 | token_scope | Токен ограничен отдельными каналами |
| 404 | not_found | Такого метода нет |
| 404 | profile_not_found | Канал не найден |
| 409 | duplicate_in_progress | Запрос с этим Idempotency-Key ещё выполняется |
| 409 | profile_not_connected | Канал не подключён |
| 429 | rate_limited | Слишком много запросов |
| 429 | send_limit | Превышена скорость канала |
| 502 | send_failed | Мессенджер не принял сообщение |
| 503 | worker_unavailable | Канал временно недоступен |
| 504 | worker_timeout | Канал не ответил вовремя |