Skip to content

Вступ до API ​

API PWA Hub потрібен для ваших скриптів: вивантажити статистику й конверсії, наклонувати PWA під нову кампанію, повісити домен, увімкнути або вимкнути застосунок - без ручної роботи в панелі.

Через API доступне те саме, що ви робите в панелі, і з тими самими правами: скрипт бачить і змінює рівно ті PWA, спліти та інші ресурси, що й ви - team_lead ресурси своїх команд, customer свої, і ті, і ті - відкриті їм через групи доступу. Налаштування, користувачі, акаунти інтеграцій, пароль і сам ключ через API недоступні - лише з панелі.

Колекція для Postman

Усі методи API готові до запуску без коду: завантажте колекцію, імпортуйте її в Postman і задайте змінні baseUrl (адреса вашої панелі з /api) та apiKey.

Отримання ключа ​

  1. Адміністратор вмикає вам Manage API Token (див. розділ «Користувачі»). Це потрібно й самим адміністраторам: без перемикача ключ не видається і не працює.
  2. Відкрийте Profile і в картці API Key натисніть Generate Key (див. розділ «Профіль»).
  3. Скопіюйте ключ і збережіть його в налаштуваннях скрипта.

Ключ - це пароль

З ключем можна робити все, що можете ви самі. Не публікуйте його в репозиторіях, чатах і коді, який виконується в браузері. Якщо ключ витік - перевипустіть його в профілі, старий перестане працювати одразу.

API працює, лише якщо він входить у вашу ліцензію, і лише поки ліцензія активна.

Запит ​

Адреса API - домен вашої панелі з /api у кінці, наприклад https://panel.example.com/api. Ключ передається в заголовку Authorization, тіло запиту - JSON:

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

echo $user['email'] . 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}/user/profile", headers=HEADERS, timeout=30)
user = response.json()["data"]["user"]

print(user["email"])
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}/user/profile`, { headers, signal: AbortSignal.timeout(30000) });
const { data } = await response.json();

console.log(data.user.email);

Цей запит - зручна перевірка ключа: він повертає користувача, якому належить ключ, і його команди.

Ідентифікатори ​

У всіх об'єктів короткі рядкові ідентифікатори вигляду WZAX - і у відповідях, і в запитах (team_id, cloudflare_id тощо). Беріть їх із відповідей API або з адресного рядка панелі.

Відповідь ​

Дані завжди лежать у полі data:

json
{
  "data": {
    "pwa": { "id": "WZAX", "name": "Promo EN", "active": true }
  }
}

Списки приходять посторінково: у data.meta - номер сторінки й загальна кількість, поруч - самі записи під назвою ресурсу.

json
{
  "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:

json
{
  "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."]
  }
}
КодКолиЩо робити
401Unauthenticated - не передано заголовок Authorization; Invalid API key - ключ неправильний, перевипущений або вам вимкнули Manage API Token; API key access is not enabled - API немає в ліцензії; Account is not approved - акаунт не підтвердженийПеревірте ключ у профілі, зверніться до адміністратора
403Not available with an API key - цей метод доступний лише з панелі; This action is unauthorized. - немає прав на об'єкт; або ліцензія неактивна (тоді у відповіді є поле error)Перевірте, що об'єкт у вашій команді
404Not found - об'єкта з таким ідентифікатором немаєПеревірте ідентифікатор
422Помилка в даних - у errors перелічено поля й що з ними не такВиправте поля з errors
429Too many requests. Try again in a minute. або Too many invalid API key attempts. Try again in a minute. - перевищено ліміт, див. «Ліміти»Зачекайте хвилину й повторіть

Обробка помилок ​

Перевіряйте код відповіді, перш ніж читати data. У разі помилки виведіть message, а для 422 - ще й поля з errors: там сказано, що саме виправити. Приклад нижче навмисно створює PWA без назви й друкує, що відповів сервер.

bash
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
<?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;
python
# 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"])
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}/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, акаунти фільтрації та їхні потоки