Skip to content

Експорт ​

Два методи віддають готовий 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[]ніОдин або кілька сплітів - конверсії з їхніх потоків
bash
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
<?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";
python
# 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), "байт")
js
// 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');
Відповідь
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_idclick_id з постбеку, якщо партнерка його передала
country, deviceКраїна та пристрій за останнім візитом цього відвідувача
Помилки
КодmessageКоли
422The date from field is required. (and 1 more error)Не передано період
422The date to field must be a date before or equal to 2026-11-01.Період довший за місяць; дата в тексті - date_from плюс місяць
422The date to field must be a date after or equal to date from.date_to раніше за date_from
422The selected event.0 is invalid.Невідомий тип події в event[]
422Invalid pwa_id / Invalid split_idІдентифікатор PWA або спліта не розпізнано
404Not foundPWA або спліт із фільтра чужий або не існує
429Too 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)
bash
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
<?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";
python
# 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), "байт")
js
// 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');
Відповідь
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
unique1 - перший візит цього відвідувача в панелі, 0 - повторний
flow_unique1 - перший візит відвідувача на цей потік (так рахуються уніки у статистиці)
white1 - фільтр відправив відвідувача на білу сторінку, у воронці він не бере участі
from_domainДомен, з якого відкрили PWA
ipIP-адреса відвідувача
sub_1 … sub_20Саб-мітки з посилання, як вони надійшли; порожньо, якщо мітки не було
Помилки
КодmessageКоли
422The date from field is required. (and 1 more error)Не передано період
422The date to field must be a date before or equal to 2026-11-01.Період довший за місяць; дата в тексті - date_from плюс місяць
422The date to field must be a date after or equal to date from.date_to раніше за date_from
422The country field format is invalid.country - не дві літери
422Invalid pwa_id / Invalid split_idІдентифікатор PWA або спліта не розпізнано
404Not foundPWA або спліт із фільтра чужий або не існує
429Too many requests. Try again in a minute.Більше 10 вивантажень на хвилину

Файл великий - звузьте вибірку

Візитів за місяць в активної команди мільйони, і файл важитиме сотні мегабайтів. Вивантажуйте по PWA або по тижню: кілька запитів поспіль швидші за один величезний, а ліміт у 10 вивантажень на хвилину на це й розрахований.