Создание рассылок#
Создание рассылки#
POST https://direct.i-dgtl.ru/api/v1/dispatch
Метод позволяет создать как рассылку по одному каналу, так и каскадную рассылку.
Headers#
Name |
Type |
Description |
|---|---|---|
Authorization* |
string |
|
Content-Type* |
string |
|
Request Body#
Name |
Type |
Description |
|---|---|---|
dispatchName* |
string |
Название рассылки |
cascade |
array |
Массив каскадной отправки; описан ниже |
channelType |
string |
Канал рассылки; обязателен при отсутствии массива |
content |
object |
Содержимое сообщения; обязателен при отсутствии массива |
localSendTime* |
string |
Нижняя граница допустимого времени начала рассылки (с учетом |
localCompletionTime |
string |
Верхняя граница допустимого времени завершения рассылки (с учетом |
useLocalTime |
boolean |
Флаг, отвечающий за таймзону, в которой будут отправляться сообщения |
hours* |
array |
Допустимые часы отправки (массив чисел). В массиве могут быть переданы целые числа от 0 до 23, каждое из которых соответствует разрешенному для отправки часовому интервалу с учетом |
days* |
array |
Допустимые дни отправки (массив чисел). В массиве могут быть переданы целые числа от 1 (пн) до 7 (вс), каждое из которых соответствует разрешенному для отправки дню недели; значения должны быть уникальны. |
tags |
array |
Теги рассылки (массив строк). Каждый тег должен соответствовать выражению |
senderName |
string |
Имя отправителя; обязателен при отсутствии массива |
shortUrl |
boolean |
Флаг, отвечающий за сокращение ссылок в сообщении: |
rate |
integer |
Максимальное количество сообщений рассылки, которые можно отправить в единицу времени |
rateTerm |
string |
Единица времени для ограничения |
callbackUrl |
string |
Адрес для отправки callback |
callbackEvents |
array |
События, по которым будут отправлены callback (массив строк). При наличии |
При успешном создании рассылки возвращается ее идентификатор.
{
"dispatchId": 10000000125
}
Использование невалидного токена / отсутствие заголовка авторизации.
{
"error": {
"code": 4012,
"msg": "Bad credentials"
}
}
{
"error": {
"code": 4010,
"msg": "Not Authenticated"
}
}
Использование неподходящего токена.
{
"error": {
"code": 4030,
"msg": "Access Denied"
}
}
Невалидные параметры в теле запроса; ниже приведены несколько примеров ответа.
{
"error": {
"code": 4220,
"msg": "Local send time is less than minimal 2020-12-11T02:15:38Z"
}
}
-----------------------------------------------------------------------------
{
"error": {
"code": 4220,
"msg": "Local send time is greater than maximal 2020-12-18T14:17:52Z"
}
}
-----------------------------------------------------------------------------
{
"error": {
"code": 4220,
"msg": "No active sender name SENDER"
}
}
Совет
Рекомендуемое время ожидания ответа: 70 секунд.
Как правило, ответ на запрос возвращается не более чем за несколько секунд, но таймаут величиной в 70 секунд позволяет гарантированно получить ответ на запрос, в том числе в ситуациях повышенной нагрузки.Для настройки сокращения ссылок с использованием личного домена необходимо обратиться в поддержку
Совет
Имена отправителей можно создать в личном кабинете. Имена отправителей для канала SMS также можно создать при помощи API
Параметры
rateиrateTermвместе образуют максимально допустимую скорость отправки, которую рассылка гарантированно не превысит
Возможные варианты перечислений:
Параметр |
Варианты |
|---|---|
channelType |
SMS, VIBER |
rateTerm |
|
callbackEvents |
Создание одноканальной рассылки #
Для создания рассылки по одному каналу в объекте:
передаются параметры
channelType, senderName, contentне передается массив
cascade
Контент рассылки #
Для канала VIBER формат и валидация объекта content описаны в разделе Отправка VIBER
Для канала SMS формат и валидация объекта content описаны в разделе Каскадная отправка
При этом в тексте сообщения могут присутствовать переменные, которые будут заменены на строки для каждого отдельного сообщения при наполнении рассылки сообщениями.
Переменными являются все строки в двойных фигурных скобках, которые находятся в строке content.text
Пример: #
"content": {
"text": "Уважаемый {{A}}! Рады сообщить, что Вам одобрена кредитная карта на сумму {{B}}, можете забрать ее в ближайшем офисе по адресу {{C}}."
}
Пример запроса #
POST https://direct.i-dgtl.ru/api/v1/dispatch
Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
Content-Type: application/json
{
"dispatchName": "название рассылки",
"localSendTime": "2021-10-01 00:00:00",
"localCompletionTime": "2021-1-01 00:00:00",
"useLocalTime": true,
"hours": [10, 11, 12, 13, 14, 15],
"days": [1, 2, 3, 4, 5, 6, 7],
"tags": ["тег"],
"senderName": "sender",
"rate": 100,
"rateTerm": "h",
"shortUrl": true,
"channelType": "VIBER",
"callbackUrl": "https://domain.com/callback",
"callbackEvents": ["delivered", "price"],
"content": {
"contentType": "text",
"text": "Уважаемый {{A}}! Рады сообщить, что Вам одобрена кредитная карта на сумму {{B}}, можете забрать ее в ближайшем офисе по адресу {{C}}. Подробности: https://bank.ru"
}
}
curl --location 'https://direct.i-dgtl.ru/api/v1/dispatch'
--header 'Content-Type: application/json'
--data '{
"dispatchName": "Рассылка SMS",
"channelType": "SMS",
"content": {
"text": "Уважаемый клиент! Ваш код 1234"
},
"localSendTime": "2026-06-01 10:00:00",
"localCompletionTime": "2026-06-01 20:00:00",
"useLocalTime": true,
"hours": [10,11,12,13,14,15,16,17,18,19],
"days": [1,2,3,4,5],
"tags": ["promo"]
}'
import requests
import json
url = "https://direct.i-dgtl.ru/api/v1/dispatch"
payload = json.dumps({
"dispatchName": "Рассылка SMS",
"channelType": "SMS",
"content": {
"text": "Уважаемый клиент! Ваш код 1234"
},
"localSendTime": "2026-06-01 10:00:00",
"localCompletionTime": "2026-06-01 20:00:00",
"useLocalTime": True,
"hours": [
10,
11,
12,
13,
14,
15,
16,
17,
18,
19
],
"days": [
1,
2,
3,
4,
5
],
"tags": [
"promo"
]
})
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({
"dispatchName": "Рассылка SMS",
"channelType": "SMS",
"content": {
"text": "Уважаемый клиент! Ваш код 1234"
},
"localSendTime": "2026-06-01 10:00:00",
"localCompletionTime": "2026-06-01 20:00:00",
"useLocalTime": true,
"hours": [
10,
11,
12,
13,
14,
15,
16,
17,
18,
19
],
"days": [
1,
2,
3,
4,
5
],
"tags": [
"promo"
]
});
const requestOptions = {
method: "POST",
headers: myHeaders,
body: raw,
redirect: "follow"
};
fetch("https://direct.i-dgtl.ru/api/v1/dispatch", 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 \"dispatchName\": \"Рассылка SMS\",\n \"channelType\": \"SMS\",\n \"content\": {\n \"text\": \"Уважаемый клиент! Ваш код 1234\"\n },\n \"localSendTime\": \"2026-06-01 10:00:00\",\n \"localCompletionTime\": \"2026-06-01 20:00:00\",\n \"useLocalTime\": true,\n \"hours\": [\n 10,\n 11,\n 12,\n 13,\n 14,\n 15,\n 16,\n 17,\n 18,\n 19\n ],\n \"days\": [\n 1,\n 2,\n 3,\n 4,\n 5\n ],\n \"tags\": [\n \"promo\"\n ]\n}");
Request request = new Request.Builder()
.url("https://direct.i-dgtl.ru/api/v1/dispatch")
.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 = '{
"dispatchName": "Рассылка SMS",
"channelType": "SMS",
"content": {
"text": "Уважаемый клиент! Ваш код 1234"
},
"localSendTime": "2026-06-01 10:00:00",
"localCompletionTime": "2026-06-01 20:00:00",
"useLocalTime": true,
"hours": [
10,
11,
12,
13,
14,
15,
16,
17,
18,
19
],
"days": [
1,
2,
3,
4,
5
],
"tags": [
"promo"
]
}';
$request = new Request('POST', 'https://direct.i-dgtl.ru/api/v1/dispatch', $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/dispatch"
method := "POST"
payload := strings.NewReader(`{
"dispatchName": "Рассылка SMS",
"channelType": "SMS",
"content": {
"text": "Уважаемый клиент! Ваш код 1234"
},
"localSendTime": "2026-06-01 10:00:00",
"localCompletionTime": "2026-06-01 20:00:00",
"useLocalTime": true,
"hours": [
10,
11,
12,
13,
14,
15,
16,
17,
18,
19
],
"days": [
1,
2,
3,
4,
5
],
"tags": [
"promo"
]
}`)
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))
}
Создание каскадной рассылки #
Для создания каскадной рассылки в объекте:
не передаются параметры
channelType, senderName, contentпередается массив
cascade
Описание массива cascade #
"cascade": [
{
"channelType": "VIBER",
"senderName": "viber-sender",
"ttl": 10000,
"condition": "not_read",
"content": {
"contentType": "text",
"text": "текст VIBER сообщения {{A}}"
}
},
{
"channelType": "SMS",
"senderName": "sms-sender",
"ttl": 20000,
"condition": "not_delivered",
"content": {
"contentType": "text",
"text": "текст SMS сообщения {{A}}"
}
}
]
Параметр |
Тип |
Описание |
|---|---|---|
cascade |
array (objects) required |
Массив объектов, описывающих каскад; отправка сообщений будет производиться в соответствии с порядком объектов в массиве (аналогично отправке одиночных каскадных сообщений) |
cascade.channelType |
string required |
Канал отправки; одно из значений:
|
cascade.content |
object required |
Контент для сообщений данного шага; объекты соответствуют объектам контента соответствующего канала для одноканальной рассылки; в тексте также допускаются подстановки |
cascade.senderName |
string required |
Имя отправителя соответствующего канала в статусе «Одобрено» с датой начала действия не позднее момента отправки запроса |
cascade.condition |
string optional |
Условие отправки следующего сообщения |
cascade.ttl |
integer optional |
Время жизни сообщения в секундах. По истечении ttl: сообщению данного шага каскада будет присвоен финальный статус, а также при выполнении cascade.condition будет создано следующее сообщение
По умолчанию время жизни сообщения составляет 25 часов |
Пример запроса #
В данной рассылке для каждого получателя рассылки будет отправлено VIBER-сообщение; если для VIBER-сообщения не будет получен статус «Прочитано» в течение 12 часов, то для получателя будет отправлено SMS-сообщение.
При этом сообщения отправляются с 10 до 16 часов со скоростью не более 100 сообщений в час.
Подстановки {{A}}, {{B}}, {{C}}, указанные в параметрах content.text, обязательно должны быть переданы для каждого сообщения на следующем шаге.
POST https://direct.i-dgtl.ru/api/v1/dispatch
Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
Content-Type: application/json
{
"dispatchName": "название рассылки",
"localSendTime": "2021-10-01 00:00:00",
"localCompletionTime": "2021-11-01 00:00:00",
"useLocalTime": true,
"hours": [10,11,12,13,14,15],
"days": [1,2,3,4,5,6,7],
"tags": ["тег"],
"rate": 100,
"rateTerm": "h",
"shortUrl": true,
"callbackUrl": "https://domain.com/callback",
"callbackEvents": ["delivered","price"],
"cascade": [
{
"channelType": "VIBER",
"senderName": "viber-sender",
"ttl": 43200,
"condition": "not_read",
"content": {
"contentType": "button",
"text": "Уважаемый {{A}}! Рады сообщить, что Вам одобрена кредитная карта на сумму {{B}}, можете забрать ее в ближайшем офисе по адресу {{C}}",
"caption": "Подробнее",
"action": "https://example.ru",
"imageUrl": "https://example.ru/image.png"
}
},
{
"channelType": "SMS",
"senderName": "sms-sender",
"content": {
"contentType": "text",
"text": "Уважаемый {{A}}! Рады сообщить, что Вам одобрена кредитная карта на сумму {{B}}, можете забрать ее в ближайшем офисе по адресу {{C}}. Подробнее: https://bank.ru"
}
}
]
}
curl -X POST 'https://direct.i-dgtl.ru/api/v1/dispatch' \
-H 'Content-Type: application/json' \
-H 'Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==' \
-d '{"dispatchName":"название рассылки","localSendTime":"2021-10-01 00:00:00","localCompletionTime":"2021-11-01 00:00:00","useLocalTime":true,"hours":[10,11,12,13,14,15],"days":[1,2,3,4,5,6,7],"tags":["тег"],"rate":100,"rateTerm":"h","shortUrl":true,"callbackUrl":"https://domain.com/callback","callbackEvents":["delivered","price"],"cascade":[{"channelType":"VIBER","senderName":"viber-sender","ttl":43200,"condition":"not_read","content":{"contentType":"button","text":"Уважаемый {{A}}! Рады сообщить, что Вам одобрена кредитная карта на сумму {{B}}, можете забрать ее в ближайшем офисе по адресу {{C}}","caption":"Подробнее","action":"https://example.ru","imageUrl":"https://example.ru/image.png"}},{"channelType":"SMS","senderName":"sms-sender","content":{"contentType":"text","text":"Уважаемый {{A}}! Рады сообщить, что Вам одобрена кредитная карта на сумму {{B}}, можете забрать ее в ближайшем офисе по адресу {{C}}. Подробнее: https://bank.ru"}}]}'
import requests
import json
url = "https://direct.i-dgtl.ru/api/v1/dispatch"
payload = "\"cascade\": [\n {\n \"channelType\": \"VIBER\",\n \"senderName\": \"viber-sender\",\n \"ttl\": 10000,\n \"condition\": \"not_read\",\n \"content\": {\n \"contentType\": \"text\",\n \"text\": \"текст VIBER сообщения {{A}}\"\n }\n },\n {\n \"channelType\": \"SMS\",\n \"senderName\": \"sms-sender\",\n \"ttl\": 20000,\n \"condition\": \"not_delivered\",\n \"content\": {\n \"contentType\": \"text\",\n \"text\": \"текст SMS сообщения {{A}}\"\n }\n }\n ]"
headers = {
'Content-Type': 'application/json',
'Authorization': 'Bearer MTY3MDQ6c1FOa3BmOTYxdkdJeW9QRHJ6U0Rhaw=='
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
const myHeaders = new Headers();
myHeaders.append("Content-Type", "application/json");
myHeaders.append("Authorization", "Bearer MTY3MDQ6c1FOa3BmOTYxdkdJeW9QRHJ6U0Rhaw==");
const raw = "\"cascade\": [\n {\n \"channelType\": \"VIBER\",\n \"senderName\": \"viber-sender\",\n \"ttl\": 10000,\n \"condition\": \"not_read\",\n \"content\": {\n \"contentType\": \"text\",\n \"text\": \"текст VIBER сообщения {{A}}\"\n }\n },\n {\n \"channelType\": \"SMS\",\n \"senderName\": \"sms-sender\",\n \"ttl\": 20000,\n \"condition\": \"not_delivered\",\n \"content\": {\n \"contentType\": \"text\",\n \"text\": \"текст SMS сообщения {{A}}\"\n }\n }\n ]";
const requestOptions = {
method: "POST",
headers: myHeaders,
body: raw,
redirect: "follow"
};
fetch("https://direct.i-dgtl.ru/api/v1/dispatch", 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, "\"cascade\": [\n {\n \"channelType\": \"VIBER\",\n \"senderName\": \"viber-sender\",\n \"ttl\": 10000,\n \"condition\": \"not_read\",\n \"content\": {\n \"contentType\": \"text\",\n \"text\": \"текст VIBER сообщения {{A}}\"\n }\n },\n {\n \"channelType\": \"SMS\",\n \"senderName\": \"sms-sender\",\n \"ttl\": 20000,\n \"condition\": \"not_delivered\",\n \"content\": {\n \"contentType\": \"text\",\n \"text\": \"текст SMS сообщения {{A}}\"\n }\n }\n ]");
Request request = new Request.Builder()
.url("https://direct.i-dgtl.ru/api/v1/dispatch")
.method("POST", body)
.addHeader("Content-Type", "application/json")
.addHeader("Authorization", "Bearer MTY3MDQ6c1FOa3BmOTYxdkdJeW9QRHJ6U0Rhaw==")
.build();
Response response = client.newCall(request).execute();
<?php
$client = new Client();
$headers = [
'Content-Type' => 'application/json',
'Authorization' => 'Bearer MTY3MDQ6c1FOa3BmOTYxdkdJeW9QRHJ6U0Rhaw=='
];
$body = '"cascade": [
{
"channelType": "VIBER",
"senderName": "viber-sender",
"ttl": 10000,
"condition": "not_read",
"content": {
"contentType": "text",
"text": "текст VIBER сообщения {{A}}"
}
},
{
"channelType": "SMS",
"senderName": "sms-sender",
"ttl": 20000,
"condition": "not_delivered",
"content": {
"contentType": "text",
"text": "текст SMS сообщения {{A}}"
}
}
]';
$request = new Request('POST', 'https://direct.i-dgtl.ru/api/v1/dispatch', $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/dispatch"
method := "POST"
payload := strings.NewReader(`"cascade": [
{
"channelType": "VIBER",
"senderName": "viber-sender",
"ttl": 10000,
"condition": "not_read",
"content": {
"contentType": "text",
"text": "текст VIBER сообщения {{A}}"
}
},
{
"channelType": "SMS",
"senderName": "sms-sender",
"ttl": 20000,
"condition": "not_delivered",
"content": {
"contentType": "text",
"text": "текст SMS сообщения {{A}}"
}
}
]`)
client := &http.Client {
}
req, err := http.NewRequest(method, url, payload)
if err != nil {
fmt.Println(err)
return
}
req.Header.Add("Content-Type", "application/json")
req.Header.Add("Authorization", "Bearer MTY3MDQ6c1FOa3BmOTYxdkdJeW9QRHJ6U0Rhaw==")
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))
}