API WL RUS Domains

Публичный REST API личного кабинета: домены, DNS, цены, баланс и пополнения.
Базовый адрес: https://api.wlrus.cfd · версия v1
Содержание
  1. Быстрый старт и доступ
  2. Авторизация
  3. Примеры на curl / JavaScript / Python
  4. Методы
  5. Цены, скидки и лимиты
  6. Ошибки

1. Быстрый старт и доступ

Базовый URLhttps://api.wlrus.cfd
ФорматJSON (UTF-8), поле в ответе — объект
МетодыGET, POST, PATCH, DELETE
Rate limit60 запросов / 60 секунд на ключ

Доступ к API открывается автоматически после того, как суммарные пополнения баланса (за всё время, только оплаченные счета) достигнут 10 $. Ключ выпускается самостоятельно в боте:

  1. Откройте бота и перейдите в Профиль → 🔌 API.
  2. Нажмите «Выпустить ключ». Ключ показывается один раз — сохраните его.
  3. Повторный выпуск создаёт новый ключ, а прежний автоматически отзывается.
Запросы к API выполняются только от имени владельца ключа: через API доступны исключительно его домены, баланс, счета и DNS-записи.

2. Авторизация

Ключ передаётся одним из двух заголовков:

Authorization: Bearer <ВАШ_КЛЮЧ>
X-Api-Key: <ВАШ_КЛЮЧ>

Без ключа возвращается 401 unauthorized. Если ключ действителен, но суммарных пополнений меньше 10 $ — 403 access_required.

3. Примеры

curl

curl -s https://api.wlrus.cfd/v1/me \
  -H "Authorization: Bearer $WLRUS_API_KEY"

# проверка свободен ли домен и цена
curl -s "https://api.wlrus.cfd/v1/check?domain=example.com&years=1" \
  -H "Authorization: Bearer $WLRUS_API_KEY"

JavaScript (fetch)

const API = "https://api.wlrus.cfd";
const KEY = process.env.WLRUS_API_KEY;

const r = await fetch(`${API}/v1/domains`, {
  headers: { Authorization: `Bearer ${KEY}` },
});
const data = await r.json();
console.log(data.domains);

Python (requests)

import requests

API = "https://api.wlrus.cfd"
KEY = "ваш_ключ"
s = requests.Session()
s.headers["Authorization"] = f"Bearer {KEY}"

print(s.get(f"{API}/v1/me").json())
print(s.get(f"{API}/v1/check", params={"domain": "example.com", "years": 1}).json())

4. Методы

GET/v1/health
Проверка доступности сервиса. Авторизация не требуется.
{ "ok": true }
GET/v1/me
Профиль пользователя: баланс, суммарные пополнения, доступ к API, размер скидки.
{
  "id": 123456789,
  "username": "user",
  "full_name": "Иван И.",
  "balance_usd": 25.40,
  "created_at": "2026-01-04 12:00:00",
  "topup_total_usd": 62.00,
  "api_access": true,
  "discount_percent": 10
}
GET/v1/domains
Список ваших доменов.
{
  "domains": [
    {
      "id": 12, "domain": "example.com", "tld": "com", "status": "active",
      "years": 1, "registered_at": "2026-03-11 09:20:00", "expiry": "2027-03-11",
      "auto_renew": false, "nameservers": ["crystal.ns.cloudflare.com"],
      "owed": 0.0
    }
  ]
}
GET/v1/domains/{domain}
Информация об одном домене. Объект — как элемент списка выше.
GET/v1/domains/{domain}/dns
Список DNS-записей домена (через подключённый в боте Cloudflare-токен).
{ "records": [ { "id": "…", "type": "A", "host": "@", "value": "1.2.3.4",
                 "ttl": 3600, "proxied": false } ] }
POST/v1/domains/{domain}/dns
Создать DNS-запись. Типы: A, AAAA, CNAME, TXT, MX, NS, SRV, CAA.
{
  "type": "A",        // обязательно
  "host": "@",        // поддомен, по умолчанию "@"
  "value": "1.2.3.4", // обязательно
  "ttl": 3600,        // необязательно
  "proxied": false,   // оранжевое облако Cloudflare
  "priority": 10      // для MX/SRV
}

Ответ: 201 и { "record": { … } }.

PATCH/v1/domains/{domain}/dns/{record_id}
Изменить DNS-запись. Достаточно передать только изменяемые поля (host, value, ttl, proxied, priority).
DELETE/v1/domains/{domain}/dns/{record_id}
Удалить DNS-запись.
{ "ok": true }
GET/v1/check?domain={domain}&years={n}
Проверка доступности домена и итоговая цена регистрации с учётом вашей скидки.
{ "domain": "example.com", "available": true, "years": 1,
  "price_total_usd": 14.03, "premium": false }

Если домен занят: { "domain": "…", "available": false }.

POST/v1/domains/register
Регистрация домена. Списание с баланса. Премиум-домены и зоны .io/.tv уходят на ручное согласование администратором.
{
  "domain": "example.com",
  "years": 1,
  "use_cloudflare": false   // true — сразу подключить домен к Cloudflare
}

Ответы:

statusHTTPЗначение
registered201Домен зарегистрирован, баланс списан
pending_approval202Заявка отправлена админу, ждёт решения
held202Цена регистратора не подтверждена / нужна ручная проверка
POST/v1/domains/{domain}/renew
Продление домена на N лет. Скидка на продление не распространяется.
{ "years": 1 }
// → { "status": "renewed", "domain": "example.com", "years": 1,
//     "charged_usd": 12.51, "premium": false }
GET/v1/invoices
Последние 50 счетов (пополнений).
{ "invoices": [ { "created_at": "2026-04-02 10:11:12", "method": "lava",
                  "amount_usd": 20.0, "status": "paid", "paid_at": "2026-04-02 10:12:03" } ] }

5. Цены, скидки и лимиты

6. Ошибки

Все ошибки имеют единый формат:

{ "error": { "code": "insufficient_funds", "message": "Недостаточно средств: нужно 14.03, на балансе 5.0" } }
HTTPcodeКогда возникает
400bad_requestНекорректные параметры или тело запроса
401unauthorizedКлюч не указан, недействителен или отозван
402insufficient_fundsНа балансе недостаточно средств
403access_requiredМеньше 10 $ суммарных пополнений
403approval_rejectedРегистрация отклонена администрацией
404not_foundДомен/запись не найдены или не вам принадлежат
409unavailableДомен занят
409cf_requiredНужен подключённый Cloudflare-токен для этой зоны
409cf_not_configuredCloudflare-токен не подключён — DNS недоступен
429rate_limited / busyПревышен лимит запросов / операция уже идёт
500internal_errorВнутренняя ошибка сервиса
502upstream_error / registrar_errorОшибка регистратора или Cloudflare
503tld_disabled / registrar_unavailableЗона закрыта / регистратор недоступен