Публичное HTTP API
Документ описывает, как сторонние интеграции (BI-системы, скрипты, дашборды) могут авторизоваться и получать данные статистики через публичное HTTP API платформы.
Базовый URL: https://adset.pro (production). Swagger UI: https://adset.pro/api/docs (OpenAPI 3.0).
TL;DR (чек-лист)
В UI кабинета (раздел API ключи) создайте PAT (Personal Access Token). Скопируйте токен сразу — он показывается только один раз.
Передавайте токен в каждом запросе заголовком
Authorization: Bearer <token>.Все публичные эндпойнты статистики живут под префиксом
/api/stats/**.Тело запроса для
/api/stats/query— этоStatsQueryDto(см. ниже).Скоупы PAT разделены:
api:stats(читать),api:stats:export(CSV-выгрузка),api:stats:meta(справочники).Альтернатива PAT — OAuth 2.0 (Authorization Code + PKCE) через
/oauth/authorize→/api/oauth/token. Discovery:/.well-known/oauth-authorization-server.
1. Аутентификация
1.1 Personal Access Token (PAT) — рекомендуется для скриптов
Префикс токена: pat_… (~64 символа). Подходит для серверных интеграций и curl.
Использование
curl -X POST 'https://adset.pro/api/stats/meta/metrics' \
-H 'Authorization: Bearer pat_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
Префикс pat_ принимается только на путях /api/*. На /mcp нужен отдельный ключ типа mcp (префикс mcp_).
1.2 OAuth 2.0 (Authorization Code + PKCE) — для приложений
Параметр | Значение |
|---|---|
Authorization endpoint |
|
Token endpoint |
|
Token prefix |
|
Discovery (RFC 8414) |
|
Protected resource (RFC 9728) |
|
Регистрация клиента |
|
OAuth-токены oat_ принимаются и на /api/*, и на /mcp.
1.3 Скоупы доступа к API
Скоуп | Что разрешает |
|---|---|
|
|
|
|
|
|
Эффективные права = скоупы токена ∩ RBAC-роль пользователя-владельца. BUYER видит только свою статистику, TEAM_LEAD — статистику команды по правилам resourceAccess и т.д.
1.4 Стандартные ошибки авторизации
HTTP |
| Причина |
|---|---|---|
401 |
| токен отсутствует / просрочен / отозван |
401 |
|
|
403 |
| у токена нет требуемого scope (см. таблицу 1.3) |
403 |
| RBAC-проверка пользователя не прошла |
2. Эндпойнты публичного API статистики
Базовый префикс — /api/stats. Тело запросов — JSON, ответы — application/json (либо text/csv для экспорта).
Метод | Путь | Скоуп | Назначение |
|---|---|---|---|
|
|
| Получить отчёт (метрики × группировки + фильтры) |
|
|
| Та же выборка, но в виде CSV (без пагинации, до 100 000 строк) |
|
|
| Каталог метрик |
|
|
| Каталог группировок |
|
|
| Список фильтруемых полей |
|
|
| Подсказки (autocomplete) для значения поля |
|
|
| Подсказки для версий ОС |
2.1 POST /api/stats/query
Тело запроса (StatsQueryDto):
{
"time": {
"preset": "last7", // ИЛИ from/to
"from": "2026-05-01 00:00:00",
"to": "2026-05-20 23:59:59",
"timezone": "UTC"
},
"groups": ["day", "cmp_campaign"], // см. Раздел 5
"metrics": ["clicks", "cpa_accept", "revenue", "roi"],
"filters": [
{ "field": "user_country", "op": "in", "value": ["US", "CA"] },
{ "field": "cmp_offer", "op": "eq", "value": "65f0…" }
],
"pagination": { "page": 1, "limit": 100 },
"sort": { "field": "clicks", "order": "desc" },
"attributionWindow": { "hours": 24, "eventType": "click" }
}
Правила
timeобязателен; нужно передать либоpreset, либоfrom(опционально сto).groups— массив ключей из таблицы группировок (см. раздел 5). Пустой массив → агрегат «всего».metrics— массив ключей метрик из раздела 6. По умолчанию["clicks"].filters[*].op— оператор из таблицы 4.1.pagination.limit≤ 100 000 (фактический максимум API), дляqueryрекомендуется ≤ 100.attributionWindowприменяется только к Push-метрикам (push_postclick_*).
Пример ответа
{
"data": {
"rows": [
{
"day": "2026-05-13T00:00:00+00:00",
"cmp_campaign": "65f0…",
"cmp_campaign_name": "Brand A — RU",
"clicks": 18432,
"cpa_accept": 122,
"revenue": 2840.55,
"roi": 0.36
}
],
"total": { "clicks": 18432, "cpa_accept": 122, "revenue": 2840.55 },
"page": 1,
"limit": 100,
"rowCount": 1
},
"traceId": "01HX…"
}
2.2 POST /api/stats/export/csv
То же тело StatsQueryDto. Ответ — text/csv; charset=utf-8, имя файла stats-report-YYYY-MM-DD.csv. Пагинация игнорируется (фиксируется в 100 000 строк).
curl -X POST 'https://adset.pro/api/stats/export/csv' \
-H 'Authorization: Bearer pat_…' \
-H 'Content-Type: application/json' \
--data-binary @query.json -o report.csv
2.3 GET /api/stats/meta/metrics
Возвращает список объектов вида:
{
"key": "roi",
"type": "calculated",
"title": "ROI",
"group": "Finance",
"format": "percent",
"dependencies": ["revenue", "cost"],
"table": "events"
}
2.4 GET /api/stats/meta/groups
{ "key": "cmp_campaign", "title": "Campaign", "group": "Campaign", "tables": ["events", "events_push", "events_push_attributed"] }
2.5 GET /api/stats/meta/filters
{ "field": "user_country", "type": "list", "group": "Traffic", "name": "Country" }
2.6 GET /api/stats/meta/distinct
Запрос: ?field=user_country&q=us&limit=20. Поле должно входить в meta/filters.
{
"data": [
{ "label": "US", "value": "US" },
{ "label": "Australia", "value": "AU" }
],
"traceId": "01HX…"
}
2.7 GET /api/stats/meta/os-versions
То же, что distinct?field=user_os_ver, но с дополнительной нормализацией версий.
3. Структура StatsQueryDto
Поле | Тип | Обяз. | Описание |
|---|---|---|---|
|
| да | Временной интервал отчёта |
|
| нет | Массив группировок (раздел 5) |
|
| нет | Массив ключей метрик (раздел 6). По умолчанию |
|
| нет | Массив фильтров (раздел 4) |
|
| нет |
|
|
| нет |
|
|
| нет | Окно атрибуции для Push-метрик: |
3.1 TimeRangeDto
Поле | Описание |
|---|---|
|
|
| то же |
| IANA TZ, по умолчанию |
| один из пресетов (раздел 3.2). Имеет приоритет над |
3.2 Пресеты дат (time.preset)
Пресет | Что значит |
|---|---|
| Сегодня от 00:00 до текущего момента |
| Полные предыдущие сутки |
| Последние 7 полных дней (включая сегодня) |
| Последние 30 полных дней |
| С понедельника текущей недели |
| Предыдущая полная неделя (Пн–Вс) |
| С 1-го числа текущего месяца |
| Предыдущий полный месяц |
4. Фильтры
4.1 Операторы (FieldFilterDto.op)
Оператор | Семантика | Тип |
|---|---|---|
| равно | строка/число |
| не равно | строка/число |
| значение из списка | массив |
| значения нет в списке | массив |
| больше | число |
| меньше | число |
| больше или равно | число |
| меньше или равно | число |
| в диапазоне |
|
| подстрока (case-insensitive, ClickHouse | строка с |
4.2 Серверные фильтры (нельзя задавать клиентом)
Поля cmp_team и cmp_user всегда переопределяются сервером согласно роли пользователя — попытка задать их клиентом игнорируется (для cmp_user — пересекается с разрешённым набором, см. раздел 1.3).
4.3 Полный список фильтруемых полей
Поле | Имя | Группа |
|---|---|---|
| Device | Traffic |
| Platform | Traffic |
| OS | Traffic |
| OS Version | Traffic |
| Browser | Traffic |
| Browser Version | Traffic |
| Language | Traffic |
| Country | Traffic |
| Region | Traffic |
| ASN | Traffic |
| ASN Org | Traffic |
| IP | Traffic |
| Domain | Event |
| Click ID | Event |
| Event Type | Event |
| UTM Source | UTM |
| UTM Campaign | UTM |
| UTM Medium | UTM |
| UTM Content | UTM |
| UTM Term | UTM |
| Sub1 | UTM |
| Sub2 | UTM |
| Sub3 | UTM |
| Sub4 | UTM |
| Sub5 | UTM |
| Sub6 | UTM |
| Sub7 | UTM |
| Sub8 | UTM |
| Sub9 | UTM |
| Sub10 | UTM |
| User | Stream |
| Team | Stream |
| Campaign | Stream |
| CPA | Stream |
| Offer | Stream |
| Offer type | Stream |
| Flow | Stream |
| Creative | Stream |
| PWA | Stream |
| Landing | Stream |
| Source | Stream |
| Set | Stream |
| Rotation | Stream |
| Push ID | Push |
| Slot Key | Push |
| Sub ID | Push |
Для значений-перечислений (страны, ОС, кампании и т.п.) удобно использовать GET /api/stats/meta/distinct?field=…&q=… — он вернёт пары {label, value}.
5. Группировки (groups[])
Если рядом с ID-полем существует «name»-вариант (cmp_campaign ↔ cmp_campaign_name), его не нужно явно добавлять — он подмешивается в проекцию автоматически.
tables — типы ответов для которых группировка валидна:
events— основная воронка (clicks, conversions, finance);events_push— Push-события;events_push_attributed— Post-click атрибуция Push;events_ltv— LTV / Cohort.
5.1 Время
Ключ | Заголовок | Группа | Таблицы |
|---|---|---|---|
| Hour | Time | events, events_push, events_push_attributed |
| Hour (DateTime) | Time | events, events_push, events_push_attributed |
| Day | Time | events, events_push, events_push_attributed |
| Week | Time | events, events_push, events_push_attributed |
| Month | Time | events, events_push, events_push_attributed |
5.2 Cohort / LTV
Ключ | Заголовок | Группа | Таблицы |
|---|---|---|---|
| Cohort (Day) | Cohort | events_ltv |
| Cohort (Week) | Cohort | events_ltv |
| Cohort (Month) | Cohort | events_ltv |
| Lifetime Days | Cohort | events_ltv |
| Reg Cohort (Day) | Cohort | events_ltv |
| Reg Cohort (Week) | Cohort | events_ltv |
| Reg Cohort (Month) | Cohort | events_ltv |
| Lifetime Days (Reg) | Cohort | events_ltv |
5.3 Пользователь / Сеть
Ключ | Заголовок | Группа | Таблицы |
|---|---|---|---|
| Device | User | events, events_push, events_push_attributed |
| Platform | User | events, events_push, events_push_attributed |
| OS | User | events, events_push, events_push_attributed |
| OS Version | User | events, events_push, events_push_attributed |
| Browser | User | events, events_push, events_push_attributed |
| Browser Version | User | events, events_push, events_push_attributed |
| Language | User | events, events_push, events_push_attributed |
| Language Name | User | events, events_push, events_push_attributed |
| Country | User | events, events_push, events_push_attributed |
| Country Name | User | events, events_push, events_push_attributed |
| Region | User | events, events_push, events_push_attributed |
| Proxy | User | events, events_push, events_push_attributed |
| Proxy Type | User | events, events_push, events_push_attributed |
| Proxy Usage | User | events, events_push, events_push_attributed |
| Is Bot | User | events, events_push, events_push_attributed |
| ASN | Network | events, events_push, events_push_attributed |
| ASN Org | Network | events, events_push, events_push_attributed |
| Domain | User | events |
5.4 Маркетинг (UTM / External / Campaign)
Ключ | Заголовок | Группа | Таблицы |
|---|---|---|---|
| UTM Source | UTM | events |
| UTM Campaign | UTM | events |
| UTM Medium | UTM | events |
| UTM Content | UTM | events |
| UTM Term | UTM | events |
| Sub 1 … Sub 10 | External | events |
| Campaign Owner ID | Campaign | events, events_push, events_push_attributed |
| Campaign Owner Name | Campaign | events, events_push, events_push_attributed |
| Campaign Owner Email | Campaign | events, events_push, events_push_attributed |
| Campaign ID | Campaign | events, events_push, events_push_attributed |
| Campaign Name | Campaign | events, events_push, events_push_attributed |
| CPA ID | Campaign | events, events_push, events_push_attributed |
| CPA Name | Campaign | events, events_push, events_push_attributed |
| Offer ID | Campaign | events, events_push, events_push_attributed |
| Offer Name | Campaign | events, events_push, events_push_attributed |
| Flow Link ID | Campaign | events, events_push, events_push_attributed |
| Flow Name | Campaign | events, events_push, events_push_attributed |
| PWA ID | Campaign | events, events_push, events_push_attributed |
| PWA Name | Campaign | events, events_push, events_push_attributed |
| Landing ID | Campaign | events, events_push, events_push_attributed |
| Landing Name | Campaign | events, events_push, events_push_attributed |
| Traffic Source ID | Campaign | events, events_push, events_push_attributed |
| Traffic Source Name | Campaign | events, events_push, events_push_attributed |
| Campaign Stream Set ID | Campaign | events, events_push, events_push_attributed |
| Campaign Stream Set Rotation ID | Campaign | events, events_push, events_push_attributed |
5.5 Push / Event
Ключ | Заголовок | Группа | Таблицы |
|---|---|---|---|
| Push ID | Push | events_push, events_push_attributed |
| Push Name | Push | events_push, events_push_attributed |
| Slot Key | Push | events_push, events_push_attributed |
| Sub ID | Push | events_push, events_push_attributed |
| Event Type | Event | events |
6. Метрики (metrics[])
type различает прямые агрегаты (direct) и вычисляемые из других метрик (calculated). У calculated в dependencies перечислены метрики, которые автоматически добавляются в ответ.
format — подсказка для фронтовых форматтеров: ceil (целое), finance (деньги, USD), percent (доля 0..1).
6.1 Трафик и финансы
Ключ | Заголовок | Группа | Тип | Формат | Зависимости / Описание |
|---|---|---|---|---|---|
| Clicks | Traffic | direct | ceil | Уникальные клики (по паре |
| Clicks All | Traffic | direct | ceil | Все клики без дедупликации |
| Filtered | Traffic | direct | ceil | События |
| CPC | Traffic | calculated | finance |
|
| RPM | Traffic | calculated | finance |
|
| Costs | Finance | direct | finance | Сумма |
| Revenue | Finance | direct | finance | Сумма |
| Profit | Finance | calculated | finance |
|
| ROI | Finance | calculated | percent |
|
| EPL | Finance | calculated | finance |
|
| EPC | Finance | calculated | finance |
|
| CPL | Finance | calculated | finance |
|
| EPL Total | Finance | calculated | finance |
|
| CPL Total | Finance | calculated | finance |
|
6.2 Лендинг
Ключ | Заголовок | Группа | Тип | Формат | Описание |
|---|---|---|---|---|---|
| Impression | Landing | direct | ceil | События |
| Clicks | Landing | direct | ceil | События |
| CTR | Landing | calculated | percent |
|
6.3 PWA
Ключ | Заголовок | Группа | Тип | Формат | Описание |
|---|---|---|---|---|---|
| Impression | PWA | direct | ceil |
|
| Install | PWA | direct | ceil |
|
| Open | PWA | direct | ceil |
|
| iOS Install | PWA | direct | ceil |
|
| Click 2 Install | PWA | calculated | percent |
|
| Click 2 iOS Install | PWA | calculated | percent |
|
| Imp 2 Install | PWA | calculated | percent |
|
6.4 Postlanding
Ключ | Заголовок | Группа | Тип | Формат | Описание |
|---|---|---|---|---|---|
| Impression | Postlanding | direct | ceil |
|
| Clicks | Postlanding | direct | ceil |
|
| CTR | Postlanding | calculated | percent |
|
6.5 Notify
Ключ | Заголовок | Группа | Тип | Формат | Описание |
|---|---|---|---|---|---|
| Notify requests | Notify | direct | ceil |
|
| Notify subscribes | Notify | direct | ceil |
|
| Notify declines | Notify | direct | ceil |
|
| Clicks | Notify | direct | ceil |
|
6.6 Конверсии
Ключ | Заголовок | Группа | Тип | Формат | Описание |
|---|---|---|---|---|---|
| Registration | Conversion | direct | ceil |
|
| FTDs | Conversion | direct | ceil |
|
| DECLINE | Conversion | direct | ceil |
|
| TRASH | Conversion | direct | ceil |
|
| Re-Deposits | Conversion | direct | ceil |
|
| FTD Revenue | Conversion | direct | finance | Доход с FTD |
| ReDep Revenue | Conversion | direct | finance | Доход с повторных депов |
| Total Deposits | Conversion | calculated | ceil |
|
| Total Dep Revenue | Conversion | calculated | finance |
|
| Dep 2 ReDep | Conversion | calculated | percent |
|
| Click 2 Reg | Conversion | calculated | percent |
|
| Click 2 Dep | Conversion | calculated | percent |
|
| Click 2 Dep Total | Conversion | calculated | percent |
|
| Install 2 Reg | Conversion | calculated | percent |
|
| Install to FTDs | Conversion | calculated | percent |
|
| Reg 2 Dep | Conversion | calculated | percent |
|
6.7 Telegram
Ключ | Заголовок | Группа | Тип | Формат | Описание |
|---|---|---|---|---|---|
| TG Starts | Telegram | direct | ceil |
|
| TG Joins | Telegram | direct | ceil |
|
| Click 2 Start | Telegram | calculated | percent |
|
| Click 2 Join | Telegram | calculated | percent |
|
6.8 Push (таблица events_push)
Ключ | Заголовок | Группа | Тип | Формат | Описание |
|---|---|---|---|---|---|
| Push Views | Push | direct | ceil | Просмотры push |
| Push Clicks | Push | direct | ceil | Клики по push |
| Push CTR | Push | calculated | percent |
|
6.9 Push Attribution (таблица events_push_attributed)
Требует параметра attributionWindow в запросе.
Ключ | Заголовок | Группа | Тип | Формат | Описание |
|---|---|---|---|---|---|
| Post-Click Registrations | Push Attribution | direct | ceil | Регистрации в окне атрибуции после push-клика |
| Post-Click FTDs | Push Attribution | direct | ceil | FTD после push-клика |
| Post-Click ReDeps | Push Attribution | direct | ceil | ReDep после push-клика |
| Click to Reg | Push Attribution | calculated | percent |
|
| Click to FTD | Push Attribution | calculated | percent |
|
| Reg to Dep | Push Attribution | calculated | percent |
|
6.10 LTV / Cohort (таблица events_ltv)
Используются вместе с группировками cohort_* / reg_cohort_* / lifetime_days* (раздел 5.2). LTV считается от даты FTD (ftd_time), Reg-LTV — от даты регистрации (reg_time).
Ключ | Заголовок | Группа | Тип | Формат | Описание |
|---|---|---|---|---|---|
| Avg ReDep Revenue | LTV | calculated | finance |
|
| ReDeps per FTD | LTV | calculated | number |
|
| ReDep Users | LTV | direct | ceil | Уникальные |
| FTD to ReDep Rate | LTV | calculated | percent |
|
| LTV Day 0 | LTV | direct | finance | Доход за день FTD |
| LTV Day 1-7 | LTV | direct | finance | Доход в 1–7 день после FTD |
| LTV Day 8-30 | LTV | direct | finance | Доход в 8–30 день после FTD |
| LTV Day 31-90 | LTV | direct | finance | Доход в 31–90 день после FTD |
| LTV Total | LTV | calculated | finance | Сумма LTV окон от FTD |
| LTV per FTD | LTV | calculated | finance |
|
| LTV Reg Day 0 | LTV | direct | finance | Доход за день регистрации |
| LTV Reg Day 1-7 | LTV | direct | finance | Доход в 1–7 день после регистрации |
| LTV Reg Day 8-30 | LTV | direct | finance | Доход в 8–30 день после регистрации |
| LTV Reg Day 31-90 | LTV | direct | finance | Доход в 31–90 день после регистрации |
| LTV Reg Total | LTV | calculated | finance | Сумма LTV окон от регистрации |
| LTV per Reg | LTV | calculated | finance |
|
| Registrations | Cohort | direct | ceil |
|
| FTDs | Cohort | direct | ceil |
|
| Reg to FTD | Cohort | calculated | percent |
|
7. Примеры (curl)
7.1 Получить отчёт по дням и кампаниям за прошлую неделю
curl -X POST 'https://adset.pro/api/stats/query' \
-H 'Authorization: Bearer pat_…' \
-H 'Content-Type: application/json' \
-d '{
"time": { "preset": "prevWeek", "timezone": "Europe/Moscow" },
"groups": ["day", "cmp_campaign"],
"metrics": ["clicks", "cpa_accept", "revenue", "roi"],
"filters": [
{ "field": "user_country", "op": "in", "value": ["US","CA","GB"] }
],
"pagination": { "page": 1, "limit": 50 },
"sort": { "field": "revenue", "order": "desc" }
}'
7.2 Подсказки по странам
curl -G 'https://adset.pro/api/stats/meta/distinct' \
-H 'Authorization: Bearer pat_…' \
--data-urlencode 'field=user_country' \
--data-urlencode 'q=u' \
--data-urlencode 'limit=10'
7.3 LTV-когорта по неделям
curl -X POST 'https://adset.pro/api/stats/query' \
-H 'Authorization: Bearer pat_…' \
-H 'Content-Type: application/json' \
-d '{
"time": { "preset": "last30" },
"groups": ["cohort_week", "lifetime_days"],
"metrics": ["ftds", "ltv_d0", "ltv_d1_7", "ltv_d8_30", "ltv_total", "ltv_per_ftd"],
"pagination": { "page": 1, "limit": 1000 }
}'
7.4 Push Attribution с окном 48 часов
curl -X POST 'https://adset.pro/api/stats/query' \
-H 'Authorization: Bearer pat_…' \
-H 'Content-Type: application/json' \
-d '{
"time": { "preset": "last7" },
"groups": ["day", "event_push_id"],
"metrics": ["push_views", "push_clicks", "push_postclick_accepts", "push_click_to_accept_rate"],
"attributionWindow": { "hours": 48, "eventType": "click" }
}'
7.5 Экспорт CSV
curl -X POST 'https://adset.pro/api/stats/export/csv' \
-H 'Authorization: Bearer pat_…' \
-H 'Content-Type: application/json' \
--data-binary @query.json -o report.csv
8. Стандартные ошибки
HTTP | Тело | Когда |
|---|---|---|
|
| Не передан |
|
| Некорректный временной интервал |
|
| Токен битый/просрочен |
|
| Не хватает scope (см. 1.3) |
|
| RBAC запрещает действие |
| стандартная схема | Неверная форма JSON / |
9. Лимиты и ограничения
Параметр | Лимит |
|---|---|
| 1 — 100 000 (рекомендовано ≤ 100 для UI, ≤ 10 000 для скриптов) |
Экспорт CSV | до 100 000 строк |
| 1 — 720 (30 дней) |
Длина имени PAT | 100 символов |
Срок жизни PAT | задаётся при создании ( |
