Вебхуки позволяют узнавать о событиях, которые происходят на стороне 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 — изменилась информация о групповом чате;crm_entities.contact_add — нужно создать новый контакт;crm_entities.deal_add — нужно создать новую сделку.Подписывайтесь только на события, которые обрабатывает ваша система.
В рамках одного вызова можно подписаться сразу на несколько событий.
Метод POST /v2/webhooks
| Body-параметр | Обяз. параметр | Тип параметра | Описание параметра |
data |
да | object |
Список вебхуков, на которые подписываетесь |
data.url |
да | string |
Адрес, на который хотите получать вебхуки |
data.event |
да | string |
Вебхук |
У вебхуков о необходимости создать контакт, сделку есть особенности:
Вы можете подписаться на оба вебхука crm_entities.contact_add и crm_entities.deal_add или только на crm_entities.contact_add. Вебхук о необходимости создать сделку не будет работать без подписки на вебхук о создании нового контакта.
Пример запроса:
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" }
]
}
}
{ "event": "message.add", "data": [ { "message_id": "a5e8ba61-bc6c-41fe-9598-db7a9cbfbcbd", "chat_id": "221601332", "channel_id": "5f3f029a-8e76-4203-9434-fd490f8db848", "direction": "inbound", "quoted_message_id": null, "timestamp": 1776953557938, "crm_user_id": null, "text": "Hello", "status": "accepted",
"sender": { "chat_type": "telegram",
"chat_id": "221601332", "name": "Test Testovich", "username": "testaccount", "phone": 79111234567
} "recipient": { "chat_id": "221601332", "chat_type": "telegroup", "avatar": null, "username": null, "phone": null, "name": "Групповой чат", "profile_id": null, "advert": null } } ], "meta": { "idempotency_key": "9ef07b18-e95f-4ba1-9981-63d95d8ed468", "timestamp": 1776953558 } }
{ "event": "message.add", "data": [ { "message_id": "a5e8ba61-bc6c-41fe-9598-db7a9cbfbcbd", "chat_id": "221601332", "channel_id": "5f3f029a-8e76-4203-9434-fd490f8db848", "direction": "outbound", "quoted_message_id": null, "timestamp": 1776953557938, "crm_user_id": "1", "text": "111111111112", "status": "accepted", "recipient": { "chat_id": "221601332", "chat_type": "cian", "avatar": "https://store.dev-wazzup24.com/f0099ac6204c37af8cf80136d910f87520887d3b", "username": "139032710", "phone": null, "name": "Контакт номер 1", "profile_id": "139032710", "advert": { "id": 326650834, "url": "https://cian.ru/sale/flat/326650834/", "sha1": "e920b6e6b46756d4761d1bcc1e281fcf3279dea7", "type": "offer", "price": "7 350 000 ₽", "title": "1-комн. кв., 45,3 м², 7/7 этаж", "userId": 133889346, "externalId": "2299893155", "locationTitle": "Магаданская область, Магадан, улица Берзина, 12" } } } ], "meta": { "idempotency_key": "9ef07b18-e95f-4ba1-9981-63d95d8ed468", "timestamp": 1776953558 } }
| Параметр. Обязательные отмечены * | Тип | Описание |
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" |
sender |
object |
Отправитель сообщения в групповом чате WhatsApp, Telegram или MAX |
sender.chat_type* |
string |
Тип чата. Доступные значения:
|
sender.chat_id* |
string |
ID отправителя в мессенджере |
sender.name |
string |
Имя отправителя |
sender.username |
string |
Только для Telegram. Имя пользователя в Telegram, без @ в начале |
sender.phone |
string |
Телефон отправителя в международном формате, если известен. Без + и иных символов |
recipient* |
object |
Чат, в котором появилось новое исходящее или входящее сообщение. Если вебхук о новом сообщении в диалоге, то в этом объекте содержится информация о контакте, с которым переписывается пользователь. Если вебхук о новом сообщении в групповом чате, то в этом объекте содержится общая информация о группе без указания участников. |
recipient.chat_type* |
string |
Тип чата. Доступные значения:
|
recipient.chat_id |
string |
ID чата, в котором появилось новое исходящее или входящее сообщение. Если сообщение появилось в диалоге с контактом, то фактически это ID аккаунта в мессенджере, с которым переписывается пользователь:
|
recipient.username |
string |
Только для Telegram. Имя пользователя в Telegram, без @ в начале. Можно использовать при отправке сообщений, если неизвестен chat_id |
recipient.phone |
string |
Телефон контакта в международном формате, если известен. Без + и иных символов |
recipient.profile_id* |
string |
Только для Циан. Идентификатор профиля. Для других типов чата в параметре будет null. |
recipient.advert* |
object |
Объявление Циан, по которому написал клиент. Для других типов чата в объекте будет null. |
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 кнопки |
referral |
object |
Только для WABA. Маркетинговые данные из рекламы. Передаются, если клиент перешел в WhatsApp по кнопке в объявлении. Помогают понять, откуда о вас узнал клиент |
referral.source_url |
string |
URL на рекламу, пост, по которому перешел клиент |
referral.source_type |
string |
Тип объявления. Возможные значения: ad, post |
referral.source_id |
string |
ID, который Meta присвоила объявлению |
referral.headline |
string |
Заголовок объявления |
referral.body |
string |
Основной текст объявления |
referral.media_type |
string |
Тип медиа в объявлении. Возможные значения: image, video |
referral.image_url |
string |
Ссылка на изображение из рекламы, если в media_type передано image |
referral.video_url |
string |
Ссылка на видео из рекламы, если в media_type передано video |
referral.thumbnail_url |
string |
Ссылка на превью видео из рекламы, если в media_type передано video |
referral.ctwa_clid |
string |
ID, сгенерированное Meta для рекламы с редиректом в WhatsApp |
{
"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"
}
Отправляем, когда нужно создать контакт или сделку в CRM. Это происходит в 3 случаях:
Кейс 1: в п. 3 настроек интеграции выбрано «Нового клиента получает первый ответивший менеджер».
Пишет новый клиент. Сотрудник ему отвечает. Wazzup отправляет вебхук о создании нового контакта и сделки на первое исходящее, если из CRM загружены воронки с этапами.
Вебхук отправляем, только если получили id сотрудника, который ответил на сообщение нового клиента.
Кейс 2: в п. 3 настроек интеграции выбрано «Менеджеры получают новых клиентов по очереди».
Пишет новый клиент. Wazzup отправляет вебхук о создании нового контакта и сделки на первое входящее, если из CRM загружены воронки с этапами.
Чтобы вебхуки приходили в первом и втором кейсах, нужно в ЛК добавить сотрудников и включить кому-то из них в настройках интеграции ползунок «Получает новых клиентов».
Кейс 3: при нажатии на кнопку «+» в списке «Сделки» для создания сделки:
Мы проверяем, создан ли контакт у нас в базе.
Если контакт отсутствует, отправляем вебхук о необходимости создания контакта:
{
"event": "crm_entities.contact_add",
"data": [
{
"responsible_user_id": string,
"name": string,
"recipient":
{
"chat_type": string,
"chat_id": string,
"username": "string",
"phone": "string"
}[],
"source": "auto" | "by_user"
//auto — при входящем или исходящем, by_user — по кнопке
}
],
"meta": {
"idempotency_key": string
"timestamp": number
}
}
После этого CRM должна создать контакт и вернуть JSON-объект с данными о контакте. Пример:
{
"id": "string",
// id контакта в CRM, обязательный параметр
"responsible_user_id": "string",
"name": "string",
// имя контакта, обязательный параметр
"recipient": [
{
"chat_type": "string",
"chat_id": "string",
"username": "string",
"phone": "string"
}
],
"uri": "string"
// uri опционально. Ссылка на контакт в CRM, по которой переходит пользователь из списка «Сделки» в iframe чатов
}
Затем мы отправим вебхук о необходимости создания сделки.
Если контакт уже создан, мы отправляем вебхук о необходимости создания сделки:
{
"event": "crm_entities.deal_add",
"data": [
{
"responsible_user_id": string
"pipeline_id": string,
"stage_id": string,
"contacts": string[],
"source": "auto" | "by_user"
//auto — при входящем или исходящем, by_user — по кнопке
}
],
"meta": {
"idempotency_key": string
"timestamp": number
}
}
После чего CRM должна создать сделку и вернуть JSON-объект с данными сделки. Пример:
{ "id": "deal_123",
// id сделки в CRM, обязательный параметр "responsible_user_id": "user_456", "name": "Клиент", "contacts": ["contact_789", "contact_012"], "source": "auto", "closed": false, "uri": "https://crm.example.com/deals/deal_123"
// uri опционально. Ссылка на сделку в CRM, по которой переходит пользователь из списка «Сделки» в iframe чатов }
Если контакт, сделка уже созданы, то Wazzup не отправит повторно вебхук, даже если сделка закрыта: "close": "true"
200 OK, остальную обработку делайте асинхронно.POST‑endpoint (HTTPS), принимайте application/json.message.add и message.status_update — это минимум, чтобы понимать что сообщение отправлено и доставлено.*Запрещены и признаны экстремистскими на территории РФ