Справочники
Методы, которые только читают: откуда взять team_id, cloudflare_id, filter_account_id и filter_stream_id для создания PWA, сплитов и доменов. Проверить сам ключ и узнать, чей он, можно запросом профиля - см. «Введение в API».
| Метод | Адрес | Что делает |
|---|---|---|
| GET | /teams | Ваши команды |
| GET | /cloudflares | Аккаунты Cloudflare |
| GET | /filter_accounts | Аккаунты фильтрации |
| GET | /filter_accounts/{id}/streams | Потоки в аккаунте Adspect |
Замените ВАШ_КЛЮЧ и panel.example.com на свои.
Команды
GET/teams
Команды, в которых вы состоите, по алфавиту. admin видит все команды панели.
| Параметр | Что фильтрует |
|---|---|
search | Часть названия |
page, per_page | Страница и её размер (по умолчанию 100) |
curl https://panel.example.com/api/teams \
-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,
]);
$teams = json_decode($api->get('teams')->getBody(), true)['data']['teams'];
foreach ($teams as $team) {
echo "{$team['id']} {$team['name']}" . PHP_EOL;
}# pip install requests
import requests
API = "https://panel.example.com/api"
HEADERS = {"Authorization": "Bearer ВАШ_КЛЮЧ", "Accept": "application/json"}
teams = requests.get(f"{API}/teams", headers=HEADERS, timeout=30).json()["data"]["teams"]
for team in teams:
print(team["id"], team["name"])// 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}/teams`, {
method: 'GET',
headers,
signal: AbortSignal.timeout(30000),
});
const { data } = await response.json();
for (const team of data.teams) {
console.log(team.id, team.name);
}Ответ
{
"data": {
"meta": { "current_page": 1, "per_page": 100, "last_page": 1, "total": 1 },
"teams": [
{ "id": "WQby", "name": "Team A", "users_count": 4, "created_at": "05 Oct 2026 14:23", "updated_at": "05 Oct 2026 14:23" }
]
}
}Ошибки - только общие, см. «Введение в API».
Аккаунты Cloudflare
GET/cloudflares
Аккаунты Cloudflare панели, основной (Primary) первым. Архивные не показываются. Сами аккаунты заводит администратор в панели.
| Параметр | Что фильтрует |
|---|---|
search | Часть email аккаунта |
health | ok - только рабочие, error - только с ошибкой |
page, per_page | Страница и её размер (по умолчанию 100) |
curl "https://panel.example.com/api/cloudflares?health=ok" \
-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('cloudflares', ['query' => ['health' => 'ok']]);
$accounts = json_decode($response->getBody(), true)['data']['cloudflares'];
foreach ($accounts as $account) {
echo "{$account['id']} {$account['email']}" . ($account['is_primary'] ? ' (основной)' : '') . PHP_EOL;
}# pip install requests
import requests
API = "https://panel.example.com/api"
HEADERS = {"Authorization": "Bearer ВАШ_КЛЮЧ", "Accept": "application/json"}
response = requests.get(f"{API}/cloudflares", headers=HEADERS, params={"health": "ok"}, timeout=30)
accounts = response.json()["data"]["cloudflares"]
for account in accounts:
print(account["id"], account["email"], "(основной)" if account["is_primary"] 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 params = new URLSearchParams({ health: 'ok' });
const response = await fetch(`${API}/cloudflares?${params}`, {
method: 'GET',
headers,
signal: AbortSignal.timeout(30000),
});
const { data } = await response.json();
for (const account of data.cloudflares) {
console.log(account.id, account.email, account.is_primary ? '(основной)' : '');
}Ответ
{
"data": {
"meta": { "current_page": 1, "per_page": 100, "last_page": 1, "total": 1 },
"cloudflares": [
{
"id": "Lm3T",
"email": "[email protected]",
"is_primary": true,
"archived": false,
"status_error": null,
"status_checked_at": "05 Oct 2026 14:00",
"domains_count": 12
}
]
}
}status_error - последняя ошибка проверки аккаунта, null - аккаунт в порядке. domains_count - сколько доменов в нём.
Ошибки - только общие, см. «Введение в API».
Аккаунты фильтрации
GET/filter_accounts
Аккаунты фильтрации трафика, основной первым. Архивные не показываются.
| Параметр | Что фильтрует |
|---|---|
search | Часть названия |
type | Сервис: adspect, fraudfilter или trafficarmor |
page, per_page | Страница и её размер (по умолчанию 100) |
curl "https://panel.example.com/api/filter_accounts?type=adspect" \
-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('filter_accounts', ['query' => ['type' => 'adspect']]);
$accounts = json_decode($response->getBody(), true)['data']['filter_accounts'];
foreach ($accounts as $account) {
echo "{$account['id']} {$account['name']}" . PHP_EOL;
}# pip install requests
import requests
API = "https://panel.example.com/api"
HEADERS = {"Authorization": "Bearer ВАШ_КЛЮЧ", "Accept": "application/json"}
response = requests.get(f"{API}/filter_accounts", headers=HEADERS, params={"type": "adspect"}, timeout=30)
accounts = response.json()["data"]["filter_accounts"]
for account in accounts:
print(account["id"], account["name"])// Node.js 18+, без зависимостей; сохраните как script.mjs
const API = 'https://panel.example.com/api';
const headers = { Authorization: 'Bearer ВАШ_КЛЮЧ', Accept: 'application/json', 'Content-Type': 'application/json' };
const params = new URLSearchParams({ type: 'adspect' });
const response = await fetch(`${API}/filter_accounts?${params}`, {
method: 'GET',
headers,
signal: AbortSignal.timeout(30000),
});
const { data } = await response.json();
for (const account of data.filter_accounts) {
console.log(account.id, account.name);
}Ответ
{
"data": {
"meta": { "current_page": 1, "per_page": 100, "last_page": 1, "total": 1 },
"filter_accounts": [
{ "id": "Rt7Q", "name": "Adspect main", "type": "adspect", "is_primary": true, "archived": false }
]
}
}Ошибки - только общие, см. «Введение в API».
Потоки Adspect
GET/filter_accounts/{id}/streams
Потоки в аккаунте Adspect. stream_id из ответа - это filter_stream_id для PWA и сплитов.
| Параметр | Что это |
|---|---|
search | Часть названия потока |
stream | stream_id потока - вернуть его в поле selected, даже если он не попал в поиск |
refresh | 1 - запросить список у Adspect заново, минуя кэш |
Для fraudfilter и trafficarmor список всегда пустой: у этих сервисов нет API потоков, идентификатор потока берите в их кабинете.
curl "https://panel.example.com/api/filter_accounts/Rt7Q/streams?search=Promo" \
-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('filter_accounts/Rt7Q/streams', ['query' => ['search' => 'Promo']]);
$streams = json_decode($response->getBody(), true)['data']['streams'];
foreach ($streams as $stream) {
echo "{$stream['stream_id']} {$stream['name']}" . PHP_EOL;
}# pip install requests
import requests
API = "https://panel.example.com/api"
HEADERS = {"Authorization": "Bearer ВАШ_КЛЮЧ", "Accept": "application/json"}
response = requests.get(f"{API}/filter_accounts/Rt7Q/streams", headers=HEADERS, params={"search": "Promo"}, timeout=30)
streams = response.json()["data"]["streams"]
for stream in streams:
print(stream["stream_id"], stream["name"])// Node.js 18+, без зависимостей; сохраните как script.mjs
const API = 'https://panel.example.com/api';
const headers = { Authorization: 'Bearer ВАШ_КЛЮЧ', Accept: 'application/json', 'Content-Type': 'application/json' };
const params = new URLSearchParams({ search: 'Promo' });
const response = await fetch(`${API}/filter_accounts/Rt7Q/streams?${params}`, {
method: 'GET',
headers,
signal: AbortSignal.timeout(30000),
});
const { data } = await response.json();
for (const stream of data.streams) {
console.log(stream.stream_id, stream.name);
}Ответ
{
"data": {
"streams": [
{ "stream_id": "a1b2c3", "name": "Promo EN", "mode": "Filter" },
{ "stream_id": "d4e5f6", "name": "Promo DE", "mode": "Filter" }
],
"selected": null
}
}Приходит не больше 100 потоков - если нужного нет, уточните search.
Ошибки
| Код | message | Когда |
|---|---|---|
404 | Not found | Такого аккаунта нет |
422 | Filter account not found | Аккаунт в архиве |
422 | Adspect account has no API key | У аккаунта Adspect не задан API-ключ |
422 | текст ошибки от Adspect, например Invalid API key | Adspect отклонил ключ аккаунта |
502 | Adspect request failed | Adspect не ответил |
Не добавляйте refresh=1 в циклы
Список потоков кэшируется на 5 минут. С refresh=1 каждый запрос уходит в Adspect - в цикле это быстро упрётся в лимиты самого Adspect. Используйте его один раз, если только что создали поток в кабинете Adspect и не видите его в списке.