Skip to content

Потоки ​

Потік - це зв'язка «спліт → PWA» з вагою: що більша вага, то більшу частку трафіку спліта отримує це PWA. Методи нижче додають PWA у спліт, змінюють ваги й прибирають PWA зі спліта. Як ваги ділять трафік, див. розділ «Спліти та потоки».

МетодАдресаЩо робить
GET/pwa_flowsСписок потоків
GET/pwa_flows/{id}Один потік
POST/pwa_flowsДодати PWA у спліт
PUT/pwa_flows/{id}Змінити вагу
DELETE/pwa_flows/{id}Прибрати PWA зі спліта

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

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

GET/pwa_flows

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

ПараметрЩо фільтрує
owner_split_idСпліт - потоки лише цього спліта
archived1 - лише архівні
page, per_pageСторінка та її розмір (за замовчуванням 100)

Завжди вказуйте owner_split_id

Без owner_split_id у список потраплять не лише потоки сплітів, а й службові потоки кожного PWA - по одному на застосунок. Їх не потрібно змінювати чи видаляти.

bash
curl "https://panel.example.com/api/pwa_flows?owner_split_id=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_flows', ['query' => ['owner_split_id' => 'WQby']]);
$flows = json_decode($response->getBody(), true)['data']['pwa_flows'];

foreach ($flows as $flow) {
    echo "{$flow['pwa']['name']}: вага {$flow['weight']}, {$flow['stat_installs']} встановлень" . 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_flows", headers=HEADERS, params={"owner_split_id": "WQby"}, timeout=30)
flows = response.json()["data"]["pwa_flows"]

for flow in flows:
    print(flow["pwa"]["name"], "вага", flow["weight"], flow["stat_installs"], "встановлень")
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_flows?owner_split_id=WQby`, { headers, signal: AbortSignal.timeout(30000) });
const { data } = await response.json();

for (const flow of data.pwa_flows) {
  console.log(flow.pwa.name, 'вага', flow.weight, flow.stat_installs, 'встановлень');
}
Відповідь (скорочено)
json
{
  "data": {
    "meta": { "current_page": 1, "per_page": 100, "last_page": 1, "total": 2 },
    "pwa_flows": [
      {
        "id": "ymqy",
        "weight": 70,
        "archived": false,
        "stat_uniques": 1100,
        "stat_installs": 290,
        "stat_registrations": 70,
        "stat_deposits": 15,
        "stat_repeat_deposits": 5,
        "team": { "id": "WZAX", "name": "Team A" },
        "pwa": { "id": "WZAX", "name": "Promo EN", "active": true, "archived": false },
        "created_at": "05 Oct 2026 14:22",
        "updated_at": "05 Oct 2026 14:22"
      }
    ]
  }
}

Лічильники stat_* - за весь час, лише за трафіком, що прийшов через цей потік.

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

Один потік ​

GET/pwa_flows/{id}

Потік із його PWA та сплітом (owner_split).

bash
curl https://panel.example.com/api/pwa_flows/ymqy \
  -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_flows/ymqy');
$flow = json_decode($response->getBody(), true)['data']['pwa_flow'];

echo "{$flow['pwa']['name']}: вага {$flow['weight']}" . 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_flows/ymqy", headers=HEADERS, timeout=30)
flow = response.json()["data"]["pwa_flow"]

print(flow["pwa"]["name"], "вага", flow["weight"])
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_flows/ymqy`, { headers, signal: AbortSignal.timeout(30000) });
const { data } = await response.json();

console.log(data.pwa_flow.pwa.name, 'вага', data.pwa_flow.weight);
Відповідь (скорочено)
json
{
  "data": {
    "pwa_flow": {
      "id": "ymqy",
      "weight": 70,
      "pwa": { "id": "WZAX", "name": "Promo EN", "active": true },
      "owner_split": { "id": "WQby", "name": "US test", "status": "active" },
      "team": { "id": "WZAX", "name": "Team A" }
    }
  }
}
Помилки
КодmessageКоли
404Not foundНеправильний ідентифікатор
403This action is unauthorized.Об'єкт належить не вашій команді

Додавання PWA у спліт ​

POST/pwa_flows

ПолеОбов'язковоЩо це
owner_split_idтакСпліт, у який додаєте PWA
pwa_idтакPWA, яке отримуватиме трафік. Має бути в тій самій команді, що й спліт
weightніВага, ціле число від 0. За замовчуванням 1
bash
curl -X POST https://panel.example.com/api/pwa_flows \
  -H "Authorization: Bearer ВАШ_КЛЮЧ" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"owner_split_id": "WQby", "pwa_id": "WZAX", "weight": 70}'
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_flows', ['json' => [
    'owner_split_id' => 'WQby',
    'pwa_id' => 'WZAX',
    'weight' => 70,
]]);
$flow = json_decode($response->getBody(), true)['data']['pwa_flow'];

echo "Створено потік {$flow['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_flows", headers=HEADERS, json={
    "owner_split_id": "WQby",
    "pwa_id": "WZAX",
    "weight": 70,
}, timeout=30)
flow = response.json()["data"]["pwa_flow"]

print("Створено потік", flow["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_flows`, {
  method: 'POST',
  headers,
  body: JSON.stringify({
    owner_split_id: 'WQby',
    pwa_id: 'WZAX',
    weight: 70,
  }),
  signal: AbortSignal.timeout(30000),
});
const { data } = await response.json();

console.log('Створено потік', data.pwa_flow.id);

Відповідь - створений потік у data.pwa_flow. Якщо weight не передано, у цій відповіді його немає - вага дорівнює 1.

Помилки
КодmessageКоли
422The owner split id field is required.Не передано owner_split_id або передано неіснуючий
422The pwa id field is required.Не передано pwa_id або передано неіснуючий
422You do not have access to this resourceСпліт або PWA, яких ви не бачите: customer - лише свої
422This resource belongs to another teamPWA з іншої команди, не тієї, що у спліта
422This PWA is already in the split.У спліта вже є потік із цим PWA
422The weight field must be at least 0.weight менше нуля
422The weight field must be an integer.weight - не ціле число

Команда потоку береться зі спліта, team_id у тілі запиту не потрібен. Одне PWA додається у спліт один раз: повторний запит відповість 422. Якщо старий потік із цим PWA видалено (в архіві), додати PWA знову можна.

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

Зміна ваги ​

PUT/pwa_flows/{id}

Змінює лише weight (і override_offer). Інші поля - pwa_id, owner_split_id, team_id тощо - ігноруються: потік не можна перенести в інший спліт або на інше PWA. Щоб змінити PWA у спліті, видаліть потік і додайте новий.

bash
curl -X PUT https://panel.example.com/api/pwa_flows/ymqy \
  -H "Authorization: Bearer ВАШ_КЛЮЧ" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"weight": 50}'
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_flows/ymqy', ['json' => ['weight' => 50]]);
$flow = json_decode($response->getBody(), true)['data']['pwa_flow'];

echo "Нова вага: {$flow['weight']}" . 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_flows/ymqy", headers=HEADERS, json={"weight": 50}, timeout=30)
flow = response.json()["data"]["pwa_flow"]

print("Нова вага:", flow["weight"])
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_flows/ymqy`, {
  method: 'PUT',
  headers,
  body: JSON.stringify({ weight: 50 }),
  signal: AbortSignal.timeout(30000),
});
const { data } = await response.json();

console.log('Нова вага:', data.pwa_flow.weight);

Відповідь - потік після зміни в data.pwa_flow. Нові ваги доходять до трафіку протягом трьох хвилин.

Помилки
КодmessageКоли
404Not foundНеправильний ідентифікатор
403This action is unauthorized.Об'єкт належить не вашій команді
422The weight field must be an integer.weight - не ціле число
422The weight field must be at least 0.weight менше нуля

Вага 0 замість видалення

Потік із вагою 0 лишається у спліті, але трафіку не отримує. Так зручно тимчасово вимкнути PWA з роздачі, а потім повернути вагу.

Видалення PWA зі спліта ​

DELETE/pwa_flows/{id}

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

bash
curl -X DELETE https://panel.example.com/api/pwa_flows/ymqy \
  -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_flows/ymqy');

echo $response->getStatusCode() === 200 ? 'PWA прибрано зі спліта' . 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_flows/ymqy", headers=HEADERS, timeout=30)

print("PWA прибрано зі спліта" 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_flows/ymqy`, { method: 'DELETE', headers, signal: AbortSignal.timeout(30000) });

console.log(response.ok ? 'PWA прибрано зі спліта' : 'Помилка');

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

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