Отправка WHATSAPP#
Совет
Для получения возможности отправки WHATSAPP-сообщений необходимо заполнить анкету, после чего будет зарегистрировано имя отправителя и шаблон для отправки сообщений.
Получение WHATSAPP-шаблонов и преобразование в сообщения описано здесь.
Совет
Отправка сообщений происходит в режиме чата:
если чат инициируется клиентом, первое сообщение должно соответствовать зарегистрированному шаблону. После каждого ответа абонента открывается 24-часовое окно для отправки сообщений с произвольным содержанием. Если абонент не ответил, клиент может отправлять сообщения пользователю вне рамок 24-часового окна с использованием заранее зарегистрированных шаблонов сообщений;
если чат инициируется абонентом, в течение 24-часового окна клиент может отправлять сообщения с произвольным содержанием.
Отправка WHATSAPP-сообщений#
POST https://direct.i-dgtl.ru/api/v1/message
Метод позволяет отправлять массив одиночных сообщений (от 1 до 1000)
Headers#
Name |
Type |
Description |
|---|---|---|
Authorization* |
string |
|
Content-Type* |
string |
|
Request Body#
Name |
Type |
Description |
|---|---|---|
channelType* |
string |
Канал отправки ( |
senderName* |
string |
Имя отправителя. Допускаются WHATSAPP-имена в статусе «Одобрено» |
destination* |
string |
Номер абонента |
content* |
object |
Контент сообщения. Ниже описаны возможные варианты содержимого. |
tags |
array |
Теги сообщения (массив строк). Каждый тег должен соответствовать выражению |
useLocalTime |
boolean |
Флаг, отвечающий за таймзону, в которой будет отправлено сообщение: |
localSendTime |
string |
Нижняя граница допустимого времени отправки сообщения (с учетом значения |
localCompletionTime |
string |
Верхняя граница допустимого времени отправки сообщения (с учетом |
ttl |
integer |
Время жизни сообщения в секундах. По истечении ttl сообщению устанавливается финальный статус. |
hours |
array |
Допустимые часы отправки (массив чисел). В массиве могут быть переданы целые числа от 0 до 23, каждое из которых соответствует разрешенному для отправки интервалу с учетом |
days |
array |
Допустимые дни отправки (массив чисел). В массиве могут быть переданы целые числа от 1 (пн) до 7 (вс), каждое из которых соответствует разрешенному для отправки дню недели; значения должны быть уникальны. |
shortUrl |
boolean |
Флаг, отвечающий за сокращение ссылок в сообщении: |
callbackUrl |
string |
Адрес для отправки callback |
callbackEvents |
array |
События, по которым будут отправлены callback (массив строк). При наличии |
externalMessageId |
string |
Внутренний id сообщения в вашей системе. До 100 символов |
В случае успешного запроса возвращается ответ, в котором перечислены идентификаторы сообщений и коды результата. При значении errors = false гарантируется, что все переданные сообщения успешно созданы.
{
"errors": false,
"items": [
{
"messageUuid": "063474ec-a34f-4558-90c5-984395000004",
"code": 201
},
{
"messageUuid": "063564ec-a34f-4558-90c5-984395000005",
"code": 201
}
]
}
Использование невалидного токена / отсутствие заголовка авторизации.
{
"error": {
"code": 4012,
"msg": "Bad credentials"
}
}
{
"error": {
"code": 4010,
"msg": "Not Authenticated"
}
}
Использование неподходящего токена.
{
"error": {
"code": 4030,
"msg": "Access Denied"
}
}
Невалидные параметры в теле запроса; ниже приведены несколько примеров ответа.
{
"error": {
"code": 4220,
"msg": "Invalid msisdn"
}
}
-----------------------------------------------------------------------------
{
"error": {
"code": 4220,
"msg": "Invalid text length in viber content (0)"
}
}
-----------------------------------------------------------------------------
{
"error": {
"code": 4220,
"msg": "Invalid caption length in viber content (3)"
}
}
-----------------------------------------------------------------------------
{
"error": {
"code": 4220,
"msg": "Invalid caption length in viber content (3)"
}
}
Payment Required. Недостаточно средств на балансе.
{
"error": {
"code": 402,
"msg": "Insufficient funds"
}
}
Совет
Рекомендуемое время ожидания ответа: 70 секунд.
Как правило, ответ на запрос возвращается не более чем за несколько секунд, но таймаут величиной в 70 секунд позволяет гарантированно получить ответ на запрос, в том числе в ситуациях повышенной нагрузки.
Совет
Для данного канала рекомендуется использовать ttl не менее 24 часов, так как сервис может доставить сообщение даже спустя 24 часа неактивности абонента (например, если устройство было выключено).
Совет
Для использования личного домена в сокращенных ссылках необходимо обратиться в поддержку
Возможные варианты перечислений:
Параметр |
Варианты |
|---|---|
callbackEvents |
Текстовое сообщение #
Текстовое WHATSAPP-сообщение, помимо текста, может содержать заголовок, подпись и кнопки.
Для отправки текстового WHATSAPP-сообщения используется следующий объект content:
{
"contentType": "text",
"text": "текст whatsapp-сообщения",
"header": {
"text": "Заголовок сообщения"
},
"footer": {
"text": "Подпись сообщения"
},
"buttons": [
{
"text": "текст кнопки",
"url": "https://i-dgtl.ru"
},
{
"text": "текст второй кнопки",
"phone": "78124269988"
}
]
}
Параметр |
Тип |
Описание |
|---|---|---|
contentType |
string required |
Тип контента ( |
text |
string required |
Текст сообщения; строка в кодировке UTF-8 без Byte Order Mark От 1 до 1000 символов |
header |
object |
Заголовок сообщения |
header.text |
string |
Текст для заголовка |
header.documentUrl |
string |
Ссылка на документ для заголовка. Документ должен быть в формате PDF. |
header.documentName |
string |
Название документа для заголовка; может присутствовать только при наличии documentUrl |
header.imageUrl |
string |
Ссылка на изображение для заголовка. Изображение должно быть в формате JPG или PNG |
footer |
object |
Подпись сообщения |
footer.text |
string |
Текст для подписи; от 1 до 60 символов |
buttons |
array (objects) |
Массив с объектами кнопок |
buttons.text |
string |
Текст кнопки; от 1 до 25 символов |
buttons.url |
string |
Ссылка, на которую происходит переход при нажатии на кнопку; от 1 до 1000 символов; должна начинаться с |
buttons.phone |
string |
Телефонный номер, на который предлагается сделать вызов при нажатии на кнопку; от 1 до 1000 символов |
buttons.payload |
string |
Скрытый текст, который будет передан во входящем сообщении, если пользователь нажмет на кнопку; от 1 до 1000 символов |
Заголовок в сообщениях #
в объекте header допускается использовать только одно из:
textdocumentUrlиdocumentNameimageUrl
Кнопки в сообщениях #
кнопки передаются объектами в массиве
buttonsв каждом объекте обязателен
textсуществует два типа кнопок:
кнопка с ссылкой: содержит
textиurlилиtextиphoneкнопка с текстом: содержит
textиpayload
в одном сообщении допускается передача кнопок только одного типа (то есть передача
payload-кнопок вместе сurl/phone-кнопками не допускается)в сообщении допускается только одна кнопка с параметром
urlв сообщении допускается только одна кнопка с параметром
phoneпри передаче кнопок с текстом допускается не более трех объектов в массиве
при передаче кнопок с ссылкой допускается не более двух объектов в массиве
наличие кнопок в сообщении не влияет на возможность наличия заголовка и подписи
Примеры объектов #
{
"contentType": "text",
"text": "текст сообщения"
}
{
"contentType": "text",
"text": "Текст сообщения",
"header": {
"documentUrl": "https://example.com/document.pdf",
"documentName": "document.pdf"
}
}
{
"contentType": "text",
"text": "Текст сообщения",
"header": {
"imageUrl": "https://example.com/image.png"
},
"footer": {
"text": "Подпись сообщения"
}
}
{
"contentType": "text",
"text": "Текст сообщения",
"buttons": [
{
"text": "текст кнопки 1",
"payload": "id=1"
},
{
"text": "текст кнопки 2",
"payload": "id=2"
}
]
}
{
"contentType": "text",
"text": "Текст сообщения",
"buttons": [
{
"text": "текст кнопки 1",
"url": "https://i-dgtl.ru/"
},
{
"text": "текст кнопки 2",
"phone": "78124269988"
}
]
}
Аутентификационное сообщение #
Для отправки аутентификационного WHATSAPP-сообщения используется следующий объект content:
{
"contentType": "authentication",
"text": "1234",
"lang": "ru",
"addSecurityRecommendation": true,
"codeExpirationMinutes": 10,
"buttons": [
{
"text": "Скопировать"
}
]
}
Параметр |
Тип |
Описание |
|---|---|---|
contentType |
string |
Тип контента ( |
text |
string |
Текст сообщения, не более 15 символов |
lang |
string |
Язык сообщения, не более 2 символов |
addSecurityRecommendation |
boolean |
Определяет, будет ли сообщение содержать предустановленный текст безопасности |
codeExpirationMinutes |
integer |
Срок действия пароля или кода в минутах. Если не указывать этот параметр, сообщение не будет содержать предупреждение об истечении срока действия пароля. Допустимые значения: от 1 до 90. |
buttons |
array |
Массив кнопок. Должен содержать ровно одну кнопку. |
buttons.text |
string |
Текст на кнопке, не более 25 символов |
Совет
Значения параметров lang, addSecurityRecommendation, codeExpirationMinutes, buttons.text должны соответствовать указанным в зарегистрированном шаблоне
Сообщение с изображением #
Для отправки WHATSAPP-сообщения с изображением используется следующий объект content:
{
"contentType": "image",
"imageUrl": "https://image.png",
"imageName": "Изображение"
}
Параметр |
Тип |
Описание |
|---|---|---|
contentType |
string required |
Тип контента ( |
imageUrl |
string required |
Ссылка на изображение |
imageName |
string |
Название изображения |
Сообщение с документом #
Для отправки WHATSAPP-сообщения с документом используется следующий объект content:
{
"contentType": "document",
"documentUrl": "https://document.pdf",
"documentName": "Документ"
}
Параметр |
Тип |
Описание |
|---|---|---|
contentType |
string required |
Тип контента ( |
documentUrl |
string required |
Ссылка на документ |
documentName |
string |
Название документа |
Сообщение с видео #
Для отправки WHATSAPP-сообщения с видео используется следующий объект content:
{
"contentType": "video",
"videoUrl": "https://video.mp4",
"videoName": "Название видео"
}
Параметр |
Тип |
Описание |
|---|---|---|
contentType |
string required |
Тип контента ( |
videoUrl |
string required |
Ссылка на видео |
videoName |
string |
Название видео |
Пример запроса #
POST https://direct.i-dgtl.ru/api/v1/message
Authorization: Basic QWxhZGRpbjp...
Content-Type: application/json
[
{
"senderName": "SENDER",
"channelType": "WHATSAPP",
"content": {
"contentType": "text",
"text": "Текст WHATSAPP-сообщения",
},
"destination": "7818242882",
}
]
curl -X POST 'https://direct.i-dgtl.ru/api/v1/message' \
-H 'Content-Type: application/json' \
-H 'Authorization: Basic QWxhZGRpbjpvc...' \
-d '[{"senderName":"SENDER","channelType":"WHATSAPP","content":{"contentType":"text","text":"Текст WHATSAPP-сообщения"},"destination":"7818242882"}]'
import requests
import json
url = "https://direct.i-dgtl.ru/api/v1/message"
payload = json.dumps([
{
"senderName": "SENDER",
"channelType": "WHATSAPP",
"destination": "7818242882",
"content": {
"contentType": "text",
"text": "Текст WHATSAPP-сообщения"
}
}
])
headers = {
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
const myHeaders = new Headers();
myHeaders.append("Content-Type", "application/json");
const raw = JSON.stringify([
{
"senderName": "SENDER",
"channelType": "WHATSAPP",
"destination": "7818242882",
"content": {
"contentType": "text",
"text": "Текст WHATSAPP-сообщения"
}
}
]);
const requestOptions = {
method: "POST",
headers: myHeaders,
body: raw,
redirect: "follow"
};
fetch("https://direct.i-dgtl.ru/api/v1/message", requestOptions)
.then((response) => response.text())
.then((result) => console.log(result))
.catch((error) => console.error(error));
OkHttpClient client = new OkHttpClient().newBuilder()
.build();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "[\n {\n \"senderName\": \"SENDER\",\n \"channelType\": \"WHATSAPP\",\n \"destination\": \"7818242882\",\n \"content\": {\n \"contentType\": \"text\",\n \"text\": \"Текст WHATSAPP-сообщения\"\n }\n }\n]");
Request request = new Request.Builder()
.url("https://direct.i-dgtl.ru/api/v1/message")
.method("POST", body)
.addHeader("Content-Type", "application/json")
.build();
Response response = client.newCall(request).execute();
<?php
$client = new Client();
$headers = [
'Content-Type' => 'application/json'
];
$body = '[
{
"senderName": "SENDER",
"channelType": "WHATSAPP",
"destination": "7818242882",
"content": {
"contentType": "text",
"text": "Текст WHATSAPP-сообщения"
}
}
]';
$request = new Request('POST', 'https://direct.i-dgtl.ru/api/v1/message', $headers, $body);
$res = $client->sendAsync($request)->wait();
echo $res->getBody();
package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://direct.i-dgtl.ru/api/v1/message"
method := "POST"
payload := strings.NewReader(`[
{
"senderName": "SENDER",
"channelType": "WHATSAPP",
"destination": "7818242882",
"content": {
"contentType": "text",
"text": "Текст WHATSAPP-сообщения"
}
}
]`)
client := &http.Client {
}
req, err := http.NewRequest(method, url, payload)
if err != nil {
fmt.Println(err)
return
}
req.Header.Add("Content-Type", "application/json")
res, err := client.Do(req)
if err != nil {
fmt.Println(err)
return
}
defer res.Body.Close()
body, err := io.ReadAll(res.Body)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(string(body))
}
Совет
В примере указан минимальный набор параметров, который позволяет моментально отправить WHATSAPP-сообщение (при наличии зарегистрированного имени отправителя и шаблона). Вы можете кастомизировать контент, время отправки, настроить коллбэки и добавить теги, используя опциональные параметры, описанные выше на данной странице.