Вебхуки позволяют узнавать о событиях, которые происходят на стороне Wazzup. Например, что у сообщения изменился статус на «Доставлено» или канал «Не авторизован», а значит, канал надо переподключить.
Wazzup отправляет вебхуки на ваш HTTP‑endpoint. Нужно подписываться на вебхуки по конкретному дочернему аккаунту с использованием client_access_token в заголовке: Authorization: Bearer <client_access_token>
Минимальные требования при приёме вебхуков: отвечайте HTTP 200 как можно быстрее. Логи и бизнес‑логику можно выполнять асинхронно.
message.add — получено входящее сообщение от клиента;message.status_update — обновился статус исходящего сообщения. Например, с «Доставлено» на «Прочитано»;message.delete — сообщение удалено;message.edit — сообщение отредактировано. Приходит только по сообщениям на каналах, которые поддерживают редактирование;waba_template.status_update — изменился статус модерации шаблона WABA. Статус модерации показывает, можно ли использовать шаблон;channel.status_update — изменился статус канала;channel.create — канал создан;channel.delete — канал удалён;channel.qr_update — обновился QR, код подключения → необходимо отобразить новый код клиенту. Приходит для WhatsApp, Telegram Personal, Viber;channel.waba_tier_update — изменился уровень (tier) WABA. Уровень показывает, сколько переписок можно начинать первым в течение 24 часов;group_chat.memberships_update — изменился состав группового чата WhatsApp или участник чата переименован;group_chat.update — изменилась информация о групповом чате.Подписывайтесь только на события, которые обрабатывает ваша система.
В рамках одного вызова можно подписаться сразу на несколько событий.
Метод POST /v2/webhooks
| Body-параметр | Обяз. параметр | Тип параметра | Описание параметра |
data |
да | object |
Список вебхуков, на которые подписываетесь |
data.url |
да | string |
Адрес, на который хотите получать вебхуки |
data.event |
да | string |
Вебхук |
Пример запроса:
curl -L 'https://tech.wazzup24.com/v2/webhooks'
-H 'Content-Type: application/json'
-H 'Authorization: Bearer <client_access_token>'
-d '{
"data": [
{
"url": "https://webhook.site/73796fab-2e6d-492a-b68e-061d825b7db5",
"event": "message.add"
},
{
"url": "https://webhook.site/73796fab-2e6d-492a-b68e-061d825b7db5",
"event": "message.status_update"
}
]
}'
Пример ответа:
{
"data": [
{
"id": "d6c04-7623-43ae-a024-7b36c4004c13",
"url": "https://webhook.site/73796fab-2e6d-492a-b68e-061d825b7db5",
"event": "message.add"
},
{
"id": "b0a26-10d9-4d47-8cda-892c9b471a05",
"url": "https://webhook.site/73796fab-2e6d-492a-b68e-061d825b7db5",
"event": "message.status_update"
}
],
"meta": {
"timestamp": 1759494767
}
}
Результат: Создана подписка на события message.add и message.status_update. Вебхуки будут приходить на адрес https://webhook.site/73796fab-2e6d-492a-b68e-061d825b7db5.
В ответе содержится id подписки — ID нужно для управления вебхуками в других методах.
Метод позволяет подписаться на другие вебхуки, отменить подписку или изменить url для получения событий.
Метод PATCH /v2/webhooks
| Body-параметр | Обяз. параметр | Тип параметра | Описание параметра |
data |
да | object |
Список вебхуков, на которые подписываетесь |
data.id |
да | string |
id подписки |
data.url |
да | string |
Адрес, на который хотите получать вебхуки |
data.event |
да | string |
Вебхук |
Пример:
curl -L -X PATCH 'https://tech.wazzup24.com/v2/webhooks'
-H 'Authorization: Bearer <client_access_token>'
-H 'Content-Type: application/json' -d '{
"data": [
{
"id": "42cdd-a0a6-40fd-b55b-040e7c605d0a",
"url": "https://webhook.site/1d2c6a79-d709-4d00-ad24-856e3d8edfd5",
"event": "message.delete"
}
]
}'
Пример ответа:
{
"data": [
{
"id": "d6c04-7623-43ae-a024-7b36c4004c13",
"url": "https://webhook.site/new-webhook-url",
"event": "message.delete"
}
],
"meta": {
"timestamp": 1759483585
}
}
Результат: Для подписки с id: 411d6c04-7623-43ae-a024-7b36c4004c13 обновлен url для получения вебхуков.
Метод GET /v2/webhooks
Пример:
curl -L 'https://tech.wazzup24.com/v2/webhooks' -H 'Authorization: Bearer <client_access_token>'
Пример ответа:
{
"data": [
{
"id": "891cdbf4-07bd-4c24-942b-27d5c820c879",
"url": "https://webhook.site/3d76c4a6-f1ab-4090-a766-3f9a07bca714",
"event": "channel.status_update"
},
{
"id": "1e35de57-ca04-45ba-a345-67f0d8b11138",
"url": "https://webhook.site/3d76c4a6-f1ab-4090-a766-3f9a07bca714",
"event": "channel.create"
},
{
"id": "ccbe0af3-2f12-4e6e-8c35-78fe3c9d3714",
"url": "https://webhook.site/3d76c4a6-f1ab-4090-a766-3f9a07bca714",
"event": "channel.update"
}
],
"meta": {
"timestamp": 1759483435
}
}
Результат: Список всех подписок на вебхуки для дочернего аккаунта.
Метод DELETE /v2/webhooks
| Body-параметр | Обяз. параметр | Тип параметра | Описание параметра |
data |
да | object |
Список вебхуков, на которые подписываетесь |
data.id |
да | string |
id подписки |
Пример:
curl -L -X DELETE 'https://tech.wazzup24.com/v2/webhooks'
-H 'Authorization: Bearer <client_access_token>'
-H 'Content-Type: application/json'
-d '{
"data": [
{
"id": "dbf4-07bd-4c24-942b-27d5c820c879"
}
]
}'
Пример ответа:
{
"data": null,
"meta": {
"timestamp": 1759483702
}
}
Результат: Подписка с id: dbf4-07bd-4c24-942b-27d5c820c879 удалена. Вы больше не получаете вебхуки с этим событием.
{
"event": "message.add" | "message.status_update" | "message.delete" | "message.edit" | "channel.status_update" | "channel.delete" | "channel.create" | "channel.qr_update" | "channel.waba_tier_update" | "waba_template.status_update" | "group_chat.memberships_update" | "group_chat.update",
"data": [],
"meta": {
"idempotency_key": UUIDv4,
"timestamp": Unix timestamp в секундах
}
}
Внутри поля data содержится само событие. Структура событий:
{
"message_id": "a14325c0-97c0-43dd-917e-f0ad7460b6a9",
"channel_id": "a14325c0-97c0-43dd-917e-f0ad7460b6a9",
"direction": "inbound",
"quoted_message_id": "90126ace-fc10-44ed-90de-c30c3802fcf5" | null,
"timestamp": 1762340622177,
"crm_user_id": "123" | null,
"status": "sent",
"recipient": {
"chat_id": "7999999999",
"username": "my_tg_user",
"phone": "79851112233",
"chat_type": "telegram",
"name": "Tg User"
},
"text": "Привет!",
"attachment": {
"url": "https://some.url/photo.jpg",
"name": "photo.jpg",
"mimetype": "image/jpeg",
"size": 14832,
"sha1": "123456abcdf"
},
"template": {
"id": "2b1c3d4e-5f67-890a-bcde-f123456789ab",
"values": [ "Привет" ],
"buttons": [
{ "text": "Да", "payload": "yes" },
{ "text": "Нет", "payload": "no" }
]
}
}
| Параметр. Обязательные отмечены * | Тип | Описание |
message_id* |
string |
ID сообщения |
channel_id* |
string |
ID канала Wazzup |
direction* |
string |
Направление сообщения: inbound, outbound |
quoted_message_id |
string |
ID цитируемого сообщения |
timestamp* |
number |
Unix timestamp |
status* |
string |
Статус сообщения (accepted) |
crm_user_id |
string |
ID пользователя CRM или "null" |
recipient* |
object |
Получатель сообщения |
recipient.chat_type* |
string |
Тип чата. Доступные значения:
|
recipient.chat_id |
string |
Вариант идентификации для всех типов чата — ID чата, то есть аккаунт контакта в мессенджере.
|
recipient.username |
string |
Только для Telegram. Имя пользователя в Telegram, без @ в начале. Можно использовать при отправке сообщений через Telegram, если неизвестен chatId |
recipient.phone |
string |
Только для Telegram, MAX. Телефон контакта в международном формате, без + и иных символов: только цифры с корректным кодом страны. Может использоваться при отправке сообщений через Telegram, если неизвестен chatId |
text |
string |
Текст сообщения. Должен быть либо text, либо attachment, либо template |
attachment |
object |
Объект вложения |
attachment.url* |
string |
URL файла |
attachment.name |
string |
Имя файла |
attachment.mimetype |
string |
MIME-тип файла |
attachment.size |
number |
Размер файла в байтах |
attachment.sha1 |
string |
SHA-1 хеш файла |
template |
object |
Объект WABA-шаблона |
template.id* |
string |
ID шаблона |
template.values |
array[string] |
Значения переменных шаблона |
template.buttons |
array[object] |
Кнопки шаблона |
template.buttons[].text* |
string |
Текст кнопки |
template.buttons[].payload* |
string |
Payload кнопки |
{
"message_id": UUIDv4 | null,
"request_id": UUIDv4 | null,
"status": "accepted" | "sent" | "delivered" | "read" | "failed",
"reason": string | null
}
Возможные значения reason в зависимости от status.
При status: "accepted" | "sent" | "delivered" | "read" — reason всегда null
При status: "failed" — reason показывает причину ошибки.
| Значение reason | Описание |
network_error |
Ошибка сети |
bad_contact |
Контакт не существует |
text_length_is_too_much |
Максимальная длина сообщения для WhatsApp и Telegram, Max — 4096 знаков, для Instagram* — 1000 знаков |
can_not_get_content |
|
is_spam |
Мессенджер не пропускает сообщение из-за подозрения на спам. Измените сообщение и попробуйте написать позже — если у вас Instagram* или WhatsApp. Если у вас Telegram — напишите в @SpamBot. |
to_many_requests |
Слишком много запросов |
bad_content |
Файл слишком большой или его тип не поддерживается мессенджером |
canceled |
Отправка отменена |
over_24_hour_limit |
Для WABA. Превышен суточный лимит Meta* на диалоговые сессии. Писать первым пока что нельзя. Подождите, пока завершится одна из активных 24-часовых сессий, и заново отправьте сообщение |
wapi_not_enough_money |
Для WABA. Пополните баланс подписки WABA, чтобы писать первым и отправлять шаблоны WABA. |
target_user_is_blocked |
|
no_user_permissions |
|
waba_rejected_by_experiment |
Для WABA. С этим клиентом нельзя начать 24-часовую переписку с шаблона «Маркетинг» — так решили в Meta*. Отправьте шаблон из другой категории |
tgapi_megagroups_not_enabled |
В этот чат нельзя написать из Wazzup. Сейчас мы не поддерживаем некоторые групповые чаты Telegram |
waba_message_undeliverable |
|
viber_is_blocked |
|
waba_limit_marketing_template_sending |
Сейчас этому клиенту нельзя отправить шаблон «Маркетинг» из-за лимитов на маркетинговые сообщения. Попробуйте позже или отправьте шаблон из другой категории |
waba_business_account_locked |
Сообщение не отправлено: Meta* заблокировала ваш аккаунт WhatsApp. Узнайте в инструкции, как выяснить точную причину блокировки и что делать |
message_limit_exceeded |
Сообщение не отправлено: Meta* ограничила количество сообщений, которые можно отправлять с этого номера WABA. Возможно, получатели помечали предыдущие сообщения как спам. |
bad_required_parameter |
Запрос содержит один или несколько неподдерживаемых или некорректно написанных параметров. |
stop_receiving_marketing_messages |
Для WABA. Контакт решил прекратить получать маркетинговые сообщения в WhatsApp от вашей компании. Отправьте шаблон из другой категории или напишите в другой мессенджер |
voice_messages_forbidden |
Для Telegram. Этот пользователь запретил получение голосовых сообщений. |
input_user_deactivated |
Для Telegram. Этот контакт удалил аккаунт в Telegram или заблокировал вас. |
privacy_premium_required |
Для Telegram. Этот контакт принимает сообщения только от аккаунтов с активной подпиской Telegram Premium. Такие подписки оформляют в приложении Telegram. |
allow_payment_required |
Для Telegram. Этот контакт принимает входящие сообщения только за платные звёзды Telegram. |
message_empty |
Для Telegram. Добавьте текст или вложение: Telegram не дает отправить сообщение без контента. |
session_revoked |
Для Telegram. Сообщение не отправлено: Telegram завершил активный сеанс Wazzup. |
file_part_missing |
Для Telegram. Не получилось загрузить файл. Попробуйте снова. |
channel_private |
Для Telegram. Вы не состоите в этой группе или группа удалена. |
contact_can_not_create |
Для MAX и Telegram. Не получилось найти пользователя по username или phone |
channel_blocked |
Канал заблокирован |
message_channel_unavailable |
Канал временно недоступен |
messages_invalid_contact_type |
chat_type несовместим с chat_id |
chat_is_blocked |
Контакт заблокирован |
messages_not_text_first_from_telegram_bot |
Для Telegram Bot. Нельзя писать первым |
bad_contact |
Для WhatsApp. Номер пользователя не зарегистрирован |
messages_not_text_first |
Для Instagram*. Нельзя писать первым |
unknown_error |
Неизвестная ошибка |
{
"message_id": UUIDv4,
"crm_user_id": string | null,
"timestamp": Unix timestamp в миллисекундах
}
{
"message_id": UUIDv4,
"crm_user_id": string | null,
"timestamp": Unix timestamp в миллисекундах
"text": string, // опционально
"old_text": string, // опционально
"attachment": {},
"old_attachment": {}
}
{
"template_id": UUIDv4,
"status": "APPROVED" | "PENDING" | "REJECTED" | "PAUSED" | "DISABLED",
"timestamp": unix epoch,
}
| Параметр | Тип | Описание |
template_id |
String |
guid шаблона |
status |
String |
Статус модерации шаблона |
| Значение status | Описание |
APPROVED |
То же, что «Активен» в ЛК Wazzup. Шаблон одобрен Meta*, его можно использовать |
PENDING |
То же, что «На модерации» в ЛК Wazzup. Meta* еще проверяет шаблон |
REJECTED |
В ЛК Wazzup — «Отклонен». Шаблон не прошел модерацию Meta* |
PAUSED |
В ЛК Wazzup — «Отклонен». На шаблон жаловались получатели, поэтому Meta* его снова проверяет |
DISABLED |
В ЛК Wazzup — «Отклонен». Шаблон заблокировали после жалоб |
{
"channel_id": UUIDv4,
"status": "active" | "disabled" | "init",
"reason": string | null
}
Возможные значения reason в зависимости от status:
status: "active" — reason всегда nullstatus: "init" — reason: wait_for_password, wait_for_code, qr, sync или nullstatus: "disabled" — reason: blocked, not_enough_money, rejected, unauthorized, foreignphone, qridle, openelsewhere или null| status канала | Описание |
active |
Канал активен |
init |
Канал запускается |
disabled |
Канал выключен: убрали из подписки или удалили с сохранением сообщений |
| Значение reason | Описание |
qridle, qr |
Необходимо отсканировать QR-код |
openelsewhere |
Канал авторизован в другом аккаунте Wazzup |
not_enough_money |
Канал не оплачен |
foreignphone |
QR отсканирован другим аккаунтом в мессенджере (другой номер телефона) |
unauthorized |
Не авторизован |
wait_for_password |
Нужно ввести пароль для двухфакторной аутентификации |
blocked |
Meta* заблокировала канал WABA |
rejected |
Канал WABA отклонен |
{
"channel_id": UUIDv4,
"timestamp": Unix timestamp в миллисекундах,
}
{
"channel_id": UUIDv4,
"timestamp": Unix timestamp в миллисекундах,
}
{
"channel_id": UUIDv4,
"qr_code": string,
"platform": 'whatsapp' | 'telegram_api' | 'viber'
}
Meta* присваивает аккаунтам WhatsApp Business уровни tier — они показывают, сколько 24-часовых переписок можно начать сутки.
{
"channel_id": UUIDv4,
"tier": "TIER_0" | "TIER_1K" | "TIER_10K" | "TIER_100K" | "TIER_UNLIMITED",
}
Возможные значения:
{
"meta": {
"idempotency_key": "945ff8a4-bb3c-45f7-8d1a-b40f7ce2fb",
"timestamp": 1760690824
},
"data": [
{
"group_id": "3c67afca-6cbf-4517-b120-c4a83dbd41",
"members": [
{
"group_member_id": "c705786d-bba5-43f9-9b-5f6f5d4ba623",
"name": "Маша",
"avatar_url": null,
"status": "in_group" | "invited" | "unknown" | "deleted" | "not_exists" |
}
]
}
],
"event": "group_chat.memberships_update"
}
200 OK, остальную обработку делайте асинхронно.POST‑endpoint (HTTPS), принимайте application/json.message.add и message.status_update — это минимум, чтобы понимать что сообщение отправлено и доставлено.*Запрещены и признаны экстремистскими на территории РФ