Отправка сообщений
Для отправки сообщений в каналы WhatsApp и Viber используется метод api/cascade/schedule.
В обратном случае мы не можем гарантировать корректное отображение статистики переходов по кнопкам-ссылкам.
edna Pulse не позволяет отправлять дубликаты сообщения в течение 20 минут после его отправки.
Сообщения отправляются через каскад — сценарий последовательной рассылки в несколько каналов. При регистрации канала каскад для него создается автоматически.
Создать каскад из нескольких каналов можно в личном кабинете edna Pulse.
Как работают каскады Как создать каскадВызов метода api/cascade/schedule
Чтобы вызвать метод api/cascade/schedule, отправьте POST-запрос на URL-адрес https://app.edna.io/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": {
"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": "USD"
}
]
},
"messageMatcherId": 0,
"useMarketingMessagesApi": boolean,
"messageActivitySharing": boolean
},
"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
}
]
}
]
}
}
}
}
Параметры запроса
Общие параметры
| Параметр | Тип данных | Характер | Описание |
|---|---|---|---|
requestId | string | Обязательный | Идентификатор сообщения. Генерируется вашей системой, после чего значение должно быть передано в запрос. Максимальная длина строки — 256 символов. |
comment | string | Необязательный | Текстовый комментарий в сообщении. Значение параметра отображается в детальном отчете. |
cascadeId | string | Обязательный | Идентификатор каскада. При создании канала автоматически создается каскад для отправки сообщений по этому каналу. Чтобы узнать идентификатор каскада — используйте метод API по получению информации о каскадах (поле id).
Получение информации о каскадах |
subscriberFilter | object | Обязательный | Получатель сообщения: ID в edna Pulse, номер телефона клиента, а также другие ID для push-сообщений.
Включает в себя следующие параметры: - address — значение, которое зависит от type;
- type — см. параметр type
Например: если type — это PHONE, то address — номер телефона клиента |
address | string | Обязательный | Значение идентификатора указанного типа type. |
type | string | Обязательный | Тип идентификатора клиента. Возможные значения указываются в верхнем регистре:
- INSTAGRAM_ID* — Идентификатор клиента в Instagram* из 16 числовых символов. Этот идентификатор создается на стороне Facebook*, когда клиент первым взаимодействует с Instagram*-аккаунтом бизнеса. Это значение может быть разным и меняться для одного и того же Instagram* клиента.
- FACEBOOK_ID* — Идентификатор клиента в Facebook*.
- DEVICE_APP_ID — Идентификатор push-устройства клиента.
- EDNA_ID — Идентификатор клиента в базе данных edna, который создается автоматически при создании клиента в edna.
Доступен только для каналов WhatsApp, SMS и Viber. Отображается на странице Редактирование пользователя в строке URL, например: 3314 в строке https://app.edna.io/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, viberContent. |
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 делает запрос к конечной точке.
|
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.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 |
Параметры viberContent
| Параметр | Тип данных | Характер | Описание |
|---|---|---|---|
contentType | string | Обязательный | Тип содержимого сообщения. Возможные значения указываются в верхнем регистре:
- TEXT — текстовое сообщение;
- IMAGE — изображение;
- DOCUMENT — документ, вложенный в сообщение;
- VIDEO — сообщение, содержащее видео;
- AUDIO — сообщение, содержащее звук;
- BUTTON — кнопка;
- 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 | Необязательный | Ссылка для кнопки. |
Кавычки в тексте
Знаки кавычек “ или ‘ должны быть отделены знаком \ в отправляемом сообщении.
Пример правильного оформления
"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"
Оформление текста в WhatsApp
Опция для оформления текста в сообщениях WhatsApp подключена по умолчанию без возможности отключения.
| Выделение текста | Пример |
|---|---|
| _Курсив_ | Курсив |
| *Жирный* | Жирный |
| ~Зачеркнутый~ | |
| `Моноширинный` | Моноширинный |
Формат ответа
В ответ на запрос возвращается JSON-объект, содержащий ID отправленного сообщения и статус его обработки.