regzone
Войти

API для разработчиков

HTTPS API для ваших программ: записи DNS (certbot и другие клиенты Let’s Encrypt, системы развёртывания, свои скрипты), раздел «Домены» — сроки, серверы имён, автопродление, проверка свободных доменов — и покупки с баланса: регистрация и продление доменов. Ответы — JSON.

Ключ доступа

Ключ создаётся в кабинете, в разделе «API-ключи». Ключ привязывается к выбранным доменам или ко всем доменам аккаунта, включая будущие, и даёт права в трёх разделах — DNS, «Домены» и покупки. Настройки ключа можно изменить в кабинете в любой момент — сам ключ при этом не меняется.

«Полный доступ» в кабинете — это управление DNS и управление доменами сразу. Покупки к нему не относятся: право тратить деньги включается отдельно, с лимитами по желанию.

Ключ передаётся в заголовке Authorization: Bearer <ключ>. Ключ показывается один раз при создании; потерянный или засвеченный ключ перевыпустите в кабинете (кнопка «Перевыпустить»: новое значение, прежние права) или удалите.

curl -H "Authorization: Bearer rz_…" https://regzone.pro/api/v1/zones

HTTP/1.1 200 OK
{"scope":"acme","zones":[{"name":"example.com","status":"active"}]}

Ответ: scope — доступ ключа к DNS (acme, dns_read, dns_write или null, если у ключа его нет); zones — домены, доступные ключу, по алфавиту: name — имя домена (кириллические — в punycode), status — его состояние (active, pending, expired и др.). Записи можно менять только у домена со статусом active, у остальных ответ 409. Других полей в ответе нет.

Проверка ключа

curl -H "Authorization: Bearer rz_…" https://regzone.pro/api/v1/key

{"key":{"name":"certbot","scope":"acme","domainsAccess":null,"purchases":null,"allDomains":false,"domains":["example.com"],"allowedIps":["203.0.113.7"],"expiresAt":null}}

Запрос ничего не меняет и не требует ни одного права — так проверяют, что ключ вписан верно и что он может. scope, domainsAccess и purchases — права ключа (null — права нет); domains — домены, которых он касается; allDomains — ключ работает со всеми доменами аккаунта, включая будущие; allowedIps — адреса, с которых он работает (пусто — с любого); expiresAt — конец срока (ISO 8601) или null у бессрочного.

Адреса

Базовый адрес: https://regzone.pro/api/v1

GET/keyЧто может этот ключ: права, домены, разрешённые адреса, срок. Ничего не меняет.
GET/zonesДомены, доступные ключу, и его право.
GET/zones/{zone}/recordsЗаписи зоны, которые ключу разрешено видеть.
POST/zones/{zone}/recordsДобавить запись. В ответе — её идентификатор.
DELETE/zones/{zone}/records/{id}Удалить одну запись по идентификатору.
GET/domainsДомены ключа: срок, автопродление, серверы имён.
GET/domains/{domain}Один домен — то же самое.
PUT/domains/{domain}/nameserversСменить серверы имён домена.
PUT/domains/{domain}/auto-renewВключить или выключить автопродление.
GET/availability?domain={domain}Свободен ли домен и сколько стоят регистрация и продление.
GET/balanceБаланс аккаунта и лимиты трат ключа.
GET/contactsКонтакты, на которые можно регистрировать домены.
POST/domainsЗарегистрировать домен с баланса.
POST/domains/{domain}/renewПродлить домен с баланса.
GET/orders/{id}Заказ, сделанный этим ключом, и его состояние.

Добавить запись

Тело: type, name, value, ttl (необязательно; по умолчанию 60 для _acme-challenge и 3600 для остальных), priority (обязательно для MX и SRV).

curl -X POST https://regzone.pro/api/v1/zones/example.com/records \
  -H "Authorization: Bearer rz_…" \
  -H "Content-Type: application/json" \
  -d '{"type":"TXT","name":"_acme-challenge","value":"<token>","ttl":60}'

HTTP/1.1 201 Created
{"record":{"id":"4Zt2…","type":"TXT","name":"_acme-challenge","value":"<token>","ttl":60,"priority":null},"created":true}

Список записей

curl -H "Authorization: Bearer rz_…" https://regzone.pro/api/v1/zones/example.com/records

{"zone":"example.com","records":[{"id":"4Zt2…","type":"TXT","name":"_acme-challenge","value":"<token>","ttl":60,"priority":null}]}

Ключ «Только проверка SSL» видит только записи _acme-challenge; по списку удобно найти и убрать оставшиеся проверочные записи.

Удалить запись

curl -X DELETE -H "Authorization: Bearer rz_…" https://regzone.pro/api/v1/zones/example.com/records/4Zt2…

HTTP/1.1 204 No Content

Удаляется ровно одна запись; другие записи TXT на том же имени остаются. Несуществующий идентификатор — 404.

Домены

Нужно право «Домены: чтение» или «Домены: управление».

curl -H "Authorization: Bearer rz_…" https://regzone.pro/api/v1/domains

{"domains":[{"name":"example.com","status":"active","expiresAt":"2027-10-02T00:00:00.000Z","autoRenew":true,"nameservers":["ns1.regzone.pro","ns2.regzone.pro"],"dns":"platform"}]}

expiresAt — окончание срока (ISO 8601) или null, пока домен регистрируется; dns — platform, если зону обслуживают серверы имён по умолчанию, иначе other.

Серверы имён

curl -X PUT https://regzone.pro/api/v1/domains/example.com/nameservers \
  -H "Authorization: Bearer rz_…" \
  -H "Content-Type: application/json" \
  -d '{"nameservers":["ns1.example.net","ns2.example.net"]}'

{"domain":{"name":"example.com",…,"nameservers":["ns1.example.net","ns2.example.net"],"dns":"other"}}

Нужно право «Домены: управление». От 2 до 13 имён. Серверы имён по умолчанию так не ставятся (ответ 409 platform_nameservers): возврат на них — кнопкой в кабинете, она переносит записи зоны. Свои серверы для такого домена — можно: домен уйдёт с DNS по умолчанию так же, как из кабинета. В ответе — домен после изменения.

Автопродление

curl -X PUT https://regzone.pro/api/v1/domains/example.com/auto-renew \
  -H "Authorization: Bearer rz_…" \
  -H "Content-Type: application/json" \
  -d '{"enabled":false}'

Нужно право «Домены: управление». Автопродление списывает деньги с баланса за 14 дней до окончания срока; через API его только включают и выключают.

Свободен ли домен

curl -H "Authorization: Bearer rz_…" "https://regzone.pro/api/v1/availability?domain=example.org"

{"domain":"example.org","available":true,"premium":false,"sold":true,"price":{"minor":113480,"currency":"RUB"},"renewPrice":{"minor":113480,"currency":"RUB"}}

Нужно право «Домены: чтение». Одно полное имя за запрос. Цены — в копейках (minor) и в валюте баланса; premium — премиум-домен с особой ценой; sold: false — эту зону мы не продаём. Проверок — не больше 40 в минуту.

Покупки

Нужно право «Покупки: продление» или «Покупки: регистрация и продление». Деньги списываются с баланса аккаунта — пополните его в кабинете заранее. Адрес почты аккаунта должен быть подтверждён.

Баланс и лимиты

curl -H "Authorization: Bearer rz_…" https://regzone.pro/api/v1/balance

{"balance":{"minor":500000,"currency":"RUB"},"key":{"purchases":"register","dailyLimit":{"minor":300000,"currency":"RUB"},"purchaseLimit":null,"spentLast24h":{"minor":113480,"currency":"RUB"},"remainingLast24h":{"minor":186520,"currency":"RUB"}}}

dailyLimit и purchaseLimit — лимиты ключа (null — без лимита); spentLast24h — сколько ключ потратил за последние 24 часа; remainingLast24h — сколько ещё можно потратить (null — без лимита).

Контакты

curl -H "Authorization: Bearer rz_…" https://regzone.pro/api/v1/contacts

{"contacts":[{"id":"8f0c…","label":"Основной","name":"Иван Петров","country":"RU","default":true}]}

Нужно право «Покупки: регистрация и продление». Контакты заводятся в кабинете; через API отдаются только номер, подпись, имя и страна.

Зарегистрировать домен

curl -X POST https://regzone.pro/api/v1/domains \
  -H "Authorization: Bearer rz_…" \
  -H "Idempotency-Key: 3b1f6c2e-7a4d-4f0e-9c1a-5d2b8e6f0a11" \
  -H "Content-Type: application/json" \
  -d '{"domain":"example.org","years":1,"contact":"8f0c…","autoRenew":true}'

HTTP/1.1 202 Accepted
{"order":{"id":"c41e…","status":"processing"},"domain":"example.org","years":1,"charged":{"minor":113480,"currency":"RUB"},"replayed":false}

Тело: domain — одно полное имя; years — срок в годах (по умолчанию 1; у .ru и .рф — только 1); contact — номер контакта-владельца (по умолчанию — основной контакт); autoRenew — продлевать ли домен автоматически с баланса (по умолчанию false). Ответ 202: заказ оплачен, регистрация идёт — обычно минуту. Ход регистрации — в GET /orders/{id}; готовый домен появится в GET /domains, если ключ работает со всеми доменами аккаунта. Для зон с дополнительными данными (.ru, .рф, .us, .it) их заполняют в контакте в кабинете.

Продлить домен

curl -X POST https://regzone.pro/api/v1/domains/example.com/renew \
  -H "Authorization: Bearer rz_…" \
  -H "Idempotency-Key: renew-example.com-2027" \
  -H "Content-Type: application/json" \
  -d '{"years":1}'

{"domain":{"name":"example.com","status":"active","expiresAt":"2028-10-02T00:00:00.000Z",…},"years":1,"charged":{"minor":113480,"currency":"RUB"},"replayed":false}

Тело: years — срок в годах (по умолчанию 1; тело можно не передавать). Продлеваются только домены ключа. В ответе — домен с новым сроком. Если реестр зоны ещё не принимает продление (у .ru и .рф — за два месяца до окончания), ответ 409 renewal_not_open с датой.

Заказ

curl -H "Authorization: Bearer rz_…" https://regzone.pro/api/v1/orders/c41e…

{"order":{"id":"c41e…","status":"completed","total":{"minor":113480,"currency":"RUB"},"placedAt":"2026-10-03T09:15:00.000Z","items":[{"domain":"example.org","years":1}]}}

Ключ видит только свои заказы. status: processing — оплачен, регистрация идёт; completed — домен зарегистрирован; failed или refunded — не получилось, деньги вернулись на баланс.

Ограничения

Ошибки

Ошибка — код HTTP и тело с машинным кодом (code), пояснением (message) и номером запроса (request_id):

HTTP/1.1 409 Conflict
X-Request-Id: req_5b1c0e7a9d2f4c68b3a1e0d97f246c15

{"error":{"code":"zone_not_active","message":"The domain is not active: its status is \"pending\". Records can be managed once it is \"active\".","details":{"status":"pending"},"request_id":"req_5b1c0e7a9d2f4c68b3a1e0d97f246c15"}}

Каждый ответ несёт заголовок X-Request-Id, а ошибка — то же значение в поле request_id. Пришлите его в поддержку: по нему мы находим запрос в журнале.

У части ошибок есть поле details с тем, что именно не так: у zone_not_active — status (текущий статус домена), у zone_not_served — nameservers (серверы имён, записанные у нас за доменом) и expected_nameservers (серверы, для которых API меняет записи), у ip_not_allowed — ip (адрес, с которого пришёл запрос).

400idempotency_key_requiredНет заголовка Idempotency-Key — без него покупку можно случайно повторить.
400invalid_jsonТело запроса — не JSON.
401invalid_tokenНет ключа, ключ неверный, отозван или истёк.
402insufficient_balanceНе хватает денег на балансе — пополните его в кабинете.
403insufficient_scopeУ ключа нет права на этот раздел или действие.
403ip_not_allowedС этого адреса ключ не работает: адреса нет в списке разрешённых у ключа.
403email_not_verifiedСначала подтвердите адрес почты аккаунта.
403purchase_limit_exceededПокупка дороже лимита одной покупки этого ключа.
403daily_limit_exceededПокупка не помещается в лимит ключа за 24 часа.
403forbidden_recordПраву ключа эта запись не разрешена.
403zone_suspendedДомен приостановлен — менять его зону нельзя.
403domain_suspendedДомен заблокирован — менять его нельзя.
404zone_not_foundТакой зоны у ключа нет.
404record_not_foundТакой записи нет.
404domain_not_foundЭтого домена у ключа нет.
404order_not_foundТакого заказа у ключа нет.
409zone_not_activeДомен не активен; его статус — в details.status. Записями можно управлять, когда статус — active.
409zone_not_servedДомен делегирован на другие серверы имён — записями управляют там. Какие серверы записаны за доменом и какие нужны — в details.
409zone_fullВ зоне уже максимум записей.
409platform_nameserversСерверы имён по умолчанию ставятся кнопкой в кабинете.
409not_supportedДля этого домена такое изменение недоступно.
409domain_not_availableДомен занят — зарегистрировать его нельзя.
409price_unavailableЦену сейчас не определить — повторите позже.
409renewal_not_openРеестр зоны ещё не принимает продление — в ответе дата, с которой можно.
409renewal_in_progressЭтот домен прямо сейчас продлевается.
409late_fee_requiredПродление сейчас стоит дополнительный сбор — денег не списано, напишите в поддержку.
409request_in_progressЗапрос с этим Idempotency-Key ещё выполняется — повторите через минуту.
409previous_order_failedПокупка с этим Idempotency-Key уже не удалась, деньги вернулись. Для новой попытки — новое значение.
413body_too_largeСлишком большой запрос.
422invalid_bodyТело не JSON нужного вида.
422invalid_valueНеверное значение, имя, TTL или тип записи.
422invalid_typeНеизвестный тип записи или тип, который для этого домена не поддерживается.
422invalid_nameНеверное имя записи или имя другой зоны.
422invalid_ttlНедопустимый TTL.
422priority_requiredДля записи этого типа нужен приоритет.
422invalid_nameserversНужно от 2 до 13 имён вида ns1.example.net.
422invalid_domainНужно одно полное имя домена.
422invalid_yearsСрок вне допустимого для зоны.
422contact_requiredВ аккаунте нет контактов — добавьте контакт в кабинете.
422contact_not_foundТакого контакта нет — см. GET /contacts.
422contact_incompleteКонтакт заполнен не полностью — дополните его в кабинете.
422contact_missing_zone_dataДля этой зоны в контакте не хватает данных — заполните блок «Документы».
422contact_not_eligibleРеестр зоны не принимает владельца из страны контакта.
429rate_limitedСлишком много запросов — повторите позже.
500internal_errorНепредвиденная ошибка — повторите позже; если повторяется, пришлите request_id в поддержку.
502dns_unavailableЗону не удалось прочитать — повторите позже.
502dns_write_failedЗапись не удалось сохранить — повторите через минуту.
502registry_unavailableИзменение не прошло — повторите чуть позже.
502check_failedПроверка не завершилась — повторите чуть позже.
502purchase_failedПокупка не прошла, денег не списано — повторите чуть позже.
502renewal_failedПродление не прошло, деньги вернулись на баланс — повторите чуть позже.
502charge_failedНе удалось списать деньги — повторите чуть позже.
503check_unavailableРеестр не ответил — повторите чуть позже.
503temporarily_unavailableИзменения временно недоступны.
503api_disabledAPI временно приостановлено.

Wildcard-сертификат через certbot

Два скрипта для certbot: первый ставит проверочную запись, второй убирает её после проверки. Замените example.com своим доменом.

#!/bin/sh
# /etc/letsencrypt/regzone-auth.sh — certbot --manual-auth-hook
set -eu
KEY=$(cat /etc/letsencrypt/regzone.key)
ZONE="example.com"
ID_FILE="/var/tmp/regzone-$CERTBOT_DOMAIN-$CERTBOT_VALIDATION.id"

curl -fsS -X POST "https://regzone.pro/api/v1/zones/$ZONE/records" \
  -H "Authorization: Bearer $KEY" \
  -H "Content-Type: application/json" \
  -d "{\"type\":\"TXT\",\"name\":\"_acme-challenge.$CERTBOT_DOMAIN\",\"value\":\"$CERTBOT_VALIDATION\",\"ttl\":60}" \
  | sed -n 's/.*"id":"\([^"]*\)".*/\1/p' > "$ID_FILE"

# The record reaches the public nameservers within 1–2 minutes.
sleep 90
#!/bin/sh
# /etc/letsencrypt/regzone-cleanup.sh — certbot --manual-cleanup-hook
set -eu
KEY=$(cat /etc/letsencrypt/regzone.key)
ZONE="example.com"
ID_FILE="/var/tmp/regzone-$CERTBOT_DOMAIN-$CERTBOT_VALIDATION.id"

if [ -s "$ID_FILE" ]; then
  curl -fsS -X DELETE "https://regzone.pro/api/v1/zones/$ZONE/records/$(cat "$ID_FILE")" \
    -H "Authorization: Bearer $KEY"
  rm -f "$ID_FILE"
fi

Сохраните ключ в файл, выпустите сертификат — продление пойдёт с теми же скриптами:

printf '%s' 'rz_…' > /etc/letsencrypt/regzone.key
chmod 600 /etc/letsencrypt/regzone.key
chmod 700 /etc/letsencrypt/regzone-auth.sh /etc/letsencrypt/regzone-cleanup.sh

certbot certonly --manual --preferred-challenges dns \
  --manual-auth-hook /etc/letsencrypt/regzone-auth.sh \
  --manual-cleanup-hook /etc/letsencrypt/regzone-cleanup.sh \
  -d example.com -d '*.example.com'

# Renewal re-uses the same hooks:
certbot renew

Ключу хватает права «Только проверка SSL». Сертификат на example.com и *.example.com требует две записи TXT на одном имени — API это поддерживает.

Безопасность

API для разработчиков · regzone