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 выгрузок в минуту на это рассчитан.