Формат запросов и ответов
Один конверт ответа на все эндпоинты, предсказуемые HTTP-коды и несколько особенностей передачи составных значений, о которых лучше узнать заранее.
Как передавать параметры #
API принимает параметры тремя способами и объединяет их в один набор:
- JSON в теле запроса — основной способ для
POSTиPUT; - форма
application/x-www-form-urlencoded— принимается для совместимости; - строка запроса — обычный способ для
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 | Объект не найден — либо запрос вернул пустой результат, см. ниже. |
405 | HTTP-метод неприменим к этому 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 нет — оно унаследовано от разных подсистем. Всегда сверяйтесь с таблицей параметров конкретного эндпоинта.
| Где | Смещение | Размер страницы |
|---|---|---|
| Подписчики, отписки, жалобы, лог транзакционных, отчёт по доменам | start | limit |
| Рассылки, письма и доставки в «Обработке входящих» | offset | limit |
Общего счётчика записей API не возвращает. Признак последней страницы —
ответ, в котором элементов меньше запрошенного limit, либо
404 с code: 4.
Дополнительные поля подписчика #
Поля подписчика сверх адреса нумерованы: merge_1,
merge_2, … Номер — это позиция поля в адресной базе;
структуру полей конкретной базы отдаёт
запрос одной базы.
В новых базах merge_1 — «Имя», merge_2 — «Фамилия».
Тип поля определяет формат значения:
| Тип поля | Значение |
|---|---|
text | Произвольная строка. |
number | Число. Нечисловое значение приводится к 0. |
date | YYYY-MM-DD или YYYY-MM-DD HH:MM:SS. |
choice | Ровно одно из значений списка. Значение вне списка молча записывается пустым. |
tags | Метки через ; — например "vip;москва". |
CORS #
API отвечает Access-Control-Allow-Origin: * и обрабатывает
предварительные запросы OPTIONS. Это не приглашение ходить в
API из браузера: ключ, попавший в клиентский код, компрометирован.
Проксируйте вызовы через свой бэкенд.