Введение

API отправляет сообщения через подключённые каналы, а входящие передаёт на ваш адрес. Все запросы и ответы в JSON, кодировка UTF-8.

Адрес API: https://api.wabado.ru

Как начать:

  1. Подключите канал в кабинете или методом создания канала.
  2. Создайте токен в разделе «Токены API».
  3. Отправьте сообщение.
  4. Укажите адрес для входящих.

В кабинете подключённый номер или бот называется каналом. В 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_file15 МБ, в очереди 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

ПолеТипОбязательноеОписание
namestringдаНазвание, до 100 символов
messengerstringнетwhatsapp, telegram, max, telegram_bot, max_bot, vk_group. По умолчанию whatsapp
webhook_urlstringнетСразу добавить адрес для событий этого канала
api_idstringдля telegramКлюч приложения с my.telegram.org
api_hashstringдля telegramКлюч приложения с my.telegram.org
bot_tokenstringдля ботов и VKТокен бота или ключ сообщества

Поля ответа

ПолеТипОписание
profileobjectКанал, поля описаны в разделе статус канала
webhookobjectАдрес с секретом, если передан 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

Возвращает каналы аккаунта. Токен с ограничением видит только свои.

Поля ответа

ПолеТипОписание
profilesarrayСписок каналов
Запрос
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_idstringдаID канала

Поля ответа

ПолеТипОписание
profile_idstringID канала
namestringНазвание
messengerstringТип канала
statusstringСм. статусы канала
authorizedbooleanКанал подключён
phonestringНомер аккаунта, если известен
send_limit_per_minintegerСкорость отправки
last_seen_atstringПоследний сигнал от канала
possible_gap_fromstringНачало периода, когда события могли потеряться из-за перезапуска
possible_gap_tostringКонец этого периода
created_atstringДата создания

Ошибки

  • 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_idstringда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_idstringдаID канала

Тело запроса, JSON

ПолеТипОбязательноеОписание
api_idstringдаНовый api_id
api_hashstringдаНовый 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_idstringда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_idstringда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_idstringдаID канала

Поля ответа

ПолеТипОписание
messengerstringТип канала
capabilities.autharrayСпособы входа: qr, code, pairing_code, password, bot_token
capabilities.recipientarrayКак указать получателя
capabilities.write_firstbooleanfalse, если канал не может писать первым
Запрос
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_idstringдаID канала

Поля ответа

ПолеТипОписание
qrstringКартинка, подходит для src тега img

Ошибки

  • 409 qr_not_ready QR ещё не готов
  • 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_idstringдаID канала

Тело запроса, JSON

ПолеТипОбязательноеОписание
phonestringдаНомер аккаунта

Поля ответа

ПолеТипОписание
codestringКод для ввода на телефоне, только WhatsApp
time_leftintegerСколько секунд действует код
sentbooleanКод отправлен в приложение

Ошибки

  • 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_idstringдаID канала

Тело запроса, JSON

ПолеТипОбязательноеОписание
codestringнетКод из приложения
passwordstringнетПароль двухэтапной проверки

Поля ответа

ПолеТипОписание
need_passwordbooleanНужен ещё пароль

Ошибки

  • 422 bad_code Неверный код
  • 422 bad_password Неверный пароль
  • 422 unsupported_by_messenger WhatsApp подтверждает код на телефоне
  • 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_idstringдаID канала

Поля ответа

ПолеТипОписание
history[].typestringlogin или logout
history[].reasonstringПричина выхода
history[].created_atstringВремя
Запрос
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_idstringдаID канала

Тело запроса, JSON

ПолеТипОбязательноеОписание
recipientstringда, или chat_idНомер получателя. Telegram принимает и @username
chat_idstringда, или recipientID чата из уведомления, используйте для ответа
bodystringдаТекст сообщения
with_previewbooleanнетПоказывать предпросмотр ссылок

Поля ответа

ПолеТипОписание
message_idstringID сообщения в мессенджере
chat_idstringID чата, используйте для ответа
profile_idstringID канала

Ошибки

  • 409 profile_not_connected Канал не подключён
  • 409 profile_restricted Канал ограничен мессенджером
  • 402 insufficient_funds Каналы отключены за неоплату
  • 422 bad_recipient Получателя нет в мессенджере
  • 422 no_recipient Не указан получатель
  • 429 send_limit Превышена скорость канала, см. retry_after
  • 503 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_idstringдаID канала
ttlintegerнетСколько секунд задача может ждать, от 1 до 86400, по умолчанию 600
timeout_fromintegerнетПауза перед отправкой, от, секунд. По умолчанию 1
timeout_tointegerнетПауза перед отправкой, до, секунд. Берётся случайное значение из диапазона

Тело запроса, JSON

ПолеТипОбязательноеОписание
recipientstringда, или chat_idНомер получателя. Telegram принимает и @username
chat_idstringда, или recipientID чата из уведомления, используйте для ответа
bodystringдаТекст сообщения

Поля ответа

ПолеТипОписание
task_idstringID задачи
profile_idstringID канала

Ошибки

  • 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_idstringдаID канала

Тело запроса, JSON

ПолеТипОбязательноеОписание
recipientstringда, или chat_idНомер получателя. Telegram принимает и @username
chat_idstringда, или recipientID чата из уведомления, используйте для ответа
urlstringда, или b64_fileПубличная ссылка на файл
b64_filestringда, или urlФайл в base64
captionstringнетПодпись
file_namestringнетИмя файла
mimetypestringнетТип файла
as_documentbooleanнетОтправить документом, а не картинкой или видео

Поля ответа

ПолеТипОписание
message_idstringID сообщения в мессенджере
chat_idstringID чата, используйте для ответа
profile_idstringID канала

Ошибки

  • 409 profile_not_connected Канал не подключён
  • 409 profile_restricted Канал ограничен мессенджером
  • 402 insufficient_funds Каналы отключены за неоплату
  • 422 bad_recipient Получателя нет в мессенджере
  • 422 no_recipient Не указан получатель
  • 429 send_limit Превышена скорость канала, см. retry_after
  • 503 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_idstringдаID канала
ttlintegerнетСколько секунд задача может ждать, от 1 до 86400, по умолчанию 600
timeout_fromintegerнетПауза перед отправкой, от, секунд. По умолчанию 1
timeout_tointegerнетПауза перед отправкой, до, секунд. Берётся случайное значение из диапазона

Тело запроса, JSON

ПолеТипОбязательноеОписание
recipientstringда, или chat_idНомер получателя. Telegram принимает и @username
chat_idstringда, или recipientID чата из уведомления, используйте для ответа
urlstringда, или b64_fileПубличная ссылка на файл
b64_filestringда, или urlФайл в base64
captionstringнетПодпись
file_namestringнетИмя файла
mimetypestringнетТип файла
as_documentbooleanнетОтправить документом, а не картинкой или видео

Поля ответа

ПолеТипОписание
task_idstringID задачи

Ошибки

  • 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_idstringнетОграничить одним каналом

Тело запроса, JSON

ПолеТипОбязательноеОписание
urlstringдаАдрес вашего сервера
eventsarrayнетТипы событий. По умолчанию все
chat_typesarrayнетprivate, group, channel. По умолчанию только private

Поля ответа

ПолеТипОписание
webhook.idintegerID адреса
webhook.secretstringСекрет для проверки подписи

Ошибки

  • 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

ПолеТипОбязательноеОписание
idintegerдаID адреса
chat_typesarrayда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

Удаляет адрес.

Параметры адреса

ПолеТипОбязательноеОписание
idintegerда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_idstringID чата
chat_phonestringНомер собеседника, если известен. В WhatsApp chat_id бывает в формате @lid
message_idstringID сообщения
data.typestringtext, image, video, audio, document, sticker, location, contact, reaction, other
data.textstringТекст
data.captionstringПодпись к файлу
data.media_urlstringСсылка на файл
data.file_namestringИмя файла
data.mimetypestringТип файла
data.chat_typestringprivate, group, channel, в сессиях MAX отсутствует
data.is_groupbooleanСообщение из группы или канала
data.senderstringID отправителя
data.sender_altstringДругой ID отправителя, например username
data.sender_namestringИмя отправителя
data.reply_tostringID сообщения, на которое ответили
Пример события
{
    "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.тело, ключ это секрет адреса. Отклоняйте запросы с неверной подписью.

PHP
$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_idstringнетТолько этот канал
limitintegerнетОт 1 до 500, по умолчанию 100

Поля ответа

ПолеТипОписание
events[].event_idstringID события
events[].event_typestringТип
events[].chat_idstringЧат
events[].message_idstringСообщение
events[].has_mediabooleanБыл файл
events[].occurred_atstringВремя события
events[].failed_atstringВремя последней неудачи
Запрос
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_idsarrayдаОт 1 до 500 значений

Поля ответа

ПолеТипОписание
acknowledgedintegerСколько событий отмечено

Ошибки

  • 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

ПолеТипОбязательноеОписание
namestringдаНазвание, до 100 символов
stepsarrayдаОт 1 до 5 шагов
steps[].profile_idstringдаКанал, без повторов в цепочке
steps[].bodystringв шаге 1Текст до 4000 символов. Пусто: как в первом шаге
steps[].wait_minutesintegerнетЖдать подтверждение, от 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

Запущенные каскады продолжат работу.

Параметры адреса

ПолеТипОбязательноеОписание
idintegerда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

ПолеТипОбязательноеОписание
recipientstringдаНомер получателя
cascade_idintegerда, или stepsID шаблона
stepsarrayда, или cascade_idШаги, как при создании шаблона
varsobjectесли есть переменныеЗначения переменных

Поля ответа

ПолеТипОписание
broadcast_idintegerID запуска

Ошибки

  • 404 cascade_not_found Шаблон не найден
  • 422 bad_recipient Неверный номер
  • 422 missing_vars Не хватает значений в vars
  • 429 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 дней после завершения.

Параметры адреса

ПолеТипОбязательноеОписание
idintegerдаID запуска

Поля ответа

ПолеТипОписание
run_statusstringrunning, done, cancelled
recipients[].statestringpending, sending, waiting, sent, delivered, failed, cancelled, unknown
recipients[].stepintegerНомер шага с нуля
recipients[].error_codestringКод последней ошибки

Ошибки

  • 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КодЧто значит
400bad_jsonТело запроса не является JSON
400no_profile_idНе указан profile_id
401no_tokenНет токена
401bad_tokenТокен неверен или отозван
402insufficient_fundsКаналы отключены за неоплату
403account_blockedАккаунт заблокирован
403email_not_verifiedПочта не подтверждена
403token_scopeТокен ограничен отдельными каналами
404not_foundТакого метода нет
404profile_not_foundКанал не найден
409duplicate_in_progressЗапрос с этим Idempotency-Key ещё выполняется
409profile_not_connectedКанал не подключён
429rate_limitedСлишком много запросов
429send_limitПревышена скорость канала
502send_failedМессенджер не принял сообщение
503worker_unavailableКанал временно недоступен
504worker_timeoutКанал не ответил вовремя