Skip to content

Статистика ​

Методи для звітів: та сама статистика, що на «Панелі» та на сторінці «Статистика», лише в 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:

json
{
  "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

Усе, що показує «Панель», одним запитом. Параметри - лише період.

bash
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
<?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";
python
# 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"]}%')
js
// 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}%`);
Відповідь (скорочено)
json
{
  "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Коли
422The date from field is required. (and 1 more error)Не передано період
422The date from field must be a valid date.Дату не розпізнано
422The date to field must be a date after or equal to date from.date_to раніше за date_from
422The 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
bash
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
<?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";
}
python
# 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"])
js
// 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);
}
Відповідь (скорочено)
json
{
  "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Коли
422The date from field is required. (and 1 more error)Не передано період
422The date from field must be a valid date.Дату не розпізнано
422The date to field must be a date after or equal to date from.date_to раніше за date_from
422The date to field must be a date before or equal to 2026-02-01.Період довший за місяць (у тексті - останній допустимий день)
404Not foundpwa_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).

bash
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
<?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";
}
python
# 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"])
js
// 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);
}
Відповідь
json
{
  "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Коли
422The date from field is required. (and 1 more error)Не передано період
422The date from field must be a valid date.Дату не розпізнано
422The date to field must be a date after or equal to date from.date_to раніше за date_from
422The date to field must be a date before or equal to 2026-02-01.Період довший за місяць (у тексті - останній допустимий день)
422The slot field is required.Не передано slot
422The slot field must not be greater than 20.slot більше 20
422The limit field must not be greater than 100.limit більше 100
422Filter key must be sub_1..sub_20.Ключ у filters - не sub_1 … sub_20
404Not foundpwa_id чужого або неіснуючого PWA