Домени
Методи для доменів: прив'язати домен або піддомен до PWA чи спліта, вимкнути й увімкнути його DNS, перестворити DNS-записи й видалити домен. Як домени влаштовані в панелі, див. розділ «Домени PWA та сплітів» у довіднику.
| Метод | Адреса | Що робить |
|---|---|---|
| GET | /domains | Кореневі домени, доступні команді |
| POST | /domains | Прив'язати домен до PWA або спліта |
| POST | /domains/{id}/toggle-dns | Вимкнути або увімкнути DNS домену |
| POST | /domains/{id}/recreate-dns | Перестворити DNS-записи |
| DELETE | /domains/{id} | Видалити домен |
Замініть ВАШ_КЛЮЧ і panel.example.com на свої.
Це справжній Cloudflare
Усі методи, крім GET, одразу змінюють акаунт Cloudflare: створюють зону, додають і видаляють DNS-записи. Скасувати це з API не можна - перевіряйте домен і PWA до запиту, особливо в циклах.
Кореневі домени
GET/domains
Домени другого рівня (example.com), на яких можна заводити піддомени: домени команди PWA або спліта та спільні домени без команди. Піддомени в цей список не потрапляють. Домени, уже прив'язані до конкретного PWA, дивіться в полі domains у GET/pwas/{id}.
| Параметр | Обов'язково | Що це |
|---|---|---|
pwa_id або pwa_split_id | так, одне з двох | PWA або спліт - за його командою вибираються домени |
curl "https://panel.example.com/api/domains?pwa_id=WZAX" \
-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('domains', ['query' => ['pwa_id' => 'WZAX']]);
$domains = json_decode($response->getBody(), true)['data']['domains'];
foreach ($domains as $domain) {
echo "{$domain['id']} {$domain['domain']}" . PHP_EOL;
}# pip install requests
import requests
API = "https://panel.example.com/api"
HEADERS = {"Authorization": "Bearer ВАШ_КЛЮЧ", "Accept": "application/json"}
response = requests.get(f"{API}/domains", headers=HEADERS, params={"pwa_id": "WZAX"}, timeout=30)
domains = response.json()["data"]["domains"]
for domain in domains:
print(domain["id"], domain["domain"])// 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}/domains?pwa_id=WZAX`, { headers, signal: AbortSignal.timeout(30000) });
const { data } = await response.json();
for (const domain of data.domains) {
console.log(domain.id, domain.domain);
}Відповідь
{
"data": {
"domains": [
{
"id": "Xk9P",
"domain": "fit-tracker.example",
"domain_level": 2,
"dns_on": true,
"team": { "id": "WQby", "name": "Team A" },
"created_at": "05 Oct 2026 14:23",
"updated_at": "05 Oct 2026 14:23"
}
]
}
}Список не посторінковий - приходить повністю. dns_on - чи увімкнено DNS домену в Cloudflare.
Помилки
| Код | message | Коли |
|---|---|---|
422 | The pwa id field is required when pwa split id is not present. | Не передано ні pwa_id, ні pwa_split_id, або id не існує |
403 | This action is unauthorized. | PWA або спліт чужої команди |
Прив'язка домену
POST/domains
Додає домен у Cloudflare і прив'язує його до PWA або спліта.
| Поле | Обов'язково | Що це |
|---|---|---|
domain | так | Домен або піддомен, наприклад fit-tracker.example або go.fit-tracker.example |
pwa_id або pwa_split_id | так, одне з двох | Куди прив'язати |
cloudflare_id | ні | Акаунт Cloudflare для зони. Без нього береться основний акаунт (Primary) |
Команда домену береться з PWA або спліта, team_id у запиті не потрібен і ігнорується. Прив'язати домен можна лише до PWA або спліта, до яких у вас є доступ.
curl -X POST https://panel.example.com/api/domains \
-H "Authorization: Bearer ВАШ_КЛЮЧ" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{"domain": "fit-tracker.example", "pwa_id": "WZAX", "cloudflare_id": "Lm3T"}'<?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('domains', ['json' => [
'domain' => 'fit-tracker.example',
'pwa_id' => 'WZAX',
'cloudflare_id' => 'Lm3T',
]]);
$result = json_decode($response->getBody(), true)['data'];
// NS-сервери, які потрібно прописати в реєстратора
echo implode(PHP_EOL, $result['zone']['name_servers']) . PHP_EOL;# pip install requests
import requests
API = "https://panel.example.com/api"
HEADERS = {"Authorization": "Bearer ВАШ_КЛЮЧ", "Accept": "application/json"}
response = requests.post(f"{API}/domains", headers=HEADERS, json={
"domain": "fit-tracker.example",
"pwa_id": "WZAX",
"cloudflare_id": "Lm3T",
}, timeout=30)
result = response.json()["data"]
# NS-сервери, які потрібно прописати в реєстратора
print("\n".join(result["zone"]["name_servers"]))// 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}/domains`, {
method: 'POST',
headers,
body: JSON.stringify({
domain: 'fit-tracker.example',
pwa_id: 'WZAX',
cloudflare_id: 'Lm3T',
}),
signal: AbortSignal.timeout(30000),
});
const { data } = await response.json();
// NS-сервери, які потрібно прописати в реєстратора
console.log(data.zone.name_servers.join('\n'));Відповідь - домен і зона Cloudflare, у яку він потрапив:
Відповідь
{
"data": {
"domain": {
"id": "Xk9P",
"domain": "fit-tracker.example",
"domain_level": 2,
"dns_on": true,
"team": { "id": "WQby", "name": "Team A" }
},
"zone": {
"id": "023e105f4ecef8ad9ca31a8372d0c353",
"name": "fit-tracker.example",
"status": "pending",
"name_servers": ["ada.ns.cloudflare.com", "bob.ns.cloudflare.com"]
}
}
}Що відбувається в Cloudflare:
- Новий домен другого рівня - створюється зона й записи, які ведуть домен на сервер панелі. Поки в реєстратора не прописано NS із
zone.name_servers, зона в статусіpendingі домен не відкривається. NS прописуються в реєстратора - див. розділ «Домени та Cloudflare». - Піддомен (
go.fit-tracker.example) - у зону кореневого домену додається запис для піддомену. Кореневий домен має вже бути в панелі, інакше прийде404.
Той самий акаунт, що в PWA
Передавайте cloudflare_id того самого акаунта, що в PWA (поле cloudflare_id у GET/pwas/{id}). Без нього зона створюється в основному акаунті, і домен може опинитися не в тому акаунті, що застосунок.
Спільний кореневий домен (без команди) після додавання на ньому піддомену закріплюється за командою PWA або спліта.
Повторний POST із уже доданим доменом та іншим pwa_id переприв'язує домен до нового PWA. Домен іншої команди так не забрати - прийде 403.
Ліміт доменів
Кількість доменів обмежена ліцензією - рахуються всі домени й піддомени панелі. Коли ліміт вичерпано, прийде 403 із текстом Limit reached: max_domains (50) - на будь-який POST/domains, навіть на переприв'язку вже доданого домену.
Помилки
| Код | message | Коли |
|---|---|---|
422 | The domain field is required. | Не передано domain |
422 | The domain field format is invalid. | domain - не доменне ім'я |
422 | The pwa id field is required when pwa split id is not present. | Не передано ні pwa_id, ні pwa_split_id, або id не існує |
422 | You do not have access to this resource | PWA або спліт, до якого у вас немає доступу; разом із ним на team_id приходить You do not have access to this team |
422 | The cloudflare id field must be an integer. | cloudflare_id не існує |
403 | This action is unauthorized. | Домен уже додала інша команда |
403 | Limit reached: max_domains (50) | Вичерпано ліміт доменів ліцензії |
404 | Not found | Піддомен, а його кореневого домену немає в панелі |
Вимкнення та увімкнення DNS
POST/domains/{id}/toggle-dns
Якщо DNS домену увімкнено, видаляє його записи в Cloudflare (домен перестає відкриватися, але лишається прив'язаним); якщо вимкнено - створює їх заново.
curl -X POST https://panel.example.com/api/domains/Xk9P/toggle-dns \
-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->post('domains/Xk9P/toggle-dns');
$domain = json_decode($response->getBody(), true)['data']['domain'];
echo ($domain['dns_on'] ? 'DNS увімкнено' : 'DNS вимкнено') . PHP_EOL;# pip install requests
import requests
API = "https://panel.example.com/api"
HEADERS = {"Authorization": "Bearer ВАШ_КЛЮЧ", "Accept": "application/json"}
response = requests.post(f"{API}/domains/Xk9P/toggle-dns", headers=HEADERS, timeout=30)
domain = response.json()["data"]["domain"]
print("DNS увімкнено" if domain["dns_on"] else "DNS вимкнено")// 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}/domains/Xk9P/toggle-dns`, { method: 'POST', headers, signal: AbortSignal.timeout(30000) });
const { data } = await response.json();
console.log(data.domain.dns_on ? 'DNS увімкнено' : 'DNS вимкнено');Відповідь - домен у data.domain, новий стан у dns_on.
Помилки
| Код | message | Коли |
|---|---|---|
404 | Not found | Домену з таким id немає |
403 | This action is unauthorized. | Домен чужої команди |
Перестворення DNS
POST/domains/{id}/recreate-dns
Приводить записи домену в Cloudflare до правильного вигляду: створює відсутні, виправляє записи з неправильною адресою сервера, за потреби створює зону. Повторний виклик нічого не ламає. Знадобиться, якщо записи видалили або змінили вручну в Cloudflare.
curl -X POST https://panel.example.com/api/domains/Xk9P/recreate-dns \
-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->post('domains/Xk9P/recreate-dns');
$domain = json_decode($response->getBody(), true)['data']['domain'];
echo "DNS {$domain['domain']} перестворено" . PHP_EOL;# pip install requests
import requests
API = "https://panel.example.com/api"
HEADERS = {"Authorization": "Bearer ВАШ_КЛЮЧ", "Accept": "application/json"}
response = requests.post(f"{API}/domains/Xk9P/recreate-dns", headers=HEADERS, timeout=30)
domain = response.json()["data"]["domain"]
print("DNS", domain["domain"], "перестворено")// 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}/domains/Xk9P/recreate-dns`, { method: 'POST', headers, signal: AbortSignal.timeout(30000) });
const { data } = await response.json();
console.log('DNS', data.domain.domain, 'перестворено');Відповідь - домен у data.domain з dns_on: true.
Помилки
| Код | message | Коли |
|---|---|---|
404 | Not found | Домену з таким id немає |
403 | This action is unauthorized. | Домен чужої команди |
Видалення домену
DELETE/domains/{id}
Видаляє DNS-записи домену в Cloudflare і сам домен із панелі. Зона в Cloudflare лишається. Піддомени видаленого кореневого домену лишаються прив'язаними - видаляйте їх окремо.
curl -X DELETE https://panel.example.com/api/domains/Xk9P \
-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('domains/Xk9P');
echo $response->getStatusCode() === 200 ? 'Домен видалено' . 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}/domains/Xk9P", headers=HEADERS, timeout=30)
print("Домен видалено" 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}/domains/Xk9P`, { method: 'DELETE', headers, signal: AbortSignal.timeout(30000) });
console.log(response.ok ? 'Домен видалено' : 'Помилка');Відповідь: {"data": true}.
Помилки
| Код | message | Коли |
|---|---|---|
404 | Not found | Домену з таким id немає |
403 | This action is unauthorized. | Домен чужої команди |