Skip to content

Домени ​

Методи для доменів: прив'язати домен або піддомен до 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 або спліт - за його командою вибираються домени
bash
curl "https://panel.example.com/api/domains?pwa_id=WZAX" \
  -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('domains', ['query' => ['pwa_id' => 'WZAX']]);
$domains = json_decode($response->getBody(), true)['data']['domains'];

foreach ($domains as $domain) {
    echo "{$domain['id']} {$domain['domain']}" . 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}/domains", headers=HEADERS, params={"pwa_id": "WZAX"}, timeout=30)
domains = response.json()["data"]["domains"]

for domain in domains:
    print(domain["id"], domain["domain"])
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}/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);
}
Відповідь
json
{
  "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Коли
422The pwa id field is required when pwa split id is not present.Не передано ні pwa_id, ні pwa_split_id, або id не існує
403This 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 або спліта, до яких у вас є доступ.

bash
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
<?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;
python
# 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"]))
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}/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, у яку він потрапив:

Відповідь
json
{
  "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Коли
422The domain field is required.Не передано domain
422The domain field format is invalid.domain - не доменне ім'я
422The pwa id field is required when pwa split id is not present.Не передано ні pwa_id, ні pwa_split_id, або id не існує
422You do not have access to this resourcePWA або спліт, до якого у вас немає доступу; разом із ним на team_id приходить You do not have access to this team
422The cloudflare id field must be an integer.cloudflare_id не існує
403This action is unauthorized.Домен уже додала інша команда
403Limit reached: max_domains (50)Вичерпано ліміт доменів ліцензії
404Not foundПіддомен, а його кореневого домену немає в панелі

Вимкнення та увімкнення DNS ​

POST/domains/{id}/toggle-dns

Якщо DNS домену увімкнено, видаляє його записи в Cloudflare (домен перестає відкриватися, але лишається прив'язаним); якщо вимкнено - створює їх заново.

bash
curl -X POST https://panel.example.com/api/domains/Xk9P/toggle-dns \
  -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->post('domains/Xk9P/toggle-dns');
$domain = json_decode($response->getBody(), true)['data']['domain'];

echo ($domain['dns_on'] ? 'DNS увімкнено' : 'DNS вимкнено') . 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}/domains/Xk9P/toggle-dns", headers=HEADERS, timeout=30)
domain = response.json()["data"]["domain"]

print("DNS увімкнено" if domain["dns_on"] else "DNS вимкнено")
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}/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Коли
404Not foundДомену з таким id немає
403This action is unauthorized.Домен чужої команди

Перестворення DNS ​

POST/domains/{id}/recreate-dns

Приводить записи домену в Cloudflare до правильного вигляду: створює відсутні, виправляє записи з неправильною адресою сервера, за потреби створює зону. Повторний виклик нічого не ламає. Знадобиться, якщо записи видалили або змінили вручну в Cloudflare.

bash
curl -X POST https://panel.example.com/api/domains/Xk9P/recreate-dns \
  -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->post('domains/Xk9P/recreate-dns');
$domain = json_decode($response->getBody(), true)['data']['domain'];

echo "DNS {$domain['domain']} перестворено" . 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}/domains/Xk9P/recreate-dns", headers=HEADERS, timeout=30)
domain = response.json()["data"]["domain"]

print("DNS", domain["domain"], "перестворено")
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}/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Коли
404Not foundДомену з таким id немає
403This action is unauthorized.Домен чужої команди

Видалення домену ​

DELETE/domains/{id}

Видаляє DNS-записи домену в Cloudflare і сам домен із панелі. Зона в Cloudflare лишається. Піддомени видаленого кореневого домену лишаються прив'язаними - видаляйте їх окремо.

bash
curl -X DELETE https://panel.example.com/api/domains/Xk9P \
  -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->delete('domains/Xk9P');

echo $response->getStatusCode() === 200 ? 'Домен видалено' . PHP_EOL : 'Помилка' . PHP_EOL;
python
# 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 "Помилка")
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}/domains/Xk9P`, { method: 'DELETE', headers, signal: AbortSignal.timeout(30000) });

console.log(response.ok ? 'Домен видалено' : 'Помилка');

Відповідь: {"data": true}.

Помилки
КодmessageКоли
404Not foundДомену з таким id немає
403This action is unauthorized.Домен чужої команди