Docs
Trading domain-core API

PlanetDomains API

Спокойная и предсказуемая API для доменной торговли: поиск, регистрация, продление, DNS, nameservers, Cloudflare и webhook. Публичные docs открыты, а рабочие методы защищены токеном и whitelist IP.

Base URL

https://planet-project.click/api/v1

Auth

Bearer token из бота + whitelist IP. Создание и перевыпуск токена доступны при балансе от $40.

Mutations

Idempotency-Key обязателен для register, renew, DNS, NS, bind и batch.

Limits

10 RPS на токен. Если спайк слишком жёсткий, токен временно блокируется на 5 минут.

Быстрый старт

Сначала токен, потом whitelist, потом запросы
  1. Создайте токен в боте: Профиль -> API.
  2. Добавьте IP сервера, который будет вызывать API, в Whitelist.
  3. Передавайте Authorization: Bearer <token> в каждый защищённый запрос.
  4. Для всех изменяющих запросов добавляйте уникальный Idempotency-Key.

Токен и whitelist

Bearer + whitelist
Создание токена, whitelist и webhook управляются из бота. Новый токен или перевыпуск доступны при балансе от $40. Пустой whitelist означает полностью закрытую API даже при валидном токене.
GET
/api/v1/account

Баланс, API-статус, whitelist, webhook и summary defaults.

Справка
AuthBearer + whitelist
Параметрыnone
Ответaccount summary
Idempotencyне нужен
Эффекттолько чтение
Развернуть деталиparams / body / response / notes

Response shape

{
  "status": true,
  "result": {
    "user_id": 7,
    "balance_usd": 1.25,
    "api_enabled": true,
    "webhook_enabled": false
  }
}

Зоны и цены

GET /api/v1/zones
GET
/api/v1/zones

Список зон с ценой регистрации, ценой продления и premium flag.

Справка
AuthBearer + whitelist
Параметрыnone
Ответzones[]
Idempotencyне нужен
Эффекттолько чтение
Развернуть деталиparams / body / response / notes

Response shape

{
  "status": true,
  "result": {
    "zones": [
      {"zone": ".click", "register_price_usd": 3.20, "renew_price_usd": 27.47, "premium": false}
    ]
  }
}

Операционные заметки

  • Используйте этот метод как основу для витрины и калькулятора.

Регистрация

POST /api/v1/domains/register
POST
/api/v1/domains/register

Регистрация одного домена. Если config не передан, используются defaults из конфигуратора.

Торговляconfig
AuthBearer + whitelist
Bodydomain, years?, config?
Ответorder summary
Idempotencyобязателен
Эффектсоздаёт заказ
Развернуть деталиparams / body / response / notes

Request body

{
  "domain": "planet-project.click",
  "years": 1,
  "client_ref": "deal-42",
  "external_ref": "invoice-77"
}

Response shape

{
  "status": true,
  "result": {
    "domain": "planet-project.click",
    "status": "registered",
    "client_ref": "deal-42",
    "external_ref": "invoice-77"
  }
}

Ошибки

404 domain_not_found
Домен не найден или уже занят.
422 validation_error
Некорректный payload или config.

Операционные заметки

  • Для изменяющих операций всегда прикладывайте Idempotency-Key.
  • client_ref и external_ref возвращаются обратно в detail, list и webhook payload.
POST
/api/v1/domains/register/batch

Пакетная регистрация с частичным успехом и item-level статусами.

BatchТорговля
AuthBearer + whitelist
Bodyitems[]
Ответcount / success / failed / items[]
Idempotencyобязателен
Эффектсоздаёт заказы
Развернуть деталиparams / body / response / notes

Request body

{
  "items": [
    {"domain": "planet-project.click", "years": 1, "client_ref": "deal-1"},
    {"domain": "planet-trade.click", "years": 1, "client_ref": "deal-2"}
  ]
}

Response shape

{
  "status": true,
  "result": {
    "count": 2,
    "success": 1,
    "failed": 1,
    "items": []
  }
}

Операционные заметки

  • Batch допускает частичный успех. Каждый item нужно читать отдельно.

Batch-операции

Частичный успех — это нормальный контракт
Batch-потоки всегда возвращают результат по каждому item. Не полагайтесь на один верхнеуровневый status и не делайте выводы о всём запросе по первому неуспеху.

Ошибки batch item

Читать по item, не по эмоции
invalid_domain
Домен не прошёл локальную валидацию.
not_available
Домен уже занят или недоступен для заказа.
validation_error
Payload item содержит несовместимую конфигурацию.
request_in_progress
Для того же Idempotency-Key операция ещё выполняется.

Продление

POST /renew
POST
/api/v1/domains/{domain}/renew

Продление одного домена.

Торговля
AuthBearer + whitelist
Bodyyears, client_ref?, external_ref?
Ответrenewal summary
Idempotencyобязателен
Эффектпродлевает домен
Развернуть деталиparams / body / response / notes

Параметры

domain
Домен из вашего аккаунта.

Request body

{
  "years": 1,
  "client_ref": "renew-42"
}

Response shape

{
  "status": true,
  "result": {
    "domain": "planet-project.click",
    "status": "renewed"
  }
}

Операционные заметки

  • Путь продления использует ту же ценовую логику, что и бот.
POST
/api/v1/domains/renew/batch

Пакетное продление доменов.

BatchТорговля
AuthBearer + whitelist
Bodyitems[]
Ответcount / success / failed / items[]
Idempotencyобязателен
Эффектпродлевает пакет доменов
Развернуть деталиparams / body / response / notes

Request body

{
  "items": [
    {"domain": "planet-project.click", "years": 1},
    {"domain": "planet-trade.click", "years": 1}
  ]
}

Response shape

{
  "status": true,
  "result": {
    "count": 2,
    "success": 2,
    "failed": 0,
    "items": []
  }
}

Операционные заметки

  • Используйте batch renew для реселлерских циклов и ночных задач.

client_ref / external_ref

Связка с вашей системой
client_ref и external_ref помогают связать сделки, счета и внутренние заказы с нашим ответом. Они сохраняются в заказе и возвращаются в list, detail и webhook payload.

SDK-примеры

Быстрый старт для интегратора
Python
import requests

r = requests.get(
    f"{BASE_URL}/account",
    headers={"Authorization": f"Bearer {TOKEN}"},
    timeout=20,
)
print(r.json())
Node.js
const response = await fetch(`${BASE_URL}/domains/search?query=planet-project.click`, {
  headers: { Authorization: `Bearer ${TOKEN}` },
});
console.log(await response.json());
PHP
$ch = curl_init(BASE_URL . "/account");
curl_setopt_array($ch, [
  CURLOPT_HTTPHEADER => ["Authorization: Bearer " . TOKEN],
  CURLOPT_RETURNTRANSFER => true,
]);
echo curl_exec($ch);

Примеры ответов

JSON
Account
{
  "status": true,
  "result": {
    "user_id": 7,
    "balance_usd": 1.25,
    "api_enabled": true
  }
}
Domain search
{
  "status": true,
  "result": {
    "query": "planet-project.click",
    "available": false,
    "register_price_usd": 3.20
  }
}
Webhook delivery
{
  "status": true,
  "result": {
    "limit": 10,
    "count": 1,
    "items": [
      {"event_type": "domain.renewed", "attempt_number": 1, "status": "delivered", "status_code": 200}
    ]
  }
}

DNS и NS

Чтение и полная замена
GET
/api/v1/domains/{domain}/dns

Текущие DNS-записи, nameservers и режим домена.

Инфраструктура
AuthBearer + whitelist
Pathdomain
Ответrecords / nameservers / mode
Idempotencyне нужен
Эффекттолько чтение
Развернуть деталиparams / body / response / notes

Параметры

domain
Домен из вашего аккаунта.

Response shape

{
  "status": true,
  "result": {
    "mode": "cloudflare",
    "records": [],
    "nameservers": ["elaine.ns.cloudflare.com", "thomas.ns.cloudflare.com"]
  }
}
PUT
/api/v1/domains/{domain}/dns

Полная замена набора DNS-записей через тот же валидатор, что и в боте.

Инфраструктура
AuthBearer + whitelist
Bodyrecords[]
Ответupdated dns
Idempotencyобязателен
Эффектзаменяет DNS
Развернуть деталиparams / body / response / notes

Параметры

domain
Домен из вашего аккаунта.

Request body

{
  "records": [
    {"type": "A", "name": "@", "content": "2.26.84.230", "ttl": 300}
  ]
}

Response shape

{
  "status": true,
  "result": {
    "updated": true,
    "records": []
  }
}
PATCH
/api/v1/domains/{domain}/nameservers

Полная замена nameservers через preset_key или явный список nameservers.

Инфраструктура
AuthBearer + whitelist
Bodypreset_key or nameservers
Ответupdated nameservers
Idempotencyобязателен
Эффектзаменяет NS
Развернуть деталиparams / body / response / notes

Параметры

domain
Домен из вашего аккаунта.

Request body

{
  "nameservers": ["ns1.example.net", "ns2.example.net"]
}

Response shape

{
  "status": true,
  "result": {
    "updated": true,
    "nameservers": ["ns1.example.net", "ns2.example.net"]
  }
}

Cloudflare bind

POST /api/v1/domains/{domain}/cloudflare/bind
POST
/api/v1/domains/{domain}/cloudflare/bind

Привязка домена к Cloudflare-профилю из бота.

Cloudflare
AuthBearer + whitelist
Bodycloudflare_profile_key
Ответcloudflare bind summary
Idempotencyобязателен
Эффектподключает Cloudflare
Развернуть деталиparams / body / response / notes

Параметры

domain
Домен из вашего аккаунта.

Request body

{
  "cloudflare_profile_key": "default"
}

Response shape

{
  "status": true,
  "result": {
    "bound": true,
    "cloudflare_profile_key": "default"
  }
}

Ошибки

409 cloudflare_not_configured
Cloudflare-профиль не найден или выключен.

Webhook

Webhook + delivery log
Webhook настраивается из бота и отправляет все поддерживаемые доменные события пользователя. Для payload, подписей и retries откройте отдельный webhook guide.

Ошибки и лимиты

401 / 403 / 404 / 409 / 422 / 429
Самая полезная модель проста: 401/403 — это доступ, 404/422 — payload или ownership, 409 — состояние или конфиг, 429 — pacing и backoff.

Endpoints

Краткая карта v1
GET /account
Баланс, whitelist, webhook и summary аккаунта.
GET /zones
Зоны и цены регистрации/продления.
GET /domains/search
Точный поиск домена.
POST /domains/search/batch
Batch-поиск доменов.
POST /domains/register
Регистрация одного домена.
POST /domains/register/batch
Пакетная регистрация доменов.
POST /domains/{domain}/renew
Продление одного домена.
POST /domains/renew/batch
Пакетное продление доменов.
GET/PUT /domains/{domain}/dns
Чтение и полная замена DNS.
PATCH /domains/{domain}/nameservers
Полная замена NS.
POST /domains/{domain}/cloudflare/bind
Привязка к Cloudflare-профилю.

OpenAPI

/api/v1/openapi.json

Используйте OpenAPI JSON для генерации клиента, контрактной проверки и быстрой навигации по схемам.