Отправка сообщений
Для отправки сообщений в канал WhatsApp используется метод api/cascade/schedule
.
Если у вас зарегистрировано два одинаковых по контенту шаблона WhatsApp, которые отличаются только параметром Отслеживать переходы по кнопке-ссылке, мы не рекомендуем отправлять сообщения с таким контентом по API. Для отправки используйте личный кабинет edna Pulse.
В обратном случае мы не можем гарантировать корректное отображение статистики переходов по кнопкам-ссылка м
edna Pulse не позволяет отправлять дубликаты сообщения в течение 20 минут после его отправки
Сообщения отправляются через каскад — сценарий последовательной рассылки в несколько каналов. При регистрации канала каскад для него создается автоматически.
Создать каскад из нескольких каналов можно в личном кабинете edna Pulse.
Как работают каскады Как создать каскадВы можете протестировать отправку сообщений с помощью API edna Pulse для канала WhatsApp, не регистрируя канал
Тестирование API канала WhatsAppВызов метода api/cascade/schedule
Чтобы вызвать метод api/cascade/schedule
, отправьте POST-запрос на URL-адрес https://app.edna.ru/api/cascade/schedule
. Запрос выполняется через публичный интерфейс API с авторизацией по API-ключу.
После выполнения запроса программа получает задание на отправку сообщения по каскаду согласно параметрам в теле запроса.
Если запрос принят, сервер возвращает ответ с кодом 200
, содержащий JSON-объект с идентификатором запроса. В случае неуспешной проверки запроса возвращается ответ с кодом ошибки.
Информация о результате отправки сообщения приходит на установленный вебхук.
Получение статусов сообщенийВ случае успешной отправки сообщения возвращается статус sent
, затем delivered
, read
или undelivered
(в зависимости от канала). Статус сообщения failed
означает, что сообщение обработано с ошибкой и не отправлено.
Если сервер не возвращает статус сообщения, отправьте запрос в службу технической поддержки edna
Формат запроса
В теле запроса передается набор параметров каскада, по которому вы хотите отправить сообщение
{
"requestId": "string",
"cascadeId": 0,
"subscriberFilter": {
"address": "string",
"type": "EDNA_ID"
},
"startTime": "2023-09-27T12:06:29Z",
"ttl": "PT1M",
"content": {
"smsContent": {
"text": "string"
},
"whatsappContent": {
"contentType": "TEXT",
"text": "string",
"attachment": {
"url": "string",
"name": "string"
},
"location": {
"longitude": 0,
"latitude": 0,
"address": "string",
"name": "string"
},
"comment": "string",
"caption": "string",
"action": "string",
"header": {
"text": "string",
"imageUrl": "string",
"documentUrl": "string",
"documentName": "string",
"videoUrl": "string",
"videoName": "string"
},
"footer": {
"text": "string"
},
"keyboard": {
"rows": [
{
"buttons": [
{
"text": "string",
"url": "string",
"urlPostfix": "string",
"phone": "string",
"payload": "string",
"type": "PHONE",
"otpType": "COPY_CODE",
"color": "string",
"requestContact": true,
"requestLocation": true,
"autofillText": "string",
"packageName": "string",
"hash": "string",
"appId": 0,
"ownerId": 0
}
]
}
]
},
"listPicker": {
"button": "string",
"sections": [
{
"title": "string",
"items": [
{
"identifier": "string",
"title": "string",
"subtitle": "string"
}
]
}
]
},
"catalog": {
"id": "string",
"product": {
"id": "string"
},
"sections": [
{
"title": "string",
"products": [
{
"id": "string"
}
]
}
]
},
"order": {
"catalogId": "string",
"products": [
{
"id": "string",
"quantity": 0,
"price": 0,
"currency": "RUB"
}
]
},
"messageMatcherId": 0
},
"viberContent": {
"contentType": "TEXT",
"text": "string",
"attachment": {
"url": "string",
"name": "string"
},
"location": {
"longitude": 0,
"latitude": 0,
"address": "string"
},
"comment": "string",
"caption": "string",
"action": "string",
"header": {
"text": "string",
"imageUrl": "string",
"documentUrl": "string",
"documentName": "string",
"videoUrl": "string",
"videoName": "string"
},
"footer": {
"text": "string"
},
"keyboard": {
"rows": [
{
"buttons": [
{
"text": "string",
"url": "string",
"urlPostfix": "string",
"phone": "string",
"payload": "string",
"type": "PHONE",
"otpType": "COPY_CODE",
"color": "string",
"requestContact": true,
"requestLocation": true,
"autofillText": "string",
"packageName": "string",
"hash": "string",
"appId": 0,
"ownerId": 0
}
]
}
]
}
},
"pushContent": {
"attributes": {
"additionalProp1": "string",
"additionalProp2": "string",
"additionalProp3": "string"
},
"small": {
"title": "string",
"text": "string",
"imageUrl": "string"
},
"big": {
"title": "string",
"text": "string",
"imageUrl": "string"
},
"buttons": [
{
"text": "string",
"url": "string"
}
],
"action": "string",
"effects": {
"sound": "string",
"lights": "string",
"vibrate": "string",
"androidNotificationChannel": "string"
},
"iosSettings": {
"interruptionLevel": "ACTIVE",
"category": "string"
},
"subscription": "string"
},
"vkNotifyContent": {
"contentType": "string",
"text": "string",
"messageMatcherId": 0,
"keyboard": {
"rows": [
{
"buttons": [
{
"text": "string",
"buttonType": "QUICK_REPLY",
"payload": "string",
"color": "string"
}
]
}
]
}
},
"okNotifyContent": {
"contentType": "string",
"text": "string"
}
},
"errorIfNotMatched": true,
"comment": "string",
"priority": "default"
}
Параметры запроса
Об щие параметры
Параметр | Тип данных | Характер | Описание |
---|---|---|---|
requestId | string | Обязательный | Идентификатор сообщения. Генерируется вашей системой, после чего значение должно быть передано в запрос. Максимальная длина строки — 256 символов. |
comment | string | Необязательный | Текстовый комментарий в сообщении. Значение параметра отображается в детальном отчете. |
cascadeId | string | Обязательный | Идентификатор каскада. При создании канала автоматически создается каскад для отправки сообщений по этому каналу. Чтобы узнать идентификатор каскада — используйте метод API по получению информации о каскадах (поле id ). Получение информации о каскадах |
subscriberFilter | object | Обязательный | Получатель сообщения: ID в edna Pulse, номер телефона клиента, а также другие ID для push-сообщений. subscriberFilter включает в себя параметры: - address — значение, которое зависит от type ; - type — см. параметр type Если type — это PHONE , то address — номер телефона клиента, например:<p></p> "subscriberFilter": <p></p>{ <p></p> "address": "79000000000",<p></p> "type": "PHONE"<p></p>} |
address | string | Обязательный | Значение идентификатора указанного типа type. |
type | string | Обязательный | Тип идентификатора клиента. Возможные значения указываются в верхнем регистре: - INSTAGRAM_ID * — Идентификатор клиента в Instagram* из 16 числовых символов. Этот идентификатор создается на стороне Facebook*, когда клиент первым взаимодействует с Instagram*-аккаунтом бизнеса. Это значение может быть разным и меняться для одного и того же Instagram* клиента. - FACEBOOK_ID * — Идентификатор клиента в Facebook*. - DEVICE_APP_ID — Идентификатор push-устройства клиента. - EDNA_ID — Идентификатор клиента в базе данных edna, который создается автоматически при создании клиента в edna. Отображается на странице Редактирование пользователя в строке URL, например: > 3314 в строке https://app.edna.ru/audience/3314/edit . - PHONE — Номер телефона клиента в формате 79000000000 . - EMAIL - UTM - COOKIE_ID - TELEGRAM_ID - GOOGLE_ID - APPLE_ID - YANDEX_ID - EXT_USER_ID |
startTime | string | Необязательный | Дата и время в формате ISO 8601 (например, 2024-07-01T00:00:00Z ), раньше которого сообщение не будет отправлено. Используется при отложенной отправке. Допустимые форматы: |
content | object | Обязательный | Содержит объект whatsappContent |
ttl | string | Необязательный | Время, по истечении которого нужно переходить на описываемый шаг, если сообщение на предыдущем шаге было не доставлено. Период времени указывается в формате ISO 8601 (например, PT1M ). |
errorIfNotMatched | boolean | Необязательный | Устаревший параметр. Используется, чтобы включить проверку шаб лона сообщения. Если совпадений нет, возвращается ошибка. |
priority | string | Необязательный | Используется для обозначения приоритета сообщений. Возможные значения:- DEFAULT — стандартный приоритет, эквивалентно отсутствию дополнительных настроек приоритета;- LOW — низкий приоритет;- NORMAL — средний приоритет;- HIGH — высокий приоритет;- REALTIME — доставка в режиме реального времени. |
Параметры whatsappContent
Параметр | Тип данных | Характер | Описание |
---|---|---|---|
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 . |
flowId | integer | Обязательный, если contentType = FLOW | Идентификатор Flow, который присваивается в WhatsApp Manager в момент создания Flow. |
screen | string | Необязательный | Идентификатор экрана, который первым будет отображаться во Flow. |
caption | string | Обязательный, если contentType = FLOW | Текст кнопки, после нажатия на которую запускается Flow. |
action | string | Необязательный | Тип взаимодействия Flow.Возможные значения:- navigate — Flow не делает запрос к конечной точке. Значение по умолчанию.- data_exchange — Flow делает запрос к конечной точке. developers.facebook.com |
attachment | object | Обязательный | Содержит информацию о вложении. Если при отправке чат-сообщения 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.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 | Идентификатор шаблона для данного авторизационного сообщения. |
Параметры viberContent
Параметр | Тип данных | Характер | Описание |
---|---|---|---|
contentType | string | Обязательный | Тип содержимого сообщения. Возможные значения указываются в верхнем регистре:- TEXT — текстовое сообщение;- IMAGE — изображение;- DOCUMENT — документ, вложенный в сообщение;- VIDEO — сообщение, содержащее видео;- AUDIO — сообщение, содержащее звук;- BUTTON — кнопка;- LIST_PICKER — кнопки интерактивного меню WhatsApp;- LOCATION — сообщение с координатами, адресом и описанием места. Координаты преобразуются в снимок Google maps. |
footer | object | Необязательный | Подпись. Отображается под сообщением приглушенным цветом текста. |
text | string | Необязательный | Текст сообщения. |
header | object | Необязательный | Заголовок сообщения. Можно выбрать один из следующих вариантов заголовка: текст, изображение, документ. Для текстового заголовка нужно указать сам текст заголовка, заголовок может содержать одну переменную. Сам заголовок отображается жирным текстом перед сообщением. Для мультимедиа заголовка можно указать ссылку на документ или изображение. |
attachment | object | Необязательный | Содержит информацию о вложении. |
attachment.url | string | Обязательный | Ссылка на вложение: изображение, файл, видео или аудио. |
attachment.name | string | Необязательный | Название изображения, файла, видео или аудио. Максимальная длина — 25 символов. |
location | object | Необязательный | Содержит информацию о местонахождении. |
location.longitude | string | Обязательный | Координаты (долгота). |
location.latitude | string | Обязательный | Координаты (широта). |
location.address | string | Необязательный | Адрес на карте. |
caption | string | Необязательный | Название кнопки. |
action | string | Необязательный | Ссылка для кнопки. |
Параметры smsContent
Параметр | Тип данных | Характер | Описание |
---|---|---|---|
text | string | Обязательный | Текст сообщения. |
Параметры pushContent
Параметр | Тип данных | Характер | Описание |
---|---|---|---|
small | object | Обязательный | Параметры отображения свернутого push-уведомления. |
small.title | string | Необязательный | Заголовок свернутого push-уведомления. |
small.text | string | Обязательный | Текст свернутого push-уведомления. |
small.imageUrl | string | Необязательный | Иконка (логотип) для отображения в свернутом push-уведомлении. Рекомендуемое соотношение сторон — 1×1. Pазмер — не более 1024×1024. |
big | object | Необязательный | Параметры отображения расширенного push-уведомления. |
big.title | string | Необязательный | Заголовок развернутого push-уведомления. |
big.text | string | Необязательный | Текст развернутого push-уведомления. |
big.imageUrl | string | Необязательный | Большое изображение для развернутого push-уведомления. Рекомендуются изображения с соотношениями сторон 2×1, где основная визуальная масса остается при обрезке до 1,79×1 и 2,5×1 (ограничения Android). |
action | string | Необязательный | Ссылка, которая будет передана приложению при переходе пользователя по push-уведомлению. |
buttons | object | Необязательный | Параметры отображения кнопок. Вмест е с уведомлением можно отобразить до двух кнопок. |
buttons.text | string | Необязательный | Название кнопки. Пользователи увидят это название на кнопке в уведомлении. |
buttons.url | string | Необязательный | Ссылка кнопки. Будет передана приложению при нажатии пользователя на кнопку. |
effects | object | Необязательный | Звук, вибрация, имя notification channel и цвет мигания светодиода на устройстве пользователя при получении push-уведомления. |
effects.sound | string | Необязательный | Имя файла со звуком без расширения. Файл с таким именем должен находиться в каталоге res/raw приложения Android и в корневом каталоге Xcode приложения iOS. |
effects.lights | string | Необязательный | Цвет LED при получении push-уведомления (только Android). На некоторых смартфонах Android есть сигнальный светодиод. С помощью этого параметра можно задать цвет мигания этого светодиода при получении push-уведомления. |
effects.vibrate | string | Необязательный | Последовательность промежутков бездействия и вибрации мотора при получении push-уведомления в милл исекундах (только Android). Первое значение — бездействие. Например, при паттерне [300,500,300,500] на устройстве будет 300 мс бездействия, 500 мс вибрации, 300 мс бездействия, 500 мс вибрации. |
effects.androidNotificationChannel | string | Необязательный | Название канала уведомлений для Android. Пользователи увидят это название в настройках смартфона. Изменить параметры канала (звук, вибрацию и цвет светодиода) возможно только для новых получателей push-уведомлений. |
iosSettings | object | Необязательный | Уровень прерывания и категория ContentExtension (только для iOS). |
iosSettings.interruptionLevel | string | Необязательный | Уровень прерывания определяет вид уведомления на iOS 15 и выше. |
iosSettings.category | string | Необязательный | Категория для вызова ContentExtension . Параметр обрабатывается на стороне iOS и определяет, как отрисовывается расширенное push-уведомление. |
attributes | object | Необязательный | Дополнительные параметры push-сообщения. Внутри JSON таблица «ключ-значение». |
Параметры okNotifyContent
Параметр | Тип данных | Характер | Описание |
---|---|---|---|
contentType | string | Обязательный | Тип содержимого сообщения. |
text | string | Обязательный | Текст сообщения. |
Параметры vkNotifyContent
Параметр | Тип данных | Характер | Описание |
---|---|---|---|
messageMatcherId | integer | Обязательный | Идентификатор шаблона сообщения. |
contentType | string | Обязательный | Тип содержимого сообщения. |
text | string | Обязательный | Текст сообщения. |
keyboard | object | Необязательный | Кнопки в сообщении. |
keyboard.buttons | object | Обязательный | Массив объектов, в каждом из которых определяется кнопка. |
buttons.text | string | Обязательный | Название кнопки. |
buttons.buttonType | string | Обязательный | Тип кнопки: QUICK_REPLY , URL , LOCATION , VK_MINI_APPS . |
buttons.payload | string | Обязательный | Код кнопки. |
buttons.url | string | Обязательный | URL-адрес для кнопки типа URL. |
buttons.hash | string | Обязательный | Хеш для навигации в приложении. Указывается, если поле определено при регистрации шаблона. Для кнопки типа VK_MINI_APPS . |
buttons.appId | integer | Обязательный | Идентификатор приложения, которое открывается после нажатия кнопки. Для кнопки типа VK_MINI_APPS . |
buttons.ownerId | integer | Обязательный | Идентификатор VK сообщества, если приложение необходимо открыть в контексте сообщества. Для кнопки типа VK_MINI_APPS . |
buttons.requestLocation | boolean | Необязательный | Запрос геолокации пользователя. Возможное значение — true |
buttons.color | string | Необязательный | Цвет кнопки. Возможные значения: - primary — синяя кнопка для основного действия;- secondary — белая кнопка для второстепенного действия;- negative — красна я кнопка для отрицательного действия (например, отклонить, удалить);- positive — зеленая кнопка для положительного действия (например, согласиться, подтвердить). |
Кавычки в тексте
Знаки кавычек “
или ‘
должны быть отделены знаком \
в отправляемом сообщении.
Пример правильного оформления
"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"