Отправка сообщений по каскаду в канал WhatsApp
Для отправки сообщений в канал WhatsApp по каскаду используется метод api/cascade/schedule.
В этой статье описана отправка сообщений по каскаду с использование метода api/cascade/schedule и объекта whatsappContent.
Подробную информацию о методе api/cascade/schedule смотрите в статье:
WhatsApp Метод поддерживает отправку сообщений в WhatsApp как по номеру телефона, так и по идентификатору пользователя — BSUID.
WhatsApp Если у вас зарегистрировано два одинаковых по контенту шаблона WhatsApp, которые отличаются только параметром Отслеживать переходы по кнопке-ссылке, мы не рекомендуем отправлять сообщения с таким контен том по API. Для отправки используйте личный кабинет edna Pulse.
В обратном случае мы не можем гарантировать корректное отображение статистики переходов по кнопкам-ссылкам.
Вызов метода
Чтобы отправить сообщение в канал WhatsApp через каскад по методу api/cascade/schedule, отправьте POST-запрос на URL-адрес https://app.edna.ru/api/cascade/schedule.
WhatsApp Вы можете протестировать отправку сообщений через API edna Pulse для канала WhatsApp без предварительного подключения канала.
Как проверить отправку сообщений по API для канала WhatsAppПримеры запросов с нешаблонными сообщениями WhatsApp
В документации WhatsApp этот тип сообщений называются free-form messages.
Сообщение с текстом
{
"requestId": "test-001",
"cascadeId": 1,
"subscriberFilter": {
"address": "79000000000",
"type": "PHONE"
},
"startTime": "2021-01-21T08:00:00Z",
"content": {
"whatsappContent": {
"contentType": "TEXT",
"text": "Добрый день! Рады представить наш новый канал для общения с клиентами. Здесь вы можете задавать все интересующие вопросы."
}
}
}
Сообщение с текстом, отправленное по идентификатору BSUID
{
"requestId": "test-001",
"cascadeId": 1,
"subscriberFilter": {
"address": "RU.1234567890123456789",
"type": "WHATSAPP_BSUID"
},
"startTime": "2026-04-21T08:00:00Z",
"content": {
"whatsappContent": {
"contentType": "TEXT",
"text": "Добрый день! Это сообщение было отправлено по новому идентификатору"
}
}
}
Сообщение с изображением
{
"requestId": "test-001",
"cascadeId": 1,
"subscriberFilter": {
"address": "79000000000",
"type": "PHONE"
},
"startTime": "2021-01-21T08:00:00Z",
"content": {
"whatsappContent": {
"contentType": "IMAGE",
"attachment": {
"url": "https://www.gstatic.com/webp/gallery/1.jpg",
"name": "Lorem Ipsum"
}
}
}
}
Сообщение с документом
{
"requestId": "test-001",
"cascadeId": 1,
"subscriberFilter": {
"address": "79000000000",
"type": "PHONE"
},
"startTime": "2021-01-21T08:00:00Z",
"content": {
"whatsappContent": {
"contentType": "DOCUMENT",
"attachment": {
"url": "https://www.w3.org/WAI/ER/tests/xhtml/testfiles/resources/pdf/dummy.pdf",
"name": "Lorem Ipsum"
}
}
}
}
Сообщение с видео
{
"requestId": "test-001",
"cascadeId": 1,
"subscriberFilter": {
"address": "79000000000",
"type": "PHONE"
},
"startTime": "2021-01-21T08:00:00Z",
"content": {
"whatsappContent": {
"contentType": "VIDEO",
"attachment": {
"url": "https://file-examples.com/wp-content/uploads/2017/04/file_example_MP4_480_1_5MG.mp4",
"name": "Lorem Ipsum"
}
}
}
}
Сообщение с аудио
{
"requestId": "test-001",
"cascadeId": 1,
"subscriberFilter": {
"address": "79000000000",
"type": "PHONE"
},
"startTime": "2021-01-21T08:00:00Z",
"content": {
"whatsappContent": {
"contentType": "AUDIO",
"attachment": {
"url": "https://dl.espressif.com/dl/audio/ff-16b-2c-44100hz.aac",
"name": "Lorem Ipsum"
}
}
}
}
Сообщение с геолокацией
{
"requestId": "test-001",
"cascadeId": 1,
"subscriberFilter": {
"address": "79000000000",
"type": "PHONE"
},
"startTime": "2021-01-21T08:00:00Z",
"content": {
"whatsappContent": {
"contentType": "LOCATION",
"location": {
"longitude": "163",
"latitude": "48",
"address": "г. Москва, ул. Правды, д. 3",
"name": "ООО Компания"
}
}
}
}
Сообщение с интерактивным меню
{
"requestId": "test-001",
"cascadeId": 1,
"subscriberFilter": {
"address": "79000000000",
"type": "PHONE"
},
"startTime": "2021-01-21T08:00:00Z",
"content": {
"whatsappContent": {
"contentType": "LIST_PICKER",
"text": "Здравствуйте! Пожалуйста, выберите цвет худи",
"listPicker": {
"button": "Цвета худи",
"sections": [
{
"title": "Выберите цвет",
"items": [
{
"identifier": "1",
"title": "Red",
"subtitle": "Красное худи Матрица L"
},
{
"identifier": "2",
"title": "Blue",
"subtitle": "Синее худи Матрица L"
}
]
}
]
}
}
}
}
Сообщение с кнопками ответа
{
"requestId": "test-001",
"cascadeId": 1,
"subscriberFilter": {
"address": "79000000000",
"type": "PHONE"
},
"startTime": "2021-01-21T08:00:00Z",
"content": {
"whatsappContent": {
"contentType": "TEXT",
"text": "Здравствуйте! Пожалуйста, выберите цвет худи",
"keyboard": {
"rows": [
{
"buttons": [
{
"text": "Красный",
"payload": "1"
},
{
"text": "Синий",
"payload": "2"
},
{
"text": "Зеленый",
"payload": "3"
}
]
}
]
}
}
}
}
Сообщение с одним товаром
{
"requestId": "test-001",
"cascadeId": 3,
"subscriberFilter": {
"address": "79000000000",
"type": "PHONE"
},
"content": {
"whatsappContent": {
"contentType": "PRODUCT",
"header": {
"text": "Футер"
},
"text": "Выберите лучшее предложение",
"catalog": {
"id": "377932094379589",
"product": {
"id": "yxtgwrkdy9"
}
}
}
}
}
Сообщение с группой товаров
{
"requestId": "test-001",
"cascadeId": 8,
"subscriberFilter": {
"address": "79000000000",
"type": "PHONE"
},
"content": {
"whatsappContent": {
"contentType": "PRODUCT_LIST",
"header": {
"text": "Футер"
},
"text": "Выберите лучшее предложение",
"catalog": {
"id": "377932094379589",
"sections": [
{
"title": "Кроссовки",
"products": [
{
"id": "yxtgwrkdy9"
},
{
"id": "5k0l3pwczd"
}
]
},
{
"title": "Футболки",
"products": [
{
"id": "5k0l3pwczd"
}
]
}
]
}
}
}
}
Сообщение с функцией WhatsApp Flows
{
"requestId": "test-001",
"cascadeId": 3,
"subscriberFilter": {
"address": "79000000000",
"type": "PHONE"
},
"content": {
"whatsappContent": {
"contentType": "FLOW",
"caption": "Перейти",
"text": "Купить товары по скидкам",
"flowId": 3779320943795899,
"action": "navigate"
}
}
}
Примеры запросов с шаблонными сообщениями WhatsApp
В документации WhatsApp этот тип сообщений называются template messages.
Сообщение с текстом и подписью
{
"requestId": "test-001",
"cascadeId": 1,
"subscriberFilter": {
"address": "79000000000",
"type": "PHONE"
},
"startTime": "2021-01-21T08:00:00Z",
"content": {
"whatsappContent": {
"contentType": "TEXT",
"text": "Здравствуйте! Напишите нам, чтобы познакомиться с возможностями edna Pulse",
"footer": {
"text": "Компания edna"
}
}
}
}
Сообщение с текстом, заголовком-текстом и подписью
{
"requestId": "test-001",
"cascadeId": 1,
"subscriberFilter": {
"address": "79000000000",
"type": "PHONE"
},
"startTime": "2021-01-21T08:00:00Z",
"content": {
"whatsappContent": {
"contentType": "TEXT",
"text": "Здравствуйте! Напишите нам, чтобы познакомиться с возможностями edna Pulse",
"header": {
"text": "Ваш чат с компанией edna"
},
"footer": {
"text": "Компания edna"
}
}
}
}
Сообщение с текстом и заголовком-изображением
{
"requestId": "test-001",
"cascadeId": 1,
"subscriberFilter": {
"address": "79000000000",
"type": "PHONE"
},
"startTime": "2021-01-21T08:00:00Z",
"content": {
"whatsappContent": {
"contentType": "TEXT",
"text": "Здравствуйте! Напишите нам, чтобы познакомиться с возможностями edna Pulse",
"header": {
"imageUrl": "https://cdn.maikoapp.com/3d4b/4qgko/200.jpg"
}
}
}
}
Сообщение с текстом, заголовком-изображением и подписью
{
"requestId": "test-001",
"cascadeId": 1,
"subscriberFilter": {
"address": "79000000000",
"type": "PHONE"
},
"startTime": "2021-01-21T08:00:00Z",
"content": {
"whatsappContent": {
"contentType": "TEXT",
"text": "Текст, заголовок-изображение и подпись",
"header": {
"imageUrl": "https://www.gstatic.com/webp/gallery/1.jpg"
},
"footer": {
"text": "Ждем вас!"
}
}
}
}
Сообщение с текстом и заголовком-файлом
{
"requestId": "test-001",
"cascadeId": 1,
"subscriberFilter": {
"address": "79000000000",
"type": "PHONE"
},
"startTime": "2021-01-21T08:00:00Z",
"content": {
"whatsappContent": {
"contentType": "TEXT",
"text": "Здравствуйте! Напишите нам, чтобы познакомиться с возможностями edna Pulse",
"header": {
"documentUrl": "https://cdn.maikoapp.com/3d4b/4qgko/200.jpg"
}
}
}
}
Сообщение с текстом, заголовком-файлом и подписью
{
"requestId": "test-001",
"cascadeId": 1,
"subscriberFilter": {
"address": "79000000000",
"type": "PHONE"
},
"startTime": "2021-01-21T08:00:00Z",
"content": {
"whatsappContent": {
"contentType": "TEXT",
"text": "Здравствуйте! Напишите нам, чтобы познакомиться с возможностями edna Pulse",
"header": {
"documentUrl": "https://cdn.maikoapp.com/3d4b/4qgko/200.jpg"
},
"footer": {
"text": "Компания edna"
}
}
}
}
Сообщение с текстом, заголовком-видео и подписью
{
"requestId": "test-001",
"cascadeId": 1,
"subscriberFilter": {
"address": "79000000000",
"type": "PHONE"
},
"startTime": "2021-01-21T08:00:00Z",
"content": {
"whatsappContent": {
"contentType": "TEXT",
"text": "Текст, заголовок-видео и подпись",
"header": {
"videoUrl": "https://file-examples.com/wp-content/uploads/2017/04/file_example_MP4_480_1_5MG.mp4"
},
"footer": {
"text": "Ждем вас!"
}
}
}
}
Сообщение с текстом и двумя чат-кнопками
{
"requestId": "test-001",
"cascadeId": 11,
"subscriberFilter": {
"address": "79000000000",
"type": "PHONE"
},
"startTime": "2021-01-21T08:00:00Z",
"content": {
"whatsappContent": {
"contentType": "TEXT",
"text": "Здравствуйте! Напишите нам, чтобы познакомиться с возможностями edna Pulse",
"keyboard": {
"rows": {
"buttons": [
{
"text": "Написать",
"type": "QUICK_REPLY",
"payload": "1"
},
{
"text": "Позже",
"type": "QUICK_REPLY",
"payload": "2"
}
]
}
}
}
}
}
Сообщение с текстом и кнопкой-ссылкой
{
"requestId": "test-001",
"cascadeId": 1,
"subscriberFilter": {
"address": "79000000000",
"type": "PHONE"
},
"startTime": "2021-01-21T08:00:00Z",
"content": {
"whatsappContent": {
"contentType": "TEXT",
"text": "Здравствуйте! Перейдите в базу знаний edna, чтобы познакомиться с возможностями edna Pulse",
"keyboard": {
"rows": {
"buttons": [
{
"text": "Перейти",
"type": "URL",
"url": "https://docs-pulse.edna.ru/"
}
]
}
}
}
}
}
Сообщение с текстом и кнопкой-звонком
{
"requestId": "test-001",
"cascadeId": 1,
"subscriberFilter": {
"address": "79000000000",
"type": "PHONE"
},
"startTime": "2021-01-21T08:00:00Z",
"content": {
"whatsappContent": {
"contentType": "TEXT",
"text": "Здравствуйте! Позвоните нам, чтобы познакомиться с возможностями edna Pulse",
"keyboard": {
"rows": {
"buttons": [
{
"text": "Позвонить",
"type": "PHONE",
"phone": "79000000000"
}
]
}
}
}
}
}
Авторизационное сообщение с кнопкой копирования одноразового пароля
{
"requestId": "test-001",
"cascadeId": 71,
"subscriberFilter": {
"address": "79000000000",
"type": "PHONE"
},
"content": {
"whatsappContent": {
"contentType": "AUTHENTICATION",
"messageMatcherId": 4601,
"text": "1234"
}
}
}
Параметры whatsappContent
Подробную информацию об общих параметрах метода api/cascade/schedule смотрите в статье:
| Параметр | Тип данных | Характер | Описание |
|---|---|---|---|
contentType | string | Обязательный | Тип содержимого сообщения. Возможные значения указываются в верхнем регистре:
- TEXT — текстовое сообщение;
- IMAGE — изображение;
- DOCUMENT — документ, вложенный в сообщение;
- VIDEO — сообщение, содержащее видео;
- AUDIO — сообщение, содержащее звук;
- LOCATION — сообщение с координатами, адресом и описанием места. Координаты преобразуются в снимок Google maps;
- LIST_PICKER — кнопки интерактивного меню WhatsApp;
- AUTHENTICATION — сообщение с одноразовым паролем и кнопкой копирования;
- FLOW — сообщение, содержащее WhatsApp Flows.
Использование WhatsApp Flows
|
text | string | Обязательный, если contentType = TEXT, AUTHENTICATION или FLOW | - Текст сообщения, если contentType = TEXT.
- Текст сообщения, в которое будет вложен Flow, если contentType = FLOW.
- Одноразовый пароль, если contentType = AUTHENTICATION.
warning Если при отправке сообщения WhatsApp указано поле attachment — поле text игнорируется и отправляется только вложение. |
flowId | integer | Обязательный, если contentType = FLOW | Идентификатор Flow, который присваивается в WhatsApp Manager в момент создания Flow. |
screen | string | Необязательный | Идентификатор экрана, который первым будет отображаться во Flow. |
caption | string | Обязательный, если contentType = FLOW | Текст кнопки, после нажатия на которую запускается Flow. |
action | string | Необязательный | Тип взаимодействия Flow.
Возможные значения: - navigate — Flow не делает запрос к конечной точке. Значение по умолчанию.
- data_exchange — Flow делает запрос к конечной точке.
|
attachment | object | Обязательный | Содержит информацию о вложении.
warning Если при отправке сообщения WhatsApp указано поле attachment — поле text игнорируется и отправляется только вложение. |
attachment.url | string | Обязательный, если объект attachment не пустой | Ссылка на вложение: изображение, файл, видео или аудио. |
attachment.name | string | Обязательный | Название изображения, файла, видео или аудио. Максимальная длина — 70 символов. |
header | object | Обязательный | Заголовок сообщения. Можно выбрать один из следующих вариантов заголовка: текст, изображение, документ. Для текстового заголовка нужно указать сам текст заголовка, заголовок может содержать одну переменную. Сам заголовок отображается жирным текстом перед сообщением. Для мультимедиа заголовка можно указать ссылку на документ или изображение. |
footer | string | Обязательный | Подпись. Отображается под сообщением приглушенным цветом текста. |
location | object | Обязательный | Содержит информацию о геолокации. Отправка сообщения с геолокацией доступна только в рамках 24-часового диалога. |
location.longitude | string | Обязательный | Координаты (долгота). Диапазон значений — от -180 до 180. |
location.latitude | string | Обязательный | Координаты (широта). Диапазон значений — от -90 до 90. |
location.address | string | Необязательный | Адрес на карте. |
location.name | string | Необязательный | Название объекта, адрес которого передается. |
header.text | string | Обязательный для текстового заголовка | Текст заголовка. |
header.imageUrl | string | Обязательный для заголовка-изображения | Ссылка на изображение в заголовке. |
header.documentUrl | string | Обязательный для заголовка-документа | Ссылка на документ в заголовке. |
header.documentName | string | Обязательный для заголовка-документа | Название документа в заголовке. Будет отображаться получателю сообщения. |
header.videoUrl | string | Обязательный для заголовка-видео | Ссылка на видео в заголовке. |
header.videoName | string | Обязательный для заголовка-видео | Название видео в заголовке. Будет отображаться получателю сообщения. |
buttons | object | Обязательный | Массив объектов, в каждом из которых определяется кнопка. |
buttons.text | string | Обязательный | Текст кнопки. Максимальная длина — 20 символов. |
buttons.url | string | Обязательный для кнопки-ссылки | URL-адрес, который открывается при нажатии кнопки. |
buttons.urlPostfix | string | Обязательный, если в шаблоне есть динамическая ссылка или она ненулевая | Динамическая часть ссылки URL-адреса кнопки. |
buttons.phone | string | Обязательный для кнопки-звонка | Номер телефона, который набирается при нажатии кнопки. |
buttons.payload | string | Обязательный для кнопки с текстом | Код или текст кнопки быстрого ответа.
Максимальное количество символов: - у HSM-сообщений — 128. - у CHAT-сообщений — 128. |
buttons.type | string | Обязательный | Вид кнопки:
- URL — открывает указанную ссылку;
- PHONE — набирает указанный номер телефона;
- QUICK_REPLY — отправляет готовый ответ;
- OTP — копирует одноразовый пароль.
В одном сообщении может быть либо не более трех кнопок типа QUICK_REPLY, либо не более одной каждой из кнопок URL и PHONE. Кнопки QUICK_REPLY не могут быть в сообщении с другими кнопками.
Возможные варианты: - QUICK_REPLY
- QUICK_REPLY QUICK_REPLY
- QUICK_REPLY QUICK_REPLY QUICK_REPLY
- URL
- PHONE
- URL PHONE |
buttons.otpType | boolean | Необязательный | Тип кнопки в авторизационном сообщение WhatsApp. Только для авторизационного шаблонного сообщения WhatsApp.
Возможные значения: - COPY_CODE — скопировать код;
- ONE_TAP — кнопка автоматического заполнения. |
buttons.autofillText | string | Необязательный | Текст кнопки автоматического заполнения. Только для кнопок автоматического заполнения в авторизационном шаблонном сообщении WhatsApp. Максимальное количество символов — 25. |
buttons.packageName | string | Необязательный | Имя пакета приложения Android в авторизационном сообщение WhatsApp. Только для кнопок автоматического заполнения в авторизационном шаблонном сообщении WhatsApp. |
listPicker | object | Обязательный | Объект списка элементов. Содержит в себе параметр button и объект sections, который содержит объекты section. |
listPicker.button | string | Обязательный, если объект listPicker не пустой | Наименование кнопки для интерактивного списка. |
listPicker.sections.title | string | Обязательный, если объект listPicker не пустой | Заголовок секции с элементами, который отображается пользователю. |
listPicker.sections.items | array of objects | Необязательный | Список объектов item. |
listPicker.sections.items.identifier | string | Обязательный, если объект listPicker не пустой | Сквозной для всего сообщения ID элемента, вернется в ответном сообщении пользователя. |
listPicker.sections.items.title | string | Обязательный, если объект listPicker не пустой | Название элемента. Максимальная длина — 24 символа с учетом пробелов. |
listPicker.sections.items.subtitle | string | Обязательный, если объект listPicker не пустой | Подзаголовок элемента. Максимальная длина — 24 символа с учетом пробелов. |
messageMatcherId | integer | Обязательный, если contentType = AUTHENTICATION | Идентификатор шаблона для данного авторизационного сообщения. |
useMarketingMessagesApi | boolean | Необязательный | Параметр определяет способ доставки маркетингового сообщения — Marketing Messages API или Cloud API.
Возможные значения: - true — через Marketing Messages API;
- false — через Cloud API.
Включение Marketing Messages API для WhatsApp |
messageActivitySharing | boolean | Необязательный | Параметр включает оптимизацию доставки маркетингового сообщения через Marketing Messages API и определяет, может ли Meta* анализировать данные сообщения.
Возможные значения: - true — оптимизация включена: Meta* может читать сообщение и принимать решение о его доставке получателю.
- false — оптимизация отключена: Meta* не имеет доступа к содержанию сообщения и не участвует в принятии решения о доставке.
Включение Marketing Messages API для WhatsApp |
Оформление текста
Опция для оформления текста в сообщениях WhatsApp подключена по умолчанию без возможности отключения.
| Выделение текста | Пример |
|---|---|
| _Курсив_ | Курсив |
| *Жирный* | Жирный |
| ~Зачеркнутый~ | |
| `Моноширинный` | Моноширинный |
Правила экранирования кавычек в тексте
Знаки кавычек “ или ‘ должны быть отделены знаком \ в отправляемом сообщении.
Пример правильного оформления:
"text": "Мария! Ждем вас на Мастер-класс \"Готовим вместе c Tefal\" 25.01.2020 в 13.00. Не пропустите это событие! Наш телефон 8(495)100-00-00"
"text": "Мария! Ждем вас на Мастер-класс «Готовим вместе c Tefal» 25.01.2020 в 13.00. Не пропустите это событие! Наш телефон 8(495)100-00-00"
Пример неправильного оформления:
"text": "Мария! Ждем вас на Мастер-класс "Готовим вместе с Tefal" 25.01.2020 в 13.00. Не пропустите это событие! Наш телефон 8(495)100-00-00"
Требования к вложениям
Отправляемые вложения должны соответствовать следующим требованиям:
| Тип вложения | Поддерживаемый формат | Допустимый размер |
|---|---|---|
| document | Любой корректный MIME-тип. | 100 МБ |
| image | image/jpeg, image/png. | 5 МБ |
| audio | audio/aac, audio/mp4, audio/amr, audio/mpeg, audio/ogg.
Кодек=opus (NWB) и ACC. | 16 МБ |
| video | video/mp4, video/3gpp.
Поддерживается только формат MPEG 4 и 3GPP c кодеком H.264 (MPEG-4 Part 10) и AAC для аудио. | 16 МБ |
Формат ответа
{
"requestId": "string"
}
Пример ответа
{
"requestId": "test-001"
}
Параметры ответа
| Параметр | Тип данных | Описание |
|---|---|---|
requestId | string | Внутренний идентификатор исходящего сообщения. Был сгенерирован внешней системой клиента при отправке сообщения. |
* Деятельность компании Meta запрещена на территории Российской Федерации.