Ошибки и лимиты
Формат ошибок API и коды ответов, ошибки проверки отчётов и отдельных записей, лимиты запросов на ключ, размеры пачек, квоты сайта — хиты, записи сессий, хранение — и пределы тега и отчётов.
Формат ошибки
Ошибка запроса целиком приходит с HTTP-кодом 4xx или 5xx и телом:
{"error": {"code": "validation_failed", "message": "Поле date_from обязательно"}}
code— машинный код из таблицы ниже. Проверяйте в коде именно его.message— пояснение для человека; текст может меняться.details— необязательный объект с подробностями, например о полях, которые не прошли проверку.
| Код | HTTP | Когда | Что делать |
|---|---|---|---|
invalid_request |
400 | тело не JSON или запрос не разобрать; с HTTP 405 — метод не поддерживается по этому адресу | исправить запрос |
unauthorized |
401 | нет ключа, ключ неверен или отозван | проверить ключ; новый ключ сайта выпускается в «Интеграции → Ключи API» сайта, ключ аккаунта — в разделе «Ключи аккаунта» |
forbidden |
403 | сайт заблокирован или удалён, владелец заблокирован или удалён; заголовок X-Dara-Site ключа сайта называет другой сайт; запрос по http:// |
отправлять запросы на https://; если адрес верный — связаться с поддержкой |
not_found |
404 | нет такого метода или объекта; сайта из заголовка X-Dara-Site не существует или он не в вашем аккаунте |
проверить адрес и идентификатор сайта |
payload_too_large |
413 | тело больше 1 МБ | разбить пачку на части |
validation_failed |
422 | поля не прошли проверку; у ключа аккаунта нет заголовка X-Dara-Site или он не идентификатор сайта |
исправить поля по details |
rate_limited |
429 | превышен лимит запросов, в том числе заняты все слоты POST /reports (2 по ключу сайта, 4 по аккаунту) |
повторить после паузы из заголовка Retry-After |
internal |
500 | ошибка сервиса | повторить позже; если повторяется — сообщить X-Request-ID |
unavailable |
503 | сервис временно недоступен | повторить после паузы из заголовка Retry-After |
Каждый ответ содержит заголовок X-Request-ID — сохраняйте его в логах.
Ответы веб-сервера
Часть ответов формирует не сервис, а веб-сервер перед ним:
403наhttp://. API работает только по HTTPS: запрос поhttp://не перенаправляется, а сразу получает403с кодомforbidden, без заголовкаX-Request-ID. Ключ в таком запросе уже ушёл по сети открытым — отзовите его и создайте новый.413— тело больше 1 МБ, и429— превышен лимит запросов с одного IP, в том же формате JSON. У429по IP заголовокRetry-After: 2.503сRetry-After: 10— служба API не отвечает веб-серверу, например перезапускается. Сам сервис отвечает503сRetry-After: 5, когда не может прочитать данные.5xxне в JSON. Если сбой случился на входе, до службы API, — например, при перезапуске веб-сервера — ответ5xxможет прийти страницей HTML без заголовкаX-Request-ID. Решайте по HTTP-коду, а не по телу: такой ответ повторяйте, как500и503.
Сайт запроса
Ключ аккаунта (aa_…) работает со всеми сайтами аккаунта, поэтому каждый запрос называет сайт заголовком X-Dara-Site — подробности и примеры в разделе API.
| Ответ | details |
Что случилось |
|---|---|---|
422 validation_failed |
[{"field": "X-Dara-Site", "code": "required"}] |
ключ аккаунта, а сайт не назван. Сервис не выбирает сайт за вас |
422 validation_failed |
[{"field": "X-Dara-Site", "code": "invalid"}] |
заголовок не идентификатор сайта (номер, ключ as_…, мусор) или передан дважды |
403 forbidden |
— | ключ сайта, а заголовок называет другой сайт ВАШЕГО аккаунта: этим ключом доступен только его сайт. Для нескольких сайтов нужен ключ аккаунта |
404 not_found |
— | сайта нет или он не в вашем аккаунте. Оба случая отвечают одинаково, поэтому чужой сайт по кодам ответа не найти — в том числе ключом сайта |
GET /meta, GET /network и GET /categories отвечают одинаково для всех сайтов, поэтому им заголовок не нужен.
Проверка отчёта
POST /reports с неверным определением отвечает 422 с кодом validation_failed. В details — поле и код причины:
{"error": {"code": "validation_failed", "message": "Неизвестная метрика", "details": [{"field": "metrics[1]", "code": "unknown_metric"}]}}
Код в details |
Причина |
|---|---|
unknown_dimension |
нет такого измерения |
unknown_metric |
нет такой метрики |
unknown_segment |
нет такого сегмента у сайта |
incompatible |
метрику нельзя посчитать вместе с измерениями запроса — например, отказы по адресу ссылки; рядом с метриками расхода — любое измерение, кроме трёх UTM-меток, дня, недели и месяца, фильтр не по UTM-метке и сегмент (Отчёты и метрики) |
too_many |
больше 5 измерений, 10 метрик, 20 фильтров или 3 сортировок |
bad_date |
неверная дата, date_from позже date_to, период длиннее 25 месяцев или дата в будущем |
bad_filter |
неверный фильтр: оператор, число значений или регулярное выражение |
Если отчёт не уложился во время даже по выборке, ответ — 503 с кодом unavailable: сократите период.
Ошибки отдельных записей
Методы пачек отвечают 202 Accepted, даже если часть записей не принята. Непринятые записи перечислены в ответе.
| Метод | Где | Коды |
|---|---|---|
POST /conversions |
rejected: [{"index", "code"}] |
unknown_goal — нет JS-цели с таким кодом; unknown_visitor — посетитель не найден; too_old — подходящий визит старше 90 дней |
POST /orders |
rejected: [{"index", "code"}] |
unknown_visitor, too_old, invalid_products — ошибка в списке товаров |
POST /users |
results: [{"index", "ok", "error"}] |
pii_not_allowed — в params есть ключ персональных данных; других кодов отказа у записи нет |
index — номер записи в пачке, с нуля. duplicates в ответе POST /conversions и POST /orders — записи, которые уже были учтены: это не ошибка.
POST /ad-costs — пачка «всё или ничего»: ответ 200, а при ошибке хотя бы одной строки — 422 с кодом validation_failed, и не пишется ни одна строка. В details — ошибки всех строк сразу, например costs[3].amount. Свои коды метода: no_rate — нет курса ЦБ для валюты строки на её дату (укажите сумму в валюте сайта); duplicate — та же строка (дата и три метки) дважды в пачке; too_many у поля costs — больше 1000 строк в пачке или больше 200 000 строк расходов у сайта.
Ошибка формы хотя бы одного элемента POST /visitors/attributes или записи POST /users — неверный тип, длина, UUID, нет идентификатора — отклоняет весь запрос ответом 422 с кодом validation_failed, а в details — поле с номером элемента, например visitors[3].visitor_id или users[3].email. POST /users отвечает 503 с кодом unavailable, если приём временно недоступен: пачка не сохранена, её нужно отправить ещё раз.
Повторы
- Повторяйте при сетевой ошибке,
429,500и503— с растущей паузой, а приRetry-After— не раньше указанного времени. - Не повторяйте без исправления остальные ответы 4xx: результат будет тем же.
- Пачки конверсий и заказов можно отправлять повторно без риска задвоить данные: конверсии узнаются по
id, заказы — поtransaction_id. - Пачку
POST /usersтоже можно повторить: повтор той же пачки второй раз не записывается — ни поля, ниinterests. Ответ приходит тот же, вместе с заголовкомIdempotent-Replayed: true; пачка узнаётся по содержимому 15 минут, а с вашим заголовкомIdempotency-Key— сутки. Тот жеIdempotency-Keyс другой пачкой — ответ422с полемIdempotency-Keyвdetails: имя уже занято, возьмите новое (Данные о посетителях).
Лимиты запросов
| Что | Лимит |
|---|---|
/users, /conversions, /orders |
20 запросов в секунду на ключ сайта, 80 — на ключ аккаунта; общий лимит трёх методов; его же делят все методы записи — цели, сегменты, воронки, сопоставления категорий, расходы на рекламу и сайты (создание, правка, удаление и восстановление) |
/visitors/attributes, /visitors/{visitor_id}, /network |
50 в секунду на ключ сайта, 200 — на ключ аккаунта; общее ведро со всеми читающими методами: /meta, /site, /sites, GET /goals, /segments, /funnels, /categories, /category-mappings и GET /ad-costs |
/reports |
ключ сайта — 2 одновременных запроса и 60 в минуту на ключ; ключ аккаунта — 4 одновременных запроса на аккаунт (общих для всех его ключей) и 240 в минуту на ключ; тот же лимит у POST /reports/async, POST /audiences/export и POST /funnels/{funnel_id}/report |
невыполненные задания очереди (queued и running) |
2 на ключ сайта, 4 на аккаунт |
все запросы к /api/ с одного IP |
3000 в минуту; кратковременный всплеск — до 500 запросов сверх этого темпа |
Лимит частоты считается на ключ, а не на сайт: ключ аккаунта с сотней сайтов не получает сотню бюджетов, а сайт из заголовка X-Dara-Site на лимит не влияет. Ключу аккаунта бюджеты вчетверо шире, потому что он ходит за все сайты сразу.
Сверх лимита, в том числе при третьем одновременном отчёте ключа сайта и пятом одновременном отчёте аккаунта, сразу приходит ответ 429 с кодом rate_limited и заголовком Retry-After. Ответ /visitors/* из кеша тоже расходует лимит, и отказы — тоже: неверный сайт в заголовке и ключ сайта там, где нужен ключ аккаунта, расходуют лимит чтения так же, как чтение.
Retry-Afterлимита на ключ — секунды до конца окна лимита: у лимитов в секунду и у занятых слотов отчётов — 1, у лимита отчётов в минуту — до 60.Retry-Afterлимита запросов с одного IP — 2.
Размеры пачек
| Метод | В одном запросе |
|---|---|
POST /conversions |
до 1000 конверсий |
POST /orders |
до 500 заказов |
POST /users |
до 500 записей |
POST /visitors/attributes |
до 100 посетителей |
POST /ad-costs |
до 1000 строк расходов (на сайт — до 200 000 строк) |
POST /reports |
до 5 измерений, 10 метрик и 10 000 строк |
POST /orders — товаров в одном заказе |
от 1 до 100 |
POST /audiences/export |
до 100 000 посетителей; результат отдаётся страницами до 10 000 строк |
| любой запрос | тело до 1 МБ |
Квоты сайта
Сервис бесплатный, нагрузку ограничивают квоты. Администратор ДАРА может изменить квоты для сайта или пользователя.
| Квота | По умолчанию | Что при превышении |
|---|---|---|
| хитов сайта в сутки по Москве | 1 000 000 | до конца суток хиты принимаются от 10 % посетителей с весом 10; отправки форм, цели из тега, покупки, возвраты и dara('user') принимаются от всех посетителей |
| записей сессий сайта в сутки по Москве | 1000 | до конца суток новые визиты не записываются, начатые записи продолжаются; короткие записи в квоту не входят |
| хранение хитов и визитов | 13 месяцев | данные старше удаляются |
| хранение записей сессий | 15 дней, не больше 90; избранные — 90 дней | запись пропадает из списка и плеера и удаляется |
| сайтов у пользователя | 30 | новый сайт не создаётся, кабинет показывает пояснение |
Роботы учитываются в квоте хитов: они тоже нагружают сервер. Как считаются отчёты сверх квоты — в разделе Отчёты и метрики.
Пределы тега
| Что | Предел |
|---|---|
| целей на сайте | 200 |
| код цели | латинские буквы в нижнем регистре, цифры, _ и -, до 64 знаков |
params в dara('goal') |
2 КБ |
params в dara('event') |
2 КБ |
user_id в dara('user') |
до 191 символа |
email, phone, city в dara('user') |
до 254, 32 и 128 символов |
age в dara('user') |
от 5 до 100 |
children в dara('user') |
до 10 детей, age ребёнка — от 0 до 17 |
interests в dara('user') |
до 50 строк, строка — до 200 символов |
params в dara('user') |
до 4 КБ в JSON; больше — params не отправляются |
| пачка хитов | до 50 событий и 64 КБ |
| кусок записи сессии | до 1024 КБ в сжатом виде; больший кусок не отправляется |
| запросы с одного посетителя | до 60 за 10 секунд и до 1000 событий в час |
| опоздавшие события | старше 24 часов отбрасываются |
Посетитель, который превысил лимиты запросов, получает отметку робота с причиной «Частота», а лишние события отбрасываются.
Лишние элементы children и interests и строки длиннее предела тег обрезает, а поля dara('user') с неверным значением не отправляет — остальные поля команды уходят. В POST /users пределы строк шире — phone до 64 символов, city до 200 — а превышение даёт 422.
Пределы отчётов
| Что | Предел |
|---|---|
| время расчёта отчёта | 30 секунд, затем автоматический повтор по выборке 10 % посетителей |
| одновременных отчётов пользователя | 2 |
| конструктор | до 5 группировок и 10 метрик |
| выгрузка XLSX | до 100 000 строк; больше 10 000 — в фоне, ссылка приходит письмом и действует 7 дней |
| хранение файла выгрузки | 7 дней, потом файл удаляется |
| выгрузки сайта | одновременно собирается одна, в очереди — до 5 |
| избранные записи сессий | до 100 на сайт |
| ссылка режима карты | действует 1 час |