Статистика
Методи для звітів: та сама статистика, що на «Панелі» та на сторінці «Статистика», лише в JSON - для власних дашбордів, вивантажень у таблиці й автоматичних перевірок. Що означають самі показники, докладно розібрано в розділах «Панель» і «Статистика».
| Метод | Адреса | Що робить |
|---|---|---|
| GET | /stats/dashboard | Зведення за період: підсумки, графіки, GEO, пристрої, топ PWA |
| GET | /stats/funnel | Воронка за днями та результати сплітів |
| GET | /stats/subs | Розбивка за однією саб-міткою (sub_1 … sub_20) |
Замініть ВАШ_КЛЮЧ і panel.example.com на свої.
Період
Усі три методи вимагають період - параметри date_from і date_to:
| Параметр | Обов'язково | Що це |
|---|---|---|
date_from | так | Перший день періоду, РРРР-ММ-ДД |
date_to | так | Останній день періоду включно, не раніше date_from |
- Дні беруться повністю:
date_from=2026-10-01&date_to=2026-10-01- це весь день 1 жовтня. - Час - за UTC: день починається о 00:00 UTC, а не за вашим часовим поясом.
- Період - не довший за місяць:
date_toне може бути пізніше, ніжdate_fromплюс один місяць. Потрібна статистика за квартал - запитайте помісячно й складіть (крімuniqі відсотків - їх складати не можна).
Без дат або з періодом, довшим за місяць, прийде 422:
{
"data": null,
"message": "The date to field must be a date before or equal to 2026-02-01.",
"errors": { "date_to": ["The date to field must be a date before or equal to 2026-02-01."] }
}Візити за датою візиту, події - за датою події
Візити, унікальні та вайти рахуються за днем, коли був візит. Встановлення, відкриття, реєстрації та депозити - за днем, коли прийшла подія. Тому на короткому періоді крок воронки буває більшим за 100% від попереднього: події належать до візитів, що були раніше.
Цифри оновлюються раз на кілька хвилин: свіжий візит або депозит з'явиться у звітах із затримкою до 5 хвилин. Статистику видно лише за PWA ваших команд, у admin - за всіма.
Зведення
GET/stats/dashboard
Усе, що показує «Панель», одним запитом. Параметри - лише період.
curl "https://panel.example.com/api/stats/dashboard?date_from=2026-09-29&date_to=2026-10-05" \
-H "Authorization: Bearer ВАШ_КЛЮЧ" \
-H "Accept: application/json"<?php
// composer require guzzlehttp/guzzle
require 'vendor/autoload.php';
$api = new GuzzleHttp\Client([
'base_uri' => 'https://panel.example.com/api/',
'headers' => ['Authorization' => 'Bearer ВАШ_КЛЮЧ', 'Accept' => 'application/json'],
'timeout' => 30,
]);
$response = $api->get('stats/dashboard', ['query' => [
'date_from' => '2026-09-29',
'date_to' => '2026-10-05',
]]);
$metrics = json_decode($response->getBody(), true)['data']['metrics'];
echo "Встановлення: {$metrics['total_installs']['value']} ({$metrics['total_installs']['trend']}%)\n";
echo "Депозити: {$metrics['total_deposits']['value']}, CR {$metrics['avg_cr']['value']}%\n";# pip install requests
import requests
API = "https://panel.example.com/api"
HEADERS = {"Authorization": "Bearer ВАШ_КЛЮЧ", "Accept": "application/json"}
response = requests.get(f"{API}/stats/dashboard", headers=HEADERS, params={
"date_from": "2026-09-29",
"date_to": "2026-10-05",
}, timeout=30)
metrics = response.json()["data"]["metrics"]
print("Встановлення:", metrics["total_installs"]["value"], f'({metrics["total_installs"]["trend"]}%)')
print("Депозити:", metrics["total_deposits"]["value"], f'CR {metrics["avg_cr"]["value"]}%')// Node.js 18+, без залежностей; збережіть як script.mjs
const API = 'https://panel.example.com/api';
const headers = { Authorization: 'Bearer ВАШ_КЛЮЧ', Accept: 'application/json', 'Content-Type': 'application/json' };
const params = new URLSearchParams({ date_from: '2026-09-29', date_to: '2026-10-05' });
const response = await fetch(`${API}/stats/dashboard?${params}`, {
method: 'GET',
headers,
signal: AbortSignal.timeout(30000),
});
const { data } = await response.json();
const { metrics } = data;
console.log('Встановлення:', metrics.total_installs.value, `(${metrics.total_installs.trend}%)`);
console.log('Депозити:', metrics.total_deposits.value, `CR ${metrics.avg_cr.value}%`);Відповідь (скорочено)
{
"data": {
"metrics": {
"previous_period": { "from": "2026-09-22", "to": "2026-09-29" },
"total_visits": { "value": 12480, "trend": 14 },
"total_uniques": { "value": 9870, "trend": 12.2 },
"total_repeats": { "value": 2610, "trend": 21.4 },
"total_whites": { "value": 1310, "trend": -7.7 },
"total_installs": { "value": 2140, "trend": 8.1 },
"total_opens": { "value": 1890, "trend": 11 },
"total_registrations": { "value": 412, "trend": 8.4 },
"total_deposits": {
"value": 96,
"trend": 18.5,
"amounts": [
{ "currency": "USD", "amount": 4820.5 },
{ "currency": "EUR", "amount": 310 }
]
},
"avg_cr": { "value": 4.49, "trend": 6.1 }
},
"chart": [
{ "date": "2026-10-04", "visits": 610, "whites": 60, "installs": 110, "deposits": 4 },
{ "date": "2026-10-05", "visits": 640, "whites": 70, "installs": 120, "deposits": 6 }
],
"geo": [
{ "code": "US", "installs": 1200, "cr": 5.1, "pct": 100 },
{ "code": "DE", "installs": 400, "cr": 3.5, "pct": 33 }
],
"devices": [
{ "name": "Android", "installs": 1900, "pct": 89 },
{ "name": "iOS", "installs": 240, "pct": 11 }
],
"pwas": [
{
"id": "WZAX", "name": "Promo EN", "icon_url": null,
"domains": [{ "id": "K3LP", "domain": "promo-en.example.com" }],
"visits": 12480, "installs": 2140, "cr": 4.5, "status": "active"
}
],
"activity": [
{ "id": "WZAX", "type": "deploy", "msg": "Promo EN is running", "icon_url": null, "time": "2 hours ago" }
]
}
}metrics - підсумки за період. У кожного показника value - значення, trend - зміна у відсотках до рівного за довжиною періоду перед ним (його дати - у previous_period). Якщо в минулому періоді був нуль, а зараз щось є, trend дорівнює 100.
| Поле | Що це |
|---|---|
total_visits | Усі візити |
total_uniques | Унікальні - перші візити відвідувача на потік |
total_repeats | Повторні: візити мінус унікальні |
total_whites | Візити, які фільтр відправив на white-сторінку |
total_installs | Встановлення |
total_opens | Відкриття офера зі встановленого PWA |
total_registrations | Реєстрації з постбеків |
total_deposits | Депозити; amounts - суми виплат за кожною валютою окремо |
avg_cr | Конверсія: депозити ÷ встановлення × 100%. trend - зміна до минулого періоду, за тими самими правилами, що й у решти |
chart - ті самі візити, вайти, встановлення й депозити за днями. День, у якому були лише встановлення чи депозити без візитів, теж є - з нулями у visits і whites.
geo - топ-10 країн за встановленнями: code - код країни (XX - не визначилася), cr - депозити ÷ встановлення, pct - скільки відсотків встановлень від першої країни у списку.
devices - встановлення за типами пристроїв (Android, iOS, Desktop), pct - частка від усіх встановлень.
pwas - топ-10 PWA за встановленнями за період. status: active - увімкнено, paused - вимкнено, archived - в архіві. domains - домени PWA (порожній список, якщо їх немає).
activity - десять останніх змінених PWA, без прив'язки до періоду. Потрібна для стрічки в панелі, у скриптах зазвичай не знадобиться.
Помилки
| Код | message | Коли |
|---|---|---|
422 | The date from field is required. (and 1 more error) | Не передано період |
422 | The date from field must be a valid date. | Дату не розпізнано |
422 | The date to field must be a date after or equal to date from. | date_to раніше за date_from |
422 | The date to field must be a date before or equal to 2026-02-01. | Період довший за місяць (у тексті - останній допустимий день) |
Воронка та спліти
GET/stats/funnel
Воронка Візити → Унік → Встановлення → Відкриття → Рег → Деп за днями та підсумком, плюс результати сплітів.
| Параметр | Обов'язково | Що це |
|---|---|---|
date_from, date_to | так | Період, див. вище |
pwa_id | ні | Лише одне PWA. Чуже або неіснуюче - 404 |
curl "https://panel.example.com/api/stats/funnel?date_from=2026-09-29&date_to=2026-10-05" \
-H "Authorization: Bearer ВАШ_КЛЮЧ" \
-H "Accept: application/json"<?php
// composer require guzzlehttp/guzzle
require 'vendor/autoload.php';
$api = new GuzzleHttp\Client([
'base_uri' => 'https://panel.example.com/api/',
'headers' => ['Authorization' => 'Bearer ВАШ_КЛЮЧ', 'Accept' => 'application/json'],
'timeout' => 30,
]);
$response = $api->get('stats/funnel', ['query' => [
'date_from' => '2026-09-29',
'date_to' => '2026-10-05',
]]);
$funnel = json_decode($response->getBody(), true)['data']['funnel'];
foreach ($funnel['rows'] as $day) {
echo "{$day['date']}: {$day['installs']} встановлень, {$day['deps']} депозитів, CR {$day['cr']}%\n";
}# pip install requests
import requests
API = "https://panel.example.com/api"
HEADERS = {"Authorization": "Bearer ВАШ_КЛЮЧ", "Accept": "application/json"}
response = requests.get(f"{API}/stats/funnel", headers=HEADERS, params={
"date_from": "2026-09-29",
"date_to": "2026-10-05",
}, timeout=30)
funnel = response.json()["data"]["funnel"]
for day in funnel["rows"]:
print(day["date"], day["installs"], "встановлень,", day["deps"], "депозитів, CR", day["cr"])// Node.js 18+, без залежностей; збережіть як script.mjs
const API = 'https://panel.example.com/api';
const headers = { Authorization: 'Bearer ВАШ_КЛЮЧ', Accept: 'application/json', 'Content-Type': 'application/json' };
const params = new URLSearchParams({ date_from: '2026-09-29', date_to: '2026-10-05' });
const response = await fetch(`${API}/stats/funnel?${params}`, {
method: 'GET',
headers,
signal: AbortSignal.timeout(30000),
});
const { data } = await response.json();
for (const day of data.funnel.rows) {
console.log(day.date, day.installs, 'встановлень,', day.deps, 'депозитів, CR', day.cr);
}Відповідь (скорочено)
{
"data": {
"funnel": {
"rows": [
{
"date": "2026-10-05",
"visits": 640, "uniq": 590, "uniques": 520, "repeats": 120, "whites": 70,
"installs": 120, "opens": 105, "regs": 24, "deps": 6,
"inst_pct": 20.3, "open_pct": 87.5, "reg_pct": 20, "dep_pct": 25, "cr": 5
}
],
"totals": {
"date": null,
"visits": 1250, "uniq": 1100, "uniques": 1020, "repeats": 230, "whites": 130,
"installs": 230, "opens": 203, "regs": 44, "deps": 10,
"inst_pct": 20.9, "open_pct": 88.3, "reg_pct": 19.1, "dep_pct": 22.7, "cr": 4.3
}
},
"splits": [
{
"id": "Lm3T",
"name": "Split US",
"status": "active",
"visits": 6100, "installs": 1030, "conversions": 44, "cr": 4.3,
"flows": [
{
"flow_id": "Qp8R", "pwa_id": "WZAX", "pwa_name": "Promo EN", "weight": 50,
"visits": 6100, "installs": 1030, "conversions": 44, "cr": 4.3
}
]
}
],
"pwa": null
}
}funnel.rows - по рядку на день, нові зверху. funnel.totals - підсумок за весь період (date - null).
| Поле | Що це |
|---|---|
visits | Усі візити |
uniq | Унікальні люди - скільки різних відвідувачів прийшло |
uniques | Унікальні візити - перші візити відвідувача на потік. Одна людина, що пройшла з основного PWA на схоже, - це два uniques, але один uniq |
repeats | Повторні: visits − uniques |
whites | Пішли на white-сторінку |
installs, opens, regs, deps | Встановлення, відкриття офера, реєстрації, депозити |
inst_pct | Встановлення ÷ uniq |
open_pct | Відкриття ÷ встановлення |
reg_pct | Реєстрації ÷ встановлення |
dep_pct | Депозити ÷ реєстрації |
cr | Депозити ÷ встановлення - головна конверсія |
Усі відсотки - числа від 0 до 100 (на короткому періоді буває більше, див. вище).
uniq не можна складати
totals.uniq перераховано за весь період: людина, що приходила три дні поспіль, у ньому один раз, а в сумі днів - три. Тому totals.uniq менший за суму uniq за днями, і це правильно. Решта лічильників складається як звичайно.
splits - усі спліти ваших команд із результатами за період: підсумок за сплітом і за кожним потоком усередині (flows) - до якого PWA веде потік (pwa_id, pwa_name) і його вага (weight). conversions - це депозити, cr - депозити ÷ встановлення. З параметром pwa_id список сплітів порожній: спліт об'єднує кілька PWA, і для одного застосунку він не рахується.
pwa - вибране PWA (id і name), якщо передано pwa_id, інакше null.
Помилки
| Код | message | Коли |
|---|---|---|
422 | The date from field is required. (and 1 more error) | Не передано період |
422 | The date from field must be a valid date. | Дату не розпізнано |
422 | The date to field must be a date after or equal to date from. | date_to раніше за date_from |
422 | The date to field must be a date before or equal to 2026-02-01. | Період довший за місяць (у тексті - останній допустимий день) |
404 | Not found | pwa_id чужого або неіснуючого PWA |
Саб-мітки
GET/stats/subs
Які значення однієї саб-мітки приносять встановлення й депозити: наприклад, які кампанії, креативи чи адсети за sub_1 … sub_20 справді конвертять.
| Параметр | Обов'язково | Що це |
|---|---|---|
date_from, date_to | так | Період, див. вище |
slot | так | Номер саб-мітки, від 1 до 20 |
limit | ні | Скільки значень повернути, від 1 до 100, за замовчуванням 20 |
search | ні | Лише значення, у яких є цей підрядок (без урахування регістру) |
filters[sub_N] | ні | Звузити за іншими мітками: filters[sub_1]=fb-ua-creo1 - лише візити з таким sub_1. Можна кілька |
pwa_id | ні | Лише одне PWA: його візити та його конверсії. Чуже або неіснуюче - 404 |
Приклад: які адсети (sub_2) працюють усередині креативу fb-ua-creo1 (sub_1).
curl -G "https://panel.example.com/api/stats/subs" \
-H "Authorization: Bearer ВАШ_КЛЮЧ" \
-H "Accept: application/json" \
--data-urlencode "date_from=2026-09-29" \
--data-urlencode "date_to=2026-10-05" \
--data-urlencode "slot=2" \
--data-urlencode "filters[sub_1]=fb-ua-creo1"<?php
// composer require guzzlehttp/guzzle
require 'vendor/autoload.php';
$api = new GuzzleHttp\Client([
'base_uri' => 'https://panel.example.com/api/',
'headers' => ['Authorization' => 'Bearer ВАШ_КЛЮЧ', 'Accept' => 'application/json'],
'timeout' => 30,
]);
$response = $api->get('stats/subs', ['query' => [
'date_from' => '2026-09-29',
'date_to' => '2026-10-05',
'slot' => 2,
'filters' => ['sub_1' => 'fb-ua-creo1'],
]]);
$subs = json_decode($response->getBody(), true)['data']['subs'];
foreach ($subs as $sub) {
$value = $sub['value'] ?? '(порожньо)';
echo "{$value}: {$sub['installs']} встановлень, CR {$sub['cr']}%\n";
}# pip install requests
import requests
API = "https://panel.example.com/api"
HEADERS = {"Authorization": "Bearer ВАШ_КЛЮЧ", "Accept": "application/json"}
response = requests.get(f"{API}/stats/subs", headers=HEADERS, params={
"date_from": "2026-09-29",
"date_to": "2026-10-05",
"slot": 2,
"filters[sub_1]": "fb-ua-creo1",
}, timeout=30)
subs = response.json()["data"]["subs"]
for sub in subs:
print(sub["value"] or "(порожньо)", sub["installs"], "встановлень, CR", sub["cr"])// Node.js 18+, без залежностей; збережіть як script.mjs
const API = 'https://panel.example.com/api';
const headers = { Authorization: 'Bearer ВАШ_КЛЮЧ', Accept: 'application/json', 'Content-Type': 'application/json' };
const params = new URLSearchParams({
date_from: '2026-09-29',
date_to: '2026-10-05',
slot: 2,
'filters[sub_1]': 'fb-ua-creo1',
});
const response = await fetch(`${API}/stats/subs?${params}`, {
method: 'GET',
headers,
signal: AbortSignal.timeout(30000),
});
const { data } = await response.json();
for (const sub of data.subs) {
console.log(sub.value || '(порожньо)', sub.installs, 'встановлень, CR', sub.cr);
}Відповідь
{
"data": {
"slot": 2,
"pwa": null,
"subs": [
{ "value": "adset-7", "visits": 5210, "installs": 980, "conversions": 51, "cr": 5.2 },
{ "value": null, "visits": 1200, "installs": 140, "conversions": 3, "cr": 2.1 }
]
}
}Значення відсортовано за встановленнями, найкращі зверху. value: null - візити, у яких ця мітка не заповнена. conversions - депозити, cr - депозити ÷ встановлення.
Ключ у filters може бути лише sub_1 … sub_20.
Помилки
| Код | message | Коли |
|---|---|---|
422 | The date from field is required. (and 1 more error) | Не передано період |
422 | The date from field must be a valid date. | Дату не розпізнано |
422 | The date to field must be a date after or equal to date from. | date_to раніше за date_from |
422 | The date to field must be a date before or equal to 2026-02-01. | Період довший за місяць (у тексті - останній допустимий день) |
422 | The slot field is required. | Не передано slot |
422 | The slot field must not be greater than 20. | slot більше 20 |
422 | The limit field must not be greater than 100. | limit більше 100 |
422 | Filter key must be sub_1..sub_20. | Ключ у filters - не sub_1 … sub_20 |
404 | Not found | pwa_id чужого або неіснуючого PWA |