Документация для разработчиков

Рассылки

Массовые письма по адресной базе: создание, вёрстка, запуск, пауза, вложения и папки.

Рассылка создаётся черновиком, наполняется содержимым и запускается отдельным вызовом: 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 /campaigns

Возвращает рассылки аккаунта. Удалённые не показываются, если явно не запрошен статус DELETED.

Здесь смещение задаётся параметром offset (в отличие от подписчиков, где используется start). По умолчанию возвращается 100 рассылок.

Варианты A/B-теста в списке не показываются: сам тест виден одной строкой с ab: "test", а его варианты перечислены в ab_campaigns. По идентификатору вариант отдаётся, а весь набор вернёт ab_variants=1.

Параметры строки запроса

ПараметрТипОписание
limitintegerпо умолчанию: 100Сколько рассылок вернуть.
offsetintegerпо умолчанию: 0Смещение. Учитывается только вместе с limit.
statusstringФильтр по статусу рассылки.
list_idintegerТолько рассылки по указанной адресной базе.
startdateРассылки не раньше этой даты. Для статуса SENT сравнивается время отправки, иначе — время последнего изменения.
enddateРассылки не позже этой даты.
external_campaign_idstringПоиск по вашему внешнему идентификатору.
workflowintegerТолько письма указанной цепочки автоматизации.
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);
Ответ HTTP 200
{
  "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.

Возможные ошибки

HTTPcodeКогда возникает
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);
Ответ HTTP 200
{
  "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Имя отправителя.
namestringпо умолчанию: Без Названия + датаВнутреннее название рассылки, получателям не видно.
htmlstringHTML-версия письма. Вместо вёрстки можно передать id сохранённого шаблона числом, либо tmpl<campaign_id>, чтобы взять вёрстку другой рассылки.
plain_textstringТекстовая версия письма.
ampstringAMP-версия письма. Требует включённой поддержки AMP на аккаунте.
track_opensstringпо умолчанию: YОтслеживать открытия.
Допустимые значения: Y, N
track_clicksstringпо умолчанию: YОтслеживать клики.
Допустимые значения: Y, N
plain_clicksstringпо умолчанию: NОтслеживать клики и в текстовой версии.
Допустимые значения: Y, N
esegmentJSON-строкаУсловия сегментации базы. Структура: {"match":"all","c":[{"field":"…","op":"…","value":"…"}]}. При рассылке по нескольким базам — объект, где ключ это list_id.
statusstringпо умолчанию: DRAFTПри создании допустимы только DRAFT и TEMPLATE; любое другое значение приводится к DRAFT.
Допустимые значения: DRAFT, TEMPLATE
external_campaign_idstringВаш идентификатор рассылки для сопоставления с внешней системой.
personalizeToEmailstringпо умолчанию: offПодставлять имя получателя в поле «Кому».
to_emailstringШаблон отображаемого имени получателя, например %ИМЯ%.
analyticsstringпо умолчанию: NДобавлять UTM-метки к ссылкам.
Допустимые значения: Y, N
analytics_tagstringЗначение utm_campaign.
analytics_sourcestringЗначение utm_source.
analytics_mediumstringЗначение utm_medium.
analytics_contentstringЗначение utm_content.
analytics_termstringЗначение utm_term.
allow_time_zoneфлагОтправлять с учётом часового пояса получателя.
allow_best_timeфлагОтправлять в наиболее удачное для получателя время.
limitintegerОграничить скорость отправки — сколько писем за интервал wait_time.
wait_timeintegerИнтервал ограничения скорости в минутах.
no_images_addфлагНе добавлять изображения автоматически.
dialogs_enabledфлагВключить приём ответов через Даша.Диалоги. Несовместимо с собственным Reply-To — при конфликте побеждают диалоги.
stat_domainstringДомен для ссылок статистики. Должен быть подтверждён в аккаунте.
cloudфлагВыгрузить изображения из HTML в облачное хранилище DashaMail.

Что возвращается

Идентификатор созданной рассылки.

Возможные ошибки

HTTPcodeКогда возникает
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);
Ответ HTTP 201
{
  "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Идентификатор рассылки.

Параметры тела запроса

ПараметрТипОписание
statusstringНовый статус. Запуск отправки — MODERATING или SCHEDULE.
Допустимые значения: DRAFT, MODERATING, SCHEDULE, TEMPLATE
delivery_timedatetimeВремя запланированной отправки. Обязателен при status=SCHEDULE.
subjectstringТема письма.
from_emailstringАдрес отправителя.
from_namestringИмя отправителя.
namestringВнутреннее название.
list_idinteger | JSON-строкаСменить адресную базу или набор баз.
htmlstringHTML-версия письма.
plain_textstringТекстовая версия письма.
esegmentJSON-строкаУсловия сегментации.
track_opensstringОтслеживание открытий.
Допустимые значения: Y, N
track_clicksstringОтслеживание кликов.
Допустимые значения: Y, N
stat_domainstringДомен статистики.

Возможные ошибки

HTTPcodeКогда возникает
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);
Ответ HTTP 200
{
  "response": {
    "msg": {
      "err_code": 0,
      "text": "OK",
      "type": "message"
    },
    "data": true
  }
}

Удалить рассылку #

DELETE /campaigns/{campaign_id}

Помечает рассылку удалённой. Статистика по уже отправленным письмам сохраняется.

Параметры пути

ПараметрТипОписание
campaign_id обязательныйintegerИдентификатор рассылки.

Возможные ошибки

HTTPcodeКогда возникает
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);
Ответ HTTP 204
(тело ответа пустое)

Скопировать рассылку #

POST /campaigns/{campaign_id}/copy

Создаёт копию рассылки вместе с вёрсткой. Копия отправленной или заблокированной рассылки всегда получает статус DRAFT.

Параметры пути

ПараметрТипОписание
campaign_id обязательныйintegerИдентификатор исходной рассылки.

Параметры тела запроса

ПараметрТипОписание
namestringНазвание копии. По умолчанию совпадает с исходным.
client_idintegerСоздать копию в аккаунте клиента. Доступно партнёрским аккаунтам.

Что возвращается

Идентификатор созданной копии.

Возможные ошибки

HTTPcodeКогда возникает
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);
Ответ HTTP 201
{
  "response": {
    "msg": {
      "err_code": 0,
      "text": "OK",
      "type": "message"
    },
    "data": {
      "campaign_id": 501240
    }
  }
}

Поставить отправку на паузу #

POST /campaigns/{campaign_id}/pause

Приостанавливает идущую рассылку. Уже отправленные письма не отзываются.

Параметры пути

ПараметрТипОписание
campaign_id обязательныйintegerИдентификатор рассылки.

Возможные ошибки

HTTPcodeКогда возникает
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);
Ответ HTTP 200
{
  "response": {
    "msg": {
      "err_code": 0,
      "text": "OK",
      "type": "message"
    },
    "data": true
  }
}

Возобновить отправку #

POST /campaigns/{campaign_id}/resume

Продолжает рассылку, поставленную на паузу, с того места, где она остановилась.

Параметры пути

ПараметрТипОписание
campaign_id обязательныйintegerИдентификатор рассылки.

Возможные ошибки

HTTPcodeКогда возникает
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);
Ответ HTTP 200
{
  "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флагОтправлять в лучшее время подписчика.

Возможные ошибки

HTTPcodeКогда возникает
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);
Ответ HTTP 200
{
  "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Идентификатор рассылки.

Возможные ошибки

HTTPcodeКогда возникает
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);
Ответ HTTP 200
{
  "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Идентификатор рассылки.

Возможные ошибки

HTTPcodeКогда возникает
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);
Ответ HTTP 200
{
  "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Идентификатор черновика.

Параметры тела запроса

ПараметрТипОписание
subjectJSON-строкаТемы письма для сравнения, от двух: ["Скидки до 40%", "Последний день распродажи"].
fromJSON-строкаОтправители для сравнения, от двух: [{"from_name":"Ромашка","from_email":"news@example.ru"}, …]. Адреса — только подтверждённые.
htmlJSON-строкаВёрстка писем для сравнения, от двух.
timeJSON-строкаЧасы отправки для сравнения, от двух: [9, 18]. Час суток, 0–23.
partintegerпо умолчанию: 10Доля базы на каждый вариант в процентах, 1–50. Все доли вместе — не больше 100.
winner_bystringпо умолчанию: opensКак выбирается победитель. manual — тест дождётся вашего выбора и не отправит остаток сам.
Допустимые значения: opens, clicks, unsubscribes, manual
wait_hoursintegerпо умолчанию: 4Сколько часов ждать перед отправкой победителя, 1–168. При winner_by=manual не используется.

Что возвращается

То же, что чтение теста.

Возможные ошибки

HTTPcodeКогда возникает
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);
Ответ HTTP 201
{
  "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 у варианта — исключён ли он из теста.

Возможные ошибки

HTTPcodeКогда возникает
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);
Ответ HTTP 200
{
  "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Идентификатор рассылки-теста.

Параметры тела запроса

ПараметрТипОписание
subjectJSON-строкаТемы письма для сравнения, от двух.
fromJSON-строкаОтправители для сравнения, от двух.
htmlJSON-строкаВёрстка писем для сравнения, от двух.
timeJSON-строкаЧасы отправки для сравнения, от двух.
partintegerпо умолчанию: 10Доля базы на каждый вариант в процентах, 1–50.
winner_bystringпо умолчанию: opensКак выбирается победитель.
Допустимые значения: opens, clicks, unsubscribes, manual
wait_hoursintegerпо умолчанию: 4Сколько часов ждать перед отправкой победителя, 1–168.

Возможные ошибки

HTTPcodeКогда возникает
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);
Ответ HTTP 200
{
  "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Идентификатор рассылки-теста.

Возможные ошибки

HTTPcodeКогда возникает
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);
Ответ HTTP 200
{
  "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Когда отправить победителя остатку базы.

Возможные ошибки

HTTPcodeКогда возникает
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);
Ответ HTTP 200
{
  "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Идентификатор рассылки-теста.

Возможные ошибки

HTTPcodeКогда возникает
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);
Ответ HTTP 200
{
  "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Адрес получателя. Несколько адресов — через запятую или массивом, не больше шести.

Что возвращается

Число отправленных писем и адреса, на которые они ушли.

Возможные ошибки

HTTPcodeКогда возникает
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);
Ответ HTTP 200
{
  "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Идентификатор рассылки.

Что возвращается

Ссылка на страницу просмотра.

Возможные ошибки

HTTPcodeКогда возникает
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);
Ответ HTTP 200
{
  "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Идентификатор рассылки.

Что возвращается

Общее число получателей и разбивка по базам.

Возможные ошибки

HTTPcodeКогда возникает
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);
Ответ HTTP 200
{
  "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_subjectstringТема повторного письма. По умолчанию берётся исходная.

Что возвращается

Идентификатор созданной рассылки.

Возможные ошибки

HTTPcodeКогда возникает
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);
Ответ HTTP 201
{
  "response": {
    "msg": {
      "err_code": 0,
      "text": "OK",
      "type": "message"
    },
    "data": {
      "campaign_id": 501255
    }
  }
}

Вложения рассылки #

GET /campaigns/{campaign_id}/attachments

Список файлов, приложенных к рассылке. Возвращается не больше десяти вложений.

Параметры пути

ПараметрТипОписание
campaign_id обязательныйintegerИдентификатор рассылки.

Возможные ошибки

HTTPcodeКогда возникает
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);
Ответ HTTP 200
{
  "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Ссылка на файл.
namestringИмя файла в письме. По умолчанию берётся из ссылки; кириллица транслитерируется.
separate_linkфлагНе прикладывать файл, а вставить ссылку на него.

Что возвращается

Идентификатор вложения.

Возможные ошибки

HTTPcodeКогда возникает
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);
Ответ HTTP 201
{
  "response": {
    "msg": {
      "err_code": 0,
      "text": "OK",
      "type": "message"
    },
    "data": {
      "id": 7712
    }
  }
}

Удалить вложение #

DELETE /campaigns/{campaign_id}/attachments/{id}

Открепляет файл от рассылки и удаляет его с диска.

Параметры пути

ПараметрТипОписание
campaign_id обязательныйintegerИдентификатор рассылки.
id обязательныйintegerИдентификатор вложения из списка вложений.

Возможные ошибки

HTTPcodeКогда возникает
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);
Ответ HTTP 204
(тело ответа пустое)

Папки рассылок #

GET /campaigns/folders

Список папок, по которым разложены рассылки.

Параметры строки запроса

ПараметрТипОписание
idintegerВернуть одну папку.
namestringНайти папку по точному названию.
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);
Ответ HTTP 200
{
  "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Идентификатор папки из списка папок.

Возможные ошибки

HTTPcodeКогда возникает
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);
Ответ HTTP 200
{
  "response": {
    "msg": {
      "err_code": 0,
      "text": "OK",
      "type": "message"
    },
    "data": true
  }
}

DashaMail хранит и защищает ваши данные на территории Российской Федерации

Подробнее...