API
API v1 ДАРА АНАЛИТИКИ — ключи и общие правила, конверсии и заказы с сервера, отчёты, атрибуты и данные посетителей. Примеры на curl, PHP и Python.
API нужен, чтобы передавать данные с сервера сайта и забирать отчёты в свои системы. Он работает только сервер-сервер: ключ API хранится на вашем сервере и в браузер не попадает.
Здесь — общие правила, методы и примеры. Полное описание методов, полей и схем — машинное: OpenAPI по адресу GET /api/v1/openapi.json, без авторизации. Его понимают генераторы клиентов и просмотрщики API, и оно всегда совпадает с тем, что сервис принимает на самом деле.
Ключ API
- Откройте настройки сайта, раздел «Ключи API», и создайте ключ.
- Полный ключ показывается один раз — сохраните его в секретах сервера. В списке ключей потом видны только имя, префикс, дата создания и дата последнего использования.
- Потерянный или раскрытый ключ отзовите и создайте новый.
Ключ — ak_ и 40 латинских букв и цифр. В примерах вместо него заглушка ak_XXXXXXXX…. Ключ определяет сайт: все запросы с ним относятся к этому сайту. Кнопка «Выйти на всех устройствах» в кабинете ключи API не отзывает.
Ключ API — не то же самое, что ключ сайта as_… в коде тега: ключ сайта публичный и для API не подходит.
Общие правила
| Что | Как |
|---|---|
| Адрес | https://analytics.daratech.ru/api/v1, только HTTPS |
| Ключ | заголовок Authorization: Bearer ak_XXXXXXXX…; в адресе и параметрах ключ не принимается |
| Формат | JSON в UTF-8, заголовок Content-Type: application/json |
| Время | ISO-8601 с Z: 2026-09-14T12:00:00Z |
| Размер тела | до 1 МБ |
| Ответы | с заголовками Cache-Control: no-store и X-Request-ID |
| Браузер | CORS-заголовков нет: запросы из браузера не пройдут |
| Персональные данные | API не отдаёт их ни в одном ответе |
- Отозванный ключ — ответ
401. Заблокированный или удалённый сайт, заблокированный владелец —403. X-Request-IDпишите в свои логи: по нему можно найти запрос при разборе.- Коды ошибок и лимиты запросов — в разделе Ошибки и лимиты.
Идентификаторы
| Идентификатор | Что это | Формат |
|---|---|---|
visitor_id |
посетитель сайта — значение cookie _dara_a; в браузере его отдаёт команда dara('ready') |
UUID |
user_id |
id пользователя на вашем сайте, переданный в аналитику командой dara('user', { user_id: '…' }) после входа или методом POST /users |
строка до 191 символа Unicode |
fingerprint_uuid |
id устройства DARA Fingerprint — только если он подключён к сайту, см. DARA Fingerprint | UUID |
На сервере visitor_id удобно брать из cookie _dara_a запроса, в котором посетитель оформил заказ или заявку, — только если значение похоже на UUID. Сохраните его вместе с заказом: отправка в аналитику обычно идёт позже, из очереди.
Чтобы связать посетителя с пользователем сайта, после входа вызовите на странице:
dara('user', { user_id: 'u-501' });
Методы
| Метод | Назначение |
|---|---|
POST /conversions |
конверсии JS-целей с сервера |
POST /orders |
заказы и возвраты с сервера |
POST /reports |
отчёт по измерениям и метрикам |
POST /visitors/attributes |
атрибуты до 100 посетителей: пол, возрастная группа, география, дети, компания, интересы, категории покупок, параметры — API: посетители |
GET /visitors/{visitor_id} |
атрибуты одного посетителя, его первый и последний визит и число визитов — API: посетители |
GET /network |
настройки сети: передаются ли чувствительные темы — API: посетители |
POST /users |
данные сайта о посетителях: user_id, email, телефон, пол, возраст, город, дети, интересы, параметры — Данные о посетителях |
GET /openapi.json |
описание API в формате OpenAPI, без авторизации |
GET /health |
состояние сервиса — ok или degraded, без авторизации |
Конверсии
POST /conversions записывает достижение цели, которое подтвердилось на сервере: оплату, звонок из колл-центра, сделку в CRM.
export DARA_ANALYTICS_KEY='ak_XXXXXXXX…'
curl -X POST https://analytics.daratech.ru/api/v1/conversions \
-H "Authorization: Bearer $DARA_ANALYTICS_KEY" \
-H "Content-Type: application/json" \
-d '{
"conversions": [
{"id": "deal-7731", "goal": "crm_deal_won", "user_id": "u-501", "occurred_at": "2026-09-14T15:20:00Z", "value": 12000},
{"id": "deal-7732", "goal": "crm_deal_won", "visitor_id": "0b7e6f8a-3c2d-4e5f-9a1b-2c3d4e5f6a7b"}
]
}'
Ответ 202 Accepted:
{"accepted": 1, "duplicates": 0, "rejected": [{"index": 1, "code": "unknown_visitor"}]}
- В одном запросе — до 1000 конверсий.
id— ваш id конверсии, до 64 символов ASCII, уникален в пределах сайта. Повторно присланная конверсия не учитывается и попадает вduplicates, поэтому пачку можно безопасно отправить ещё раз.goal— код цели типа «JS-цель».visitor_idилиuser_id— кто достиг цели,occurred_at— когда,value— ценность достижения: она важнее фиксированной суммы из настроек цели. Безoccurred_atберётся время приёма запроса; время из будущего заменяется временем приёма.- Конверсия записывается в последний визит посетителя до
occurred_at, не старше 90 дней. Если посетитель известен только поuser_id, берётся последний визит связанного с ним посетителя. - Коды отказа:
unknown_goal— у сайта нет включённой цели типа «JS-цель» с таким кодом,unknown_visitor— посетитель не найден,too_old— подходящий визит старше 90 дней.
Заказы
POST /orders передаёт заказы и возвраты. Правила учёта — в разделе Электронная коммерция.
curl -X POST https://analytics.daratech.ru/api/v1/orders \
-H "Authorization: Bearer $DARA_ANALYTICS_KEY" \
-H "Content-Type: application/json" \
-d '{
"orders": [{
"transaction_id": "T-20931",
"visitor_id": "0b7e6f8a-3c2d-4e5f-9a1b-2c3d4e5f6a7b",
"occurred_at": "2026-09-14T12:30:00Z",
"status": "purchased",
"currency": "RUB",
"revenue": 5480,
"products": [
{"id": "SKU-1017", "name": "Платье миди", "category": "Одежда/Женская/Платья", "brand": "Пример", "variant": "синее", "price": 2490, "qty": 2},
{"id": "SKU-2044", "name": "Ремень", "category": "Одежда/Аксессуары", "price": 500, "qty": 1}
]
}]
}'
Ответ 202 Accepted:
{"accepted": 1, "duplicates": 0, "rejected": []}
- В одном запросе — до 500 заказов.
status—purchased(по умолчанию) илиrefunded. Заказ со статусомrefunded— возврат: он уменьшает выручку и заказы того периода, в который пришёл, а прошлые отчёты задним числом не меняет. Правила учёта — в разделе Электронная коммерция.- Заказ узнаётся по
transaction_id: покупка из тега и из API учитывается один раз. - Заказ приписывается визиту по тем же правилам, что конверсия.
- Коды отказа:
unknown_visitor,too_old,invalid_products.
Отчёты
POST /reports строит отчёт тем же движком, что конструктор в кабинете. Права и пределы — как у пользователя с ролью «наблюдатель».
curl -X POST https://analytics.daratech.ru/api/v1/reports \
-H "Authorization: Bearer $DARA_ANALYTICS_KEY" \
-H "Content-Type: application/json" \
-d '{
"dimensions": ["source_type", "source_name"],
"metrics": ["visits", "visitors", "pageviews"],
"date_from": "2026-09-01",
"date_to": "2026-09-14",
"filters": [{"dimension": "device_type", "op": "eq", "values": ["phone"]}],
"attribution": "last_significant",
"robots": "exclude",
"sort": [{"field": "visits", "dir": "desc"}],
"limit": 100
}'
Ответ:
{"data": [
{"dimensions": ["search", "Яндекс"], "metrics": [1840, 1522, 5210]},
{"dimensions": ["search", "Google"], "metrics": [620, 541, 1733]}
],
"totals": [3920, 3311, 11042],
"sampled": false,
"timezone": "Europe/Moscow"}
| Поле запроса | Значение |
|---|---|
dimensions |
до 5 измерений |
metrics |
от 1 до 10 метрик |
date_from, date_to |
даты ГГГГ-ММ-ДД в часовом поясе сайта, включительно; период — до 25 месяцев |
filters |
до 20 условий, объединяются через «и»: {"dimension", "op", "values"}. op — eq (равно), neq (не равно), contains (содержит), regex (регулярное выражение RE2), in (входит в список). У in в values до 100 значений, у остальных — ровно одно |
segment_id |
id сохранённого сегмента сайта |
segment |
условия сегмента прямо в запросе, вместо segment_id; оба поля сразу — ошибка |
attribution |
модель атрибуции: last_significant — последний значимый источник (по умолчанию), first — первый, last — последний |
robots |
exclude — без роботов (по умолчанию), include — все, only — только роботы |
sort |
до 3 условий {"field", "dir"}: field — метрика или измерение из запроса, dir — asc или desc. По умолчанию — первая метрика по убыванию, а если в запросе есть измерение времени — по нему по возрастанию |
limit, offset |
limit — от 1 до 10 000, по умолчанию 100; offset — сколько строк пропустить |
- Измерения и метрики — те же, что в разделе Отчёты и метрики. Полный список их идентификаторов — в описании OpenAPI.
- Измерения аудитории —
gender,age_group,interest,has_children,children_age,company_type,industry,company_region,purchase_category,price_segment,geo_person_country,geo_person_region,geo_person_city,visitor_param:ключ,value_source:атрибут— и метрикиpeople,people_share,undefined_share,network_share,affinity_indexсчитаются по правилам раздела Сеть ДАРА. Значения — коды, как вPOST /visitors/attributes; у интересов, категорий и мест — id справочника, а название — в подписи строки. totals— итоги по метрикам в том же порядке, чтоmetrics.sampled: true— отчёт посчитан по выборке, например потому что запрос не уложился в 30 секунд.- Одновременно — до 2 запросов отчётов на ключ и до 60 в минуту. Третий одновременный запрос и запрос сверх 60 в минуту сразу получают
429с кодомrate_limitedи заголовкомRetry-After. - Неизвестное измерение или метрику, неверные даты и фильтры отчёт отклоняет ответом
422с кодомvalidation_failed— подробности вdetails, коды — в разделе Ошибки и лимиты.
Примеры на PHP
<?php
function dara_analytics(string $method, string $path, ?array $body = null): array
{
$ch = curl_init('https://analytics.daratech.ru/api/v1' . $path);
$options = [
CURLOPT_CUSTOMREQUEST => $method,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('DARA_ANALYTICS_KEY'),
'Content-Type: application/json',
],
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CONNECTTIMEOUT => 3,
CURLOPT_TIMEOUT => 30,
];
if ($body !== null) {
$options[CURLOPT_POSTFIELDS] = json_encode($body, JSON_UNESCAPED_UNICODE | JSON_THROW_ON_ERROR);
}
curl_setopt_array($ch, $options);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
if ($response === false || $status >= 400) {
throw new RuntimeException('ДАРА АНАЛИТИКА: HTTP ' . $status . ' ' . ($response ?: curl_error($ch)));
}
return json_decode($response, true, 512, JSON_THROW_ON_ERROR);
}
$result = dara_analytics('POST', '/conversions', ['conversions' => [
['id' => 'deal-7731', 'goal' => 'crm_deal_won', 'user_id' => 'u-501', 'value' => 12000],
]]);
echo 'Принято: ', $result['accepted'], "\n";
// При оформлении заказа, в запросе посетителя: id посетителя сохраняется вместе с заказом
$cookie = $_COOKIE['_dara_a'] ?? '';
$visitorId = is_string($cookie)
&& preg_match('/\A[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}\z/i', $cookie)
? strtolower($cookie)
: null;
// Позже, в фоновой задаче или обработчике очереди, — отправка заказа
$order = [
'transaction_id' => 'T-20931',
'user_id' => 'u-501',
'currency' => 'RUB',
'revenue' => 5480,
'products' => [
['id' => 'SKU-1017', 'name' => 'Платье миди', 'price' => 2490, 'qty' => 2],
['id' => 'SKU-2044', 'name' => 'Ремень', 'price' => 500, 'qty' => 1],
],
];
if ($visitorId !== null) {
$order['visitor_id'] = $visitorId;
}
dara_analytics('POST', '/orders', ['orders' => [$order]]);
$report = dara_analytics('POST', '/reports', [
'dimensions' => ['source_type'],
'metrics' => ['visits'],
'date_from' => '2026-09-01',
'date_to' => '2026-09-14',
]);
foreach ($report['data'] as $row) {
echo $row['dimensions'][0], ': ', $row['metrics'][0], "\n";
}
Примеры на Python
import os
import httpx
api = httpx.Client(
base_url="https://analytics.daratech.ru/api/v1",
headers={"Authorization": f"Bearer {os.environ['DARA_ANALYTICS_KEY']}"},
timeout=30,
)
result = api.post("/conversions", json={"conversions": [
{"id": "deal-7731", "goal": "crm_deal_won", "user_id": "u-501", "value": 12000},
]})
result.raise_for_status()
print("Принято:", result.json()["accepted"])
api.post("/orders", json={"orders": [{
"transaction_id": "T-20931",
"visitor_id": "0b7e6f8a-3c2d-4e5f-9a1b-2c3d4e5f6a7b",
"currency": "RUB",
"revenue": 5480,
"products": [
{"id": "SKU-1017", "name": "Платье миди", "price": 2490, "qty": 2},
{"id": "SKU-2044", "name": "Ремень", "price": 500, "qty": 1},
],
}]}).raise_for_status()
report = api.post("/reports", json={
"dimensions": ["source_type"],
"metrics": ["visits"],
"date_from": "2026-09-01",
"date_to": "2026-09-14",
})
report.raise_for_status()
for row in report.json()["data"]:
print(row["dimensions"][0], row["metrics"][0])
Как встроить
- Очередь на сервере. Копите конверсии и заказы в очереди и отправляйте пачками. При сетевой ошибке,
429или5xxповторяйте ту же пачку с паузой: дубли поidконверсии иtransaction_idзаказа не учитываются. - Таймауты. Не держите ответ посетителю в ожидании API: отправка в аналитику не должна задерживать оформление заказа.
- Ключ. Храните ключ в секретах сервера и не пишите в логи целиком — достаточно префикса.
Машинное описание методов, полей и схем — OpenAPI: GET https://analytics.daratech.ru/api/v1/openapi.json, без авторизации. Его отдаёт сам API, поэтому оно всегда совпадает с тем, что сервис принимает.