Вступ до API
API PWA Hub потрібен для ваших скриптів: вивантажити статистику й конверсії, наклонувати PWA під нову кампанію, повісити домен, увімкнути або вимкнути застосунок - без ручної роботи в панелі.
Через API доступне те саме, що ви робите в панелі, і з тими самими правами: скрипт бачить і змінює рівно ті PWA, спліти та інші ресурси, що й ви - team_lead ресурси своїх команд, customer свої, і ті, і ті - відкриті їм через групи доступу. Налаштування, користувачі, акаунти інтеграцій, пароль і сам ключ через API недоступні - лише з панелі.
Колекція для Postman
Усі методи API готові до запуску без коду: завантажте колекцію, імпортуйте її в Postman і задайте змінні baseUrl (адреса вашої панелі з /api) та apiKey.
Отримання ключа
- Адміністратор вмикає вам Manage API Token (див. розділ «Користувачі»). Це потрібно й самим адміністраторам: без перемикача ключ не видається і не працює.
- Відкрийте Profile і в картці API Key натисніть Generate Key (див. розділ «Профіль»).
- Скопіюйте ключ і збережіть його в налаштуваннях скрипта.
Ключ - це пароль
З ключем можна робити все, що можете ви самі. Не публікуйте його в репозиторіях, чатах і коді, який виконується в браузері. Якщо ключ витік - перевипустіть його в профілі, старий перестане працювати одразу.
API працює, лише якщо він входить у вашу ліцензію, і лише поки ліцензія активна.
Запит
Адреса API - домен вашої панелі з /api у кінці, наприклад https://panel.example.com/api. Ключ передається в заголовку Authorization, тіло запиту - JSON:
curl https://panel.example.com/api/user/profile \
-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('user/profile');
$user = json_decode($response->getBody(), true)['data']['user'];
echo $user['email'] . PHP_EOL;# pip install requests
import requests
API = "https://panel.example.com/api"
HEADERS = {"Authorization": "Bearer ВАШ_КЛЮЧ", "Accept": "application/json"}
response = requests.get(f"{API}/user/profile", headers=HEADERS, timeout=30)
user = response.json()["data"]["user"]
print(user["email"])// 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}/user/profile`, { headers, signal: AbortSignal.timeout(30000) });
const { data } = await response.json();
console.log(data.user.email);Цей запит - зручна перевірка ключа: він повертає користувача, якому належить ключ, і його команди.
Ідентифікатори
У всіх об'єктів короткі рядкові ідентифікатори вигляду WZAX - і у відповідях, і в запитах (team_id, cloudflare_id тощо). Беріть їх із відповідей API або з адресного рядка панелі.
Відповідь
Дані завжди лежать у полі data:
{
"data": {
"pwa": { "id": "WZAX", "name": "Promo EN", "active": true }
}
}Списки приходять посторінково: у data.meta - номер сторінки й загальна кількість, поруч - самі записи під назвою ресурсу.
{
"data": {
"meta": { "current_page": 1, "per_page": 100, "last_page": 3, "total": 245 },
"pwas": [ { "id": "WZAX", "name": "Promo EN" } ]
}
}Сторінка задається параметром page, її розмір - per_page (за замовчуванням 100). Щоб забрати все, йдіть сторінками, поки current_page не дійде до last_page.
Дати у відповідях - у форматі 05 Oct 2026 14:03, за UTC.
Помилки
Помилка - це HTTP-код і JSON із data: null та текстом у message:
{
"data": null,
"message": "The name field is required. (and 2 more errors)",
"errors": {
"name": ["The name field is required."],
"cloudflare_id": ["The cloudflare id field is required."]
}
}| Код | Коли | Що робити |
|---|---|---|
401 | Unauthenticated - не передано заголовок Authorization; Invalid API key - ключ неправильний, перевипущений або вам вимкнули Manage API Token; API key access is not enabled - API немає в ліцензії; Account is not approved - акаунт не підтверджений | Перевірте ключ у профілі, зверніться до адміністратора |
403 | Not available with an API key - цей метод доступний лише з панелі; This action is unauthorized. - немає прав на об'єкт; або ліцензія неактивна (тоді у відповіді є поле error) | Перевірте, що об'єкт у вашій команді |
404 | Not found - об'єкта з таким ідентифікатором немає | Перевірте ідентифікатор |
422 | Помилка в даних - у errors перелічено поля й що з ними не так | Виправте поля з errors |
429 | Too many requests. Try again in a minute. або Too many invalid API key attempts. Try again in a minute. - перевищено ліміт, див. «Ліміти» | Зачекайте хвилину й повторіть |
Обробка помилок
Перевіряйте код відповіді, перш ніж читати data. У разі помилки виведіть message, а для 422 - ще й поля з errors: там сказано, що саме виправити. Приклад нижче навмисно створює PWA без назви й друкує, що відповів сервер.
curl -X POST https://panel.example.com/api/pwas \
-H "Authorization: Bearer ВАШ_КЛЮЧ" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{}' \
-w "\nHTTP %{http_code}\n"<?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,
'http_errors' => false, // не кидати виняток на 4xx/5xx, розбираємо відповідь самі
]);
$response = $api->post('pwas', ['json' => []]);
$body = json_decode($response->getBody(), true);
if ($response->getStatusCode() >= 400) {
echo "Помилка {$response->getStatusCode()}: {$body['message']}" . PHP_EOL;
foreach ($body['errors'] ?? [] as $field => $messages) {
echo " {$field}: " . implode(' ', $messages) . PHP_EOL;
}
exit(1);
}
echo "Створено PWA {$body['data']['pwa']['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}/pwas", headers=HEADERS, json={}, timeout=30)
body = response.json()
if not response.ok:
print(f"Помилка {response.status_code}: {body['message']}")
for field, messages in body.get("errors", {}).items():
print(f" {field}: {' '.join(messages)}")
raise SystemExit(1)
print("Створено PWA", body["data"]["pwa"]["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}/pwas`, {
method: 'POST',
headers,
body: JSON.stringify({}),
signal: AbortSignal.timeout(30000),
});
const body = await response.json();
if (!response.ok) {
console.log(`Помилка ${response.status}: ${body.message}`);
for (const [field, messages] of Object.entries(body.errors ?? {})) {
console.log(` ${field}: ${messages.join(' ')}`);
}
process.exit(1);
}
console.log('Створено PWA', body.data.pwa.id);Виведення:
Помилка 422: The name field is required. (and 2 more errors)
name: The name field is required.
team_id: The team id field is required.
cloudflare_id: The cloudflare id field is required.Не повторюйте 4xx у циклі
Помилки 4xx, крім 429, самі не минуть: повтор того самого запиту дасть ту саму відповідь. Повторювати має сенс лише 429 (через хвилину) та помилки мережі або 5xx.
Ліміти
- 300 запитів на хвилину на користувача - на всі методи разом.
- 10 відправлень пушів на хвилину на користувача (
POST/pwa_pushes/{id}/send) - кожне відправлення - це справжня розсилка. - 10 відмов
401за ключем на хвилину з однієї IP - неправильний ключ, непідтверджений акаунт або API не в ліцензії. Далі будь-який запит із ключем із цієї IP отримує429до кінця хвилини, відрахованої від першої відмови, - навіть із правильним ключем. Якщо скрипт отримав401- зупиніть його, а не повторюйте запит.
Що доступно
| Розділ | Що можна |
|---|---|
| PWA | список, перегляд, створення, зміна, увімкнення й вимкнення, клонування, архівування |
| Спліти | список, перегляд, створення, зміна, увімкнення й вимкнення, клонування, архівування |
| Потоки | список, перегляд, додавання PWA у спліт, зміна ваги, видалення зі спліта |
| Домени | список, додавання до PWA або спліта, увімкнення й перестворення DNS, видалення |
| Пуші | список, перегляд, створення, зміна, попередній перегляд, аудиторія, надсилання, клонування, архівування |
| Лендінги | список |
| Пікселі й теги | список, перегляд, додавання, зміна, архівування |
| Статистика | дашборд, воронка, статистика за саб-мітками |
| Конверсії | список, перегляд, повторне надсилання у Facebook |
| Експорт | конверсії та візити у CSV за період |
| Довідники | команди, акаунти Cloudflare, акаунти фільтрації та їхні потоки |