Platform
ScaiWave ScaiGrid ScaiCore ScaiBot ScaiDrive ScaiKey Models Tools & Services
Solutions
Organisations Developers Internet Service Providers Managed Service Providers AI-in-a-Box
Resources
Support Documentation Blog Downloads
Company
About Research Careers Investment Opportunities Contact
Log in

Managing Domains

Everything about creating, reading, updating, and deleting zones. For the underlying concepts, see Zones and Records.

Base path: /api/v1/domains/ Required permission: domains:read, domains:create, domains:update, domains:delete

List zones#

bash
1
2
curl "https://scaidns.scailabs.ai/api/v1/domains/?page=1&page_size=50" \
  -H "X-API-Key: $SCAIDNS_API_KEY"
python
1
2
3
4
5
6
7
8
9
import os, httpx

resp = httpx.get(
    "https://scaidns.scailabs.ai/api/v1/domains/",
    headers={"X-API-Key": os.environ["SCAIDNS_API_KEY"]},
    params={"page": 1, "page_size": 50},
)
for d in resp.json()["data"]:
    print(d["name"], d["status"])
typescript
1
2
3
4
5
6
const resp = await fetch(
  "https://scaidns.scailabs.ai/api/v1/domains/?page=1&page_size=50",
  { headers: { "X-API-Key": process.env.SCAIDNS_API_KEY! } }
);
const { data } = await resp.json();
for (const d of data) console.log(d.name, d.status);

Filters#

Param Type Notes
page integer 1-based, default 1
page_size integer 1–100, default 50
status string pending_validation, active, inactive, deleted
domain_type string primary, secondary, reverse_ipv4, reverse_ipv6
dnssec_enabled boolean Filter by DNSSEC state
search string Substring match on domain name

Create a zone#

bash
1
2
3
4
5
6
7
8
9
curl -X POST https://scaidns.scailabs.ai/api/v1/domains/ \
  -H "X-API-Key: $SCAIDNS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "example.com",
    "domain_type": "primary",
    "default_ttl": 3600,
    "description": "Main production zone"
  }'
python
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
resp = httpx.post(
    "https://scaidns.scailabs.ai/api/v1/domains/",
    headers={"X-API-Key": os.environ["SCAIDNS_API_KEY"]},
    json={
        "name": "example.com",
        "domain_type": "primary",
        "default_ttl": 3600,
        "description": "Main production zone",
    },
)
resp.raise_for_status()
domain = resp.json()
typescript
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
const resp = await fetch("https://scaidns.scailabs.ai/api/v1/domains/", {
  method: "POST",
  headers: {
    "X-API-Key": process.env.SCAIDNS_API_KEY!,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    name: "example.com",
    domain_type: "primary",
    default_ttl: 3600,
    description: "Main production zone",
  }),
});
const domain = await resp.json();

Request body#

Field Type Required Notes
name string Yes Zone apex. Must be a valid DNS name
domain_type string Yes primary, secondary, reverse_ipv4, reverse_ipv6
default_ttl integer No Seconds; default 3600
description string No Free-form note
template_id string No Apply a template after validation completes
template_variables object No Variables for the template
cidr string No For reverse zones — use Reverse Zones API instead

Newly created zones are pending_validation. Until validated, no PowerDNS zone exists and records are not served.

Get a zone#

bash
1
2
curl https://scaidns.scailabs.ai/api/v1/domains/$DOMAIN_ID \
  -H "X-API-Key: $SCAIDNS_API_KEY"

Returns the full zone object, including DNSSEC status and the most recent validation state.

Update metadata#

Only description, default_ttl, and settings are editable.

bash
1
2
3
4
curl -X PATCH https://scaidns.scailabs.ai/api/v1/domains/$DOMAIN_ID \
  -H "X-API-Key: $SCAIDNS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"default_ttl": 600, "description": "Updated note"}'

Renaming or changing the type requires deleting and recreating the zone — neither is editable in place.

Delete#

Soft delete (default):

bash
1
2
curl -X DELETE https://scaidns.scailabs.ai/api/v1/domains/$DOMAIN_ID \
  -H "X-API-Key: $SCAIDNS_API_KEY"

The domain row stays in the database with status deleted. The PowerDNS zone is also marked deleted but kept for recovery. Reads by ID return 404 unless you pass ?include_deleted=true.

Hard delete (irreversible):

bash
1
2
curl -X DELETE "https://scaidns.scailabs.ai/api/v1/domains/$DOMAIN_ID?hard=true" \
  -H "X-API-Key: $SCAIDNS_API_KEY"

Removes the row and the PowerDNS zone permanently. Records, access grants, and DNSSEC keys are all discarded.

Restore a soft-deleted zone#

bash
1
2
curl -X POST https://scaidns.scailabs.ai/api/v1/domains/$DOMAIN_ID/restore \
  -H "X-API-Key: $SCAIDNS_API_KEY"

Status flips back to whatever it was before deletion (usually active). Records are restored as they were.

Get the SOA record#

bash
1
2
curl https://scaidns.scailabs.ai/api/v1/domains/$DOMAIN_ID/soa \
  -H "X-API-Key: $SCAIDNS_API_KEY"

Returns SOA fields (serial, refresh, retry, expire, minimum). The serial increments automatically on zone changes — you don't edit it manually.

Export a zone#

bash
1
2
curl https://scaidns.scailabs.ai/api/v1/domains/$DOMAIN_ID/export \
  -H "X-API-Key: $SCAIDNS_API_KEY"

Returns a BIND-format zone file as text. Useful for backups and migrations. See Import and Export for the full surface.

What's next#

Updated 2026-05-17 02:38:20 View source (.md) rev 1