Skip to content

Спліти ​

Методи для сплітів: знайти потрібні, створити, запустити або зупинити, задати власні посилання на пропозиції та пікселі, наклонувати й прибрати в архів. Що таке спліт і як він ділить трафік, див. розділ «Спліти та потоки». Які PWA входять у спліт і з якими вагами, задається потоками - див. розділ API «Потоки».

МетодАдресаЩо робить
GET/pwa_splitsСписок сплітів
GET/pwa_splits/{id}Один спліт із потоками й доменами
POST/pwa_splitsСтворити спліт
PUT/pwa_splits/{id}Змінити, запустити або зупинити
POST/pwa_splits/{id}/cloneКлонувати
DELETE/pwa_splits/{id}Прибрати в архів

Замініть ВАШ_КЛЮЧ і panel.example.com на свої.

Список сплітів ​

GET/pwa_splits

Спліти ваших команд, нові й нещодавно змінені зверху. Архівні не показуються.

ПараметрЩо фільтрує
searchЧастина назви
domainЧастина домену, прив'язаного до спліта
statusactive - лише запущені, inactive - лише зупинені
archived1 - лише архівні
team_idКоманда
page, per_pageСторінка та її розмір (за замовчуванням 100)
bash
curl "https://panel.example.com/api/pwa_splits?status=active" \
  -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('pwa_splits', ['query' => ['status' => 'active']]);
$splits = json_decode($response->getBody(), true)['data']['pwa_splits'];

foreach ($splits as $split) {
    echo "{$split['id']} {$split['name']}: {$split['pwa_flows_count']} потоків" . PHP_EOL;
}
python
# pip install requests
import requests

API = "https://panel.example.com/api"
HEADERS = {"Authorization": "Bearer ВАШ_КЛЮЧ", "Accept": "application/json"}

response = requests.get(f"{API}/pwa_splits", headers=HEADERS, params={"status": "active"}, timeout=30)
splits = response.json()["data"]["pwa_splits"]

for split in splits:
    print(split["id"], split["name"], split["pwa_flows_count"], "потоків")
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 response = await fetch(`${API}/pwa_splits?status=active`, { headers, signal: AbortSignal.timeout(30000) });
const { data } = await response.json();

for (const split of data.pwa_splits) {
  console.log(split.id, split.name, split.pwa_flows_count, 'потоків');
}
Відповідь (скорочено)
json
{
  "data": {
    "meta": { "current_page": 1, "per_page": 100, "last_page": 1, "total": 1 },
    "pwa_splits": [
      {
        "id": "WQby",
        "name": "US test",
        "status": "active",
        "archived": false,
        "filter_stream_id": null,
        "pwa_flows_count": 2,
        "domains_count": 1,
        "stat_uniques": 1520,
        "stat_installs": 410,
        "stat_registrations": 96,
        "stat_deposits": 21,
        "stat_repeat_deposits": 7,
        "team": { "id": "WZAX", "name": "Team A" },
        "pwa_flows": [
          { "id": "ymqy", "weight": 70, "pwa": { "id": "WZAX", "name": "Promo EN", "active": true } },
          { "id": "Xbpy", "weight": 30, "pwa": { "id": "Lm3T", "name": "Promo EN 2", "active": true } }
        ],
        "domains": [ { "id": "Xk9P", "domain": "spin-us.example" } ],
        "created_at": "05 Oct 2026 14:22",
        "updated_at": "05 Oct 2026 14:22"
      }
    ]
  }
}

Лічильники stat_* - сума за потоками спліта за весь час. У спліта без потоків вони приходять як null, а не 0.

Помилки - лише загальні, див. «Вступ до API».

Один спліт ​

GET/pwa_splits/{id}

Спліт із доменами, потоками та власними налаштуваннями в config.

bash
curl https://panel.example.com/api/pwa_splits/WQby \
  -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('pwa_splits/WQby');
$split = json_decode($response->getBody(), true)['data']['pwa_split'];

echo "{$split['name']}: {$split['status']}" . PHP_EOL;
python
# pip install requests
import requests

API = "https://panel.example.com/api"
HEADERS = {"Authorization": "Bearer ВАШ_КЛЮЧ", "Accept": "application/json"}

response = requests.get(f"{API}/pwa_splits/WQby", headers=HEADERS, timeout=30)
split = response.json()["data"]["pwa_split"]

print(split["name"], split["status"])
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 response = await fetch(`${API}/pwa_splits/WQby`, { headers, signal: AbortSignal.timeout(30000) });
const { data } = await response.json();

console.log(data.pwa_split.name, data.pwa_split.status);
Відповідь (скорочено)
json
{
  "data": {
    "pwa_split": {
      "id": "WQby",
      "name": "US test",
      "status": "active",
      "filter_account_id": null,
      "filter_stream_id": null,
      "team": { "id": "WZAX", "name": "Team A" },
      "domains": [ { "id": "Xk9P", "domain": "spin-us.example" } ],
      "pwa_flows": [
        { "id": "ymqy", "weight": 70, "stat_installs": 290, "pwa": { "id": "WZAX", "name": "Promo EN" } },
        { "id": "Xbpy", "weight": 30, "stat_installs": 120, "pwa": { "id": "Lm3T", "name": "Promo EN 2" } }
      ],
      "config": {
        "offerLinks": {
          "US": [ { "lang": "en", "link": "https://offer.example/?sub1={sub1}" } ]
        }
      }
    }
  }
}

config у спліта може бути null - тоді працюють налаштування самих PWA.

Поки AI-розрахунок ваг увімкнений, у відповіді є ai: shares - поточна частка кожного потоку у відсотках (за id потоку) і learning - true, поки в якогось потоку менше 100 унікальних візитів. З вимкненим AI-розрахунком ai дорівнює null.

Помилки
КодmessageКоли
404Not foundНеправильний ідентифікатор
403This action is unauthorized.Об'єкт належить не вашій команді

Створення спліта ​

POST/pwa_splits

ПолеОбов'язковоЩо це
nameтакНазва спліта в панелі
team_idдля team_lead і adminКоманда; у customer підставляється сама
statusніactive - одразу запустити. За замовчуванням спліт створюється зупиненим
filter_account_id, filter_stream_idніАкаунт фільтрації та потік у ньому - замість фільтра самих PWA
config.offerLinksніВласні посилання на пропозиції - замість посилань самих PWA, формат як у PWA
config.metricsніВласний піксель Facebook (facebook.pixelId, facebook.events) і тег Google (google.tagId)
config.aiніAI-розрахунок ваг: enabled (true/false) і goal - install, registration або deposit (за замовчуванням install)
bash
curl -X POST https://panel.example.com/api/pwa_splits \
  -H "Authorization: Bearer ВАШ_КЛЮЧ" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "US test",
    "team_id": "WZAX",
    "config": {
      "offerLinks": { "US": [ { "lang": "en", "link": "https://offer.example/?sub1={sub1}" } ] }
    }
  }'
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->post('pwa_splits', ['json' => [
    'name' => 'US test',
    'team_id' => 'WZAX',
    'config' => [
        'offerLinks' => ['US' => [['lang' => 'en', 'link' => 'https://offer.example/?sub1={sub1}']]],
    ],
]]);
$split = json_decode($response->getBody(), true)['data']['pwa_split'];

echo "Створено спліт {$split['id']}" . PHP_EOL;
python
# pip install requests
import requests

API = "https://panel.example.com/api"
HEADERS = {"Authorization": "Bearer ВАШ_КЛЮЧ", "Accept": "application/json"}

response = requests.post(f"{API}/pwa_splits", headers=HEADERS, json={
    "name": "US test",
    "team_id": "WZAX",
    "config": {
        "offerLinks": {"US": [{"lang": "en", "link": "https://offer.example/?sub1={sub1}"}]},
    },
}, timeout=30)
split = response.json()["data"]["pwa_split"]

print("Створено спліт", split["id"])
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 response = await fetch(`${API}/pwa_splits`, {
  method: 'POST',
  headers,
  body: JSON.stringify({
    name: 'US test',
    team_id: 'WZAX',
    config: {
      offerLinks: { US: [{ lang: 'en', link: 'https://offer.example/?sub1={sub1}' }] },
    },
  }),
  signal: AbortSignal.timeout(30000),
});
const { data } = await response.json();

console.log('Створено спліт', data.pwa_split.id);

Відповідь - створений спліт у data.pwa_split, у тому ж вигляді, що й GET/pwa_splits/{id}: status (inactive, якщо ви його не передали), team, порожні domains і pwa_flows. Потоки додаються методами розділу API «Потоки», домени - методами розділу API «Домени».

Помилки
КодmessageКоли
422The team id field is required.Не передано team_id (для team_lead і admin)
422You do not have access to this teamteam_id - не ваша команда
422The name field is required.Не передано name
422The selected status is invalid.status - не active і не inactive
422The offer links country "USA" must be a two-letter code.Країна в config.offerLinks - не дволітерний код
422The link field format is invalid.Посилання в config.offerLinks не починається з http:// або https://
422The selected resource does not existpixelId або tagId - не ідентифікатор вашого пікселя чи тегу з розділу API «Пікселі й теги»

Зміна, запуск і зупинка ​

PUT/pwa_splits/{id}

Змінює лише передані поля. Приймає ті самі поля, що й створення. team_id тут передавати не потрібно - лише якщо переносите спліт в іншу команду.

Запустити спліт:

bash
curl -X PUT https://panel.example.com/api/pwa_splits/WQby \
  -H "Authorization: Bearer ВАШ_КЛЮЧ" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"status": "active"}'
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->put('pwa_splits/WQby', ['json' => ['status' => 'active']]);
$split = json_decode($response->getBody(), true)['data']['pwa_split'];

echo "{$split['name']}: {$split['status']}" . PHP_EOL;
python
# pip install requests
import requests

API = "https://panel.example.com/api"
HEADERS = {"Authorization": "Bearer ВАШ_КЛЮЧ", "Accept": "application/json"}

response = requests.put(f"{API}/pwa_splits/WQby", headers=HEADERS, json={"status": "active"}, timeout=30)
split = response.json()["data"]["pwa_split"]

print(split["name"], split["status"])
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 response = await fetch(`${API}/pwa_splits/WQby`, {
  method: 'PUT',
  headers,
  body: JSON.stringify({ status: 'active' }),
  signal: AbortSignal.timeout(30000),
});
const { data } = await response.json();

console.log(data.pwa_split.name, data.pwa_split.status);

Зупинити - те саме з "status": "inactive". Учасники команди отримають сповіщення, що спліт зупинено.

config замінюється повністю

Якщо в запиті є config, він замінює всі налаштування спліта: передали лише metrics - посилання на пропозиції зітруться. Спершу отримайте поточний config, змініть у ньому потрібне й надішліть назад повністю - так само, як у PWA.

Відповідь - спліт після зміни в data.pwa_split, із потоками й доменами.

Запуск, зупинка та нові налаштування доходять до трафіку протягом трьох хвилин.

Помилки
КодmessageКоли
404Not foundНеправильний ідентифікатор
403This action is unauthorized.Об'єкт належить не вашій команді
422The selected status is invalid.status - не active і не inactive
422You do not have access to this teamteam_id - не ваша команда

Помилки в config - ті самі, що під час створення.

Клонування ​

POST/pwa_splits/{id}/clone

Робить одну копію спліта. Тіло запиту не потрібне.

Копія отримує назву оригіналу з додаванням Clone, його налаштування, фільтр і потоки з вагами. Домени не копіюються, а сама копія створюється зупиненою: перейменуйте її, прив'яжіть домени й запустіть.

bash
curl -X POST https://panel.example.com/api/pwa_splits/WQby/clone \
  -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,
]);

// 1. Копія отримує назву «US test Clone»
$response = $api->post('pwa_splits/WQby/clone');
$clone = json_decode($response->getBody(), true)['data']['pwa_split'];

// 2. Перейменовуємо її
$api->put("pwa_splits/{$clone['id']}", ['json' => ['name' => 'US test 2']]);

echo "Копія {$clone['id']} перейменовано" . PHP_EOL;
python
# pip install requests
import requests

API = "https://panel.example.com/api"
HEADERS = {"Authorization": "Bearer ВАШ_КЛЮЧ", "Accept": "application/json"}

# 1. Копія отримує назву «US test Clone»
response = requests.post(f"{API}/pwa_splits/WQby/clone", headers=HEADERS, timeout=30)
clone = response.json()["data"]["pwa_split"]

# 2. Перейменовуємо її
requests.put(f"{API}/pwa_splits/{clone['id']}", headers=HEADERS, json={"name": "US test 2"}, timeout=30)

print("Копія", clone["id"], "перейменовано")
js
// Node.js 18+, без залежностей; збережіть як script.mjs
const API = 'https://panel.example.com/api';
const headers = { Authorization: 'Bearer ВАШ_КЛЮЧ', Accept: 'application/json', 'Content-Type': 'application/json' };

// 1. Копія отримує назву «US test Clone»
const cloned = await fetch(`${API}/pwa_splits/WQby/clone`, { method: 'POST', headers, signal: AbortSignal.timeout(30000) });
const clone = (await cloned.json()).data.pwa_split;

// 2. Перейменовуємо її
await fetch(`${API}/pwa_splits/${clone.id}`, {
  method: 'PUT',
  headers,
  body: JSON.stringify({ name: 'US test 2' }),
  signal: AbortSignal.timeout(30000),
});

console.log('Копія', clone.id, 'перейменовано');

Відповідь - копія в data.pwa_split, у тому самому вигляді, що й GET/pwa_splits/{id}.

Помилки
КодmessageКоли
404Not foundНеправильний ідентифікатор
403This action is unauthorized.Об'єкт належить не вашій команді

Архівування ​

DELETE/pwa_splits/{id}

Прибирає спліт в архів разом із його потоками: домени спліта перестають віддавати трафік, статистика зберігається. Архівні спліти видно в списку з archived=1.

bash
curl -X DELETE https://panel.example.com/api/pwa_splits/WQby \
  -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->delete('pwa_splits/WQby');

echo $response->getStatusCode() === 200 ? 'Спліт в архіві' . PHP_EOL : 'Помилка' . PHP_EOL;
python
# pip install requests
import requests

API = "https://panel.example.com/api"
HEADERS = {"Authorization": "Bearer ВАШ_КЛЮЧ", "Accept": "application/json"}

response = requests.delete(f"{API}/pwa_splits/WQby", headers=HEADERS, timeout=30)

print("Спліт в архіві" if response.ok else "Помилка")
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 response = await fetch(`${API}/pwa_splits/WQby`, { method: 'DELETE', headers, signal: AbortSignal.timeout(30000) });

console.log(response.ok ? 'Спліт в архіві' : 'Помилка');

Відповідь: {"data": true}.

Помилки
КодmessageКоли
404Not foundНеправильний ідентифікатор
403This action is unauthorized.Об'єкт належить не вашій команді