Вебхуки отправляем методом POST на указанный URI. Он может включать в себя query string.
Если у нас есть ваш crmKey, мы добавляем заголовок Authorization: Bearer ${crmKey}. Если нет — не добавляем заголовок Authorization вообще.
Вебхуки содержат в теле JSON и соответствующий заголовок Content-Type: application/json; charset-utf-8. В JSON закодирован объект со свойствами, которые соответствуют типам вебхуков.
Вебхуки о новых сообщениях и изменении их статуса могут содержать объекты messages и statuses одновременно. Вебхук о необходимости создать контакт или сделку содержит только один объект: createContact или createDeal.
В ответ ожидаем код 200 OK. В некоторых случаях ждем определенную информацию в теле ответа. Таймаут — 30 с.
Чтобы подписаться на вебхуки, вызовите:
PATCH https://api.wazzup24.com/v3/webhooksPATCH /v3/webhooks
├── webhooksUri
└── subscriptions
├── messagesAndStatuses
├── contactsAndDealsCreation
├── channelsUpdates
└── templateStatus
В теле должен быть JSON с параметрами:
| Параметр | Тип | Описание |
| webhooksUri | String | Адрес для получения вебхуков. Не более 200 символов |
| subscriptions | object subscriptions |
Настройки вебхуков |
| Параметр | Тип | Описание |
| messagesAndStatuses | Boolean | Вебхук о новых сообщениях и вебхук об изменении статуса исходящих.
Если вебхук нужен, укажите true. Если нет — false. |
| contactsAndDealsCreation | Boolean | Вебхук о том, что нужно создать новый контакт или сделку.
Если вебхук нужен, укажите true. Если нет — false. |
| channelsUpdates | Boolean | Вебхук об изменении статуса канала.
Если вебхук нужен, укажите true. Если нет — false. |
| templateStatus | Boolean | Вебхук об изменении статуса модерации шаблона WABA.
Если вебхук нужен, укажите true. Если нет — false. |
При подключении на указанный url будет отправлен тестовый POST запрос с телом {test: true }. В ответ сервер должен вернуть 200 при успешном подключении вебхуков. Иначе вернется ошибка: Webhooks request not valid. Response status must be 200.
curl --location --request PATCH 'https://api.wazzup24.com/v3/webhooks' \
--header 'Authorization: Bearer w11cf3444405648267f900520d454368d27' \
--header 'Content-Type: application/json' \
--data-raw '{
"webhooksUri": "https://example.com/webhooks",
"subscriptions": {
"messagesAndStatuses": true,
"contactsAndDealsCreation": true
}
}'
{
ok
}
Помимо общих ошибок для всех роутов могут быть:
| Ошибка | Описание |
| 400 Bad Request | { error: 'uriNotValid', description: 'Provided URI is not valid URI' } — при неверном по формальным признакам URI |
| 400 Bad Request | { error: 'testPostNotPassed', description: 'URI does not return 200 OK on test request', data: { '${код ответа}' } } — если получена ошибка при отправке тестового запроса |
Чтобы проверить установленный адрес для получения вебхуков, вызовите:
GET https://api.wazzup24.com/v3/webhooksHTTP/1.1 200 OK
{
"webhooksUri": "https://example.com/webhooks",
"subscriptions": {
"messagesAndStatuses": "true",
"contactsAndDealsCreation": "true"
}
}
{
"messages": [
{
"messageId": "String (uuid4)",
"channelId": "String (uuid4)",
"chatType": "String",
"chatId": "String",
"avitoProfileId": "String",
"dateTime": "String",
"type": "String",
"isEcho": "Boolean",
"contact": {
"name": "String",
"avatarUri": "String",
"username": "String",
"phone": "String"
},
"text": "String",
"contentUri": "String",
"status": "String",
"error": {
"error": "String",
"description": "String"
},
"authorName": "String",
"authorId": "String",
"instPost": { ... },
"interactive": [ ... ],
"quotedMessage": { ... },
"sentFromApp": "Boolean",
"isEdited": "Boolean",
"isDeleted": "Boolean",
"oldInfo": {
"oldText": "String",
"oldAuthorId": "String",
"oldAuthorName": "String"
}
}
]
}
Вебхук пришлет JSON-объект с ключом messages, в значении которого лежит массив объектов со следующими параметрами:
| Параметр | Тип | Описание |
| messageId | String (uuid4) | guid сообщения в Wazzup |
| channelId | String (uuid4) | ID канала |
| chatType | String | Тип чата. Доступные значения: whatsapp, whatsgroup, viber, instagram*, telegram, telegroup, vk, avito, max, maxgroup. |
| chatId | String | ID чата (аккаунт контакта в мессенджере). |
| avitoProfileId | String | Id профиля Авито. Не то же, что chatId. |
| dateTime | String | Время отправки сообщения в формате yyyy-mm-ddThh:mm:ss.ms |
| type | String | Тип сообщения: text, image, audio, video, document, vcard, geo, wapi_template, unsupported, missing_call, unknown. |
| isEcho | Boolean | Если сообщение входящее — false. Если исходящее — true |
| contact | object contact |
Информация о контакте |
| text | String | Текст сообщения. Может отсутствовать, если сообщение с контентом |
| contentUri | String | Ссылка на контент сообщения. Может отсутствовать, если сообщение не содержит контента |
| status | String | Содержит только значение из ENUM из вебхука statuses: sent, delivered, read, error, inbound. |
| error | object error |
Приходит, если status: error |
| authorName | String | Имя пользователя, отправившего сообщение. Может быть только при isEcho == true |
| authorId | String | Идентификатор пользователя CRM |
| instPost | object instPost |
Информация о посте из Instagram*. Прикладывается к комментарию в Instagram* |
| interactive | Interactive | Массив объектов с кнопками Salesbot amoCRM |
| quotedMessage | Object | Объект с параметрами цитируемого сообщения |
| sentFromApp | Boolean | true, если отправлено из нативного чата Wazzup |
| isEdited | Boolean | Показывает, что сообщение отредактировано. |
| isDeleted | Boolean | Показывает, что сообщение удалено. |
| oldInfo | object oldInfo |
Содержит информацию об измененном или удаленном сообщении |
| Параметр | Тип | Описание |
| name | String | Имя контакта |
| avatarUri | String | URI аватарки контакта. |
| username | String | Только для Telegram. username (имя пользователя) без @ |
| phone | String | Только для Telegram, MAX. Телефон в международном формате |
| Параметр | Тип | Описание |
| error | String | Код ошибки (BAD_CONTACT, CHATID_IGSID_MISMATCH, TOO_LONG_TEXT, SPAM и др.) |
| description | String | Описание ошибки |
| Параметр | Тип | Описание |
| id | String | ID поста |
| src | String | Ссылка на пост |
| author | String | Автор поста |
| description | String | Описание поста |
| Параметр | Тип | Описание |
| oldText | String | Текст сообщения до редактирования или удаления |
| oldAuthorId | String | id автора исходного сообщения |
| oldAuthorName | String | Имя автора исходного сообщения |
{
id: '2430659146657243411_41370968890',
src: 'https://www.instagram.com/p/CG7b52ejyET',
sha1: 'dc8c036b4a0122bb238fc38dcb0391c125e916f2',
likes: 0,
author: 'wztestdlv',
comments: 22,
timestamp: 1603977171000,
updatedAt: 1608905897958,
authorName: '',
authorId: '78596324',
description: 'Красота',
previewSha1: '3a55c2920912de4b6a66d24568470dd4ad367c34',
imageSrc: 'https://store.dev-wazzup24.com/dc8c036b4a0122bb238fc38dcb0391c125e916f2',
previewSrc: 'https://store.dev-wazzup24.com/3a55c2920912de4b6a66d24568470dd4ad367c34'
}
{
"messages": [
{
"messageId": "6a2087e8-e0f4-9999-b968-9d9999933c81",
"dateTime": "2025-05-06T14:16:00.002Z",
"channelId": "b96a353b-9999-4cac-8413-ba99999f981",
"chatType": "whatsapp",
"chatId": "79999999999",
"type": "image",
"isEcho": false,
"contact": {
"name": "79999999999",
"avatarUri": "https://store.wazzup24.com/0e999997ae07d2083c687253b8baed9999a26fa";
},
"contentUri": "https://store.wazzup24.com/e51159999e0046d628b3924161d411e5812d2546/?filename=f9ebe1b1-3ed5-4ec2-97fb-03f0c25e413f.was";,
"status": "inbound"
}
]
}
{
"messages": [
{
"messageId": "caa9999-cce3-424c-86cd-05f99995073",
"dateTime": "2025-05-06T14:18:00.001Z",
"channelId": "b96a999e-06f5-4cac-8413-ba999993f981",
"chatType": "whatsapp",
"chatId": "79999999999",
"type": "text",
"isEcho": false,
"contact": {
"name": "79999999999",
"avatarUri": "https://store.wazzup24.com/0e82ead97ae07d9999c687253b8baed2365a26fa";
},
"text": "Тестовый\n• Вариант1\n• Вариант2",
"status": "inbound"
}
]
}
{
"statuses": [
{
"messageId": "String",
"timestamp": "String",
"status": "String",
"error": {
"error": "String",
"description": "String",
"[data]": "String"
}
}
]
}
Вебхук отправляет JSON-объект с ключом statuses, содержащий массив объектов со следующими параметрами:
| Параметр | Тип | Описание |
| messageId | String | guid сообщения в Wazzup |
| timestamp | String | Время получения информации об обновлении статуса |
| status | String | Обновленный статус сообщения: sent, delivered, read, error, edited. |
| error | object error |
Приходит, если status: error |
| Параметр | Тип | Описание |
| error | String | Код ошибки |
| description | String | Описание ошибки |
| [data] | String | Дополнительная информация об ошибке |
{
"statuses": [
{
"messageId": "be3dc577-60c4-4fc8-83a5-8c358e0bfe15",
"timestamp": "2025-02-05T06:01:07.499Z",
"status": "delivered"
}
]
}
Отправляем, когда нужно создать контакт или сделку в CRM. Это происходит в 3 случаях:
Кейс 1: в п. 3 настроек интеграции выбрано «Нового клиента получает первый ответивший менеджер».
Пишет новый клиент. Сотрудник ему отвечает. Wazzup отправляет вебхук о создании нового контакта и сделки на первое исходящее, если из CRM загружены воронки с этапами.
Вебхук отправляем, только если получили id сотрудника, который ответил на сообщение нового клиента.
Кейс 2: в п. 3 настроек интеграции выбрано «Менеджеры получают новых клиентов по очереди».
Пишет новый клиент. Wazzup отправляет вебхук о создании нового контакта и сделки на первое входящее, если из CRM загружены воронки с этапами.
Чтобы вебхуки приходили в первом и втором кейсах, нужно в ЛК добавить сотрудников и включить кому-то из них в настройках интеграции ползунок «Получает новых клиентов».
Кейс 3: при нажатии на кнопку «+» в списке «Сделки» для создания сделки:
Мы проверяем, создан ли контакт у нас в базе.
Если контакт уже создан, мы отправляем вебхук о необходимости создания сделки:
{
createDeal: {
responsibleUserId: '1',
contacts: ['1'],
source: 'auto'|'byUser'
},
}
Если контакт отсутствует, мы сначала отправляем вебхук о необходимости создания контакта:
{
createContact: {
responsibleUserId: '1',
name: 'contacts.name',
contactData: [{ chatType, chatId }],
source: 'auto'|'byUser'
},
}
После этого CRM должна создать контакт и вернуть в ответе 200 OK с JSON-объектом новой сущности, соответствующим сигнатуре CRUD-роутов контактов.
Затем мы отправим вебхук о необходимости создания сделки.
После чего CRM должна создать сделку и аналогично вернуть 200 OK с JSON-объектом, соответствующим сигнатуре CRUD-роутов сделок.
Если сделка контакт, сделка уже созданы, то Wazzup не отправит повторно вебхук, даже если сделка закрыта: "close": "true"
{
"channelsUpdates": [
{
"channelId": "String",
"state": "String",
"tier": "String",
"qr": "String",
"qridle": "String",
"timestamp": "Integer"
}
]
}
| Параметр | Тип | Описание |
| channelId | String | guid канала |
| state | String | Cтатус канала. См. таблицу ниже. |
| tier | String | Только для каналов WABA (TIER_0, TIER_1K, TIER_10K и т.д.) |
| qr | String | QR-код в формате base64, присутствует только при state 'qr' |
| qridle | String | канал разавторизован или QR-код протух |
| timestamp | Integer | Время установки статуса в мс |
{
"channelsUpdates": [
{
"channelId": "d9e5721c-ce2b-444f-9627-60a8129d7e1f",
"state": "qr",
"timestamp": 1603977171000,
"qr": "data:image/png;base64,iVBORw0KGgoAAAANS"
}
]
}
| Значение | Описание | Виды транспорта |
| active | Канал активен, все нормально | Все |
| disabled | Канал выключен (не в подписке или техработы) | Все |
| qr | Необходимо отсканировать qr-код | whatsapp и tgapi |
| phoneUnavailable | Нет связи с телефоном | |
| openElsewhere | WhatsApp Web открыли в другом месте | |
| notEnoughMoney | Канал не оплачен | Все |
| unauthorized | Не авторизован — надо заново авторизовать канал | Все |
{
"templateStatus": {
"templateGuid": "String",
"name": "String",
"status": "String"
}
}
| Параметр | Тип | Описание |
| templateGuid | String | guid шаблона |
| name | String | Имя шаблона |
| status | String | Статус модерации шаблона. См. таблицу ниже. |
{
templateStatus: {
templateGuid:"8d255e5d-aefd-44dc-8131-c3ad6c3ab28c",
name: "Test",
status: approved
}
}
| Значение | Описание |
| APPROVED | Одобрен Meta*, можно использовать |
| PENDING | На модерации Meta* |
| REJECTED | Отклонен Meta* |
| PAUSED | На шаблон жаловались, Meta* его проверяет |
| DISABLED | Шаблон заблокирован после жалоб |
*Запрещены и признаны экстремистскими на территории РФ