Потоки
Потік - це зв'язка «спліт → 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 | Спліт - потоки лише цього спліта |
archived | 1 - лише архівні |
page, per_page | Сторінка та її розмір (за замовчуванням 100) |
Завжди вказуйте owner_split_id
Без owner_split_id у список потраплять не лише потоки сплітів, а й службові потоки кожного PWA - по одному на застосунок. Їх не потрібно змінювати чи видаляти.
curl "https://panel.example.com/api/pwa_flows?owner_split_id=WQby" \
-H "Authorization: Bearer ВАШ_КЛЮЧ" \
-H "Accept: application/json"<?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;
}# 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"], "встановлень")// 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, 'встановлень');
}Відповідь (скорочено)
{
"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).
curl https://panel.example.com/api/pwa_flows/ymqy \
-H "Authorization: Bearer ВАШ_КЛЮЧ" \
-H "Accept: application/json"<?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;# 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"])// 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);Відповідь (скорочено)
{
"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 | Коли |
|---|---|---|
404 | Not found | Неправильний ідентифікатор |
403 | This action is unauthorized. | Об'єкт належить не вашій команді |
Додавання PWA у спліт
POST/pwa_flows
| Поле | Обов'язково | Що це |
|---|---|---|
owner_split_id | так | Спліт, у який додаєте PWA |
pwa_id | так | PWA, яке отримуватиме трафік. Має бути в тій самій команді, що й спліт |
weight | ні | Вага, ціле число від 0. За замовчуванням 1 |
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
// 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;# 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"])// 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 | Коли |
|---|---|---|
422 | The owner split id field is required. | Не передано owner_split_id або передано неіснуючий |
422 | The pwa id field is required. | Не передано pwa_id або передано неіснуючий |
422 | You do not have access to this resource | Спліт або PWA, яких ви не бачите: customer - лише свої |
422 | This resource belongs to another team | PWA з іншої команди, не тієї, що у спліта |
422 | This PWA is already in the split. | У спліта вже є потік із цим PWA |
422 | The weight field must be at least 0. | weight менше нуля |
422 | The 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 у спліті, видаліть потік і додайте новий.
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
// 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;# 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"])// 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 | Коли |
|---|---|---|
404 | Not found | Неправильний ідентифікатор |
403 | This action is unauthorized. | Об'єкт належить не вашій команді |
422 | The weight field must be an integer. | weight - не ціле число |
422 | The weight field must be at least 0. | weight менше нуля |
Вага 0 замість видалення
Потік із вагою 0 лишається у спліті, але трафіку не отримує. Так зручно тимчасово вимкнути PWA з роздачі, а потім повернути вагу.
Видалення PWA зі спліта
DELETE/pwa_flows/{id}
Прибирає потік в архів: PWA перестає отримувати трафік цього спліта, статистика потоку зберігається. Архівні потоки видно в списку з archived=1.
curl -X DELETE https://panel.example.com/api/pwa_flows/ymqy \
-H "Authorization: Bearer ВАШ_КЛЮЧ" \
-H "Accept: application/json"<?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;# 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 "Помилка")// 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 | Коли |
|---|---|---|
404 | Not found | Неправильний ідентифікатор |
403 | This action is unauthorized. | Об'єкт належить не вашій команді |