В данной статье мы подробно рассмотрим процесс отправки, редактирования и удаления сообщений через API Wazzup.
Отправка сообщений
Для отправки сообщений необходимо вызвать
POST https://api.wazzup24.com/v3/message
В теле запроса нужно передавать
- ключ API в заголовке — он нужен для авторизации,
- параметры сообщения.
Параметры запроса
Параметры запроса
Параметр Обязательные параметры отмечены «звездочкой» | Тип | Описание |
channelId* | String | Id канала (uuidv4), через который нужно отправить сообщение. |
chatType* | String | Тип чата. Доступные значения:
|
chatId | String | Id чата (аккаунт контакта в мессенджере):
|
text | String | Текст сообщения. Обязателен, если не указан contentUri. Одновременно передавать и text, и contentUri нельзя. Ограничения:
|
contentUri | String | Ссылка на файл для отправки. Параметр обязателен, если не указан text. Контент должен скачиваться по ссылке без редиректов. Попытка скачать контент будет сразу же после получения запроса, то есть можно делать короткоживущие ссылки. По типу и размеру контента есть ограничения для каждого мессенджера. Одновременно передавать и text, и contentUri нельзя. |
refMessageId | String | Id сообщения для цитирования |
crmUserId | String | Id пользователя СRМ, указанный с помощью CRUD users. Если указано, и если такой пользователь уже существует, покажем в iframe, кто из сотрудников отправил сообщение. Не работает при подключении по Sidecar API. |
crmMessageId | String | Id сообщения на стороне CRM. Нужен для придания роуту идемпотентности. |
username | String | Только для Telegram. Имя пользователя в Telegram, без @ в начале. Можно использовать при отправке сообщений через Telegram, если не известен chatId. |
phone | String | Только для Telegram. Телефон контакта в международном формате, без + и иных символов: только цифры с корректным кодом страны. Может использоваться при отправке сообщений через Telegram, если не известен chatId. |
clearUnanswered | Boolean | Сбросить ли счетчик неотвеченных. Чтобы сообщение не сбрасывало счетчик, укажите false. Например, при автоматизации. Тогда пользователь CRM увидит уведомление о новом входящем, даже если его клиенту ушел автоматический ответ. Если ничего не указать — исходящее сообщение сбросит счетчик. |
templateId | String | Код шаблона WABA. |
templateValues | String (Array) | Значения, которыми надо заполнить переменные в шаблоне WABA. |
buttonsObject | Object | Кнопки, прикрепленные к сообщению. Можно использовать для работы с шаблонами WABA и с интерактивными сообщениями WABA. Интерактивное сообщение — сообщение с кнопками, которое можно отправлять в активную 24-часовую переписку с клиентом с канала WABA. Шаблоны WABA — шаблоны, которые проходят модерацию в Meta. Их используют, чтобы начать 24-часовую переписку. При работе с шаблонами WABA buttonsObject пригодится, только если хотите привязать к кнопкам полезную нагрузку. Тексты кнопок, которые отправятся с шаблоном WABA, прописывать не надо. |
buttonsObject.buttons | Object[ ] | Массив объектов с кнопками. Не более 10. Если кнопок больше 10, возьмем первые 10. |
buttonsObject.buttons.text | String | Нужен для работы с интерактивными сообщениями. Текст кнопки, максимум 20 символов. |
buttonsObject.buttons.type | String | Тип кнопки. Нужен для работы с интерактивными сообщениями. Сейчас поддерживаем только текстовый формат — указывайте тип text. |
buttonsObject.buttons.payload | String | Полезная нагрузка кнопок в шаблонах и интерактивных сообщениях |
Для защиты от возможного дублирования сообщений можно добавлять уникальное для сообщения свойство crmMessageId. Если оно было отправлено, то при поступлении другого запроса с этим же crmMessageId, сообщение не отправится, вернется ошибка 400 Bad Request, { error: ‘repeatedCrmMessageId’, description: ‘You have already sent message with same crmMessageId’ }. Проверка на crmMessageId длится 60 секунд. Если юзер отправит дубль сообщения через 61 секунду и большее, оно уйдет.
Примеры запросов
Обычное сообщение
fetch("https://api.wazzup24.com/v3/message", { method: "POST", headers: { "Content-Type": "application/json", "Authorization": "Bearer {apiKey|sidecarApiKey}", }, body: { channelId: "e0629e11-0f67-4567-92a9-2237e91ec1b9", refMessageId: "61e5a375-1760-452f-ad73-5318844ffc4f", crmUserId: "string-user-id", crmMessageId: "string-crm-message-id", chatId: "string-chat-id", chatType: "whatsapp", text: "message text" }, });
Шаблон WABA
Запрос на отправку шаблона WABA с 3 кнопками. У каждой есть полезная нагрузка.
fetch("https://api.wazzup24.com/v3/message", { method: "POST", headers: { "Content-Type": "application/json", "Authorization": "Bearer {apiKey|sidecarApiKey}", }, body: { channelId: "24197d5f-06de-421f-8576-9f6e6cb67f28", chatType: "whatsapp", chatId: "79994621848", templateId: "6201005a-9a6f-486f-bdd5-e6cb86c76ddb", templateValues: ["value"] buttonsObject: { buttons: [ { payload: "button_payload 1" }, { payload: "button_payload 2" }, { payload: "button_payload 3" } ] } }, });
В запросе для шаблонов WABA с кнопками не нужно прописывать текст кнопок. Они проходят модерацию вместе с основным текстом шаблона, поэтому кнопки нельзя менять.
buttonsObject пригодится, только если для кнопок нужно указать полезную нагрузку в поле payload.
Интерактивное сообщение WABA
В этом запросе отправляем интерактивное сообщение с 3 кнопками: «Да», «Нет» и «возможно». У кнопок нет полезной нагрузки.
fetch("https://api.wazzup24.com/v3/message", { method: "POST", headers: { "Content-Type": "application/json", "Authorization": "Bearer {apiKey|sidecarApiKey}", }, body: { channelId: "e0629e11-0f67-4567-92a9-2237e91ec1b9", refMessageId: "61e5a375-1760-452f-ad73-5318844ffc4f", crmUserId: "string-user-id", crmMessageId: "string-crm-message-id", chatId: "string-chat-id", chatType: "whatsapp", text: "message text", buttonsObject: { buttons: [ {text: "Да", type: "text"}, {text: "Нет", type: "text"}, {text: "возможно", type: "text"} ] } }, });
Ответ
Если отправляете через API шаблон без полезной нагрузки, в вебхуке об ответном сообщении отправим текст соответствующей кнопки. Если отправляете интерактивное сообщение без полезной нагрузки — отправим порядковый номер кнопки, начиная с 0.
Параметр |
Тип | Описание |
messageId | String | Идентификатор сообщения.
Указывается только при code=OK |
chatId | String | Идентификатор чата.
Указывается только при code=OK |
Пример ответа
HTTP/1.1 201 OK
{
"messageId": "f66c53a6-957a-46b2-b41b-5a2ef4844bcb",
"chatId": "79999999999"
}
Ошибки при отправке сообщений
Если запрос содержит некорректные данные или параметры, система вернет одну из следующих ошибок:
1. Некорректные значения параметров
Если переданное значение параметра не соответствует требованиям (например, channelId не в формате UUID, chatId не является строкой или chatType не соответствует допустимым значениям), API вернет ошибку:
{ "status": 400, "requestId": "7ca68797d127735e72b066b0080e2cc0", "error": "INVALID_MESSAGE_DATA", "description": "Message data is invalid", "data": { "fields": [ "channelId" ] } }
Решение: Проверьте правильность значений передаваемых параметров. В data.fields будет указан параметр, в котором найдена ошибка.
2. Несоответствие типа транспорта и канала
Если в запросе указан channelId с одним транспортом, а chatType принадлежит другому транспорту, API вернет следующую ошибку:
{ "status": 400, "requestId": "21a9be7692d378b0270e7fc1d993381a", "error": "WRONG_TRANSPORT", "description": "You can't send message to vk chat from whatsapp transport", "data": { "channelId": "dffa1c7b-6db8-4b8f-b559-91166aba879e", "transport": "whatsapp", "chatType": "vk" } }
Решение: Убедитесь, что chatType соответствует транспорту, указанному в channelId.
3. Повторное использование crmMessageId
Если в запросе указан crmMessageId, который уже использовался в течение последних 60 секунд, API вернет следующую ошибку:
{ "status": 400, "requestId": "c1005276e8a2b5aa23fcc94407d39f49", "error": "REPEATED_CRM_MESSAGE_ID", "description": "You have already sent message with same crmMessageId", "data": { "crmMessageId": "1" } }
Решение: Используйте уникальные crmMessageId для каждого сообщения. Проверка на повтор длится 60 секунд.
Управление отправленными сообщениями
После отправки сообщения его можно изменить или удалить, если это поддерживает канал.
Редактирование сообщений
Wazzup поддерживает редактирование отправленных сообщений. Можно изменить текст или вложение, но не одновременно.
PATCH https://api.wazzup24.com/v3/message/:messageId
В заголовке запроса необходимо передавать API-ключ:
"Authorization": "Bearer {apiKey|sidecarApiKey}"
Как редактировать сообщение:
- В поле text укажите новый текст сообщения.
- Если нужно заменить вложение, используйте contentUri.
- Одновременно изменять текст и вложение нельзя.
Параметр | Тип | Описание |
messageId | String | Параметр строки для идентификации сообщения |
crmUserId | String | ID пользователя CRM, указанный с помощью CRUD users |
text | String | Текст сообщения. Обязателен, если не указан contentUri. Одновременно передавать text и contentUri нельзя |
contentUri | String | Ссылка на файл для отправки. Обязателен, если не указан text |
Пример использования для сообщений с текстом:
curl --location --request PATCH 'https://api.wazzup24.com/v3/message/6f1b3c67-3008-488b-9abc-12fcac6de134' \ --header 'Authorization: Bearer {apiKey|sidecarApiKey}' \ --header 'Content-Type: application/json' \ --data '{ "text": "Обновленный текст сообщения", "crmUserId": "2e0df379-0e3c-470f-9b36-06b9e34c3bdb" }'
Пример использования для сообщений с вложением:
curl --location --request PATCH 'https://api.wazzup24.com/v3/message/6f1b3c67-3008-488b-9abc-12fcac6de134' \ --header 'Authorization: Bearer {apiKey|sidecarApiKey}' \ --header 'Content-Type: application/json' \ --data '{ "contentUri": "https://example.com/image.png", "crmUserId": "2e0df379-0e3c-470f-9b36-06b9e34c3bdb" }'
Удаление сообщений
Чтобы удалить сообщение, используйте метод:
DELETE https://api.wazzup24.com/v3/message/:messageId
В заголовке запроса необходимо передавать API-ключ:
"Authorization": "Bearer {apiKey|sidecarApiKey}"
Пример удаления сообщения:
curl --location --request DELETE 'https://api.wazzup24.com/v3/message/6f1b3c67-3008-488b-9abc-12fcac6de134' \ --header 'Authorization: Bearer {apiKey|sidecarApiKey}'
Ошибки при отправке, редактировании и удалении сообщений
Код ошибки | Описание |
BALANCE_IS_EMPTY | Закончились деньги на балансе подписки WABA |
MESSAGE_WRONG_CONTENT_TYPE | Неверный тип контента. Возникает, если не удалось определить тип контента или он не поддерживается |
MESSAGE_ONLY_TEXT_OR_CONTENT | В сообщении может быть текст или вложение. Отправлять одновременно текст и вложение нельзя |
MESSAGE_NOTHING_TO_SEND | Текст сообщения не найден |
MESSAGE_TEXT_TOO_LONG | Текст сообщения WhatsApp превышает 10 000 символов |
MESSAGES_TOO_LONG_INSTAGRAM | Текст сообщения Instagram превышает 10 000 символов |
MESSAGES_TOO_LONG_TELEGRAM | Текст сообщения Telegram превышает 4096 символов |
MESSAGES_TOO_LONG_WABA | Текст сообщения WABA слишком длинный. Максимум 1024 для заголовка и 4096 символов для основного текста |
MESSAGES_TOO_LONG_VK | Текст сообщения Вконтакте превышает 4096 символов |
MESSAGES_TOO_LONG_AVITO | Текст слишком длинный. Максимум 1000 для подписи и 1000 для текстового сообщения |
MESSAGES_UNSUPPORTED_CONTENT_TYPE_INSTAPI | Поддерживаемые типы контента для Instagram: jpg, gif, png, ico, bmp |
MESSAGES_CONTENT_CAN_NOT_BE_BLANK | Файл с контентом не может быть пустым. Возникает при отправке нетекстового сообщения, к которому не приложили медиа. |
MESSAGES_CONTENT_SIZE_EXCEEDED | Контент превышает допустимый размер 10 MB |
MESSAGES_TEXT_CAN_NOT_BE_BLANK | Текстовое сообщение не может быть пустым |
CHANNEL_NOT_FOUND | Канал, через который отправляется сообщение, не найден в интеграции |
CHANNEL_BLOCKED | Канал, через который отправляется сообщение, выключен |
CHANNEL_WAPI_REJECTED | Канал WABA заблокирован |
MESSAGE_DOWNLOAD_CONTENT_ERROR | Не удалось скачать контент по указанной ссылке |
MESSAGES_NOT_TEXT_FIRST | На тарифе «Inbox» нельзя написать первым |
MESSAGES_IS_SPAM | WhatsApp оценил это сообщение, как спам |
VALIDATION_ERROR | Валидационная ошибка параметра, переданного в запрос |
CHANNEL_NO_MONEY | Канал не оплачен: не в подписке и не на тестовом периоде |
MESSAGE_CHANNEL_UNAVAILABLE | Канал, с которого отправляется сообщение, недоступен. У канала статус «Телефон недоступен» или «Подождите минутку» |
MESSAGES_ABNORMAL_SEND | Тип чата не соответствует источнику контакта. Например, такая ошибка может возникнуть, если вы пытаетесь отправить сообщение с канала WhatsApp на канал Instagram |
MESSAGES_INVALID_CONTACT_TYPE | Тип чата не соответствует источнику контакта Instagram. Например, такая ошибка может возникнуть, если вы пытаетесь отправить сообщение с канала Instagram на канал WhatsApp |
MESSAGES_CAN_NOT_ADD | Сообщение не отправлено. Непредвиденная серверная ошибка |
MESSAGES_CONTENT_SIZE_EXCEEDED_WABA | Контент превышает допустимый размер. Для Telegram максимальный размер фото — 5 МБ, для другого контента — 16 МБ |
MESSAGES_CONTENT_SIZE_EXCEEDED_TELEGRAM | Контент превышает допустимый размер. Для Telegram — 5 МБ для фото и 20 МБ для прочего контента |
MESSAGES_TOO_LONG_VIBER | Текст сообщения Viber превышает 6999 символов |
MESSAGES_TOO_LONG_WABA_HEADER | Текст заголовка шаблона WABA превышает 60 символов |
MESSAGES_TOO_LONG_WABA_TEMPLATE | Текс шаблона WABA превышает 1024 символов |
REFERENCE_MESSAGE_NOT_FOUND | Ошибка возникает при цитировании, если не удалось найти сообщение, к которому прикрепляется цитата. Проверьте, что в качестве refId передан идентификатор сообщения, полученный от Wazzup |
UNKNOWN_ERROR | Неизвестная ошибка. |
UNKNOWN_ERROR_WITH_TRACE_ID | Неизвестная ошибка. Свяжитесь с нами для получения помощи с идентификатором трассировки ошибки |
MESSAGES_EDITING_TIME_EXPIRED | Истекло время редактирования сообщения. Сообщение можно редактировать только в течение установленного времени после отправки. |
MESSAGES_CONTAIN_BUTTONS | Сообщение содержит кнопки и не может быть отредактировано. |
MESSAGES_ONLY_TEXT_OR_CONTENT | В сообщении может быть только текст или вложение. Одновременно передавать оба нельзя. |
CHANNEL_INVALID_TRANSPORT_FOR_EDITING | Канал не поддерживает редактирование сообщений. |
CHANNEL_INVALID_TRANSPORT_FOR_CONTENT_EDITING | Канал не поддерживает редактирование содержимого сообщений (например, вложений). |
CHAT_NO_ACCESS | Нет доступа к указанному чату. Проверьте настройки доступа. |
MESSAGES_NOT_FOUND | Сообщение не найдено или не содержит контента. |
CHANNEL_LIMIT_EXCEEDED | Превышен лимит активных диалогов для канала. |
MESSAGES_DELETION_TIME_EXPIRED | Истекло время удаления сообщения. Сообщение можно удалить только в течение установленного времени после отправки. |
CHANNEL_INVALID_TRANSPORT_FOR_DELETION | Канал не поддерживает удаление сообщений. |
TEMPLATE_REJECTED | Meta ограничила этот шаблон. Попробуйте другой или дождитесь входящего сообщения. |
BAD_CONTACT | Не удалось отправить. Номера нет в WhatsApp или версия устарела. Попробуйте позже. |