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

Формат запросов и ответов

Один конверт ответа на все эндпоинты, предсказуемые HTTP-коды и несколько особенностей передачи составных значений, о которых лучше узнать заранее.

Как передавать параметры #

API принимает параметры тремя способами и объединяет их в один набор:

  1. JSON в теле запроса — основной способ для POST и PUT;
  2. форма application/x-www-form-urlencoded — принимается для совместимости;
  3. строка запроса — обычный способ для GET.

Если один и тот же параметр пришёл и в строке запроса, и в теле, побеждает значение из тела.

При отправке JSON указывайте Content-Type: application/json. Кодировка — всегда UTF-8; параметра charset из старого API здесь нет.

Конверт успешного ответа #

Успешный ответ всегда устроен одинаково: служебный блок msg и полезная нагрузка data.

{
  "response": {
    "msg": {
      "err_code": 0,
      "text": "OK",
      "type": "message"
    },
    "data": { ... }
  }
}

Читайте данные из response.data. Поле msg на успешном ответе носит справочный характер: при err_code = 0 и type = "message" запрос выполнен.

Что окажется в data, зависит от эндпоинта: объект, массив объектов, либо просто true — если операция ничего не возвращает, кроме факта успеха.

Конверт ошибки #

При ошибке структура другая — response отсутствует, вместо него приходит error, а HTTP-код перестаёт быть 200.

HTTP/1.1 422 Unprocessable Entity

{
  "error": {
    "code": 3,
    "message": "Заданы не все необходимые параметры"
  }
}

code — код ошибки DashaMail, он точнее HTTP-статуса и не меняется между версиями. Полный список — на странице Коды ошибок.

Надёжная проверка в коде: успех — это HTTP-статус меньше 400. Разбирать error.code нужно только там, где вы хотите по-разному реагировать на разные причины отказа.

HTTP-коды #

КодКогда
200Запрос выполнен, данные в response.data.
201Объект создан. Возвращается на POST, создающих сущность.
202Задача принята в обработку — так отвечает запуск импорта подписчиков.
204Выполнено, тела ответа нет. Так отвечают все DELETE.
401Ключ отсутствует, неверен, заблокирован, либо не хватает прав.
402Недостаточно средств или функция недоступна на текущем тарифе.
403Действие запрещено: блокировка за спам, ограничение по IP.
404Объект не найден — либо запрос вернул пустой результат, см. ниже.
405HTTP-метод неприменим к этому URL.
409Конфликт: дубликат адреса, подписчик уже отписан, рассылка уже отправлена.
413Превышен лимит на размер вложений.
422Не хватает обязательных параметров или значение не прошло проверку.
429Превышен лимит запросов в минуту.
500Внутренняя ошибка. Повторите позже, при повторении — напишите в поддержку.

Пустой результат — это 404 #

Если выборка ничего не нашла, API отвечает не пустым массивом, а 404 с code: 4 и текстом «Нет данных». Так ведут себя все читающие эндпоинты: список баз у нового аккаунта, поиск подписчика, отчёт по рассылке без событий.

Обрабатывайте это как «ничего не найдено», а не как сбой:

$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$body   = json_decode($response, true);

if ($status === 404 && ($body['error']['code'] ?? null) === 4) {
    $items = [];                        // пусто — это нормально
} elseif ($status >= 400) {
    throw new RuntimeException($body['error']['message']);
} else {
    $items = $body['response']['data'];
}

Составные значения #

Часть параметров описывает вложенные структуры: список адресных баз для рассылки, набор дополнительных полей, вложения письма, условия маршрута. Такие параметры передаются строкой с JSON внутри.

{
  "list_id": "[128341, 128342]",
  "subject": "Весенняя распродажа"
}

В описании каждого параметра тип указан как JSON-строка. Там, где это допустимо, принимается и настоящий JSON-массив — но строка работает везде, поэтому она надёжнее.

Типы значений #

ТипКак передавать
ФлагЧисло 1 или 0. У ряда параметров (update, no_check, send_confirm) значение не проверяется — важен сам факт присутствия параметра, поэтому «выключить» его нужно, не передавая вовсе.
Да/нет в рассылкахСтроки "Y" и "N" — например, track_opens, track_clicks.
Дата и времяYYYY-MM-DD HH:MM:SS в часовом поясе аккаунта. Где допустима только дата — YYYY-MM-DD.
Метка времениUnix timestamp числом. Используется в delivery_time транзакционных писем.
Email с именемДопускается форма Иван Петров <ivan@example.com>.

Постраничный вывод #

Единого имени параметра смещения в API нет — оно унаследовано от разных подсистем. Всегда сверяйтесь с таблицей параметров конкретного эндпоинта.

ГдеСмещениеРазмер страницы
Подписчики, отписки, жалобы, лог транзакционных, отчёт по доменамstartlimit
Рассылки, письма и доставки в «Обработке входящих»offsetlimit

Общего счётчика записей API не возвращает. Признак последней страницы — ответ, в котором элементов меньше запрошенного limit, либо 404 с code: 4.

Дополнительные поля подписчика #

Поля подписчика сверх адреса нумерованы: merge_1, merge_2, … Номер — это позиция поля в адресной базе; структуру полей конкретной базы отдаёт запрос одной базы. В новых базах merge_1 — «Имя», merge_2 — «Фамилия».

Тип поля определяет формат значения:

Тип поляЗначение
textПроизвольная строка.
numberЧисло. Нечисловое значение приводится к 0.
dateYYYY-MM-DD или YYYY-MM-DD HH:MM:SS.
choiceРовно одно из значений списка. Значение вне списка молча записывается пустым.
tagsМетки через ; — например "vip;москва".

CORS #

API отвечает Access-Control-Allow-Origin: * и обрабатывает предварительные запросы OPTIONS. Это не приглашение ходить в API из браузера: ключ, попавший в клиентский код, компрометирован. Проксируйте вызовы через свой бэкенд.

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

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