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.Домен чужой команды