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

Адресные базы

Списки подписчиков, сами подписчики, дополнительные поля, импорт, отписки и жалобы.

Адресная база (list) — контейнер для подписчиков. Один и тот же email может находиться в нескольких базах; для DashaMail это разные записи со своими member_id.

У каждого подписчика, помимо адреса, есть до десяти (на расширенных тарифах — больше) дополнительных полей merge_1merge_N. Их состав задаётся на уровне базы и одинаков для всех её подписчиков. Подробнее — в разделе Дополнительные поля подписчика.

Возможные состояния подписчика (state):

activeАктивен, получает рассылки
unsubscribedОтписался
bouncedАдрес недоставляем
complainedПожаловался на спам
unconfirmedНе подтвердил подписку (double opt-in)
inactiveНеактивен

Список адресных баз #

GET /lists

Возвращает все адресные базы аккаунта, от новых к старым, вместе со счётчиками подписчиков по состояниям.

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

ПараметрТипОписание
statestringВернуть только базы в указанном состоянии.
Допустимые значения: active, archived, blocked
merge_jsonфлагЕсли передан, описания дополнительных полей возвращаются как JSON, а не как сериализованная PHP-строка. Рекомендуется передавать всегда.

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

Массив баз. Счётчики count_* — число подписчиков в соответствующем состоянии; merge_1merge_N описывают дополнительные поля базы.

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

HTTPcodeКогда возникает
404 4 В аккаунте нет ни одной базы
curl -X GET 'https://api.dashamail.com/v2/lists?merge_json=1' \
  -H 'Authorization: Bearer YOUR_API_KEY'
<?php
$ch = curl_init('https://api.dashamail.com/v2/lists?merge_json=1');
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/lists?merge_json=1',
    headers={'Authorization': 'Bearer YOUR_API_KEY'},
)

response.raise_for_status()
print(response.json()['response']['data'])
const response = await fetch('https://api.dashamail.com/v2/lists?merge_json=1', {
  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": 128341,
        "state": "active",
        "name": "Клиенты интернет-магазина",
        "description": "",
        "company": "ООО «Ромашка»",
        "abuse_name": "Иван Петров",
        "phone": "+7 999 000-00-00",
        "address": "ул. Ленина, 1",
        "city": "Москва",
        "url": "https://example.ru",
        "merge_1": "{\"title\":\"Имя\",\"type\":\"text\",\"req\":\"\",\"var\":\"ИМЯ\"}",
        "merge_2": "{\"title\":\"Фамилия\",\"type\":\"text\",\"req\":\"\",\"var\":\"ФАМИЛИЯ\"}",
        "creation_date": "2026-03-14 11:02:41",
        "count_active": 1284,
        "count_bounced": 37,
        "count_inactive": 0,
        "count_complained": 2,
        "count_unconfirmed": 15,
        "count_unsubscribed": 96,
        "count_all": 1434
      }
    ]
  }
}

Одна адресная база #

GET /lists/{list_id}

Возвращает одну базу — в том же формате, что и список, но массивом из одного элемента. Отсюда удобно получать состав дополнительных полей перед добавлением подписчиков.

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

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

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

ПараметрТипОписание
merge_jsonфлагОтдавать описания дополнительных полей в JSON.

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

HTTPcodeКогда возникает
404 4 Базы с таким list_id нет
curl -X GET 'https://api.dashamail.com/v2/lists/128341?merge_json=1' \
  -H 'Authorization: Bearer YOUR_API_KEY'
<?php
$ch = curl_init('https://api.dashamail.com/v2/lists/128341?merge_json=1');
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/lists/128341?merge_json=1',
    headers={'Authorization': 'Bearer YOUR_API_KEY'},
)

response.raise_for_status()
print(response.json()['response']['data'])
const response = await fetch('https://api.dashamail.com/v2/lists/128341?merge_json=1', {
  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": 128341,
        "state": "active",
        "name": "Клиенты интернет-магазина",
        "merge_1": "{\"title\":\"Имя\",\"type\":\"text\",\"req\":\"\",\"var\":\"ИМЯ\"}",
        "merge_2": "{\"title\":\"Город\",\"type\":\"choice\",\"req\":\"on\",\"var\":\"ГОРОД\"}",
        "creation_date": "2026-03-14 11:02:41",
        "count_active": 1284,
        "count_all": 1434
      }
    ]
  }
}

Создать адресную базу #

POST /lists

Создаёт новую адресную базу.

Контактные данные (company, address, city и другие) попадают в подвал писем — этого требуют антиспам-политики. Если их не передать, подставятся данные из профиля аккаунта.

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

ПараметрТипОписание
name обязательныйstringНазвание базы.
fieldsJSON-строкаСостав дополнительных полей. Если не передан, поля копируются из базы по умолчанию, а при её отсутствии создаются «Имя» и «Фамилия». Каждый элемент — объект с ключами title, type, req, var. Для типа choice в title передаётся объект {"name": "…", "choices": […]}. Длина var — не больше 10 символов.
companystringНазвание компании для подвала письма.
abuse_namestringКонтактное лицо.
abuse_emailstringКонтактный email для жалоб.
addressstringАдрес.
citystringГород.
zipstringПочтовый индекс.
countrystringСтрана.
phonestringТелефон.
urlstringСайт компании.

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

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

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

HTTPcodeКогда возникает
422 3 Не передан name
500 59 Длина var дополнительного поля больше 10 символов
curl -X POST 'https://api.dashamail.com/v2/lists' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{
  "name": "Клиенты интернет-магазина",
  "company": "ООО «Ромашка»",
  "city": "Москва",
  "fields": "[{\"title\":\"Имя\",\"type\":\"text\",\"req\":\"\",\"var\":\"ИМЯ\"},{\"title\":\"Город\",\"type\":\"choice\",\"req\":\"on\",\"var\":\"ГОРОД\"}]"
}'
<?php
$ch = curl_init('https://api.dashamail.com/v2/lists');
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' => 'Клиенты интернет-магазина',
            'company' => 'ООО «Ромашка»',
            'city' => 'Москва',
            'fields' => '[{"title":"Имя","type":"text","req":"","var":"ИМЯ"},{"title":"Город","type":"choice","req":"on","var":"ГОРОД"}]',
        ], 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/lists',
    headers={'Authorization': 'Bearer YOUR_API_KEY'},
    json={
        'name': 'Клиенты интернет-магазина',
        'company': 'ООО «Ромашка»',
        'city': 'Москва',
        'fields': '[{"title":"Имя","type":"text","req":"","var":"ИМЯ"},{"title":"Город","type":"choice","req":"on","var":"ГОРОД"}]',
    },
)

response.raise_for_status()
print(response.json()['response']['data'])
const response = await fetch('https://api.dashamail.com/v2/lists', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_API_KEY',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
  "name": "Клиенты интернет-магазина",
  "company": "ООО «Ромашка»",
  "city": "Москва",
  "fields": "[{\"title\":\"Имя\",\"type\":\"text\",\"req\":\"\",\"var\":\"ИМЯ\"},{\"title\":\"Город\",\"type\":\"choice\",\"req\":\"on\",\"var\":\"ГОРОД\"}]"
}),
});

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": {
      "list_id": 128341
    }
  }
}

Изменить адресную базу #

PUT /lists/{list_id}

Меняет реквизиты базы. Передавайте только те поля, которые нужно изменить — остальные останутся прежними. Состав дополнительных полей здесь не меняется, для этого есть отдельные эндпоинты.

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

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

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

ПараметрТипОписание
namestringНазвание базы.
abuse_emailstringКонтактный email. Проверяется на корректность.
abuse_namestringКонтактное лицо.
companystringКомпания.
addressstringАдрес.
citystringГород.
zipstringИндекс.
countrystringСтрана.
urlstringСайт.
phonestringТелефон.

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

HTTPcodeКогда возникает
404 5 Базы с таким list_id нет
422 6 Некорректный abuse_email
curl -X PUT 'https://api.dashamail.com/v2/lists/128341' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{
  "name": "Клиенты — Москва"
}'
<?php
$ch = curl_init('https://api.dashamail.com/v2/lists/128341');
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([
            '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.put(
    'https://api.dashamail.com/v2/lists/128341',
    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/lists/128341', {
  method: 'PUT',
  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 200
{
  "response": {
    "msg": {
      "err_code": 0,
      "text": "OK",
      "type": "message"
    },
    "data": true
  }
}

Удалить адресную базу #

DELETE /lists/{list_id}

Удаляет базу вместе с активными подписчиками.

Операция необратима. Отписавшиеся подписчики остаются в глобальном списке отписок аккаунта — повторно подписать их через API не получится.

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

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

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

HTTPcodeКогда возникает
404 5 Базы с таким list_id нет
curl -X DELETE 'https://api.dashamail.com/v2/lists/128341' \
  -H 'Authorization: Bearer YOUR_API_KEY'
<?php
$ch = curl_init('https://api.dashamail.com/v2/lists/128341');
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/lists/128341',
    headers={'Authorization': 'Bearer YOUR_API_KEY'},
)

response.raise_for_status()
print(response.json()['response']['data'])
const response = await fetch('https://api.dashamail.com/v2/lists/128341', {
  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 /lists/{list_id}/members

Постранично возвращает подписчиков базы.

Смещение задаётся параметром start, не offset. По умолчанию отдаётся 100 записей.

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

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

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

ПараметрТипОписание
startintegerпо умолчанию: 0Смещение от начала выборки.
limitintegerпо умолчанию: 100Сколько записей вернуть.
orderstringпо умолчанию: id ascСортировка в формате поле направление — например id desc.
statestringФильтр по состоянию подписчика. Значение spam — синоним complained.
Допустимые значения: active, unsubscribed, bounced, complained, unconfirmed, inactive
emailstringВернуть конкретного подписчика по адресу.
member_idintegerВернуть конкретного подписчика по идентификатору.
segment_idintegerВернуть подписчиков сохранённого сегмента. Несовместим с email и member_id.

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

Массив подписчиков. Поля merge_* отдаются только те, что заведены в базе; поля типа tags возвращаются строкой с разделителем ;.

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

HTTPcodeКогда возникает
404 5 Базы с таким list_id нет
404 4 В базе нет подписчиков, подходящих под фильтр
500 60 segment_id задан вместе с email или member_id
500 61 Сегмента с таким segment_id нет
curl -X GET 'https://api.dashamail.com/v2/lists/128341/members?state=active&start=0&limit=2' \
  -H 'Authorization: Bearer YOUR_API_KEY'
<?php
$ch = curl_init('https://api.dashamail.com/v2/lists/128341/members?state=active&start=0&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/lists/128341/members?state=active&start=0&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/lists/128341/members?state=active&start=0&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": 90412881,
        "list_id": 128341,
        "email": "ivan@example.com",
        "state": "active",
        "optin_time": "2026-04-02 09:31:00",
        "merge_1": "Иван",
        "merge_2": "Москва"
      },
      {
        "id": 90412882,
        "list_id": 128341,
        "email": "maria@example.com",
        "state": "active",
        "optin_time": "2026-04-02 09:44:12",
        "merge_1": "Мария",
        "merge_2": "Казань"
      }
    ]
  }
}

Добавить подписчика #

POST /lists/{list_id}/members

Добавляет один адрес в базу. Для загрузки нескольких адресов используйте пакетное добавление, для файлов — импорт.

Перед добавлением адрес проверяется по вашему списку отписок, по чёрному списку аккаунта и по глобальному списку возвратов.

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

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

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

ПараметрТипОписание
email обязательныйstringАдрес подписчика. Домен ya.ru автоматически приводится к yandex.ru.
merge_1 … merge_NstringЗначения дополнительных полей. Нумерация соответствует полям базы.
merge_0флагНумеровать переданные поля с нуля: merge_0 станет первым полем базы. Удобно, когда источник данных нумерует колонки с нуля.
updateфлагОбновлять уже существующего подписчика вместо ошибки «адрес уже есть в базе».
update_tagsstringСо значением on метки в полях типа tags добавляются к существующим, а не заменяют их.
send_confirmфлагОтправить письмо подтверждения подписки (double opt-in). Подписчик создаётся в состоянии unconfirmed.
no_checkфлагНе проверять адрес по глобальному списку возвратов.
statestringЗадать состояние подписчика явно.
genderstringПол подписчика.
regionstringРегион подписчика.

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

HTTPcodeКогда возникает
422 3 Не передан email
401 2 Некорректный формат адреса
409 7 Адрес уже есть в базе (и не передан update)
409 10 Подписчик ранее отписался или находится в чёрном списке
422 6 Адрес в глобальном списке возвратов
422 29 Адрес на сервисе одноразовой почты
404 5 Базы с таким list_id нет
curl -X POST 'https://api.dashamail.com/v2/lists/128341/members' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{
  "email": "ivan@example.com",
  "merge_1": "Иван",
  "merge_2": "Москва",
  "update": 1
}'
<?php
$ch = curl_init('https://api.dashamail.com/v2/lists/128341/members');
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' => 'ivan@example.com',
            'merge_1' => 'Иван',
            'merge_2' => 'Москва',
            'update' => 1,
        ], 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/lists/128341/members',
    headers={'Authorization': 'Bearer YOUR_API_KEY'},
    json={
        'email': 'ivan@example.com',
        'merge_1': 'Иван',
        'merge_2': 'Москва',
        'update': 1,
    },
)

response.raise_for_status()
print(response.json()['response']['data'])
const response = await fetch('https://api.dashamail.com/v2/lists/128341/members', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_API_KEY',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
  "email": "ivan@example.com",
  "merge_1": "Иван",
  "merge_2": "Москва",
  "update": 1
}),
});

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": {
      "member_id": 90412881
    }
  }
}

Добавить подписчиков пакетом #

POST /lists/{list_id}/members/batch

Загружает несколько подписчиков одним запросом. Каждый элемент batch — такой же объект, как тело добавления одного подписчика.

С параметром background запрос сразу возвращает управление, а загрузка идёт в фоне — так стоит поступать с пакетами в тысячи адресов.

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

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

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

ПараметрТипОписание
batch обязательныйJSON-строкаМассив объектов подписчиков.
updateфлагОбновлять существующих подписчиков.
backgroundфлагОбработать пакет в фоне.
webhookstringURL, на который придёт уведомление о завершении фоновой загрузки.
no_checkфлагНе проверять адреса по глобальному списку возвратов.
send_confirmфлагОтправлять письма подтверждения подписки.

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

Результат по каждому адресу: успешно добавленные и ошибки с их причинами.

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

HTTPcodeКогда возникает
422 3 Не передан batch
500 31 Массив адресов пуст
curl -X POST 'https://api.dashamail.com/v2/lists/128341/members/batch' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{
  "batch": "[{\"email\":\"ivan@example.com\",\"merge_1\":\"Иван\"},{\"email\":\"maria@example.com\",\"merge_1\":\"Мария\"}]",
  "update": 1
}'
<?php
$ch = curl_init('https://api.dashamail.com/v2/lists/128341/members/batch');
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([
            'batch' => '[{"email":"ivan@example.com","merge_1":"Иван"},{"email":"maria@example.com","merge_1":"Мария"}]',
            'update' => 1,
        ], 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/lists/128341/members/batch',
    headers={'Authorization': 'Bearer YOUR_API_KEY'},
    json={
        'batch': '[{"email":"ivan@example.com","merge_1":"Иван"},{"email":"maria@example.com","merge_1":"Мария"}]',
        'update': 1,
    },
)

response.raise_for_status()
print(response.json()['response']['data'])
const response = await fetch('https://api.dashamail.com/v2/lists/128341/members/batch', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_API_KEY',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
  "batch": "[{\"email\":\"ivan@example.com\",\"merge_1\":\"Иван\"},{\"email\":\"maria@example.com\",\"merge_1\":\"Мария\"}]",
  "update": 1
}),
});

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": {
      "success": 2,
      "errors": []
    }
  }
}

Импортировать подписчиков из файла #

POST /lists/{list_id}/members/import

Ставит в очередь импорт из файла CSV, XLS, XLSX, TXT или ZIP. Файл либо скачивается по ссылке file, либо загружается как multipart-поле import-file.

Соответствие колонок файла и полей подписчика задаётся номерами колонок, начиная с нуля: email=0 означает, что адрес лежит в первой колонке, merge_1=2 — что первое дополнительное поле лежит в третьей.

В одну базу можно поставить не больше пяти задач импорта одновременно. В режиме online импорт запрещён, если в аккаунте уже идёт другой импорт.

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

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

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

ПараметрТипОписание
email обязательныйintegerНомер колонки с адресом, считая с нуля.
type обязательныйstringРасширение файла.
Допустимые значения: csv, txt, xls, xlsx, zip
filestringURL файла. Если не задан, файл ожидается в multipart-поле import-file.
merge_1 … merge_NintegerНомера колонок для дополнительных полей. Поля, помеченные в базе обязательными, должны быть сопоставлены.
genderintegerНомер колонки с полом.
regionintegerНомер колонки с регионом.
modestringпо умолчанию: bgСо значением online импорт выполняется синхронно. По умолчанию — фоновая задача.
updateфлагОбновлять существующих подписчиков.
send_confirmфлагОтправлять письма подтверждения подписки.
sheet_indexintegerНомер листа книги Excel.
sheet_namestringНазвание листа книги Excel.
webhookstringURL для уведомления о завершении импорта.

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

HTTPcodeКогда возникает
422 3 Не передан email, type или обязательное дополнительное поле
404 5 Базы с таким list_id нет
401 2 Превышено число одновременных задач импорта
500 33 Файл не читается или имеет недопустимый формат
curl -X POST 'https://api.dashamail.com/v2/lists/128341/members/import' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{
  "file": "https://example.ru/exports/subscribers.csv",
  "type": "csv",
  "email": 0,
  "merge_1": 1,
  "merge_2": 2,
  "update": 1
}'
<?php
$ch = curl_init('https://api.dashamail.com/v2/lists/128341/members/import');
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([
            'file' => 'https://example.ru/exports/subscribers.csv',
            'type' => 'csv',
            'email' => 0,
            'merge_1' => 1,
            'merge_2' => 2,
            'update' => 1,
        ], 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/lists/128341/members/import',
    headers={'Authorization': 'Bearer YOUR_API_KEY'},
    json={
        'file': 'https://example.ru/exports/subscribers.csv',
        'type': 'csv',
        'email': 0,
        'merge_1': 1,
        'merge_2': 2,
        'update': 1,
    },
)

response.raise_for_status()
print(response.json()['response']['data'])
const response = await fetch('https://api.dashamail.com/v2/lists/128341/members/import', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_API_KEY',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
  "file": "https://example.ru/exports/subscribers.csv",
  "type": "csv",
  "email": 0,
  "merge_1": 1,
  "merge_2": 2,
  "update": 1
}),
});

const payload = await response.json();
if (!response.ok) throw new Error(payload.error.message);
console.log(payload.response.data);
Ответ HTTP 202
{
  "response": {
    "msg": {
      "err_code": 0,
      "text": "OK",
      "type": "message"
    },
    "data": {
      "task_id": 88123
    }
  }
}

Результат последнего импорта #

GET /lists/{list_id}/members/import

Возвращает текстовый отчёт о последнем завершённом импорте в базу.

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

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

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

HTTPcodeКогда возникает
422 3 Не передан list_id
curl -X GET 'https://api.dashamail.com/v2/lists/128341/members/import' \
  -H 'Authorization: Bearer YOUR_API_KEY'
<?php
$ch = curl_init('https://api.dashamail.com/v2/lists/128341/members/import');
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/lists/128341/members/import',
    headers={'Authorization': 'Bearer YOUR_API_KEY'},
)

response.raise_for_status()
print(response.json()['response']['data'])
const response = await fetch('https://api.dashamail.com/v2/lists/128341/members/import', {
  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": {
      "import_result": "Загружено 1240 адресов, пропущено 18 дубликатов, отклонено 6 некорректных."
    }
  }
}

История импортов #

GET /lists/{list_id}/import-history

Список задач импорта по базе с их состоянием и итогами.

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

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

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

ПараметрТипОписание
import_idintegerВернуть только одну задачу импорта.

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

HTTPcodeКогда возникает
404 4 Импортов в эту базу не было
curl -X GET 'https://api.dashamail.com/v2/lists/128341/import-history' \
  -H 'Authorization: Bearer YOUR_API_KEY'
<?php
$ch = curl_init('https://api.dashamail.com/v2/lists/128341/import-history');
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/lists/128341/import-history',
    headers={'Authorization': 'Bearer YOUR_API_KEY'},
)

response.raise_for_status()
print(response.json()['response']['data'])
const response = await fetch('https://api.dashamail.com/v2/lists/128341/import-history', {
  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": 88123,
        "list_id": 128341,
        "state": "done",
        "created": "2026-04-02 09:15:00",
        "result": "Загружено 1240 адресов"
      }
    ]
  }
}

Один подписчик #

GET /lists/{list_id}/members/{email}

Возвращает записи подписчика по адресу.

Поиск идёт по всем базам аккаунта, а не только по указанной в пути. Если адрес есть в нескольких базах, вернутся все записи — различайте их по полю list_id.

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

ПараметрТипОписание
list_id обязательныйintegerИдентификатор базы. На выборку не влияет.
email обязательныйstringАдрес подписчика, закодированный для URL (@%40).

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

HTTPcodeКогда возникает
404 4 Подписчика с таким адресом нет
curl -X GET 'https://api.dashamail.com/v2/lists/128341/members/ivan%40example.com' \
  -H 'Authorization: Bearer YOUR_API_KEY'
<?php
$ch = curl_init('https://api.dashamail.com/v2/lists/128341/members/ivan%40example.com');
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/lists/128341/members/ivan%40example.com',
    headers={'Authorization': 'Bearer YOUR_API_KEY'},
)

response.raise_for_status()
print(response.json()['response']['data'])
const response = await fetch('https://api.dashamail.com/v2/lists/128341/members/ivan%40example.com', {
  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": 90412881,
        "list_id": 128341,
        "email": "ivan@example.com",
        "state": "active",
        "optin_time": "2026-04-02 09:31:00",
        "merge_1": "Иван"
      }
    ]
  }
}

Изменить подписчика #

PUT /lists/{list_id}/members/{email}

Обновляет дополнительные поля и состояние подписчика. Подписчик находится по паре «база + адрес» из пути, либо, если передан member_id — по нему.

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

ПараметрТипОписание
list_id обязательныйintegerИдентификатор базы.
email обязательныйstringТекущий адрес подписчика, закодированный для URL.

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

ПараметрТипОписание
member_idintegerИскать подписчика по идентификатору, а не по адресу.
merge_1 … merge_NstringНовые значения дополнительных полей. Поля, помеченные обязательными, нельзя очищать.
update_tagsstringСо значением on метки добавляются к существующим.
statestringНовое состояние подписчика.
genderstringПол.
regionstringРегион.
sourcestringИсточник подписки.

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

HTTPcodeКогда возникает
422 3 Не удалось определить подписчика или не заполнено обязательное поле
401 2 Неверный формат даты в поле типа date
curl -X PUT 'https://api.dashamail.com/v2/lists/128341/members/ivan%40example.com' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{
  "merge_1": "Иван",
  "merge_2": "Санкт-Петербург"
}'
<?php
$ch = curl_init('https://api.dashamail.com/v2/lists/128341/members/ivan%40example.com');
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([
            'merge_1' => 'Иван',
            'merge_2' => 'Санкт-Петербург',
        ], 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/lists/128341/members/ivan%40example.com',
    headers={'Authorization': 'Bearer YOUR_API_KEY'},
    json={
        'merge_1': 'Иван',
        'merge_2': 'Санкт-Петербург',
    },
)

response.raise_for_status()
print(response.json()['response']['data'])
const response = await fetch('https://api.dashamail.com/v2/lists/128341/members/ivan%40example.com', {
  method: 'PUT',
  headers: {
    'Authorization': 'Bearer YOUR_API_KEY',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
  "merge_1": "Иван",
  "merge_2": "Санкт-Петербург"
}),
});

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 /lists/{list_id}/members/{email}

Удаляет запись подписчика из базы. Удалить можно только подписчика в состоянии active.

Удаление стирает историю подписчика. Если задача в том, чтобы перестать ему писать, используйте отписку — она сохраняет адрес в списке отписавшихся и защищает от повторного добавления.

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

ПараметрТипОписание
list_id обязательныйintegerИдентификатор базы.
email обязательныйstringАдрес подписчика, закодированный для URL.

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

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

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

HTTPcodeКогда возникает
422 3 Не передан member_id
404 9 Подписчика нет
409 10 Подписчик не в активном состоянии
curl -X DELETE 'https://api.dashamail.com/v2/lists/128341/members/ivan%40example.com' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{
  "member_id": 90412881
}'
<?php
$ch = curl_init('https://api.dashamail.com/v2/lists/128341/members/ivan%40example.com');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST  => 'DELETE',
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer YOUR_API_KEY',
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS     => json_encode([
            'member_id' => 90412881,
        ], 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.delete(
    'https://api.dashamail.com/v2/lists/128341/members/ivan%40example.com',
    headers={'Authorization': 'Bearer YOUR_API_KEY'},
    json={
        'member_id': 90412881,
    },
)

response.raise_for_status()
print(response.json()['response']['data'])
const response = await fetch('https://api.dashamail.com/v2/lists/128341/members/ivan%40example.com', {
  method: 'DELETE',
  headers: {
    'Authorization': 'Bearer YOUR_API_KEY',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
  "member_id": 90412881
}),
});

const payload = await response.json();
if (!response.ok) throw new Error(payload.error.message);
console.log(payload.response.data);
Ответ HTTP 204
(тело ответа пустое)

Отписать подписчика #

POST /lists/{list_id}/members/{email}/unsubscribe

Переводит подписчика в состояние unsubscribed и проставляет время отписки. Если адрес есть в нескольких базах, а list_id в пути указывает на конкретную — отписка затронет только её.

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

ПараметрТипОписание
list_id обязательныйintegerИдентификатор базы.
email обязательныйstringАдрес подписчика, закодированный для URL.

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

ПараметрТипОписание
member_idintegerОтписать по идентификатору вместо адреса.
reasonstringПричина отписки. Накапливается в статистике причин по базе.

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

HTTPcodeКогда возникает
409 10 Подписчик уже отписан
422 3 Подписчик не найден по адресу или идентификатору
curl -X POST 'https://api.dashamail.com/v2/lists/128341/members/ivan%40example.com/unsubscribe' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{
  "reason": "Слишком частые письма"
}'
<?php
$ch = curl_init('https://api.dashamail.com/v2/lists/128341/members/ivan%40example.com/unsubscribe');
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([
            'reason' => 'Слишком частые письма',
        ], 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/lists/128341/members/ivan%40example.com/unsubscribe',
    headers={'Authorization': 'Bearer YOUR_API_KEY'},
    json={
        'reason': 'Слишком частые письма',
    },
)

response.raise_for_status()
print(response.json()['response']['data'])
const response = await fetch('https://api.dashamail.com/v2/lists/128341/members/ivan%40example.com/unsubscribe', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_API_KEY',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
  "reason": "Слишком частые письма"
}),
});

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": {
      "unsubscribed": 1
    }
  }
}

Перенести подписчика в другую базу #

POST /lists/{list_id}/members/{email}/move

Переносит активного подписчика в другую базу. Запись меняет принадлежность, идентификатор сохраняется.

Перенос считается подпиской на целевую базу — привязанные к ней автоматизации с событием «добавление в базу» сработают.

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

ПараметрТипОписание
list_id обязательныйintegerИдентификатор исходной базы.
email обязательныйstringАдрес подписчика, закодированный для URL.

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

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

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

HTTPcodeКогда возникает
409 7 В целевой базе такой адрес уже есть
404 9 Активного подписчика с такими данными нет
404 5 Целевой базы не существует
curl -X POST 'https://api.dashamail.com/v2/lists/128341/members/ivan%40example.com/move' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{
  "to_list_id": 128342,
  "member_id": 90412881
}'
<?php
$ch = curl_init('https://api.dashamail.com/v2/lists/128341/members/ivan%40example.com/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([
            'to_list_id' => 128342,
            'member_id' => 90412881,
        ], 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/lists/128341/members/ivan%40example.com/move',
    headers={'Authorization': 'Bearer YOUR_API_KEY'},
    json={
        'to_list_id': 128342,
        'member_id': 90412881,
    },
)

response.raise_for_status()
print(response.json()['response']['data'])
const response = await fetch('https://api.dashamail.com/v2/lists/128341/members/ivan%40example.com/move', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_API_KEY',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
  "to_list_id": 128342,
  "member_id": 90412881
}),
});

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 /lists/{list_id}/members/{email}/copy

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

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

ПараметрТипОписание
list_id обязательныйintegerИдентификатор исходной базы.
email обязательныйstringАдрес подписчика, закодированный для URL.

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

ПараметрТипОписание
to_list_id обязательныйintegerИдентификатор целевой базы.
member_id обязательныйintegerИдентификатор копируемой записи из списка подписчиков.

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

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

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

HTTPcodeКогда возникает
409 7 В целевой базе такой адрес уже есть
404 9 Активного подписчика с такими данными нет
curl -X POST 'https://api.dashamail.com/v2/lists/128341/members/ivan%40example.com/copy' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{
  "to_list_id": 128342,
  "member_id": 90412881
}'
<?php
$ch = curl_init('https://api.dashamail.com/v2/lists/128341/members/ivan%40example.com/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([
            'to_list_id' => 128342,
            'member_id' => 90412881,
        ], 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/lists/128341/members/ivan%40example.com/copy',
    headers={'Authorization': 'Bearer YOUR_API_KEY'},
    json={
        'to_list_id': 128342,
        'member_id': 90412881,
    },
)

response.raise_for_status()
print(response.json()['response']['data'])
const response = await fetch('https://api.dashamail.com/v2/lists/128341/members/ivan%40example.com/copy', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_API_KEY',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
  "to_list_id": 128342,
  "member_id": 90412881
}),
});

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": {
      "copy_id": 90455102
    }
  }
}

История действий подписчика #

GET /lists/{list_id}/members/{email}/activity

События подписчика: отправки, доставки, открытия, клики, возвраты, отписки — с привязкой к рассылкам.

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

ПараметрТипОписание
list_id обязательныйintegerИдентификатор базы.
email обязательныйstringАдрес подписчика, закодированный для URL.

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

ПараметрТипОписание
filterstringпо умолчанию: allТип событий для выборки.

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

HTTPcodeКогда возникает
404 4 Подписчика нет или событий не найдено
curl -X GET 'https://api.dashamail.com/v2/lists/128341/members/ivan%40example.com/activity' \
  -H 'Authorization: Bearer YOUR_API_KEY'
<?php
$ch = curl_init('https://api.dashamail.com/v2/lists/128341/members/ivan%40example.com/activity');
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/lists/128341/members/ivan%40example.com/activity',
    headers={'Authorization': 'Bearer YOUR_API_KEY'},
)

response.raise_for_status()
print(response.json()['response']['data'])
const response = await fetch('https://api.dashamail.com/v2/lists/128341/members/ivan%40example.com/activity', {
  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,
        "event_type": "OPENED",
        "event_time": "2026-04-05 10:12:44"
      },
      {
        "campaign_id": 501233,
        "event_type": "CLICKED",
        "event_time": "2026-04-05 10:13:02",
        "url": "https://example.ru/sale"
      }
    ]
  }
}

Текущий статус адреса #

GET /lists/{list_id}/last-status

Быстрая проверка: в каком состоянии находится конкретный адрес в базе. Дешевле, чем выгружать подписчика целиком.

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

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

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

ПараметрТипОписание
email обязательныйstringПроверяемый адрес.

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

HTTPcodeКогда возникает
404 4 Адреса в базе нет
curl -X GET 'https://api.dashamail.com/v2/lists/128341/last-status?email=ivan%40example.com' \
  -H 'Authorization: Bearer YOUR_API_KEY'
<?php
$ch = curl_init('https://api.dashamail.com/v2/lists/128341/last-status?email=ivan%40example.com');
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/lists/128341/last-status?email=ivan%40example.com',
    headers={'Authorization': 'Bearer YOUR_API_KEY'},
)

response.raise_for_status()
print(response.json()['response']['data'])
const response = await fetch('https://api.dashamail.com/v2/lists/128341/last-status?email=ivan%40example.com', {
  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": {
      "email": "ivan@example.com",
      "state": "active"
    }
  }
}

Проверить адрес перед подпиской #

GET /lists/{list_id}/check-email

Отвечает на вопрос «можно ли добавить этот адрес в базу». Проверяет его по чёрному списку аккаунта, по отпискам в этой базе, по глобальному списку возвратов, а также формат адреса и принадлежность к одноразовым почтовым сервисам.

Полезно вызывать перед добавлением подписчика: так вы заранее отсеете адреса, на которых POST всё равно завершится ошибкой, и не потратите на них попытку.

Успешный ответ возвращает адрес в поле valid уже нормализованным — регистр и типичные опечатки в домене исправляются. Добавляйте в базу именно это значение.

Отказы приходят со статусами 409 и 422, но различать причины надёжнее по полю code: статус лишь делит их на «адрес в чёрном списке» и «адрес непригоден».

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

ПараметрТипОписание
list_id обязательныйintegerИдентификатор базы. Проверка отписок выполняется в пределах этой базы; чёрный список и список возвратов действуют на весь аккаунт.

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

ПараметрТипОписание
email обязательныйstringПроверяемый адрес.

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

Адрес пригоден для подписки — в valid лежит нормализованная форма. Любая причина отказа приходит ошибкой: разбирайте её по полю code.

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

HTTPcodeКогда возникает
422 3 Не передан email
422 6 Некорректный формат адреса
409 10 Адрес уже был в этой базе и отписался
422 29 Адрес на сервисе одноразовой почты
409 43 В чёрном списке: двойная отписка
409 44 В чёрном списке: жалоба на спам
409 45 В чёрном списке: добавлен вручную
422 46 В глобальном списке возвратов — адреса не существует
curl -X GET 'https://api.dashamail.com/v2/lists/128341/check-email?email=ivan%40example.com' \
  -H 'Authorization: Bearer YOUR_API_KEY'
<?php
$ch = curl_init('https://api.dashamail.com/v2/lists/128341/check-email?email=ivan%40example.com');
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/lists/128341/check-email?email=ivan%40example.com',
    headers={'Authorization': 'Bearer YOUR_API_KEY'},
)

response.raise_for_status()
print(response.json()['response']['data'])
const response = await fetch('https://api.dashamail.com/v2/lists/128341/check-email?email=ivan%40example.com', {
  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": {
      "valid": "ivan@example.com"
    }
  }
}

Очистить базу #

POST /lists/{list_id}/clean

Удаляет из базы всех активных подписчиков, сохраняя саму базу и её настройки.

Операция необратима и недоступна на месячных тарифных планах — в этом случае вернётся code: 58.

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

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

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

Количество удалённых записей.

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

HTTPcodeКогда возникает
429 58 Очистка запрещена на текущем тарифе
500 57 В базе нет активных подписчиков
curl -X POST 'https://api.dashamail.com/v2/lists/128341/clean' \
  -H 'Authorization: Bearer YOUR_API_KEY'
<?php
$ch = curl_init('https://api.dashamail.com/v2/lists/128341/clean');
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/lists/128341/clean',
    headers={'Authorization': 'Bearer YOUR_API_KEY'},
)

response.raise_for_status()
print(response.json()['response']['data'])
const response = await fetch('https://api.dashamail.com/v2/lists/128341/clean', {
  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": {
      "count": 1284
    }
  }
}

Отписавшиеся #

GET /lists/{list_id}/unsubscribed

Подписчики, отписавшиеся от рассылок, с датой отписки. Полезно для синхронизации отписок с вашей CRM.

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

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

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

ПараметрТипОписание
startintegerпо умолчанию: 0Смещение.
limitintegerпо умолчанию: 100Размер страницы.
orderstringпо умолчанию: optin_time ascСортировка в формате поле направление.
date_startdatetimeОтписавшиеся начиная с этого момента.
date_enddatetimeОтписавшиеся до этого момента.
emailstringПроверить конкретный адрес.

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

HTTPcodeКогда возникает
404 4 Отписавшихся нет
curl -X GET 'https://api.dashamail.com/v2/lists/128341/unsubscribed?date_start=2026-04-01+00%3A00%3A00&limit=50' \
  -H 'Authorization: Bearer YOUR_API_KEY'
<?php
$ch = curl_init('https://api.dashamail.com/v2/lists/128341/unsubscribed?date_start=2026-04-01+00%3A00%3A00&limit=50');
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/lists/128341/unsubscribed?date_start=2026-04-01+00%3A00%3A00&limit=50',
    headers={'Authorization': 'Bearer YOUR_API_KEY'},
)

response.raise_for_status()
print(response.json()['response']['data'])
const response = await fetch('https://api.dashamail.com/v2/lists/128341/unsubscribed?date_start=2026-04-01+00%3A00%3A00&limit=50', {
  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": 90412881,
        "email": "ivan@example.com",
        "list_id": 128341,
        "unsub_time": "2026-04-11 18:20:03"
      }
    ]
  }
}

Жалобы на спам #

GET /lists/{list_id}/complaints

Подписчики, нажавшие «Это спам» в своём почтовом клиенте. Такие адреса исключаются из рассылок навсегда.

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

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

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

ПараметрТипОписание
startintegerпо умолчанию: 0Смещение.
limitintegerпо умолчанию: 100Размер страницы.
orderstringСортировка в формате поле направление.

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

HTTPcodeКогда возникает
404 4 Жалоб нет
curl -X GET 'https://api.dashamail.com/v2/lists/128341/complaints' \
  -H 'Authorization: Bearer YOUR_API_KEY'
<?php
$ch = curl_init('https://api.dashamail.com/v2/lists/128341/complaints');
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/lists/128341/complaints',
    headers={'Authorization': 'Bearer YOUR_API_KEY'},
)

response.raise_for_status()
print(response.json()['response']['data'])
const response = await fetch('https://api.dashamail.com/v2/lists/128341/complaints', {
  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": 90412899,
        "email": "spam-reporter@example.com",
        "list_id": 128341,
        "state": "complained"
      }
    ]
  }
}

Добавить дополнительное поле #

POST /lists/{list_id}/fields

Добавляет в базу новое дополнительное поле. Оно займёт первый свободный номер merge_N.

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

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

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

ПараметрТипОписание
type обязательныйstringТип поля.
Допустимые значения: text, number, date, choice, tags
varstringИмя подстановки для писем — например ИМЯ подставляется как %ИМЯ%. Не длиннее 10 символов.
titlestringпо умолчанию: Без названияОтображаемое название поля.
choicesJSON-строкаМассив вариантов. Обязателен для типа choice.
reqstringСо значением on поле становится обязательным при добавлении подписчиков.

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

HTTPcodeКогда возникает
422 3 Не передан type
500 12 Для типа choice не заданы choices
500 59 var длиннее 10 символов
500 13 Достигнут лимит дополнительных полей на тарифе
curl -X POST 'https://api.dashamail.com/v2/lists/128341/fields' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{
  "type": "choice",
  "var": "ГОРОД",
  "title": "Город",
  "choices": "[\"Москва\",\"Санкт-Петербург\",\"Казань\"]"
}'
<?php
$ch = curl_init('https://api.dashamail.com/v2/lists/128341/fields');
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([
            'type' => 'choice',
            'var' => 'ГОРОД',
            'title' => 'Город',
            'choices' => '["Москва","Санкт-Петербург","Казань"]',
        ], 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/lists/128341/fields',
    headers={'Authorization': 'Bearer YOUR_API_KEY'},
    json={
        'type': 'choice',
        'var': 'ГОРОД',
        'title': 'Город',
        'choices': '["Москва","Санкт-Петербург","Казань"]',
    },
)

response.raise_for_status()
print(response.json()['response']['data'])
const response = await fetch('https://api.dashamail.com/v2/lists/128341/fields', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_API_KEY',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
  "type": "choice",
  "var": "ГОРОД",
  "title": "Город",
  "choices": "[\"Москва\",\"Санкт-Петербург\",\"Казань\"]"
}),
});

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": true
  }
}

Изменить дополнительное поле #

PUT /lists/{list_id}/fields/{merge_id}

Меняет параметры существующего поля. Незаданные параметры сохраняют прежние значения. Тип поля изменить нельзя.

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

ПараметрТипОписание
list_id обязательныйintegerИдентификатор базы.
merge_id обязательныйintegerНомер поля: 1 для merge_1 и так далее.

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

ПараметрТипОписание
merge_id обязательныйintegerНомер изменяемого поля — продублируйте значение из пути.
titlestringНовое название.
varstringНовое имя подстановки.
choicesJSON-строкаНовый список вариантов для поля типа choice.
reqstringОбязательность поля.
defaultstringЗначение по умолчанию. Неприменимо к полям типа tags.

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

HTTPcodeКогда возникает
422 3 Не передан merge_id
404 5 Базы с таким list_id нет
curl -X PUT 'https://api.dashamail.com/v2/lists/128341/fields/2' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{
  "merge_id": 2,
  "title": "Город проживания",
  "req": "on"
}'
<?php
$ch = curl_init('https://api.dashamail.com/v2/lists/128341/fields/2');
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([
            'merge_id' => 2,
            'title' => 'Город проживания',
            'req' => 'on',
        ], 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/lists/128341/fields/2',
    headers={'Authorization': 'Bearer YOUR_API_KEY'},
    json={
        'merge_id': 2,
        'title': 'Город проживания',
        'req': 'on',
    },
)

response.raise_for_status()
print(response.json()['response']['data'])
const response = await fetch('https://api.dashamail.com/v2/lists/128341/fields/2', {
  method: 'PUT',
  headers: {
    'Authorization': 'Bearer YOUR_API_KEY',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
  "merge_id": 2,
  "title": "Город проживания",
  "req": "on"
}),
});

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 /lists/{list_id}/fields/{merge_id}

Удаляет поле из базы вместе со значениями у всех подписчиков.

Поля с бо́льшими номерами сдвигаются на одну позицию вверх: после удаления merge_2 бывшее merge_3 становится merge_2. Проверьте интеграции, которые ссылаются на номера полей.

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

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

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

HTTPcodeКогда возникает
500 13 Номер поля выходит за пределы доступных полей
404 5 Базы с таким list_id нет
curl -X DELETE 'https://api.dashamail.com/v2/lists/128341/fields/3' \
  -H 'Authorization: Bearer YOUR_API_KEY'
<?php
$ch = curl_init('https://api.dashamail.com/v2/lists/128341/fields/3');
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/lists/128341/fields/3',
    headers={'Authorization': 'Bearer YOUR_API_KEY'},
)

response.raise_for_status()
print(response.json()['response']['data'])
const response = await fetch('https://api.dashamail.com/v2/lists/128341/fields/3', {
  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
(тело ответа пустое)

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

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