REST API

DNS SaaS provides a full REST API for programmatic access. All endpoints are prefixed with /api/v1.

Authentication

Use Sanctum tokens. Set the header:

Authorization: Bearer 

DNS Zones

List zones — `GET /api/v1/dns/zones`

Returns all zones for the authenticated user.

Create zone — `POST /api/v1/dns/zones`

Request body:

{
"domain": "example.com",
"provider_credential_id": null
}

On success (201):

{
"success": true,
"data": {
"id": 1,
"domain": "example.com",
"status": "pending",
"record_count": 4,
"created_at": "2026-05-29T10:00:00Z"
},
"message": "DNS zone for example.com created."
}

Get zone — `GET /api/v1/dns/zones/{id}`

Delete zone — `DELETE /api/v1/dns/zones/{id}`

Activate zone — `POST /api/v1/dns/zones/{id}/activate`

DNS Records

Create record — `POST /api/v1/dns/zones/{zoneId}/records`

Request body:

{
"type": "a",
"name": "www",
"value": "192.168.1.1",
"ttl": 3600,
"priority": null
}

On success (201):

{
"success": true,
"data": {
"id": 10,
"zone_id": 1,
"type": "a",
"name": "www",
"value": "192.168.1.1",
"ttl": 3600,
"is_active": true
},
"message": "DNS record added."
}

Update record — `PATCH /api/v1/dns/zones/{zoneId}/records/{recordId}`

{
"value": "10.0.0.1",
"ttl": 300
}

Delete record — `DELETE /api/v1/dns/zones/{zoneId}/records/{recordId}`

Toggle record — `POST /api/v1/dns/zones/{zoneId}/records/{recordId}/toggle`

Providers

List types — `GET /api/v1/providers/types`

List connected — `GET /api/v1/providers`

Connect a provider — `POST /api/v1/providers`

Token-based (Cloudflare, Hetzner, DigitalOcean, Vultr):

{
"provider": "cloudflare",
"name": "My Cloudflare",
"api_token": "your-api-token"
}

Key+Secret-based (GoDaddy):

{
"provider": "godaddy",
"name": "My GoDaddy",
"api_key": "your-api-key",
"api_secret": "your-api-secret"
}

Key+Secret+Region (Route53):

{
"provider": "route53",
"name": "My AWS",
"api_key": "AKI...",
"api_secret": "...",
"api_endpoint": "us-east-1"
}

Import zones — `POST /api/v1/providers/{id}/import`

Import single zone — `POST /api/v1/providers/{id}/import`

{
"domain": "example.com"
}

Disconnect — `DELETE /api/v1/providers/{id}`

Test connection — `POST /api/v1/providers/{id}/test`