Рассылки
Массовые письма по адресной базе: создание, вёрстка, запуск, пауза, вложения и папки.
Рассылка создаётся черновиком, наполняется содержимым и запускается отдельным вызовом: schedule ставит её в расписание, send отправляет сразу. Правка черновика и запуск разведены намеренно — запуском нельзя случайно переписать письмо.
Жизненный цикл
POST /campaigns → DRAFT черновик создан
PUT /campaigns/{id} → DRAFT правим тему, вёрстку, базу
POST /campaigns/{id}/test → DRAFT письмо на свой адрес — проверить
GET /campaigns/{id}/preview → DRAFT ссылка на просмотр в браузере
GET /campaigns/{id}/estimate → DRAFT сколько писем уйдёт
POST /campaigns/{id}/schedule → SCHEDULE запланирована на delivery_time
POST /campaigns/{id}/send → MODERATING отправка сразу после модерации
POST /campaigns/{id}/unschedule → DRAFT снята с расписания, пока не ушла
→ PROCESSING идёт отправка
→ SENT отправлена
A/B-тесты
Черновик можно превратить в A/B-тест: сравнить темы, отправителей, вёрстку или час отправки. Тест — это N+1 рассылка: варианты уходят каждый на свою долю базы, а победитель — всем остальным.
POST /campaigns → DRAFT обычный черновик
POST /campaigns/{id}/ab → DRAFT стал тестом, созданы варианты
PUT /campaigns/{id}/ab → DRAFT другие значения или доли
POST /campaigns/{id}/schedule → SCHEDULE варианты ушли, ждём победителя
GET /reports/{id}/variants → кто впереди
POST /campaigns/{id}/ab/winner → выбор вручную, если winner_by=manual
→ SENT победитель ушёл остатку базы
Варианты живут отдельными рассылками, но в
списке не показываются: там виден сам тест,
строкой с ab: "test".
Статусы
DRAFT | Черновик. Можно менять всё |
MODERATING | Отправлена на модерацию; уйдёт сразу после её прохождения |
SCHEDULE | Запланирована на delivery_time |
CREATED, PROCESSING | Отправка идёт. Изменить рассылку уже нельзя |
SENT | Отправлена |
PAUSED | Отправка приостановлена |
TEMPLATE | Сохранённый шаблон, а не рассылка |
SUBSCRIBE, TRIGGER | Автоматизация, не обычная рассылка |
BLOCKED, BLOCKED-SPAM | Заблокирована модератором |
DELETED | Удалена |
Ссылка отписки обязательна
Рассылка не запустится без ссылки отписки — это требование антиспам-законодательства, и API проверяет его на этапе запуска:
- в HTML-версии нужен тег со свойством
id="unsub_link":
<a id="unsub_link" href="%ОТПИСАТЬСЯ%">отписаться</a> - в текстовой версии нужна подстановка
%ОТПИСАТЬСЯ%; - в AMP-версии — тег с
id="unsub_link".
- GET Список рассылок
- GET Одна рассылка
- POST Создать рассылку
- PUT Изменить и запустить рассылку
- DELETE Удалить рассылку
- POST Скопировать рассылку
- POST Поставить отправку на паузу
- POST Возобновить отправку
- POST Запланировать отправку
- POST Отправить сейчас
- POST Снять с расписания
- POST Сделать из черновика A/B-тест
- GET A/B-тест рассылки
- PUT Изменить A/B-тест
- DELETE Разобрать A/B-тест
- POST Выбрать победителя A/B-теста
- DELETE Отменить выбор победителя
- POST Отправить тестовое письмо
- GET Ссылка на просмотр письма
- GET Сколько писем уйдёт
- POST Переотправить неоткрывшим
- GET Вложения рассылки
- POST Приложить файл
- DELETE Удалить вложение
- GET Папки рассылок
- POST Переместить рассылку в папку
Список рассылок #
GET
/campaigns
Возвращает рассылки аккаунта. Удалённые не показываются, если
явно не запрошен статус DELETED.
Здесь смещение задаётся параметром offset
(в отличие от подписчиков, где используется start).
По умолчанию возвращается 100 рассылок.
Варианты A/B-теста в списке не показываются: сам тест виден
одной строкой с ab: "test", а его варианты
перечислены в ab_campaigns. По идентификатору
вариант отдаётся, а весь набор вернёт
ab_variants=1.
Параметры строки запроса
| Параметр | Тип | Описание |
|---|---|---|
limit | integerпо умолчанию: 100 | Сколько рассылок вернуть. |
offset | integerпо умолчанию: 0 | Смещение. Учитывается только вместе с limit. |
status | string | Фильтр по статусу рассылки. |
list_id | integer | Только рассылки по указанной адресной базе. |
start | date | Рассылки не раньше этой даты. Для статуса SENT сравнивается время отправки, иначе — время последнего изменения. |
end | date | Рассылки не позже этой даты. |
external_campaign_id | string | Поиск по вашему внешнему идентификатору. |
workflow | integer | Только письма указанной цепочки автоматизации. |
merge_json | флаг | Отдавать вложенные структуры как JSON. |
ab_variants | флаг | Показывать и варианты A/B-тестов, а не только сами тесты. |
Что возвращается
emails_sent — сколько писем ушло; заполнено у
отправленных рассылок и автоматизаций.
ab — test у A/B-теста,
variant у его варианта, 0 у обычной
рассылки. ab_campaigns — остальные части теста:
у теста это его варианты, у варианта — тест и соседи.
curl -X GET 'https://api.dashamail.com/v2/campaigns?status=SENT&limit=2' \
-H 'Authorization: Bearer YOUR_API_KEY'
<?php
$ch = curl_init('https://api.dashamail.com/v2/campaigns?status=SENT&limit=2');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
],
]);
$response = json_decode(curl_exec($ch), true);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($status >= 400) {
throw new RuntimeException($response['error']['message']);
}
print_r($response['response']['data']);
import requests
response = requests.get(
'https://api.dashamail.com/v2/campaigns?status=SENT&limit=2',
headers={'Authorization': 'Bearer YOUR_API_KEY'},
)
response.raise_for_status()
print(response.json()['response']['data'])
const response = await fetch('https://api.dashamail.com/v2/campaigns?status=SENT&limit=2', {
method: 'GET',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
},
});
const payload = await response.json();
if (!response.ok) throw new Error(payload.error.message);
console.log(payload.response.data);
{
"response": {
"msg": {
"err_code": 0,
"text": "OK",
"type": "message"
},
"data": [
{
"id": 501233,
"name": "Весенняя распродажа",
"subject": "Скидки до 40%",
"from_name": "Ромашка",
"from_email": "news@example.ru",
"list_id": "128341",
"status": "SENT",
"delivery_time": "2026-04-05 10:00:00",
"emails_sent": 1284,
"ab": 0,
"ab_campaigns": []
},
{
"id": 501199,
"name": "Мартовский дайджест",
"subject": "Что нового",
"from_name": "Ромашка",
"from_email": "news@example.ru",
"list_id": "128341",
"status": "SENT",
"delivery_time": "2026-03-02 10:00:00",
"emails_sent": 1201,
"ab": 0,
"ab_campaigns": []
}
]
}
}
Одна рассылка #
GET
/campaigns/{campaign_id}
Возвращает рассылку целиком, включая HTML- и текстовую версии письма.
Параметры пути
| Параметр | Тип | Описание |
|---|---|---|
campaign_id обязательный | integer | Идентификатор рассылки. |
Параметры строки запроса
| Параметр | Тип | Описание |
|---|---|---|
merge_json | флаг | Отдавать вложенные структуры как JSON. |
Возможные ошибки
| HTTP | code | Когда возникает |
|---|---|---|
404 |
4 |
Рассылки с таким campaign_id нет |
curl -X GET 'https://api.dashamail.com/v2/campaigns/501233' \
-H 'Authorization: Bearer YOUR_API_KEY'
<?php
$ch = curl_init('https://api.dashamail.com/v2/campaigns/501233');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
],
]);
$response = json_decode(curl_exec($ch), true);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($status >= 400) {
throw new RuntimeException($response['error']['message']);
}
print_r($response['response']['data']);
import requests
response = requests.get(
'https://api.dashamail.com/v2/campaigns/501233',
headers={'Authorization': 'Bearer YOUR_API_KEY'},
)
response.raise_for_status()
print(response.json()['response']['data'])
const response = await fetch('https://api.dashamail.com/v2/campaigns/501233', {
method: 'GET',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
},
});
const payload = await response.json();
if (!response.ok) throw new Error(payload.error.message);
console.log(payload.response.data);
{
"response": {
"msg": {
"err_code": 0,
"text": "OK",
"type": "message"
},
"data": [
{
"id": 501233,
"name": "Весенняя распродажа",
"subject": "Скидки до 40%",
"from_name": "Ромашка",
"from_email": "news@example.ru",
"list_id": "128341",
"status": "SENT",
"track_opens": "Y",
"track_clicks": "Y",
"delivery_time": "2026-04-05 10:00:00",
"html": "<h1>Скидки</h1><a id=\"unsub_link\" href=\"%ОТПИСАТЬСЯ%\">отписаться</a>",
"plain_text": "Скидки. Отписаться: %ОТПИСАТЬСЯ%"
}
]
}
}
Создать рассылку #
POST
/campaigns
Создаёт черновик рассылки. Отправка не начинается — для этого нужно перевести рассылку в статус запуска.
Содержимое письма можно передать сразу в html,
а можно наполнить позже.
Параметры тела запроса
| Параметр | Тип | Описание |
|---|---|---|
list_id обязательный | integer | JSON-строка | Адресная база. Для рассылки по нескольким базам передайте JSON-массив идентификаторов: "[128341,128342]". |
subject обязательный | string | Тема письма. Поддерживает подстановки вида %ИМЯ%. |
from_email обязательный | string | Адрес отправителя. Домен должен быть подтверждён в аккаунте. |
from_name обязательный | string | Имя отправителя. |
name | stringпо умолчанию: Без Названия + дата | Внутреннее название рассылки, получателям не видно. |
html | string | HTML-версия письма. Вместо вёрстки можно передать id сохранённого шаблона числом, либо tmpl<campaign_id>, чтобы взять вёрстку другой рассылки. |
plain_text | string | Текстовая версия письма. |
amp | string | AMP-версия письма. Требует включённой поддержки AMP на аккаунте. |
track_opens | stringпо умолчанию: Y | Отслеживать открытия. Допустимые значения: Y, N |
track_clicks | stringпо умолчанию: Y | Отслеживать клики. Допустимые значения: Y, N |
plain_clicks | stringпо умолчанию: N | Отслеживать клики и в текстовой версии. Допустимые значения: Y, N |
esegment | JSON-строка | Условия сегментации базы. Структура: {"match":"all","c":[{"field":"…","op":"…","value":"…"}]}. При рассылке по нескольким базам — объект, где ключ это list_id. |
status | stringпо умолчанию: DRAFT | При создании допустимы только DRAFT и TEMPLATE; любое другое значение приводится к DRAFT.Допустимые значения: DRAFT, TEMPLATE |
external_campaign_id | string | Ваш идентификатор рассылки для сопоставления с внешней системой. |
personalizeToEmail | stringпо умолчанию: off | Подставлять имя получателя в поле «Кому». |
to_email | string | Шаблон отображаемого имени получателя, например %ИМЯ%. |
analytics | stringпо умолчанию: N | Добавлять UTM-метки к ссылкам. Допустимые значения: Y, N |
analytics_tag | string | Значение utm_campaign. |
analytics_source | string | Значение utm_source. |
analytics_medium | string | Значение utm_medium. |
analytics_content | string | Значение utm_content. |
analytics_term | string | Значение utm_term. |
allow_time_zone | флаг | Отправлять с учётом часового пояса получателя. |
allow_best_time | флаг | Отправлять в наиболее удачное для получателя время. |
limit | integer | Ограничить скорость отправки — сколько писем за интервал wait_time. |
wait_time | integer | Интервал ограничения скорости в минутах. |
no_images_add | флаг | Не добавлять изображения автоматически. |
dialogs_enabled | флаг | Включить приём ответов через Даша.Диалоги. Несовместимо с собственным Reply-To — при конфликте побеждают диалоги. |
stat_domain | string | Домен для ссылок статистики. Должен быть подтверждён в аккаунте. |
cloud | флаг | Выгрузить изображения из HTML в облачное хранилище DashaMail. |
Что возвращается
Идентификатор созданной рассылки.
Возможные ошибки
| HTTP | code | Когда возникает |
|---|---|---|
422 |
3 |
Не переданы обязательные параметры |
422 |
6 |
Адрес отправителя запрещён или не подтверждён |
500 |
38 |
Некорректная структура esegment |
404 |
5 |
Указанной адресной базы не существует |
curl -X POST 'https://api.dashamail.com/v2/campaigns' \
-H 'Authorization: Bearer YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"list_id": 128341,
"subject": "Скидки до 40%",
"from_email": "news@example.ru",
"from_name": "Ромашка",
"name": "Весенняя распродажа",
"html": "<h1>Скидки до 40%</h1><p><a id=\"unsub_link\" href=\"%ОТПИСАТЬСЯ%\">отписаться</a></p>",
"track_opens": "Y"
}'
<?php
$ch = curl_init('https://api.dashamail.com/v2/campaigns');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'list_id' => 128341,
'subject' => 'Скидки до 40%',
'from_email' => 'news@example.ru',
'from_name' => 'Ромашка',
'name' => 'Весенняя распродажа',
'html' => '<h1>Скидки до 40%</h1><p><a id="unsub_link" href="%ОТПИСАТЬСЯ%">отписаться</a></p>',
'track_opens' => 'Y',
], JSON_UNESCAPED_UNICODE),
]);
$response = json_decode(curl_exec($ch), true);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($status >= 400) {
throw new RuntimeException($response['error']['message']);
}
print_r($response['response']['data']);
import requests
response = requests.post(
'https://api.dashamail.com/v2/campaigns',
headers={'Authorization': 'Bearer YOUR_API_KEY'},
json={
'list_id': 128341,
'subject': 'Скидки до 40%',
'from_email': 'news@example.ru',
'from_name': 'Ромашка',
'name': 'Весенняя распродажа',
'html': '<h1>Скидки до 40%</h1><p><a id="unsub_link" href="%ОТПИСАТЬСЯ%">отписаться</a></p>',
'track_opens': 'Y',
},
)
response.raise_for_status()
print(response.json()['response']['data'])
const response = await fetch('https://api.dashamail.com/v2/campaigns', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
},
body: JSON.stringify({
"list_id": 128341,
"subject": "Скидки до 40%",
"from_email": "news@example.ru",
"from_name": "Ромашка",
"name": "Весенняя распродажа",
"html": "<h1>Скидки до 40%</h1><p><a id=\"unsub_link\" href=\"%ОТПИСАТЬСЯ%\">отписаться</a></p>",
"track_opens": "Y"
}),
});
const payload = await response.json();
if (!response.ok) throw new Error(payload.error.message);
console.log(payload.response.data);
{
"response": {
"msg": {
"err_code": 0,
"text": "OK",
"type": "message"
},
"data": {
"campaign_id": 501233
}
}
}
Изменить и запустить рассылку #
PUT
/campaigns/{campaign_id}
Меняет черновик и — через параметр status —
запускает отправку.
Изменять можно рассылки в статусах DRAFT,
SCHEDULE, TRIGGER и
TEMPLATE. Уже отправляющуюся рассылку изменить
нельзя.
Как отправить рассылку. Передайте
status=MODERATING, чтобы письмо ушло сразу после
модерации, либо status=SCHEDULE вместе с
delivery_time, чтобы запланировать отправку.
Перед запуском проверяются тема, отправитель, наличие текста
письма и ссылки отписки.
Параметры пути
| Параметр | Тип | Описание |
|---|---|---|
campaign_id обязательный | integer | Идентификатор рассылки. |
Параметры тела запроса
| Параметр | Тип | Описание |
|---|---|---|
status | string | Новый статус. Запуск отправки — MODERATING или SCHEDULE.Допустимые значения: DRAFT, MODERATING, SCHEDULE, TEMPLATE |
delivery_time | datetime | Время запланированной отправки. Обязателен при status=SCHEDULE. |
subject | string | Тема письма. |
from_email | string | Адрес отправителя. |
from_name | string | Имя отправителя. |
name | string | Внутреннее название. |
list_id | integer | JSON-строка | Сменить адресную базу или набор баз. |
html | string | HTML-версия письма. |
plain_text | string | Текстовая версия письма. |
esegment | JSON-строка | Условия сегментации. |
track_opens | string | Отслеживание открытий. Допустимые значения: Y, N |
track_clicks | string | Отслеживание кликов. Допустимые значения: Y, N |
stat_domain | string | Домен статистики. |
Возможные ошибки
| HTTP | code | Когда возникает |
|---|---|---|
404 |
22 |
Рассылки с таким campaign_id нет либо её статус не допускает изменений |
409 |
21 |
Рассылка уже отправляется |
422 |
20 |
Недопустимое значение status |
500 |
13 |
При SCHEDULE не задан delivery_time |
500 |
14 |
Не задана тема письма |
500 |
15 |
Не задано имя отправителя |
500 |
16 |
Не задан адрес отправителя |
500 |
17 |
Нет ни HTML-, ни текстовой версии |
500 |
18 |
В HTML нет ссылки отписки с id="unsub_link" |
500 |
19 |
В тексте нет подстановки %ОТПИСАТЬСЯ% |
402 |
25 |
Недостаточно средств на балансе |
403 |
30 |
Отправка заблокирована по подозрению в спаме |
curl -X PUT 'https://api.dashamail.com/v2/campaigns/501233' \
-H 'Authorization: Bearer YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"status": "SCHEDULE",
"delivery_time": "2026-05-01 10:00:00"
}'
<?php
$ch = curl_init('https://api.dashamail.com/v2/campaigns/501233');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'PUT',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'status' => 'SCHEDULE',
'delivery_time' => '2026-05-01 10:00:00',
], JSON_UNESCAPED_UNICODE),
]);
$response = json_decode(curl_exec($ch), true);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($status >= 400) {
throw new RuntimeException($response['error']['message']);
}
print_r($response['response']['data']);
import requests
response = requests.put(
'https://api.dashamail.com/v2/campaigns/501233',
headers={'Authorization': 'Bearer YOUR_API_KEY'},
json={
'status': 'SCHEDULE',
'delivery_time': '2026-05-01 10:00:00',
},
)
response.raise_for_status()
print(response.json()['response']['data'])
const response = await fetch('https://api.dashamail.com/v2/campaigns/501233', {
method: 'PUT',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
},
body: JSON.stringify({
"status": "SCHEDULE",
"delivery_time": "2026-05-01 10:00:00"
}),
});
const payload = await response.json();
if (!response.ok) throw new Error(payload.error.message);
console.log(payload.response.data);
{
"response": {
"msg": {
"err_code": 0,
"text": "OK",
"type": "message"
},
"data": true
}
}
Удалить рассылку #
DELETE
/campaigns/{campaign_id}
Помечает рассылку удалённой. Статистика по уже отправленным письмам сохраняется.
Параметры пути
| Параметр | Тип | Описание |
|---|---|---|
campaign_id обязательный | integer | Идентификатор рассылки. |
Возможные ошибки
| HTTP | code | Когда возникает |
|---|---|---|
404 |
22 |
Рассылки с таким campaign_id нет |
curl -X DELETE 'https://api.dashamail.com/v2/campaigns/501233' \
-H 'Authorization: Bearer YOUR_API_KEY'
<?php
$ch = curl_init('https://api.dashamail.com/v2/campaigns/501233');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'DELETE',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
],
]);
$response = json_decode(curl_exec($ch), true);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($status >= 400) {
throw new RuntimeException($response['error']['message']);
}
print_r($response['response']['data']);
import requests
response = requests.delete(
'https://api.dashamail.com/v2/campaigns/501233',
headers={'Authorization': 'Bearer YOUR_API_KEY'},
)
response.raise_for_status()
print(response.json()['response']['data'])
const response = await fetch('https://api.dashamail.com/v2/campaigns/501233', {
method: 'DELETE',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
},
});
const payload = await response.json();
if (!response.ok) throw new Error(payload.error.message);
console.log(payload.response.data);
(тело ответа пустое)
Скопировать рассылку #
POST
/campaigns/{campaign_id}/copy
Создаёт копию рассылки вместе с вёрсткой. Копия отправленной
или заблокированной рассылки всегда получает статус
DRAFT.
Параметры пути
| Параметр | Тип | Описание |
|---|---|---|
campaign_id обязательный | integer | Идентификатор исходной рассылки. |
Параметры тела запроса
| Параметр | Тип | Описание |
|---|---|---|
name | string | Название копии. По умолчанию совпадает с исходным. |
client_id | integer | Создать копию в аккаунте клиента. Доступно партнёрским аккаунтам. |
Что возвращается
Идентификатор созданной копии.
Возможные ошибки
| HTTP | code | Когда возникает |
|---|---|---|
404 |
22 |
Исходной рассылки нет |
curl -X POST 'https://api.dashamail.com/v2/campaigns/501233/copy' \
-H 'Authorization: Bearer YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"name": "Весенняя распродажа — повтор"
}'
<?php
$ch = curl_init('https://api.dashamail.com/v2/campaigns/501233/copy');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'name' => 'Весенняя распродажа — повтор',
], JSON_UNESCAPED_UNICODE),
]);
$response = json_decode(curl_exec($ch), true);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($status >= 400) {
throw new RuntimeException($response['error']['message']);
}
print_r($response['response']['data']);
import requests
response = requests.post(
'https://api.dashamail.com/v2/campaigns/501233/copy',
headers={'Authorization': 'Bearer YOUR_API_KEY'},
json={
'name': 'Весенняя распродажа — повтор',
},
)
response.raise_for_status()
print(response.json()['response']['data'])
const response = await fetch('https://api.dashamail.com/v2/campaigns/501233/copy', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
},
body: JSON.stringify({
"name": "Весенняя распродажа — повтор"
}),
});
const payload = await response.json();
if (!response.ok) throw new Error(payload.error.message);
console.log(payload.response.data);
{
"response": {
"msg": {
"err_code": 0,
"text": "OK",
"type": "message"
},
"data": {
"campaign_id": 501240
}
}
}
Поставить отправку на паузу #
POST
/campaigns/{campaign_id}/pause
Приостанавливает идущую рассылку. Уже отправленные письма не отзываются.
Параметры пути
| Параметр | Тип | Описание |
|---|---|---|
campaign_id обязательный | integer | Идентификатор рассылки. |
Возможные ошибки
| HTTP | code | Когда возникает |
|---|---|---|
500 |
41 |
Рассылка сейчас не отправляется |
404 |
22 |
Рассылки с таким campaign_id нет |
curl -X POST 'https://api.dashamail.com/v2/campaigns/501233/pause' \
-H 'Authorization: Bearer YOUR_API_KEY'
<?php
$ch = curl_init('https://api.dashamail.com/v2/campaigns/501233/pause');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
],
]);
$response = json_decode(curl_exec($ch), true);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($status >= 400) {
throw new RuntimeException($response['error']['message']);
}
print_r($response['response']['data']);
import requests
response = requests.post(
'https://api.dashamail.com/v2/campaigns/501233/pause',
headers={'Authorization': 'Bearer YOUR_API_KEY'},
)
response.raise_for_status()
print(response.json()['response']['data'])
const response = await fetch('https://api.dashamail.com/v2/campaigns/501233/pause', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
},
});
const payload = await response.json();
if (!response.ok) throw new Error(payload.error.message);
console.log(payload.response.data);
{
"response": {
"msg": {
"err_code": 0,
"text": "OK",
"type": "message"
},
"data": true
}
}
Возобновить отправку #
POST
/campaigns/{campaign_id}/resume
Продолжает рассылку, поставленную на паузу, с того места, где она остановилась.
Параметры пути
| Параметр | Тип | Описание |
|---|---|---|
campaign_id обязательный | integer | Идентификатор рассылки. |
Возможные ошибки
| HTTP | code | Когда возникает |
|---|---|---|
401 |
42 |
Рассылки на паузе с таким campaign_id нет |
curl -X POST 'https://api.dashamail.com/v2/campaigns/501233/resume' \
-H 'Authorization: Bearer YOUR_API_KEY'
<?php
$ch = curl_init('https://api.dashamail.com/v2/campaigns/501233/resume');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
],
]);
$response = json_decode(curl_exec($ch), true);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($status >= 400) {
throw new RuntimeException($response['error']['message']);
}
print_r($response['response']['data']);
import requests
response = requests.post(
'https://api.dashamail.com/v2/campaigns/501233/resume',
headers={'Authorization': 'Bearer YOUR_API_KEY'},
)
response.raise_for_status()
print(response.json()['response']['data'])
const response = await fetch('https://api.dashamail.com/v2/campaigns/501233/resume', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
},
});
const payload = await response.json();
if (!response.ok) throw new Error(payload.error.message);
console.log(payload.response.data);
{
"response": {
"msg": {
"err_code": 0,
"text": "OK",
"type": "message"
},
"data": true
}
}
Запланировать отправку #
POST
/campaigns/{campaign_id}/schedule
Ставит черновик в расписание: в указанное время письма уйдут всей аудитории баз рассылки, с учётом сегмента. Перед запуском проверяются тема, имя и адрес отправителя, вёрстка письма, ссылка отписки и баланс.
То же самое делает PUT /campaigns/{campaign_id} со
статусом SCHEDULE. Отдельный маршрут нужен, чтобы
запуск не путался с правкой черновика: здесь нельзя случайно
поменять письмо — кроме времени этот запрос принимает только
настройки самой отправки.
Передумали — снимите с расписания, пока письма не ушли.
A/B-тест запускается этим же
запросом: в указанное время уходят варианты, каждый на свою
долю базы, а победитель — позже, через
wait_hours.
Параметры пути
| Параметр | Тип | Описание |
|---|---|---|
campaign_id обязательный | integer | Идентификатор рассылки. |
Параметры тела запроса
| Параметр | Тип | Описание |
|---|---|---|
delivery_time обязательный | string | Когда отправить, YYYY-MM-DD HH:MM:SS по московскому времени. |
allow_time_zone | флаг | Отправлять по часовому поясу подписчика. |
allow_best_time | флаг | Отправлять в лучшее время подписчика. |
Возможные ошибки
| HTTP | code | Когда возникает |
|---|---|---|
404 |
22 |
Рассылки с таким campaign_id нет |
422 |
3 |
Не передано delivery_time |
402 |
25 |
Недостаточно средств на балансе |
403 |
30 |
Отправка заблокирована по подозрению в спаме |
422 |
67 |
A/B-тест уже запущен либо у варианта не заполнены тема, отправитель или письмо |
curl -X POST 'https://api.dashamail.com/v2/campaigns/501233/schedule' \
-H 'Authorization: Bearer YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"delivery_time": "2026-04-08 10:00:00"
}'
<?php
$ch = curl_init('https://api.dashamail.com/v2/campaigns/501233/schedule');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'delivery_time' => '2026-04-08 10:00:00',
], JSON_UNESCAPED_UNICODE),
]);
$response = json_decode(curl_exec($ch), true);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($status >= 400) {
throw new RuntimeException($response['error']['message']);
}
print_r($response['response']['data']);
import requests
response = requests.post(
'https://api.dashamail.com/v2/campaigns/501233/schedule',
headers={'Authorization': 'Bearer YOUR_API_KEY'},
json={
'delivery_time': '2026-04-08 10:00:00',
},
)
response.raise_for_status()
print(response.json()['response']['data'])
const response = await fetch('https://api.dashamail.com/v2/campaigns/501233/schedule', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
},
body: JSON.stringify({
"delivery_time": "2026-04-08 10:00:00"
}),
});
const payload = await response.json();
if (!response.ok) throw new Error(payload.error.message);
console.log(payload.response.data);
{
"response": {
"msg": {
"err_code": 0,
"text": "OK",
"type": "message"
},
"data": {
"campaign_id": 501233,
"status": "SCHEDULE",
"delivery_time": "2026-04-08 10:00:00"
}
}
}
Отправить сейчас #
POST
/campaigns/{campaign_id}/send
Запускает черновик немедленно: рассылка уходит всей аудитории баз, с учётом сегмента, сразу после автоматической проверки. Проверяется то же, что и при планировании: тема, отправитель, вёрстка, ссылка отписки, баланс.
Отменить можно, пока идёт проверка, — снятием с расписания. Дальше остановит только пауза, а ушедшие письма не отзываются.
A/B-тест запускается этим же
запросом: варианты уходят сразу, каждый на свою долю базы, а
победитель — через wait_hours.
Параметры пути
| Параметр | Тип | Описание |
|---|---|---|
campaign_id обязательный | integer | Идентификатор рассылки. |
Возможные ошибки
| HTTP | code | Когда возникает |
|---|---|---|
404 |
22 |
Рассылки с таким campaign_id нет |
422 |
14 |
Не задана тема письма |
422 |
17 |
Нет ни html, ни текстовой версии |
402 |
25 |
Недостаточно средств на балансе |
403 |
30 |
Отправка заблокирована по подозрению в спаме |
422 |
67 |
A/B-тест уже запущен либо у варианта не заполнены тема, отправитель или письмо |
curl -X POST 'https://api.dashamail.com/v2/campaigns/501233/send' \
-H 'Authorization: Bearer YOUR_API_KEY'
<?php
$ch = curl_init('https://api.dashamail.com/v2/campaigns/501233/send');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
],
]);
$response = json_decode(curl_exec($ch), true);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($status >= 400) {
throw new RuntimeException($response['error']['message']);
}
print_r($response['response']['data']);
import requests
response = requests.post(
'https://api.dashamail.com/v2/campaigns/501233/send',
headers={'Authorization': 'Bearer YOUR_API_KEY'},
)
response.raise_for_status()
print(response.json()['response']['data'])
const response = await fetch('https://api.dashamail.com/v2/campaigns/501233/send', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
},
});
const payload = await response.json();
if (!response.ok) throw new Error(payload.error.message);
console.log(payload.response.data);
{
"response": {
"msg": {
"err_code": 0,
"text": "OK",
"type": "message"
},
"data": {
"campaign_id": 501233,
"status": "MODERATING"
}
}
}
Снять с расписания #
POST
/campaigns/{campaign_id}/unschedule
Возвращает запланированную рассылку в черновик: статус
SCHEDULE, MODERATING, CREATED
или WAITING становится DRAFT. Письма ещё
не уходили, поэтому это не отмена отправки, а отказ от запуска —
рассылку можно поправить и запланировать заново тем же
PUT /campaigns/{campaign_id}. Сплит-варианты
возвращаются вместе с основной. Идущую отправку останавливает
POST /campaigns/{campaign_id}/pause, уже отправленные
письма не отзываются.
Параметры пути
| Параметр | Тип | Описание |
|---|---|---|
campaign_id обязательный | integer | Идентификатор рассылки. |
Возможные ошибки
| HTTP | code | Когда возникает |
|---|---|---|
404 |
22 |
Рассылки с таким campaign_id нет |
422 |
20 |
Рассылка не запланирована: черновик, уже отправлена, на паузе |
409 |
21 |
Рассылка успела уйти в отправку |
curl -X POST 'https://api.dashamail.com/v2/campaigns/501233/unschedule' \
-H 'Authorization: Bearer YOUR_API_KEY'
<?php
$ch = curl_init('https://api.dashamail.com/v2/campaigns/501233/unschedule');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
],
]);
$response = json_decode(curl_exec($ch), true);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($status >= 400) {
throw new RuntimeException($response['error']['message']);
}
print_r($response['response']['data']);
import requests
response = requests.post(
'https://api.dashamail.com/v2/campaigns/501233/unschedule',
headers={'Authorization': 'Bearer YOUR_API_KEY'},
)
response.raise_for_status()
print(response.json()['response']['data'])
const response = await fetch('https://api.dashamail.com/v2/campaigns/501233/unschedule', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
},
});
const payload = await response.json();
if (!response.ok) throw new Error(payload.error.message);
console.log(payload.response.data);
{
"response": {
"msg": {
"err_code": 0,
"text": "OK",
"type": "message"
},
"data": {
"campaign_id": 501233,
"status": "DRAFT"
}
}
}
Сделать из черновика A/B-тест #
POST
/campaigns/{campaign_id}/ab
Превращает черновик в A/B-тест: создаёт варианты письма и раскладывает по ним значения, которые вы хотите сравнить. Письма при этом не уходят — запуск отдельным вызовом schedule или send, как у обычной рассылки.
Как устроен тест: каждый вариант уходит на свою долю базы
(part процентов), через wait_hours
сервис выбирает победителя по заданному критерию и отправляет
его всем остальным. Доли равные, поэтому проценты вариантов
сравнимы напрямую.
Сравнивать можно тему, отправителя, вёрстку и час отправки — по одному измерению или сразу несколько. Вариантов получается столько, сколько даёт произведение: две темы и две вёрстки — это четыре варианта. Всё, что не тестируется, берётся из черновика.
Повторный вызов на готовом тесте отказывает: настройки меняет PUT того же адреса.
Параметры пути
| Параметр | Тип | Описание |
|---|---|---|
campaign_id обязательный | integer | Идентификатор черновика. |
Параметры тела запроса
| Параметр | Тип | Описание |
|---|---|---|
subject | JSON-строка | Темы письма для сравнения, от двух: ["Скидки до 40%", "Последний день распродажи"]. |
from | JSON-строка | Отправители для сравнения, от двух: [{"from_name":"Ромашка","from_email":"news@example.ru"}, …]. Адреса — только подтверждённые. |
html | JSON-строка | Вёрстка писем для сравнения, от двух. |
time | JSON-строка | Часы отправки для сравнения, от двух: [9, 18]. Час суток, 0–23. |
part | integerпо умолчанию: 10 | Доля базы на каждый вариант в процентах, 1–50. Все доли вместе — не больше 100. |
winner_by | stringпо умолчанию: opens | Как выбирается победитель. manual — тест дождётся вашего выбора и не отправит остаток сам.Допустимые значения: opens, clicks, unsubscribes, manual |
wait_hours | integerпо умолчанию: 4 | Сколько часов ждать перед отправкой победителя, 1–168. При winner_by=manual не используется. |
Что возвращается
То же, что чтение теста.
Возможные ошибки
| HTTP | code | Когда возникает |
|---|---|---|
404 |
22 |
Рассылки с таким campaign_id нет |
422 |
67 |
Рассылка не черновик, уже тест, измерений нет, значений меньше двух, доли не помещаются в базу |
curl -X POST 'https://api.dashamail.com/v2/campaigns/501233/ab' \
-H 'Authorization: Bearer YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"subject": [
"Скидки до 40%",
"Последний день распродажи"
],
"part": 10,
"winner_by": "opens",
"wait_hours": 4
}'
<?php
$ch = curl_init('https://api.dashamail.com/v2/campaigns/501233/ab');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'subject' => [
'Скидки до 40%',
'Последний день распродажи',
],
'part' => 10,
'winner_by' => 'opens',
'wait_hours' => 4,
], JSON_UNESCAPED_UNICODE),
]);
$response = json_decode(curl_exec($ch), true);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($status >= 400) {
throw new RuntimeException($response['error']['message']);
}
print_r($response['response']['data']);
import requests
response = requests.post(
'https://api.dashamail.com/v2/campaigns/501233/ab',
headers={'Authorization': 'Bearer YOUR_API_KEY'},
json={
'subject': [
'Скидки до 40%',
'Последний день распродажи',
],
'part': 10,
'winner_by': 'opens',
'wait_hours': 4,
},
)
response.raise_for_status()
print(response.json()['response']['data'])
const response = await fetch('https://api.dashamail.com/v2/campaigns/501233/ab', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
},
body: JSON.stringify({
"subject": [
"Скидки до 40%",
"Последний день распродажи"
],
"part": 10,
"winner_by": "opens",
"wait_hours": 4
}),
});
const payload = await response.json();
if (!response.ok) throw new Error(payload.error.message);
console.log(payload.response.data);
{
"response": {
"msg": {
"err_code": 0,
"text": "OK",
"type": "message"
},
"data": {
"campaign_id": 501233,
"test_by": [
"subject"
],
"part": 10,
"winner_by": "opens",
"wait_hours": 4,
"state": "draft",
"winner_id": 0,
"variants": [
{
"campaign_id": 501234,
"number": 1,
"subject": "Скидки до 40%",
"from_name": "Ромашка",
"from_email": "news@example.ru",
"time_window": 0,
"status": "DRAFT",
"excluded": false
},
{
"campaign_id": 501235,
"number": 2,
"subject": "Последний день распродажи",
"from_name": "Ромашка",
"from_email": "news@example.ru",
"time_window": 0,
"status": "DRAFT",
"excluded": false
}
]
}
}
}
A/B-тест рассылки #
GET
/campaigns/{campaign_id}/ab
Настройки теста и его варианты. Числа по вариантам — в отчёте.
state: draft — ничего не отправлено,
running — варианты в эфире, waiting_winner —
тест ждёт вашего выбора, done — победитель ушёл.
Параметры пути
| Параметр | Тип | Описание |
|---|---|---|
campaign_id обязательный | integer | Идентификатор рассылки-теста. |
Что возвращается
test_by — что сравнивается, part —
доля базы на вариант, winner_id — выбранный
победитель (0, пока его нет), excluded у варианта —
исключён ли он из теста.
Возможные ошибки
| HTTP | code | Когда возникает |
|---|---|---|
404 |
22 |
Рассылки с таким campaign_id нет |
404 |
4 |
Рассылка не A/B-тест |
curl -X GET 'https://api.dashamail.com/v2/campaigns/501233/ab' \
-H 'Authorization: Bearer YOUR_API_KEY'
<?php
$ch = curl_init('https://api.dashamail.com/v2/campaigns/501233/ab');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
],
]);
$response = json_decode(curl_exec($ch), true);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($status >= 400) {
throw new RuntimeException($response['error']['message']);
}
print_r($response['response']['data']);
import requests
response = requests.get(
'https://api.dashamail.com/v2/campaigns/501233/ab',
headers={'Authorization': 'Bearer YOUR_API_KEY'},
)
response.raise_for_status()
print(response.json()['response']['data'])
const response = await fetch('https://api.dashamail.com/v2/campaigns/501233/ab', {
method: 'GET',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
},
});
const payload = await response.json();
if (!response.ok) throw new Error(payload.error.message);
console.log(payload.response.data);
{
"response": {
"msg": {
"err_code": 0,
"text": "OK",
"type": "message"
},
"data": {
"campaign_id": 501233,
"test_by": [
"subject"
],
"part": 10,
"winner_by": "opens",
"wait_hours": 4,
"state": "running",
"winner_id": 0,
"variants": [
{
"campaign_id": 501234,
"number": 1,
"subject": "Скидки до 40%",
"from_name": "Ромашка",
"from_email": "news@example.ru",
"time_window": 0,
"status": "SENT",
"excluded": false
}
]
}
}
}
Изменить A/B-тест #
PUT
/campaigns/{campaign_id}/ab
Пересобирает тест под новые настройки: те же поля, что и при создании. Если измерений стало больше или меньше, варианты добавляются и удаляются под новое число — поэтому вызов работает, только пока ни одна часть не ушла.
Тело описывает тест целиком: не переданное измерение перестаёт тестироваться.
Параметры пути
| Параметр | Тип | Описание |
|---|---|---|
campaign_id обязательный | integer | Идентификатор рассылки-теста. |
Параметры тела запроса
| Параметр | Тип | Описание |
|---|---|---|
subject | JSON-строка | Темы письма для сравнения, от двух. |
from | JSON-строка | Отправители для сравнения, от двух. |
html | JSON-строка | Вёрстка писем для сравнения, от двух. |
time | JSON-строка | Часы отправки для сравнения, от двух. |
part | integerпо умолчанию: 10 | Доля базы на каждый вариант в процентах, 1–50. |
winner_by | stringпо умолчанию: opens | Как выбирается победитель. Допустимые значения: opens, clicks, unsubscribes, manual |
wait_hours | integerпо умолчанию: 4 | Сколько часов ждать перед отправкой победителя, 1–168. |
Возможные ошибки
| HTTP | code | Когда возникает |
|---|---|---|
404 |
22 |
Рассылки с таким campaign_id нет |
404 |
4 |
Рассылка не A/B-тест |
422 |
67 |
Тест уже запущен либо настройки не сходятся |
curl -X PUT 'https://api.dashamail.com/v2/campaigns/501233/ab' \
-H 'Authorization: Bearer YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"subject": [
"Скидки до 40%",
"Последний день распродажи",
"Распродажа заканчивается"
],
"part": 15,
"winner_by": "clicks",
"wait_hours": 6
}'
<?php
$ch = curl_init('https://api.dashamail.com/v2/campaigns/501233/ab');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'PUT',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'subject' => [
'Скидки до 40%',
'Последний день распродажи',
'Распродажа заканчивается',
],
'part' => 15,
'winner_by' => 'clicks',
'wait_hours' => 6,
], JSON_UNESCAPED_UNICODE),
]);
$response = json_decode(curl_exec($ch), true);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($status >= 400) {
throw new RuntimeException($response['error']['message']);
}
print_r($response['response']['data']);
import requests
response = requests.put(
'https://api.dashamail.com/v2/campaigns/501233/ab',
headers={'Authorization': 'Bearer YOUR_API_KEY'},
json={
'subject': [
'Скидки до 40%',
'Последний день распродажи',
'Распродажа заканчивается',
],
'part': 15,
'winner_by': 'clicks',
'wait_hours': 6,
},
)
response.raise_for_status()
print(response.json()['response']['data'])
const response = await fetch('https://api.dashamail.com/v2/campaigns/501233/ab', {
method: 'PUT',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
},
body: JSON.stringify({
"subject": [
"Скидки до 40%",
"Последний день распродажи",
"Распродажа заканчивается"
],
"part": 15,
"winner_by": "clicks",
"wait_hours": 6
}),
});
const payload = await response.json();
if (!response.ok) throw new Error(payload.error.message);
console.log(payload.response.data);
{
"response": {
"msg": {
"err_code": 0,
"text": "OK",
"type": "message"
},
"data": {
"campaign_id": 501233,
"test_by": [
"subject"
],
"part": 15,
"winner_by": "clicks",
"wait_hours": 6,
"state": "draft",
"winner_id": 0,
"variants": []
}
}
}
Разобрать A/B-тест #
DELETE
/campaigns/{campaign_id}/ab
Возвращает тест в обычный черновик: варианты удаляются, сама рассылка остаётся — с темой, отправителем и письмом, которые были у неё до теста. Работает, пока ни одна часть не ушла.
Не путать с удалением рассылки: там в корзину уходит и тест, и его варианты.
Параметры пути
| Параметр | Тип | Описание |
|---|---|---|
campaign_id обязательный | integer | Идентификатор рассылки-теста. |
Возможные ошибки
| HTTP | code | Когда возникает |
|---|---|---|
404 |
22 |
Рассылки с таким campaign_id нет |
404 |
4 |
Рассылка не A/B-тест |
422 |
67 |
Тест уже запущен |
curl -X DELETE 'https://api.dashamail.com/v2/campaigns/501233/ab' \
-H 'Authorization: Bearer YOUR_API_KEY'
<?php
$ch = curl_init('https://api.dashamail.com/v2/campaigns/501233/ab');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'DELETE',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
],
]);
$response = json_decode(curl_exec($ch), true);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($status >= 400) {
throw new RuntimeException($response['error']['message']);
}
print_r($response['response']['data']);
import requests
response = requests.delete(
'https://api.dashamail.com/v2/campaigns/501233/ab',
headers={'Authorization': 'Bearer YOUR_API_KEY'},
)
response.raise_for_status()
print(response.json()['response']['data'])
const response = await fetch('https://api.dashamail.com/v2/campaigns/501233/ab', {
method: 'DELETE',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
},
});
const payload = await response.json();
if (!response.ok) throw new Error(payload.error.message);
console.log(payload.response.data);
{
"response": {
"msg": {
"err_code": 0,
"text": "OK",
"type": "message"
},
"data": {
"campaign_id": 501233,
"ab": 0
}
}
}
Выбрать победителя A/B-теста #
POST
/campaigns/{campaign_id}/ab/winner
Назначает вариант-победителя и время, когда он уйдёт остатку
базы. Только для теста с winner_by=manual,
дождавшегося выбора (state: waiting_winner) —
у остальных победителя выбирает сервис сам.
Передумали — DELETE того же адреса вернёт тест
в ожидание, пока письмо не ушло.
Параметры пути
| Параметр | Тип | Описание |
|---|---|---|
campaign_id обязательный | integer | Идентификатор рассылки-теста. |
Параметры тела запроса
| Параметр | Тип | Описание |
|---|---|---|
variant_id обязательный | integer | Идентификатор варианта-победителя из списка вариантов. |
delivery_time обязательный | datetime | Когда отправить победителя остатку базы. |
Возможные ошибки
| HTTP | code | Когда возникает |
|---|---|---|
404 |
22 |
Рассылки с таким campaign_id нет |
404 |
4 |
Рассылка не A/B-тест |
422 |
67 |
Победителя выбирает сервис, тест не ждёт выбора либо варианта нет в тесте |
curl -X POST 'https://api.dashamail.com/v2/campaigns/501233/ab/winner' \
-H 'Authorization: Bearer YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"variant_id": 501234,
"delivery_time": "2026-04-08 10:00:00"
}'
<?php
$ch = curl_init('https://api.dashamail.com/v2/campaigns/501233/ab/winner');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'variant_id' => 501234,
'delivery_time' => '2026-04-08 10:00:00',
], JSON_UNESCAPED_UNICODE),
]);
$response = json_decode(curl_exec($ch), true);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($status >= 400) {
throw new RuntimeException($response['error']['message']);
}
print_r($response['response']['data']);
import requests
response = requests.post(
'https://api.dashamail.com/v2/campaigns/501233/ab/winner',
headers={'Authorization': 'Bearer YOUR_API_KEY'},
json={
'variant_id': 501234,
'delivery_time': '2026-04-08 10:00:00',
},
)
response.raise_for_status()
print(response.json()['response']['data'])
const response = await fetch('https://api.dashamail.com/v2/campaigns/501233/ab/winner', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
},
body: JSON.stringify({
"variant_id": 501234,
"delivery_time": "2026-04-08 10:00:00"
}),
});
const payload = await response.json();
if (!response.ok) throw new Error(payload.error.message);
console.log(payload.response.data);
{
"response": {
"msg": {
"err_code": 0,
"text": "OK",
"type": "message"
},
"data": {
"campaign_id": 501233,
"winner_id": 501234,
"delivery_time": "2026-04-08 10:00:00"
}
}
}
Отменить выбор победителя #
DELETE
/campaigns/{campaign_id}/ab/winner
Снимает назначенного вручную победителя: тест снова ждёт выбора, письмо остатку базы не уходит. Работает, пока победитель не отправлен.
Параметры пути
| Параметр | Тип | Описание |
|---|---|---|
campaign_id обязательный | integer | Идентификатор рассылки-теста. |
Возможные ошибки
| HTTP | code | Когда возникает |
|---|---|---|
404 |
22 |
Рассылки с таким campaign_id нет |
404 |
4 |
Рассылка не A/B-тест |
422 |
67 |
Победитель не выбран либо уже отправлен |
curl -X DELETE 'https://api.dashamail.com/v2/campaigns/501233/ab/winner' \
-H 'Authorization: Bearer YOUR_API_KEY'
<?php
$ch = curl_init('https://api.dashamail.com/v2/campaigns/501233/ab/winner');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'DELETE',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
],
]);
$response = json_decode(curl_exec($ch), true);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($status >= 400) {
throw new RuntimeException($response['error']['message']);
}
print_r($response['response']['data']);
import requests
response = requests.delete(
'https://api.dashamail.com/v2/campaigns/501233/ab/winner',
headers={'Authorization': 'Bearer YOUR_API_KEY'},
)
response.raise_for_status()
print(response.json()['response']['data'])
const response = await fetch('https://api.dashamail.com/v2/campaigns/501233/ab/winner', {
method: 'DELETE',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
},
});
const payload = await response.json();
if (!response.ok) throw new Error(payload.error.message);
console.log(payload.response.data);
{
"response": {
"msg": {
"err_code": 0,
"text": "OK",
"type": "message"
},
"data": {
"campaign_id": 501233,
"winner_id": 0
}
}
}
Отправить тестовое письмо #
POST
/campaigns/{campaign_id}/test
Отправляет письмо рассылки на указанные адреса — ровно в том
виде, в каком его получит подписчик: с вёрсткой, вложениями,
AMP-версией и подстановкой %ТЭГОВ% по случайному
активному подписчику первой базы. Служебные ссылки в тесте ведут
на заглушки, поэтому его открытия и переходы в отчёт рассылки не
попадают.
Лимит — 12 писем на рассылку и 25 в сутки на аккаунт. Адреса
из чёрного списка и формально неверные отбрасываются молча; если
не осталось ни одного, приходит отказ с кодом 6.
За один вызов уходит не больше шести писем.
Параметры пути
| Параметр | Тип | Описание |
|---|---|---|
campaign_id обязательный | integer | Идентификатор рассылки. |
Параметры тела запроса
| Параметр | Тип | Описание |
|---|---|---|
email обязательный | string | Адрес получателя. Несколько адресов — через запятую или массивом, не больше шести. |
Что возвращается
Число отправленных писем и адреса, на которые они ушли.
Возможные ошибки
| HTTP | code | Когда возникает |
|---|---|---|
403 |
30 |
Аккаунт ещё не прошёл модерацию |
404 |
22 |
Рассылки с таким campaign_id нет |
422 |
6 |
Не осталось годных адресов; обратный адрес рассылки на домене DashaMail |
429 |
63 |
Исчерпан лимит тестовых писем |
500 |
36 |
Письмо не удалось поставить в очередь отправки |
curl -X POST 'https://api.dashamail.com/v2/campaigns/501233/test' \
-H 'Authorization: Bearer YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"email": "me@example.com"
}'
<?php
$ch = curl_init('https://api.dashamail.com/v2/campaigns/501233/test');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'email' => 'me@example.com',
], JSON_UNESCAPED_UNICODE),
]);
$response = json_decode(curl_exec($ch), true);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($status >= 400) {
throw new RuntimeException($response['error']['message']);
}
print_r($response['response']['data']);
import requests
response = requests.post(
'https://api.dashamail.com/v2/campaigns/501233/test',
headers={'Authorization': 'Bearer YOUR_API_KEY'},
json={
'email': 'me@example.com',
},
)
response.raise_for_status()
print(response.json()['response']['data'])
const response = await fetch('https://api.dashamail.com/v2/campaigns/501233/test', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
},
body: JSON.stringify({
"email": "me@example.com"
}),
});
const payload = await response.json();
if (!response.ok) throw new Error(payload.error.message);
console.log(payload.response.data);
{
"response": {
"msg": {
"err_code": 0,
"text": "OK",
"type": "message"
},
"data": {
"campaign_id": 501233,
"sent": 1,
"emails": [
"me@example.com"
]
}
}
}
Ссылка на просмотр письма #
GET
/campaigns/{campaign_id}/preview
Возвращает ссылку, по которой письмо открывается в браузере так, как его увидит подписчик. Страница просмотра пускает по подписи в самой ссылке, вход в личный кабинет не нужен — ссылку можно показать тому, кто согласует письмо. Она не меняется при правках рассылки, поэтому годится и для повторного просмотра.
Параметры пути
| Параметр | Тип | Описание |
|---|---|---|
campaign_id обязательный | integer | Идентификатор рассылки. |
Что возвращается
Ссылка на страницу просмотра.
Возможные ошибки
| HTTP | code | Когда возникает |
|---|---|---|
404 |
22 |
Рассылки с таким campaign_id нет |
curl -X GET 'https://api.dashamail.com/v2/campaigns/501233/preview' \
-H 'Authorization: Bearer YOUR_API_KEY'
<?php
$ch = curl_init('https://api.dashamail.com/v2/campaigns/501233/preview');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
],
]);
$response = json_decode(curl_exec($ch), true);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($status >= 400) {
throw new RuntimeException($response['error']['message']);
}
print_r($response['response']['data']);
import requests
response = requests.get(
'https://api.dashamail.com/v2/campaigns/501233/preview',
headers={'Authorization': 'Bearer YOUR_API_KEY'},
)
response.raise_for_status()
print(response.json()['response']['data'])
const response = await fetch('https://api.dashamail.com/v2/campaigns/501233/preview', {
method: 'GET',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
},
});
const payload = await response.json();
if (!response.ok) throw new Error(payload.error.message);
console.log(payload.response.data);
{
"response": {
"msg": {
"err_code": 0,
"text": "OK",
"type": "message"
},
"data": {
"campaign_id": 501233,
"preview_url": "https://lk.dashamail.ru/stat/preview.php?hc=7a5b1&ss=9f1c0e7a4b2d8c6e5f3a1b9d7c4e2f60"
}
}
}
Сколько писем уйдёт #
GET
/campaigns/{campaign_id}/estimate
Размер аудитории рассылки до запуска: сколько активных подписчиков в выбранных базах и сколько из них попадает в сегмент. Отвечает по счётчикам, поэтому годится и перед самой отправкой, и в диалоге «а скольким это уйдёт».
Поле exact говорит, можно ли считать число
окончательным. Оно становится false в двух случаях:
баз больше одной (адрес из двух баз получит одно письмо, а
счётчики баз про это не знают, так что сумма — оценка сверху) или
размер сегмента ещё не посчитан. Состояние каждой базы — в
lists[].status:
ready | Число готово |
calculating | Сегмент пересчитывается, повторите запрос позже |
unknown | Сегмент задан, но ни разу не считался: размер появится после первого подсчёта в кабинете |
Параметры пути
| Параметр | Тип | Описание |
|---|---|---|
campaign_id обязательный | integer | Идентификатор рассылки. |
Что возвращается
Общее число получателей и разбивка по базам.
Возможные ошибки
| HTTP | code | Когда возникает |
|---|---|---|
404 |
22 |
Рассылки с таким campaign_id нет |
curl -X GET 'https://api.dashamail.com/v2/campaigns/501233/estimate' \
-H 'Authorization: Bearer YOUR_API_KEY'
<?php
$ch = curl_init('https://api.dashamail.com/v2/campaigns/501233/estimate');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
],
]);
$response = json_decode(curl_exec($ch), true);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($status >= 400) {
throw new RuntimeException($response['error']['message']);
}
print_r($response['response']['data']);
import requests
response = requests.get(
'https://api.dashamail.com/v2/campaigns/501233/estimate',
headers={'Authorization': 'Bearer YOUR_API_KEY'},
)
response.raise_for_status()
print(response.json()['response']['data'])
const response = await fetch('https://api.dashamail.com/v2/campaigns/501233/estimate', {
method: 'GET',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
},
});
const payload = await response.json();
if (!response.ok) throw new Error(payload.error.message);
console.log(payload.response.data);
{
"response": {
"msg": {
"err_code": 0,
"text": "OK",
"type": "message"
},
"data": {
"campaign_id": 501233,
"recipients": 12340,
"exact": true,
"lists": [
{
"list_id": 515843,
"name": "Клиенты",
"count_active": 12340,
"segment": false,
"recipients": 12340,
"status": "ready"
}
]
}
}
}
Переотправить неоткрывшим #
POST
/campaigns/{campaign_id}/resend
Создаёт новую рассылку по тем получателям исходной, кто её не открыл. Обычный приём — повторить письмо через несколько дней с другой темой.
Параметры пути
| Параметр | Тип | Описание |
|---|---|---|
campaign_id обязательный | integer | Идентификатор исходной рассылки. |
Параметры тела запроса
| Параметр | Тип | Описание |
|---|---|---|
new_subject | string | Тема повторного письма. По умолчанию берётся исходная. |
Что возвращается
Идентификатор созданной рассылки.
Возможные ошибки
| HTTP | code | Когда возникает |
|---|---|---|
404 |
22 |
Исходной рассылки нет |
500 |
40 |
Рассылка не в статусе PROCESSING или SENT |
curl -X POST 'https://api.dashamail.com/v2/campaigns/501233/resend' \
-H 'Authorization: Bearer YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"new_subject": "Вы не видели: скидки до 40%"
}'
<?php
$ch = curl_init('https://api.dashamail.com/v2/campaigns/501233/resend');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'new_subject' => 'Вы не видели: скидки до 40%',
], JSON_UNESCAPED_UNICODE),
]);
$response = json_decode(curl_exec($ch), true);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($status >= 400) {
throw new RuntimeException($response['error']['message']);
}
print_r($response['response']['data']);
import requests
response = requests.post(
'https://api.dashamail.com/v2/campaigns/501233/resend',
headers={'Authorization': 'Bearer YOUR_API_KEY'},
json={
'new_subject': 'Вы не видели: скидки до 40%',
},
)
response.raise_for_status()
print(response.json()['response']['data'])
const response = await fetch('https://api.dashamail.com/v2/campaigns/501233/resend', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
},
body: JSON.stringify({
"new_subject": "Вы не видели: скидки до 40%"
}),
});
const payload = await response.json();
if (!response.ok) throw new Error(payload.error.message);
console.log(payload.response.data);
{
"response": {
"msg": {
"err_code": 0,
"text": "OK",
"type": "message"
},
"data": {
"campaign_id": 501255
}
}
}
Вложения рассылки #
GET
/campaigns/{campaign_id}/attachments
Список файлов, приложенных к рассылке. Возвращается не больше десяти вложений.
Параметры пути
| Параметр | Тип | Описание |
|---|---|---|
campaign_id обязательный | integer | Идентификатор рассылки. |
Возможные ошибки
| HTTP | code | Когда возникает |
|---|---|---|
404 |
22 |
Рассылки с таким campaign_id нет |
curl -X GET 'https://api.dashamail.com/v2/campaigns/501233/attachments' \
-H 'Authorization: Bearer YOUR_API_KEY'
<?php
$ch = curl_init('https://api.dashamail.com/v2/campaigns/501233/attachments');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
],
]);
$response = json_decode(curl_exec($ch), true);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($status >= 400) {
throw new RuntimeException($response['error']['message']);
}
print_r($response['response']['data']);
import requests
response = requests.get(
'https://api.dashamail.com/v2/campaigns/501233/attachments',
headers={'Authorization': 'Bearer YOUR_API_KEY'},
)
response.raise_for_status()
print(response.json()['response']['data'])
const response = await fetch('https://api.dashamail.com/v2/campaigns/501233/attachments', {
method: 'GET',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
},
});
const payload = await response.json();
if (!response.ok) throw new Error(payload.error.message);
console.log(payload.response.data);
{
"response": {
"msg": {
"err_code": 0,
"text": "OK",
"type": "message"
},
"data": [
{
"id": 7712,
"campaign_id": 501233,
"name": "prays-list.pdf",
"size": 184320,
"link": ""
}
]
}
}
Приложить файл #
POST
/campaigns/{campaign_id}/attachments
Скачивает файл по указанной ссылке и прикладывает его к письму. Суммарный размер вложений ограничен тарифом.
С параметром separate_link файл не скачивается:
в письмо вставляется ссылка на него. Так стоит поступать с
крупными файлами — письмо останется лёгким.
Параметры пути
| Параметр | Тип | Описание |
|---|---|---|
campaign_id обязательный | integer | Идентификатор рассылки. |
Параметры тела запроса
| Параметр | Тип | Описание |
|---|---|---|
url обязательный | string | Ссылка на файл. |
name | string | Имя файла в письме. По умолчанию берётся из ссылки; кириллица транслитерируется. |
separate_link | флаг | Не прикладывать файл, а вставить ссылку на него. |
Что возвращается
Идентификатор вложения.
Возможные ошибки
| HTTP | code | Когда возникает |
|---|---|---|
422 |
3 |
Не передан url |
500 |
33 |
Недопустимый формат файла — .php и .exe запрещены |
402 |
25 |
Файл с таким именем уже приложен |
413 |
26 |
Превышен лимит на размер вложений |
curl -X POST 'https://api.dashamail.com/v2/campaigns/501233/attachments' \
-H 'Authorization: Bearer YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"url": "https://example.ru/files/prays-list.pdf",
"name": "Прайс-лист.pdf"
}'
<?php
$ch = curl_init('https://api.dashamail.com/v2/campaigns/501233/attachments');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'url' => 'https://example.ru/files/prays-list.pdf',
'name' => 'Прайс-лист.pdf',
], JSON_UNESCAPED_UNICODE),
]);
$response = json_decode(curl_exec($ch), true);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($status >= 400) {
throw new RuntimeException($response['error']['message']);
}
print_r($response['response']['data']);
import requests
response = requests.post(
'https://api.dashamail.com/v2/campaigns/501233/attachments',
headers={'Authorization': 'Bearer YOUR_API_KEY'},
json={
'url': 'https://example.ru/files/prays-list.pdf',
'name': 'Прайс-лист.pdf',
},
)
response.raise_for_status()
print(response.json()['response']['data'])
const response = await fetch('https://api.dashamail.com/v2/campaigns/501233/attachments', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
},
body: JSON.stringify({
"url": "https://example.ru/files/prays-list.pdf",
"name": "Прайс-лист.pdf"
}),
});
const payload = await response.json();
if (!response.ok) throw new Error(payload.error.message);
console.log(payload.response.data);
{
"response": {
"msg": {
"err_code": 0,
"text": "OK",
"type": "message"
},
"data": {
"id": 7712
}
}
}
Удалить вложение #
DELETE
/campaigns/{campaign_id}/attachments/{id}
Открепляет файл от рассылки и удаляет его с диска.
Параметры пути
| Параметр | Тип | Описание |
|---|---|---|
campaign_id обязательный | integer | Идентификатор рассылки. |
id обязательный | integer | Идентификатор вложения из списка вложений. |
Возможные ошибки
| HTTP | code | Когда возникает |
|---|---|---|
404 |
22 |
Рассылки с таким campaign_id нет |
404 |
27 |
Вложение не найдено |
curl -X DELETE 'https://api.dashamail.com/v2/campaigns/501233/attachments/7712' \
-H 'Authorization: Bearer YOUR_API_KEY'
<?php
$ch = curl_init('https://api.dashamail.com/v2/campaigns/501233/attachments/7712');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'DELETE',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
],
]);
$response = json_decode(curl_exec($ch), true);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($status >= 400) {
throw new RuntimeException($response['error']['message']);
}
print_r($response['response']['data']);
import requests
response = requests.delete(
'https://api.dashamail.com/v2/campaigns/501233/attachments/7712',
headers={'Authorization': 'Bearer YOUR_API_KEY'},
)
response.raise_for_status()
print(response.json()['response']['data'])
const response = await fetch('https://api.dashamail.com/v2/campaigns/501233/attachments/7712', {
method: 'DELETE',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
},
});
const payload = await response.json();
if (!response.ok) throw new Error(payload.error.message);
console.log(payload.response.data);
(тело ответа пустое)
Папки рассылок #
GET
/campaigns/folders
Список папок, по которым разложены рассылки.
Параметры строки запроса
| Параметр | Тип | Описание |
|---|---|---|
id | integer | Вернуть одну папку. |
name | string | Найти папку по точному названию. |
curl -X GET 'https://api.dashamail.com/v2/campaigns/folders' \
-H 'Authorization: Bearer YOUR_API_KEY'
<?php
$ch = curl_init('https://api.dashamail.com/v2/campaigns/folders');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
],
]);
$response = json_decode(curl_exec($ch), true);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($status >= 400) {
throw new RuntimeException($response['error']['message']);
}
print_r($response['response']['data']);
import requests
response = requests.get(
'https://api.dashamail.com/v2/campaigns/folders',
headers={'Authorization': 'Bearer YOUR_API_KEY'},
)
response.raise_for_status()
print(response.json()['response']['data'])
const response = await fetch('https://api.dashamail.com/v2/campaigns/folders', {
method: 'GET',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
},
});
const payload = await response.json();
if (!response.ok) throw new Error(payload.error.message);
console.log(payload.response.data);
{
"response": {
"msg": {
"err_code": 0,
"text": "OK",
"type": "message"
},
"data": [
{
"id": 33,
"name": "Дайджесты"
},
{
"id": 34,
"name": "Акции"
}
]
}
}
Переместить рассылку в папку #
POST
/campaigns/{campaign_id}/move
Перекладывает рассылку в указанную папку.
Параметры пути
| Параметр | Тип | Описание |
|---|---|---|
campaign_id обязательный | integer | Идентификатор рассылки. |
Параметры тела запроса
| Параметр | Тип | Описание |
|---|---|---|
folder_id обязательный | integer | Идентификатор папки из списка папок. |
Возможные ошибки
| HTTP | code | Когда возникает |
|---|---|---|
404 |
22 |
Рассылки с таким campaign_id нет |
500 |
39 |
Папки с таким folder_id нет |
curl -X POST 'https://api.dashamail.com/v2/campaigns/501233/move' \
-H 'Authorization: Bearer YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"folder_id": 34
}'
<?php
$ch = curl_init('https://api.dashamail.com/v2/campaigns/501233/move');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'folder_id' => 34,
], JSON_UNESCAPED_UNICODE),
]);
$response = json_decode(curl_exec($ch), true);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($status >= 400) {
throw new RuntimeException($response['error']['message']);
}
print_r($response['response']['data']);
import requests
response = requests.post(
'https://api.dashamail.com/v2/campaigns/501233/move',
headers={'Authorization': 'Bearer YOUR_API_KEY'},
json={
'folder_id': 34,
},
)
response.raise_for_status()
print(response.json()['response']['data'])
const response = await fetch('https://api.dashamail.com/v2/campaigns/501233/move', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
},
body: JSON.stringify({
"folder_id": 34
}),
});
const payload = await response.json();
if (!response.ok) throw new Error(payload.error.message);
console.log(payload.response.data);
{
"response": {
"msg": {
"err_code": 0,
"text": "OK",
"type": "message"
},
"data": true
}
}