Registrar Kit
alphaA white-label domain registration API. Build a registrar under your own brand — backed by xdns infrastructure. WHOIS privacy by default. Supports traditional, Handshake, and xdns-native TLDs.
What you can build
Single or bulk domain availability across all supported TLDs — traditional, Handshake, and xdns-operated.
Full registration flow via API. Supports multi-year registration. Renewal reminders via webhook.
Create and manage WHOIS contacts. WHOIS privacy enabled by default — no personal data exposed.
Initiate inbound transfers from any accredited registrar. EPP transfer codes supported.
Configure your own brand name, nameservers, and support email. Customers never see xdns.wtf branding.
Get notified on registration, renewal, transfer, and expiry events. Integrate with your billing system.
Quick start
# 1. Check availability
curl "https://xdns.wtf/api/registrar/check/myapp.com" \
-H "Authorization: Bearer $TOKEN"
# { "domain": "myapp.com", "available": true, "price_usd": 12.99 }
# 2. Bulk check
curl -X POST https://xdns.wtf/api/registrar/check/bulk \
-H "Authorization: Bearer $TOKEN" \
-d '{"domains":["myapp.com","myapp.io","myapp.co"]}'
# 3. Create a contact
curl -X POST https://xdns.wtf/api/registrar/contacts \
-H "Authorization: Bearer $TOKEN" \
-d '{
"name": "Jane Dev",
"email": "jane@myapp.com",
"privacy": true
}'
# { "id": "cnt_01abc" }
# 4. Register the domain
curl -X POST https://xdns.wtf/api/registrar/domains \
-H "Authorization: Bearer $TOKEN" \
-d '{
"domain": "myapp.com",
"years": 2,
"contact_id": "cnt_01abc",
"nameservers": ["ns1.xdns.wtf", "ns2.xdns.wtf"]
}'
# {
# "domain": "myapp.com",
# "status": "active",
# "expires_at": "2028-03-13",
# "nameservers": ["ns1.xdns.wtf", "ns2.xdns.wtf"]
# }White-label configuration
Configure your brand so customers never see xdns.wtf:
curl -X PUT https://xdns.wtf/api/registrar/config \
-H "Authorization: Bearer $TOKEN" \
-d '{
"brand_name": "AcmeDomains",
"nameservers": ["ns1.acmedomains.com", "ns2.acmedomains.com"],
"support_email": "support@acmedomains.com",
"whois_privacy_default": true,
"webhook_url": "https://acmedomains.com/webhooks/xdns"
}'Domain transfers
# Initiate transfer in
curl -X POST https://xdns.wtf/api/registrar/transfers/in \
-H "Authorization: Bearer $TOKEN" \
-d '{
"domain": "myapp.com",
"auth_code": "EPP-AUTH-CODE-FROM-CURRENT-REGISTRAR",
"contact_id": "cnt_01abc"
}'
# { "transfer_id": "tr_01xyz", "status": "pending", "estimated_days": 5 }
# Check transfer status
curl "https://xdns.wtf/api/registrar/transfers/tr_01xyz" \
-H "Authorization: Bearer $TOKEN"
# { "status": "approved", "completed_at": "2026-03-15T12:00:00Z" }Webhook events
| Event | Triggered when |
|---|---|
domain.registered | New domain successfully registered |
domain.renewed | Domain renewal completed |
domain.expiring | Domain expires in 30 / 7 / 1 day(s) |
domain.expired | Domain passed expiry date |
transfer.approved | Inbound transfer completed |
transfer.rejected | Transfer rejected by losing registrar |
contact.updated | WHOIS contact information changed |
API endpoints
/api/registrar/check/:domainSingle domain availability/api/registrar/check/bulkBulk availability (up to 50)/api/registrar/domainsRegister domain/api/registrar/domainsList registered domains/api/registrar/domains/:domain/renewRenew domain/api/registrar/contactsCreate contact/api/registrar/contacts/:idUpdate contact/api/registrar/domains/:domain/privacyEnable WHOIS privacy/api/registrar/transfers/inInitiate inbound transfer/api/registrar/transfers/:idGet transfer status/api/registrar/configUpdate white-label config- ·xdns-native — TLDs registered on Handshake via the Custom TLDs product
- ·Traditional gTLDs — .com, .net, .org, .io, .co, .app, .dev via EPP upstream partners
- ·Handshake TLDs — any HNS-registered TLD where xdns is authoritative