Экспорт
Два метода отдают готовый 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 выгрузок в минуту на это рассчитан.