Когда доменов немного, всё удобно делать в панели вручную: найти домен, купить, прописать серверы имён, добавить DNS-записи. Но когда клиентов больше сотни или сервис должен автоматически создавать домен или поддомен для каждого нового клиента, ручная работа становится медленной и подверженной ошибкам. Здесь помогает API доменов: программа напрямую общается с регистратором или DNS-сервером и выполняет одни и те же действия без участия человека. Разберём, что можно автоматизировать, какие протоколы используются и как построить систему безопасно.
Какие операции доступны через API
API доменов — это, по сути, программный вариант действий, которые обычно выполняются в панели. Самые частые операции:
- проверка доступности домена и получение цены;
- регистрация и продление домена;
- смена серверов имён и обновление контактов;
- получение кода трансфера и отслеживание статуса трансфера;
- добавление, изменение и удаление DNS-записей.
Регистраторы предоставляют эти возможности двумя способами. Первый — протокол EPP: он работает между реестром и аккредитованными регистраторами, построен на XML и требует отдельного подключения, сертификата и договора. Второй — собственный REST- или JSON-API регистратора: он рассчитан на реселлеров и разработчиков, работает через обычные HTTPS-запросы и использует токен доступа. Для малого и среднего бизнеса почти всегда подходит второй вариант.
Проверка доступности и регистрация
Любой автоматический заказ начинается с проверки доступности. В примере используется условный адрес api.misol.uz, поскольку адрес и формат запросов у каждого регистратора свои. В реальном проекте берите параметры из документации своего регистратора:
# Проверка доступности нескольких доменов (адрес условный, для примера)
curl -s -X POST https://api.misol.uz/v1/domains/check \
-H "Authorization: Bearer $API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"domains": ["example.uz", "example.com"]}'
Для независимой проверки можно использовать RDAP. Для международных доменов RDAP-сервер обычно возвращает 404, если домен не найден, но это не гарантирует, что он свободен: имя может быть зарезервировано или стоять в очереди на удаление. Поэтому RDAP — только дополнительная проверка, а окончательное решение должно опираться на ответ API регистратора:
# 404 - записи в реестре нет (возможно, свободен), 200 - занят
curl -sL -o /dev/null -w "%{http_code}\n" https://rdap.org/domain/example.com
Важное правило: прежде чем списывать деньги с клиента, убедитесь, что домен действительно свободен, и дождитесь подтверждения успешной регистрации. Регистрация часто асинхронна: то, что API принял запрос, ещё не значит, что домен ваш. Если статус «в ожидании», запрашивайте его повторно через интервалы или получайте уведомление через webhook, если регистратор это поддерживает. При отказе в регистрации система должна автоматически вернуть деньги клиенту или показать заказ администратору.
Повторные запросы и устойчивость к ошибкам
Обрывы сети бывают в любой интеграции. Если программа отправила запрос на регистрацию и соединение оборвалось до ответа, она повторит запрос, и домен может быть оплачен дважды. Чтобы этого избежать, многие API поддерживают ключ идемпотентности: второй запрос с тем же ключом не выполняет новое действие, а возвращает результат первого. В примере на Python показан этот подход и растущая пауза между попытками:
import os, time, uuid, requests
API = "https://api.misol.uz/v1"
HEAD = {"Authorization": f"Bearer {os.environ['API_TOKEN']}"}
def register(domain, contact_id, years=1):
key = str(uuid.uuid4()) # один и тот же запрос не выполнится дважды
for attempt in range(3):
r = requests.post(f"{API}/domains", headers={**HEAD, "Idempotency-Key": key},
json={"domain": domain, "years": years, "contact": contact_id},
timeout=30)
if r.status_code < 500:
r.raise_for_status()
return r.json()
time.sleep(2 ** attempt)
raise RuntimeError("API не ответил")
Обратите внимание: повтор выполняется только при ошибках сервера (5xx). При неверных параметрах или нехватке баланса повтор бесполезен, такие ошибки нужно сразу записать в лог и показать человеку. Проверьте в документации, поддерживает ли регистратор заголовок Idempotency-Key; если нет, подобную защиту придётся строить в своей базе через статус заказа.
Автоматизация DNS-записей
Потребность в автоматизации DNS часто даже больше, чем в автоматической регистрации. Например, платформа для учебного центра в Ташкенте создаёт для каждого филиала поддомен вида chilonzor.misol.uz. Для поддомена не нужно покупать новый домен, достаточно добавить запись в DNS-зону. Если DNS у регистратора или хостинг-провайдера, это делается через их API, а если у вас свой сервер BIND — через динамическое обновление, защищённое ключом TSIG:
# Создание ключа TSIG (BIND 9)
tsig-keygen -a hmac-sha256 deploy-key > /etc/bind/keys/deploy.key
# Замена A-записи
nsupdate -k /etc/bind/keys/deploy.key <<'EOF'
server ns1.misol.uz
zone misol.uz
update delete shop.misol.uz. A
update add shop.misol.uz. 300 A 203.0.113.10
send
EOF
# Проверка результата
dig +short shop.misol.uz @ns1.misol.uz
Чтобы динамическое обновление работало, в настройках зоны этому ключу должно быть разрешено обновление, например через директиву update-policy или allow-update в BIND. Давайте ключу права только на нужную зону или даже только на определённые имена. Для автоматически меняющихся записей ставьте короткий TTL, например 300 секунд, для постоянных — длиннее.
Безопасность: токены, права и логи
Токен API доменов — это ключ ко всем вашим доменам и балансу. Никогда не пишите его в коде и не храните в Git-репозитории: держите токен в переменной окружения или хранилище секретов. Если регистратор позволяет ограничить доступ по IP, разрешите обращения к API только с адреса вашего сервера. Давайте токену только необходимые права: скрипту, обновляющему DNS-записи, не нужно право на трансфер домена или смену контактов.
Записывайте в лог каждый вызов API, особенно связанные с деньгами, вместе со временем, параметрами и ответом, но не записывайте сам токен. При проблеме именно эти записи помогут восстановить картину. Соблюдайте также лимиты запросов (rate limit): при слишком частых обращениях вас могут временно заблокировать.
Внедрение по шагам
Не спешите автоматизировать всё сразу. Начните с операций чтения: проверки доступности и получения дат окончания. Затем подключите обновление DNS-записей и только в конце — регистрацию и продление, при которых списываются деньги. Если регистратор предлагает тестовую среду (sandbox), проверяйте каждую новую функцию сначала там.
Клиенты sayt.uz управляют доменами, DNS и автопродлением в кабинете, а о возможностях интеграции через API можно спросить в техподдержке. С каким бы провайдером вы ни работали, сохраняйте возможность ручного управления рядом с автоматикой: даже если API временно недоступен, важный домен должно быть можно продлить, а DNS-запись — исправить.