Експорт
Два методи віддають готовий CSV-файл за період: усі конверсії або всі візити ваших PWA. Це те саме вивантаження, що й кнопка Export у панелі, тільки скриптом - для звірки з партнеркою і трекером або для звіту в Google Таблицях чи Excel. Для таблиць усередині самої панелі ці методи не потрібні: посторінковий список конверсій віддає GET/conversions, зведені цифри - розділ «Статистика».
| Метод | Адреса | Що робить |
|---|---|---|
| GET | /export/conversions | Конверсії за період у CSV |
| GET | /export/visits | Візити за період у CSV |
Замініть ВАШ_КЛЮЧ і panel.example.com на свої.
Як влаштований файл
- Відповідь - не JSON, а файл:
Content-Type: text/csv; charset=UTF-8, ім'я вContent-Disposition-conversions_2026-10-01_2026-10-07.csvабоvisits_2026-10-01_2026-10-07.csv. - Роздільник
;, кодування UTF-8 з BOM, перший рядок - заголовки колонок. Excel відкриває такий файл подвійним кліком одразу по колонках, Google Таблиці - через File → Import. - Дані беруться з аналітичного сховища: вони відстають від панелі до 5 хвилин, а у файлі конверсій немає колонки зі статусом надсилання у Facebook - але відфільтрувати за ним можна (
export_status). - У файл потрапляє лише те, що ви бачите в панелі: admin - усе, team_lead - свої команди, customer - свої PWA.
- Не частіше 10 вивантажень на хвилину на користувача, далі -
429.
Конверсії в CSV
GET/export/conversions
Усі конверсії за період, по рядку на подію, у порядку отримання.
| Параметр | Обов'язково | Що фільтрує |
|---|---|---|
date_from, date_to | так | Період за датою отримання події: РРРР-ММ-ДД, дні повністю за UTC, не довший за місяць |
event[] | ні | Тип події, можна кілька: install, open_offer, registration, deposit, repeat_deposit |
export_status | ні | Статус надсилання у Facebook: exported, failed, not_exported або open_offer - як у GET/conversions; open_offer лишає тільки відкриття оферу, event[] при цьому ігнорується |
pwa_id або pwa_ids[] | ні | Одне або кілька PWA |
split_id або split_ids[] | ні | Один або кілька сплітів - конверсії з їхніх потоків |
curl -G "https://panel.example.com/api/export/conversions" \
-H "Authorization: Bearer ВАШ_КЛЮЧ" \
-H "Accept: application/json" \
--data-urlencode "date_from=2026-10-01" \
--data-urlencode "date_to=2026-10-07" \
--data-urlencode "event[]=deposit" \
-o conversions.csv<?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' => 120,
]);
$api->get('export/conversions', [
'query' => ['date_from' => '2026-10-01', 'date_to' => '2026-10-07', 'event' => ['deposit']],
'sink' => 'conversions.csv',
]);
echo 'Збережено: conversions.csv, ' . filesize('conversions.csv') . " байт\n";# pip install requests
import requests
API = "https://panel.example.com/api"
HEADERS = {"Authorization": "Bearer ВАШ_КЛЮЧ", "Accept": "application/json"}
response = requests.get(f"{API}/export/conversions", headers=HEADERS, params={
"date_from": "2026-10-01",
"date_to": "2026-10-07",
"event[]": ["deposit"],
}, timeout=120)
response.raise_for_status()
with open("conversions.csv", "wb") as file:
file.write(response.content)
print("Збережено: conversions.csv,", len(response.content), "байт")// Node.js 18+, без залежностей; збережіть як script.mjs
import { writeFileSync } from 'node:fs';
const API = 'https://panel.example.com/api';
const headers = { Authorization: 'Bearer ВАШ_КЛЮЧ', Accept: 'application/json' };
const params = new URLSearchParams({ date_from: '2026-10-01', date_to: '2026-10-07' });
params.append('event[]', 'deposit');
const response = await fetch(`${API}/export/conversions?${params}`, { headers, signal: AbortSignal.timeout(120000) });
if (!response.ok) throw new Error(`HTTP ${response.status}: ${(await response.json()).message}`);
writeFileSync('conversions.csv', Buffer.from(await response.arrayBuffer()));
console.log('Збережено: conversions.csv');Відповідь
date;pwa;split;event;raw_event;payout;currency;visitor_id;tid;click_id;country;device
2026-10-03 14:23:11;Promo EN;;deposit;ftd;45.00;USD;7f3c2a9e-1b4d-4c8e-9a2f-5d6e7f8a9b0c;tx-55102;;DE;Android
2026-10-04 09:02:47;Promo EN;Split A;install;install;;;0b1d8f2c-4e6a-4b7c-8d9e-1f2a3b4c5d6e;;;PL;iOS| Колонка | Що це |
|---|---|
date | Коли подія надійшла в панель, UTC - за цією датою фільтрує період |
pwa | Назва PWA, якому зараховано конверсію |
split | Назва спліта, якщо відвідувач прийшов через його потік; інакше порожньо |
event | Тип події: install, open_offer, registration, deposit, repeat_deposit; порожньо, якщо партнерка надіслала статус, який панель не розпізнала |
raw_event | Статус саме так, як його надіслала партнерка (ftd, sale, reg…) |
payout, currency | Виплата з постбеку, як надійшла |
visitor_id | Відвідувач, за яким конверсія прив'язалася до візиту - той самий visitor_id, що у файлі візитів |
tid | Ідентифікатор транзакції з постбеку |
click_id | click_id з постбеку, якщо партнерка його передала |
country, device | Країна та пристрій за останнім візитом цього відвідувача |
Помилки
| Код | message | Коли |
|---|---|---|
422 | The date from field is required. (and 1 more error) | Не передано період |
422 | The date to field must be a date before or equal to 2026-11-01. | Період довший за місяць; дата в тексті - date_from плюс місяць |
422 | The date to field must be a date after or equal to date from. | date_to раніше за date_from |
422 | The selected event.0 is invalid. | Невідомий тип події в event[] |
422 | Invalid pwa_id / Invalid split_id | Ідентифікатор PWA або спліта не розпізнано |
404 | Not found | PWA або спліт із фільтра чужий або не існує |
429 | Too many requests. Try again in a minute. | Більше 10 вивантажень на хвилину |
Візити в CSV
GET/export/visits
Усі візити за період, по рядку на візит, у порядку часу. Це сирі дані трафіку: за ними звіряють кліки з трекером за саб-мітками та збирають списки відвідувачів, які встановили PWA, але не сконвертувалися.
| Параметр | Обов'язково | Що фільтрує |
|---|---|---|
date_from, date_to | так | Період за часом візиту: РРРР-ММ-ДД, дні повністю за UTC, не довший за місяць |
pwa_id або pwa_ids[] | ні | Одне або кілька PWA |
split_id або split_ids[] | ні | Один або кілька сплітів - візити через їхні потоки |
country | ні | Країна, дволітерний код (DE, PL) |
curl -G "https://panel.example.com/api/export/visits" \
-H "Authorization: Bearer ВАШ_КЛЮЧ" \
-H "Accept: application/json" \
--data-urlencode "date_from=2026-10-01" \
--data-urlencode "date_to=2026-10-07" \
--data-urlencode "pwa_id=WZAX" \
-o visits.csv<?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' => 300,
]);
$api->get('export/visits', [
'query' => ['date_from' => '2026-10-01', 'date_to' => '2026-10-07', 'pwa_id' => 'WZAX'],
'sink' => 'visits.csv',
]);
echo 'Збережено: visits.csv, ' . filesize('visits.csv') . " байт\n";# pip install requests
import requests
API = "https://panel.example.com/api"
HEADERS = {"Authorization": "Bearer ВАШ_КЛЮЧ", "Accept": "application/json"}
response = requests.get(f"{API}/export/visits", headers=HEADERS, params={
"date_from": "2026-10-01",
"date_to": "2026-10-07",
"pwa_id": "WZAX",
}, timeout=300)
response.raise_for_status()
with open("visits.csv", "wb") as file:
file.write(response.content)
print("Збережено: visits.csv,", len(response.content), "байт")// Node.js 18+, без залежностей; збережіть як script.mjs
import { writeFileSync } from 'node:fs';
const API = 'https://panel.example.com/api';
const headers = { Authorization: 'Bearer ВАШ_КЛЮЧ', Accept: 'application/json' };
const params = new URLSearchParams({ date_from: '2026-10-01', date_to: '2026-10-07', pwa_id: 'WZAX' });
const response = await fetch(`${API}/export/visits?${params}`, { headers, signal: AbortSignal.timeout(300000) });
if (!response.ok) throw new Error(`HTTP ${response.status}: ${(await response.json()).message}`);
writeFileSync('visits.csv', Buffer.from(await response.arrayBuffer()));
console.log('Збережено: visits.csv');Відповідь
date;pwa;split;visitor_id;country;lang;os;device;unique;flow_unique;white;from_domain;ip;sub_1;sub_2;sub_3;sub_4;sub_5;sub_6;sub_7;sub_8;sub_9;sub_10;sub_11;sub_12;sub_13;sub_14;sub_15;sub_16;sub_17;sub_18;sub_19;sub_20
2026-10-03 14:20:05;Promo EN;;7f3c2a9e-1b4d-4c8e-9a2f-5d6e7f8a9b0c;DE;de;Android;Android;1;1;0;fit-tracker.example;203.0.113.7;fb-de-01;creative-7;;;;;;;;;;;;;;;;;;
2026-10-03 14:21:40;Promo EN;Split A;0b1d8f2c-4e6a-4b7c-8d9e-1f2a3b4c5d6e;PL;pl;iOS;iOS;1;1;0;fit-tracker.example;198.51.100.23;fb-pl-02;;;;;;;;;;;;;;;;;;;| Колонка | Що це |
|---|---|
date | Час візиту, UTC |
pwa | Назва PWA, на яке прийшов візит |
split | Назва спліта, якщо візит прийшов через його потік; інакше порожньо |
visitor_id | Ідентифікатор відвідувача - за ним візит пов'язується з конверсіями |
country, lang | Країна та мова браузера |
os, device | Операційна система та тип пристрою: Android, iOS або Desktop |
unique | 1 - перший візит цього відвідувача в панелі, 0 - повторний |
flow_unique | 1 - перший візит відвідувача на цей потік (так рахуються уніки у статистиці) |
white | 1 - фільтр відправив відвідувача на білу сторінку, у воронці він не бере участі |
from_domain | Домен, з якого відкрили PWA |
ip | IP-адреса відвідувача |
sub_1 … sub_20 | Саб-мітки з посилання, як вони надійшли; порожньо, якщо мітки не було |
Помилки
| Код | message | Коли |
|---|---|---|
422 | The date from field is required. (and 1 more error) | Не передано період |
422 | The date to field must be a date before or equal to 2026-11-01. | Період довший за місяць; дата в тексті - date_from плюс місяць |
422 | The date to field must be a date after or equal to date from. | date_to раніше за date_from |
422 | The country field format is invalid. | country - не дві літери |
422 | Invalid pwa_id / Invalid split_id | Ідентифікатор PWA або спліта не розпізнано |
404 | Not found | PWA або спліт із фільтра чужий або не існує |
429 | Too many requests. Try again in a minute. | Більше 10 вивантажень на хвилину |
Файл великий - звузьте вибірку
Візитів за місяць в активної команди мільйони, і файл важитиме сотні мегабайтів. Вивантажуйте по PWA або по тижню: кілька запитів поспіль швидші за один величезний, а ліміт у 10 вивантажень на хвилину на це й розрахований.