Void API — your domains, over REST.
Check availability, register and renew, switch nameservers, put a domain behind Cloudflare and manage its DNS, security switches and redirects — from your own code, on the same account and balance as the bot.
Cloudflare
one call to connect, then full controlA connected domain gets a Cloudflare zone from our pool: we create it, switch the nameservers at the registry and proxy your traffic. All endpoints below need a connected domain and answer 409 CLOUDFLARE_NOT_CONNECTED otherwise. Right after connecting the zone is pending until the nameserver change propagates (minutes to an hour); DNS records can be added straight away, cache and settings calls may return CLOUDFLARE_ZONE_PENDING until then.
Zone
Whether the domain is connected and how far the nameserver switch has propagated.
{ "ok": true, "data": { "connected": true, "domainName": "example.org", "zoneId": "6a18…",
"nameservers": ["margo.ns.cloudflare.com", "mimi.ns.cloudflare.com"], "zoneStatus": "active", "nsApplied": true } }
// not connected: { "connected": false, "domainName": "…", "zoneId": null, "nameservers": [], "zoneStatus": "none", "nsApplied": false }Creates the zone and switches the registry nameservers to Cloudflare's. Returns the zone status (pending at first). Existing records on our parking nameservers are not carried over — add what you need with POST /dns.
Deletes the zone and returns the domain to our nameservers (parking page). Records, settings and redirects are gone with the zone.
Re-reads status and nameservers from Cloudflare and returns the same object as GET. Use it to poll zoneStatus after connecting.
DNS records
All records in the zone.
{ "ok": true, "data": [ { "id": "fce74ed9…", "type": "A", "name": "api.example.org", "content": "185.225.191.222", "proxied": false, "priority": null }, … ] }Adds a record and returns it with its Cloudflare id.
| body | type | |
|---|---|---|
typerequired | A AAAA CNAME TXT MX | |
namerequired | string | relative (@ apex, www, _dmarc) or fully qualified |
contentrequired | string | IP, hostname or text |
proxied | boolean | A / AAAA / CNAME only — traffic through Cloudflare, origin IP hidden |
priority | integer | MX only |
{ "type": "A", "name": "@", "content": "203.0.113.10", "proxied": true }
{ "type": "CNAME", "name": "www", "content": "example.org", "proxied": true }
{ "type": "MX", "name": "@", "content": "mail.example.org", "priority": 10 }
{ "type": "TXT", "name": "_dmarc", "content": "v=DMARC1; p=none" }Replaces a record in full — same body as create. Ids come from GET /dns.
Removes a record. 404 DNS_NOT_FOUND if it is already gone.
Settings & cache
The zone's security and delivery switches — the same set the bot shows.
{ "ok": true, "data": { "ssl": "full", "developmentMode": false, "underAttack": false, "alwaysOnline": true, "botFightMode": true, "regionBlock": false } }Change any subset; the response is the full set after the change. An empty body is a 400.
| field | values | effect |
|---|---|---|
ssl | off flexible full strict | Cloudflare ↔ origin encryption. flexible when the origin has no certificate; full with a self-signed one; strict with a valid one |
developmentMode | boolean | bypass the cache for 3 hours (auto-off afterwards) |
underAttack | boolean | JavaScript challenge for every visitor |
alwaysOnline | boolean | serve a cached copy while the origin is down |
botFightMode | boolean | challenge known bots |
regionBlock | boolean | firewall rule blocking visitors from CIS countries |
{ "ssl": "strict", "underAttack": true, "regionBlock": true }Purges the whole cache of the zone. Cheap; safe to call after every deploy.
{ "ok": true, "data": { "purged": true } }Redirects
Redirect rules on the zone.
| body | type | |
|---|---|---|
matchrequired | string | path on the domain (old-page, blog/*) or * for everything |
targetrequired | URL | where to send visitors |
permanent | boolean · default true | true → 301, false → 302 |
{ "match": "*", "target": "https://new-domain.com", "permanent": true }
{ "ok": true, "data": { "id": "3f2a…", "match": "*", "target": "https://new-domain.com", "permanent": true } }Removes a rule by the id from the list.