ДАРА АНАЛИТИКА
Разделы документации

Документация

Ошибки и лимиты

Формат ошибок 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 час