auth
POST /v1/auth/send
Send a magic-link sign-in email.
Responses
| Status | Description | Schema |
200 | link sent (always 200, no enumeration leak) | object |
default | Problem | |
Example request
curl -X POST https://api.dnswiz.app/v1/auth/send
POST /v1/auth/verify
Verify a magic-link token and start a session.
If the email is new, a tenant is auto-created with the user as owner
and a sample zone is seeded. If the email exists, a session is
attached to the existing tenant.
Responses
| Status | Description | Schema |
200 | session created | object |
default | Problem | |
Example request
curl -X POST https://api.dnswiz.app/v1/auth/verify
POST /v1/auth/logout
Revoke the current session.
Responses
| Status | Description | Schema |
204 | revoked | |
default | Problem | |
Example request
curl -X POST https://api.dnswiz.app/v1/auth/logout \
-H "Authorization: Bearer $DNSWIZ_API_KEY"
GET /v1/auth/mfa/state
Whether the caller has TOTP MFA enrolled.
Responses
| Status | Description | Schema |
200 | enrollment state | object |
default | Problem | |
Example request
curl https://api.dnswiz.app/v1/auth/mfa/state \
-H "Authorization: Bearer $DNSWIZ_API_KEY"
POST /v1/auth/mfa/enroll/start
Begin TOTP enrollment; returns the otpauth URL and one-time recovery codes.
Responses
| Status | Description | Schema |
200 | enrollment secret and recovery codes | object |
409 | already enrolled (disable first) | |
default | Problem | |
Example request
curl -X POST https://api.dnswiz.app/v1/auth/mfa/enroll/start \
-H "Authorization: Bearer $DNSWIZ_API_KEY"
POST /v1/auth/mfa/enroll/verify
Confirm the first TOTP code to activate enrollment.
Responses
| Status | Description | Schema |
200 | enrolled | object |
default | Problem | |
Example request
curl -X POST https://api.dnswiz.app/v1/auth/mfa/enroll/verify \
-H "Authorization: Bearer $DNSWIZ_API_KEY"
POST /v1/auth/mfa/verify
Clear the MFA gate for the current session with a TOTP code.
Responses
| Status | Description | Schema |
200 | verified | object |
default | Problem | |
Example request
curl -X POST https://api.dnswiz.app/v1/auth/mfa/verify \
-H "Authorization: Bearer $DNSWIZ_API_KEY"
POST /v1/auth/mfa/recovery
Clear the MFA gate using a recovery code instead of a TOTP code.
Responses
| Status | Description | Schema |
200 | verified | object |
default | Problem | |
Example request
curl -X POST https://api.dnswiz.app/v1/auth/mfa/recovery \
-H "Authorization: Bearer $DNSWIZ_API_KEY"
DELETE /v1/auth/mfa
Disable MFA for the caller (requires a current TOTP code).
Responses
| Status | Description | Schema |
200 | disabled | object |
default | Problem | |
Example request
curl -X DELETE https://api.dnswiz.app/v1/auth/mfa \
-H "Authorization: Bearer $DNSWIZ_API_KEY"
GET /v1/auth/restorable
List the caller's soft-deleted workspaces still inside the 30-day purge window.
Responses
| Status | Description | Schema |
200 | restorable workspaces | object |
default | Problem | |
Example request
curl https://api.dnswiz.app/v1/auth/restorable \
-H "Authorization: Bearer $DNSWIZ_API_KEY"
POST /v1/auth/restore/{tenant_id}
Undelete a soft-deleted workspace (owner or admin only).
Responses
| Status | Description | Schema |
200 | restored | object |
default | Problem | |
Example request
curl -X POST https://api.dnswiz.app/v1/auth/restore/{tenant_id} \
-H "Authorization: Bearer $DNSWIZ_API_KEY"
me
GET /v1/me
Get the current user, tenant, plan, usage, and onboarding state.
Responses
| Status | Description | Schema |
200 | profile | Me |
default | Problem | |
Example request
curl https://api.dnswiz.app/v1/me \
-H "Authorization: Bearer $DNSWIZ_API_KEY"
GET /v1/me/dashboard
Workspace cockpit, vital signs, top names/zones, certs, incidents.
Responses
| Status | Description | Schema |
200 | dashboard payload | Dashboard |
default | Problem | |
Example request
curl https://api.dnswiz.app/v1/me/dashboard \
-H "Authorization: Bearer $DNSWIZ_API_KEY"
PATCH /v1/me/account
Update the current user's display name.
Responses
| Status | Description | Schema |
204 | updated | |
default | Problem | |
Example request
curl -X PATCH https://api.dnswiz.app/v1/me/account \
-H "Authorization: Bearer $DNSWIZ_API_KEY"
GET /v1/me/export
Download every zone + record as a ZIP bundle.
Responses
| Status | Description | Schema |
200 | zip archive | |
default | Problem | |
Example request
curl https://api.dnswiz.app/v1/me/export \
-H "Authorization: Bearer $DNSWIZ_API_KEY"
GET /v1/me/cert-config
Get the tenant's ACME/cert-issuance config (own overrides plus effective values).
Responses
| Status | Description | Schema |
200 | cert config | CertConfig |
default | Problem | |
Example request
curl https://api.dnswiz.app/v1/me/cert-config \
-H "Authorization: Bearer $DNSWIZ_API_KEY"
PATCH /v1/me/cert-config
Override the tenant's ACME directory, account email, or EAB credentials.
Responses
| Status | Description | Schema |
200 | updated cert config | CertConfig |
default | Problem | |
Example request
curl -X PATCH https://api.dnswiz.app/v1/me/cert-config \
-H "Authorization: Bearer $DNSWIZ_API_KEY"
DELETE /v1/me/cert-config
Revert the tenant to the platform default ACME config.
Responses
| Status | Description | Schema |
200 | reverted cert config | CertConfig |
default | Problem | |
Example request
curl -X DELETE https://api.dnswiz.app/v1/me/cert-config \
-H "Authorization: Bearer $DNSWIZ_API_KEY"
PATCH /v1/me/tenant
Update workspace settings (name, billing email, record/SOA/negative-TTL defaults).
Partial update. Empty string clears billing_email/default_soa_rname; a negative default_negative_ttl clears it.
Responses
| Status | Description | Schema |
204 | updated | |
default | Problem | |
Example request
curl -X PATCH https://api.dnswiz.app/v1/me/tenant \
-H "Authorization: Bearer $DNSWIZ_API_KEY"
DELETE /v1/me/tenant
Soft-delete the workspace (30-day grace, then purged).
Requires sudo and a name-match confirmation in the body. The
soft-delete cancels Stripe subscriptions immediately and starts
the 30-day purge clock.
Parameters
| Name | In | Type | Required |
Idempotency-Key | header | string | no |
Responses
| Status | Description | Schema |
204 | deleted (soft) | |
default | Problem | |
Example request
curl -X DELETE https://api.dnswiz.app/v1/me/tenant \
-H "Authorization: Bearer $DNSWIZ_API_KEY"
records
GET /v1/zones/{zone_id}/records
List records in a zone.
Parameters
| Name | In | Type | Required |
cursor | query | string | no |
limit | query | integer | no |
Responses
| Status | Description | Schema |
200 | page of records | RecordPage |
default | Problem | |
Example request
curl https://api.dnswiz.app/v1/zones/{zone_id}/records \
-H "Authorization: Bearer $DNSWIZ_API_KEY"
POST /v1/zones/{zone_id}/records
Create a record.
Parameters
| Name | In | Type | Required |
Idempotency-Key | header | string | no |
Request body
RecordCreate Responses
| Status | Description | Schema |
201 | created | Record |
default | Problem | |
Example request
curl -X POST https://api.dnswiz.app/v1/zones/{zone_id}/records \
-H "Authorization: Bearer $DNSWIZ_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "www",
"type": "A",
"ttl": 300,
"data": {
"value": "203.0.113.10"
}
}'
Example response
{
"id": "11111111-0000-0000-0000-000000000000",
"zone_id": "a1b2c3d4-0000-0000-0000-000000000000",
"name": "www",
"fqdn": "www.example.com.",
"type": "A",
"ttl": 300,
"ttl_inherit": false,
"data": {
"value": "203.0.113.10"
},
"active": true,
"created_at": "2026-05-28T09:01:00Z",
"updated_at": "2026-05-28T09:01:00Z"
}
GET /v1/records/{record_id}
Get a record.
Responses
| Status | Description | Schema |
200 | record | Record |
default | Problem | |
Example request
curl https://api.dnswiz.app/v1/records/{record_id} \
-H "Authorization: Bearer $DNSWIZ_API_KEY"
Example response
{
"id": "11111111-0000-0000-0000-000000000000",
"zone_id": "a1b2c3d4-0000-0000-0000-000000000000",
"name": "www",
"fqdn": "www.example.com.",
"type": "A",
"ttl": 300,
"ttl_inherit": false,
"data": {
"value": "203.0.113.10"
},
"active": true,
"created_at": "2026-05-28T09:01:00Z",
"updated_at": "2026-05-28T09:01:00Z"
}
PATCH /v1/records/{record_id}
Update a record.
Parameters
| Name | In | Type | Required |
Idempotency-Key | header | string | no |
Request body
RecordUpdate Responses
| Status | Description | Schema |
200 | updated | Record |
default | Problem | |
Example request
curl -X PATCH https://api.dnswiz.app/v1/records/{record_id} \
-H "Authorization: Bearer $DNSWIZ_API_KEY"
Example response
{
"id": "11111111-0000-0000-0000-000000000000",
"zone_id": "a1b2c3d4-0000-0000-0000-000000000000",
"name": "www",
"fqdn": "www.example.com.",
"type": "A",
"ttl": 300,
"ttl_inherit": false,
"data": {
"value": "203.0.113.10"
},
"active": true,
"created_at": "2026-05-28T09:01:00Z",
"updated_at": "2026-05-28T09:01:00Z"
}
DELETE /v1/records/{record_id}
Delete a record.
Parameters
| Name | In | Type | Required |
Idempotency-Key | header | string | no |
Responses
| Status | Description | Schema |
204 | deleted | |
default | Problem | |
Example request
curl -X DELETE https://api.dnswiz.app/v1/records/{record_id} \
-H "Authorization: Bearer $DNSWIZ_API_KEY"
POST /v1/records/{record_id}/test
Live-dig, resolve the record from the dnswiz edge fleet and return raw answers.
Responses
| Status | Description | Schema |
200 | dig result | LiveDig |
default | Problem | |
Example request
curl -X POST https://api.dnswiz.app/v1/records/{record_id}/test \
-H "Authorization: Bearer $DNSWIZ_API_KEY"
POST /v1/records/{record_id}/canary/abort
Snap a CANARY record back to its primary (set ramp to 0%).
Responses
| Status | Description | Schema |
200 | aborted | Record |
default | Problem | |
Example request
curl -X POST https://api.dnswiz.app/v1/records/{record_id}/canary/abort \
-H "Authorization: Bearer $DNSWIZ_API_KEY"
Example response
{
"id": "11111111-0000-0000-0000-000000000000",
"zone_id": "a1b2c3d4-0000-0000-0000-000000000000",
"name": "www",
"fqdn": "www.example.com.",
"type": "A",
"ttl": 300,
"ttl_inherit": false,
"data": {
"value": "203.0.113.10"
},
"active": true,
"created_at": "2026-05-28T09:01:00Z",
"updated_at": "2026-05-28T09:01:00Z"
}
POST /v1/records/{record_id}/canary/resume
Resume a paused CANARY record from its current percentage.
Responses
| Status | Description | Schema |
200 | resumed | Record |
default | Problem | |
Example request
curl -X POST https://api.dnswiz.app/v1/records/{record_id}/canary/resume \
-H "Authorization: Bearer $DNSWIZ_API_KEY"
Example response
{
"id": "11111111-0000-0000-0000-000000000000",
"zone_id": "a1b2c3d4-0000-0000-0000-000000000000",
"name": "www",
"fqdn": "www.example.com.",
"type": "A",
"ttl": 300,
"ttl_inherit": false,
"data": {
"value": "203.0.113.10"
},
"active": true,
"created_at": "2026-05-28T09:01:00Z",
"updated_at": "2026-05-28T09:01:00Z"
}
GET /v1/records/{record_id}/target-stats
Observed per-endpoint answer share for a GSLB record over a window.
Parameters
| Name | In | Type | Required |
window | query | string | no |
Responses
| Status | Description | Schema |
200 | target stats | RecordTargetStats |
default | Problem | |
Example request
curl https://api.dnswiz.app/v1/records/{record_id}/target-stats \
-H "Authorization: Bearer $DNSWIZ_API_KEY"
POST /v1/zones/{zone_id}/records/import
Import a BIND-style zonefile (preview, or commit the parsed records).
Parameters
| Name | In | Type | Required |
Idempotency-Key | header | string | no |
Request body
RecordImport Responses
| Status | Description | Schema |
200 | import preview or commit result | RecordImportResult |
default | Problem | |
Example request
curl -X POST https://api.dnswiz.app/v1/zones/{zone_id}/records/import \
-H "Authorization: Bearer $DNSWIZ_API_KEY"
pools
GET /v1/pools
List pools.
Parameters
| Name | In | Type | Required |
cursor | query | string | no |
limit | query | integer | no |
Responses
| Status | Description | Schema |
200 | page of pools | PoolPage |
default | Problem | |
Example request
curl https://api.dnswiz.app/v1/pools \
-H "Authorization: Bearer $DNSWIZ_API_KEY"
POST /v1/pools
Create a pool.
Parameters
| Name | In | Type | Required |
Idempotency-Key | header | string | no |
Responses
| Status | Description | Schema |
200 | created | Pool |
default | Problem | |
Example request
curl -X POST https://api.dnswiz.app/v1/pools \
-H "Authorization: Bearer $DNSWIZ_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "api-us-east",
"health_monitor_id": "9a000000-0000-0000-0000-000000000000",
"selection_method": "active-passive"
}'
GET /v1/pools/memberships
List every pool membership across the workspace (endpoint to pool, with weight).
Responses
| Status | Description | Schema |
200 | memberships | object |
default | Problem | |
Example request
curl https://api.dnswiz.app/v1/pools/memberships \
-H "Authorization: Bearer $DNSWIZ_API_KEY"
GET /v1/pools/gslb-services
List GSLB records (POOL/GEO/CANARY) and the pools they route to.
Responses
| Status | Description | Schema |
200 | gslb services | object |
default | Problem | |
Example request
curl https://api.dnswiz.app/v1/pools/gslb-services \
-H "Authorization: Bearer $DNSWIZ_API_KEY"
GET /v1/pools/{id}
Get a pool (aggregate health and member counts; members are a sub-resource).
Responses
| Status | Description | Schema |
200 | pool | Pool |
default | Problem | |
Example request
curl https://api.dnswiz.app/v1/pools/{id} \
-H "Authorization: Bearer $DNSWIZ_API_KEY"
PATCH /v1/pools/{id}
Update pool name, description, health monitor, or selection method.
Responses
| Status | Description | Schema |
200 | updated | Pool |
default | Problem | |
Example request
curl -X PATCH https://api.dnswiz.app/v1/pools/{id} \
-H "Authorization: Bearer $DNSWIZ_API_KEY"
DELETE /v1/pools/{id}
Delete a pool. Fails (409) if any record still references it.
Responses
| Status | Description | Schema |
204 | deleted | |
default | Problem | |
Example request
curl -X DELETE https://api.dnswiz.app/v1/pools/{id} \
-H "Authorization: Bearer $DNSWIZ_API_KEY"
GET /v1/pools/{id}/members
List a pool's members.
Responses
| Status | Description | Schema |
200 | members | object |
default | Problem | |
Example request
curl https://api.dnswiz.app/v1/pools/{id}/members \
-H "Authorization: Bearer $DNSWIZ_API_KEY"
POST /v1/pools/{id}/members
Attach an existing endpoint as a pool member (idempotent; re-adding updates weight).
Responses
| Status | Description | Schema |
200 | attached | PoolMember |
default | Problem | |
Example request
curl -X POST https://api.dnswiz.app/v1/pools/{id}/members \
-H "Authorization: Bearer $DNSWIZ_API_KEY"
POST /v1/pools/{id}/members/inline
Create an endpoint and attach it as a member in one call.
Request body
PoolMemberInline Responses
| Status | Description | Schema |
200 | created and attached | object |
default | Problem | |
Example request
curl -X POST https://api.dnswiz.app/v1/pools/{id}/members/inline \
-H "Authorization: Bearer $DNSWIZ_API_KEY"
GET /v1/pools/{id}/records
List the DNS records that reference this pool.
Responses
| Status | Description | Schema |
200 | records | object |
default | Problem | |
Example request
curl https://api.dnswiz.app/v1/pools/{id}/records \
-H "Authorization: Bearer $DNSWIZ_API_KEY"
PATCH /v1/pools/{id}/members/{member_id}
Update member weight or priority.
Responses
| Status | Description | Schema |
200 | updated | PoolMember |
default | Problem | |
Example request
curl -X PATCH https://api.dnswiz.app/v1/pools/{id}/members/{member_id} \
-H "Authorization: Bearer $DNSWIZ_API_KEY"
DELETE /v1/pools/{id}/members/{member_id}
Detach a member from a pool.
Responses
| Status | Description | Schema |
204 | detached | |
default | Problem | |
Example request
curl -X DELETE https://api.dnswiz.app/v1/pools/{id}/members/{member_id} \
-H "Authorization: Bearer $DNSWIZ_API_KEY"
PATCH /v1/pools/{id}/members/{member_id}/enabled
Flip member enabled (drain / un-drain without deleting).
Responses
| Status | Description | Schema |
200 | updated | PoolMember |
default | Problem | |
Example request
curl -X PATCH https://api.dnswiz.app/v1/pools/{id}/members/{member_id}/enabled \
-H "Authorization: Bearer $DNSWIZ_API_KEY"
Schemas
Object shapes referenced by the operations above.
ApiKey
| Field | Type | Required |
id | string <uuid> | yes |
name | string | yes |
prefix | string | yes |
scopes | string[] | yes |
allowed_ips | string[] | yes |
last_used_at | string <date-time> | no |
expires_at | string <date-time> | no |
revoked_at | string <date-time> | no |
created_at | string <date-time> | yes |
ApiKeyCreate
| Field | Type | Required |
name | string | yes |
scopes | string[] | no |
allowed_ips | string[] | no |
expires_at | string <date-time> | no |
AuditEvent
| Field | Type | Required |
id | integer <int64> | yes |
user_id | string <uuid> | no |
actor | string | yes |
api_key_id | string <uuid> | no |
api_key_name | string | no |
ip | string | no |
request_id | string | no |
resource | string | yes |
resource_id | string <uuid> | no |
action | string | yes |
before | object | no |
after | object | no |
occurred_at | string <date-time> | yes |
AuditEventPage
| Field | Type | Required |
items | AuditEvent[] | yes |
next_cursor | string | yes |
CertConfig
Per-tenant ACME override. The bare fields are the tenant's own
overrides (empty when not set); the effective_* fields are what
issuance actually uses (override, else platform default). The
has_*/customized booleans and eab_hmac_b64/clear_eab_hmac are
write-once or request-only knobs for the EAB secret.
| Field | Type | Required |
directory_url | string | no |
account_email | string | no |
eab_kid | string | no |
effective_directory_url | string | no |
effective_account_email | string | no |
effective_eab_kid | string | no |
customized | boolean | no |
has_own_account_key | boolean | no |
has_eab_hmac | boolean | no |
eab_hmac_b64 | string | no |
clear_eab_hmac | boolean | no |
CertCoverage
| Field | Type | Required |
total_names | integer | yes |
covered_names | integer | yes |
gaps | CertCoverageGap[] | yes |
CertCoverageGap
| Field | Type | Required |
name | string | yes |
record_type | string | yes |
zone_id | string <uuid> | no |
zone_name | string | no |
CertIssuance
A successfully issued certificate. Rows exist only after issuance (there is no pending/failed state).
| Field | Type | Required |
id | string <uuid> | yes |
name | string | yes |
san_names | string[] | yes |
issuer | string | yes |
serial | string | yes |
issued_at | string <date-time> | yes |
expires_at | string <date-time> | yes |
days_to_expiry | integer | yes |
CertIssueRequest
Supply exactly one of csr or names.
| Field | Type | Required |
csr | string | no |
names | string[] | no |
CertIssueResponse
| Field | Type | Required |
key_pem | string | no |
cert_pem | string | yes |
issuer_pem | string | yes |
fullchain_pem | string | yes |
serial | string | yes |
expires_at | string <date-time> | yes |
sans | string[] | yes |
DNSRow
| Field | Type | Required |
value | string | no |
ttl | integer | no |
Dashboard
Workspace cockpit payload. The response is wide and may gain
fields over time; the stable, documented ones are below.
| Field | Type | Required |
live_qps | number | no |
queries_today | integer <int64> | no |
queries_yesterday | integer <int64> | no |
queries_month | integer <int64> | no |
downtime_prevented_sec | integer <int64> | no |
incidents_count_30d | integer | no |
zones_healthy | integer | no |
zones_total | integer | no |
top_names_24h | object[] | no |
countries_24h | object[] | no |
certs | object | no |
generated_at | string <date-time> | no |
Endpoint
A monitored health-check target. `target` is the probe
destination; `value` is the IP returned in DNS answers. List/get
responses also carry current `health` and 30-day `uptime`.
| Field | Type | Required |
id | string <uuid> | yes |
name | string | yes |
kind | string (http | https | tcp) | yes |
target | string | yes |
value | string | yes |
host | string | yes |
port | integer | yes |
expected_status | integer | yes |
interval_seconds | integer | yes |
timeout_seconds | integer | yes |
healthy_after | integer | yes |
unhealthy_after | integer | yes |
health_monitor_id | string <uuid> | no |
health | EndpointHealth | no |
uptime | Uptime | no |
created_at | string <date-time> | yes |
updated_at | string <date-time> | yes |
EndpointCreate
| Field | Type | Required |
name | string | yes |
kind | string (http | https | tcp) | yes |
target | string | yes |
value | string | no |
host | string | no |
port | integer | no |
expected_status | integer | no |
interval_seconds | integer | no |
timeout_seconds | integer | no |
healthy_after | integer | no |
unhealthy_after | integer | no |
health_monitor_id | string <uuid> | no |
EndpointDetail
| Field | Type | Required |
endpoint | Endpoint | yes |
health | EndpointHealth | yes |
window | string | yes |
uptime | Uptime | yes |
buckets | object[] | yes |
incidents | object[] | yes |
EndpointHealth
| Field | Type | Required |
endpoint_id | string <uuid> | yes |
status | string (up | down | unknown) | yes |
consecutive_passes | integer | no |
consecutive_fails | integer | no |
last_checked_at | string <date-time> | no |
last_status_change_at | string <date-time> | no |
last_latency_ms | integer | no |
last_error | string | no |
EndpointPage
| Field | Type | Required |
items | Endpoint[] | yes |
next_cursor | string | yes |
FlatMembership
| Field | Type | Required |
endpoint_id | string <uuid> | yes |
pool_id | string <uuid> | yes |
pool_name | string | yes |
weight | integer | yes |
GSLBPoolRef
| Field | Type | Required |
pool_id | string <uuid> | yes |
pool_name | string | yes |
health_score | integer | yes |
enabled_up | integer | yes |
enabled_total | integer | yes |
GSLBService
| Field | Type | Required |
record_id | string <uuid> | yes |
zone_id | string <uuid> | yes |
zone_name | string | yes |
name | string | yes |
fqdn | string | yes |
type | RecordType | yes |
ttl | integer | yes |
pools | GSLBPoolRef[] | yes |
GslbTarget
A GSLB destination used by GEO and CANARY records. Supply exactly
one of: an endpoint (`endpoint_id` plus a `value` IP) or a pool
(`pool_id`).
| Field | Type | Required |
endpoint_id | string <uuid> | no |
value | string | no |
pool_id | string <uuid> | no |
HealthMonitor
A reusable probe policy (the "what": protocol, path, thresholds).
The target host/port lives on the pool member that references it.
| Field | Type | Required |
id | string <uuid> | yes |
name | string | yes |
is_preset | boolean | yes |
kind | HealthMonitorKind | yes |
path | string | yes |
expected_status | integer | yes |
interval_seconds | integer | yes |
timeout_seconds | integer | yes |
healthy_after | integer | yes |
unhealthy_after | integer | yes |
created_at | string <date-time> | yes |
updated_at | string <date-time> | yes |
HealthMonitorCreate
Numeric fields left at zero take server defaults on create. On update, zero/empty leaves the field unchanged (so a field cannot be set to 0).
| Field | Type | Required |
name | string | yes |
kind | HealthMonitorKind | yes |
path | string | no |
expected_status | integer | no |
interval_seconds | integer | no |
timeout_seconds | integer | no |
healthy_after | integer | no |
unhealthy_after | integer | no |
HealthMonitorKind
Probe protocol. udp-dns and udp-ntp are the two UDP probes; there is no ICMP/ping probe.
HijackProbe
| Field | Type | Required |
id | string <uuid> | yes |
probed_at | string <date-time> | yes |
resolver | string | yes |
qname | string | yes |
qtype | string | yes |
expected | string | no |
observed | string | no |
diverged | boolean | yes |
err | string | no |
Insights
Per-zone insights payload. Latency percentiles are in microseconds.
| Field | Type | Required |
window_hours | integer | yes |
total | integer <int64> | yes |
previous_total | integer <int64> | no |
time_series | object[] | yes |
by_qtype | LabeledCount[] | yes |
by_rcode | LabeledCount[] | yes |
by_country | LabeledCount[] | no |
top_names | LabeledCount[] | yes |
latency | object | yes |
recent | object[] | no |
generated_at | string <date-time> | yes |
Invitation
| Field | Type | Required |
id | string <uuid> | yes |
tenant_id | string <uuid> | yes |
email | string <email> | yes |
role | string (admin | editor | viewer) | yes |
invited_by | string <uuid> | no |
expires_at | string <date-time> | yes |
accepted_at | string <date-time> | no |
revoked_at | string <date-time> | no |
created_at | string <date-time> | yes |
LabeledCount
| Field | Type | Required |
label | string | yes |
count | integer <int64> | yes |
LiveDig
Result of resolving a record live from the dnswiz edge fleet.
| Field | Type | Required |
question | object | yes |
rcode | string | yes |
answers | object[] | yes |
duration_ms | integer <int64> | yes |
picked_endpoint_id | string | no |
picked_label | string | no |
MFACode
| Field | Type | Required |
code | string | yes |
Me
| Field | Type | Required |
user | object | yes |
tenant | object | yes |
role | string (owner | admin | editor | viewer) | yes |
plan | Plan | yes |
usage | object | yes |
onboarding | object | yes |
nameservers | string[] | yes |
Member
| Field | Type | Required |
user_id | string <uuid> | yes |
email | string <email> | yes |
name | string | yes |
role | string (owner | admin | editor | viewer) | yes |
joined_at | string <date-time> | yes |
NotificationChannel
An outbound webhook channel. dnswiz POSTs signed events to `target` for the subscribed `events`.
| Field | Type | Required |
id | string <uuid> | yes |
name | string | yes |
kind | string (webhook) | yes |
target | string | yes |
secret | string | no |
events | string[] | yes |
active | boolean | yes |
created_at | string <date-time> | yes |
updated_at | string <date-time> | yes |
NotificationChannelCreate
| Field | Type | Required |
name | string | yes |
kind | string (webhook) | yes |
target | string | yes |
events | string[] | yes |
NotificationChannelUpdate
Partial update; omitted fields are left unchanged.
| Field | Type | Required |
name | string | no |
target | string | no |
events | string[] | no |
active | boolean | no |
Plan
| Field | Type | Required |
id | string (free | pro | business | enterprise) | yes |
display_name | string | yes |
monthly_price_cents | integer | no |
yearly_price_cents | integer | no |
max_zones | integer | yes |
max_records_per_zone | integer | yes |
included_monthly_queries | integer <int64> | yes |
gslb_enabled | boolean | yes |
sso_enabled | boolean | yes |
audit_export_enabled | boolean | yes |
byok_enabled | boolean | yes |
is_enterprise | boolean | yes |
Policy
| Field | Type | Required |
kind | string (hijack_monitor | query_firewall) | yes |
enabled | boolean | yes |
config | object | yes |
PolicyUpdate
| Field | Type | Required |
enabled | boolean | no |
config | object | no |
Pool
A named group of endpoints with a selection method. The body
carries aggregate health only; members are a separate sub-resource
under /v1/pools/{id}/members.
| Field | Type | Required |
id | string <uuid> | yes |
name | string | yes |
description | string | no |
health_monitor_id | string <uuid> | yes |
selection_method | SelectionMethod | yes |
member_count | integer | yes |
health_score | integer | yes |
enabled_up | integer | yes |
enabled_total | integer | yes |
created_at | string <date-time> | yes |
updated_at | string <date-time> | yes |
PoolCreate
| Field | Type | Required |
name | string | yes |
description | string | no |
health_monitor_id | string <uuid> | yes |
selection_method | | no |
PoolMember
| Field | Type | Required |
id | string <uuid> | yes |
pool_id | string <uuid> | yes |
endpoint_id | string <uuid> | yes |
weight | integer | yes |
priority | integer | yes |
enabled | boolean | yes |
created_at | string <date-time> | yes |
PoolMemberInline
Create an endpoint and attach it in one call. Prefer monitor_id
(the member inherits the pool's monitor when omitted). The legacy
check_url/expected_status/... fields are a fallback used only when
monitor_id is empty.
| Field | Type | Required |
label | string | yes |
host | string | yes |
port | integer | no |
monitor_id | string <uuid> | no |
weight | integer | no |
enabled | boolean | no |
value | string | no |
check_url | string | no |
expected_status | integer | no |
interval_seconds | integer | no |
timeout_seconds | integer | no |
healthy_after | integer | no |
unhealthy_after | integer | no |
PoolPage
| Field | Type | Required |
items | Pool[] | yes |
next_cursor | object | no |
PoolRecordRef
| Field | Type | Required |
record_id | string <uuid> | yes |
zone_id | string <uuid> | yes |
zone_name | string | yes |
name | string | yes |
type | RecordType | yes |
PoolUpdate
Partial update; omitted fields are left unchanged.
| Field | Type | Required |
name | string | no |
description | string | no |
health_monitor_id | string <uuid> | no |
selection_method | SelectionMethod | no |
Problem
| Field | Type | Required |
type | string <uri> | yes |
title | string | yes |
status | integer | yes |
detail | string | no |
instance | string | no |
code | string | no |
errors | object | no |
Rdata
Record data envelope. The concrete shape depends on the sibling
`type` field; see the per-type Rdata* schemas below.
RdataANAME
ANAME (apex CNAME-flattening). `target` is the hostname to follow.
| Field | Type | Required |
target | string | yes |
RdataAddress
A and AAAA. `value` is an IPv4 (A) or IPv6 (AAAA) literal.
| Field | Type | Required |
value | string | yes |
RdataCAA
CAA. `value` is a single space-joined string "<flag> <tag> <value>"; flag 0-255, tag is issue | issuewild | iodef.
| Field | Type | Required |
value | string | yes |
RdataCanary
CANARY. Ramps traffic from `primary` to `canary` over
`ramp_seconds` starting at `started_at`. Set `aborted_at` plus
`aborted_pct` to freeze the ramp at a percentage.
| Field | Type | Required |
primary | GslbTarget | yes |
canary | GslbTarget | yes |
from_pct | integer | no |
to_pct | integer | no |
ramp_seconds | integer | no |
started_at | string <date-time> | no |
aborted_at | string <date-time> | no |
aborted_pct | integer | no |
RdataGeo
GEO. Per-continent selection. Each region and the required
`default` is a GslbTarget; region codes are unique.
| Field | Type | Required |
regions | [] | yes |
default | GslbTarget | yes |
RdataHostname
CNAME, NS, and PTR. `value` is a hostname; a trailing dot is added if omitted.
| Field | Type | Required |
value | string | yes |
RdataMX
MX. A mail-exchanger host plus a preference number.
| Field | Type | Required |
value | string | yes |
priority | integer | no |
RdataPool
POOL. Points the name at a GSLB pool; the engine answers with a healthy member.
| Field | Type | Required |
pool_id | string <uuid> | yes |
RdataSRV
SRV. `value` is a single space-joined string "<priority> <weight> <port> <target>".
| Field | Type | Required |
value | string | yes |
RdataTXT
TXT. Free text, up to 4096 bytes, no NUL byte.
| Field | Type | Required |
value | string | yes |
ReadinessCheck
Failover-readiness audit for a host (the public checker Report).
| Field | Type | Required |
host | string | yes |
resolvers | object[] | yes |
records | object | yes |
score | integer | yes |
grade | string (A | B | C | D | F) | yes |
findings | object[] | yes |
generated_at | string <date-time> | yes |
Record
A DNS record. The `data` field is a typed rdata envelope whose
shape is set by `type` (see the Rdata* schemas): address types
carry `{value}`, MX/SRV/CAA/TXT carry a packed `value` string,
ANAME carries `{target}`, and the GSLB types POOL/GEO/CANARY
carry pool and endpoint references. `name` is "@" at the apex.
`fqdn` is present on every record response except the canary
abort/resume actions.
| Field | Type | Required |
id | string <uuid> | yes |
zone_id | string <uuid> | yes |
name | string | yes |
fqdn | string | no |
type | RecordType | yes |
ttl | integer | yes |
ttl_inherit | boolean | yes |
data | Rdata | yes |
active | boolean | yes |
comment | string | no |
created_at | string <date-time> | yes |
updated_at | string <date-time> | yes |
RecordCreate
`data` must match `type` (see Rdata). If `ttl` is omitted or <= 0,
or `ttl_inherit` is true, the server resolves the effective TTL
from the zone default, then the tenant default, then 300.
| Field | Type | Required |
name | string | yes |
type | RecordType | yes |
ttl | integer | no |
ttl_inherit | boolean | no |
data | Rdata | yes |
comment | string | no |
RecordImport
| Field | Type | Required |
zonefile | string | yes |
mode | string (preview | commit) | yes |
RecordImportResult
Parse result. `rows` and `stats` describe the parsed zonefile
(per-line outcome and aggregate counts); `inserted` is the number
of records written (0 in preview mode).
| Field | Type | Required |
inserted | integer | yes |
stats | object | no |
rows | object[] | no |
RecordPage
| Field | Type | Required |
items | Record[] | yes |
next_cursor | string | yes |
RecordTargetStats
Observed answer distribution across a GSLB record's endpoints.
| Field | Type | Required |
window | string | yes |
total | integer <int64> | yes |
targets | object[] | yes |
RecordType
Standard DNS types plus dnswiz GSLB types. ANAME is apex
CNAME-flattening; POOL points a name at a GSLB pool; GEO selects
a target per continent; CANARY ramps traffic between two targets.
RecordUpdate
Partial update. `type` is immutable. Omitted fields are left unchanged; an empty `comment` clears it.
| Field | Type | Required |
name | string | no |
ttl | integer | no |
ttl_inherit | boolean | no |
data | Rdata | no |
active | boolean | no |
comment | string | no |
RefusedQuery
| Field | Type | Required |
tenant_id | string <uuid> | yes |
zone_id | string <uuid> | yes |
qname | string | no |
qtype | string | yes |
source_ip | string | no |
country | string | no |
reason | string | yes |
pii | string | no |
checked_at_ms | integer <int64> | yes |
RestorableTenant
| Field | Type | Required |
id | string <uuid> | yes |
name | string | yes |
slug | string | yes |
deleted_at | string <date-time> | yes |
purge_after | string <date-time> | yes |
role | string (owner | admin | editor | viewer) | yes |
SelectionMethod
GSLB routing algorithm. weighted picks a healthy member at random
by weight; active-passive picks the lowest-priority healthy member
(1 is primary); round-robin rotates fairly across healthy members.
Uptime
| Field | Type | Required |
pct_30d | number | no |
incident_count_30d | integer | no |
last_incident_at | string <date-time> | no |
current_down_since | string <date-time> | no |
Zone
A DNS zone. `default_ttl`, `soa_rname`, and `negative_ttl` are
omitted when unset (the engine falls back to its defaults).
| Field | Type | Required |
id | string <uuid> | yes |
name | string | yes |
active | boolean | yes |
default_ttl | integer | no |
soa_rname | string | no |
negative_ttl | integer | no |
created_at | string <date-time> | yes |
updated_at | string <date-time> | yes |
ZoneCreate
| Field | Type | Required |
name | string | yes |
ZoneHealth
Zone health report. Categories present only when they have checks.
| Field | Type | Required |
overall | integer | yes |
categories | object | yes |
results | ZoneHealthCheck[] | yes |
ZoneHealthCheck
| Field | Type | Required |
id | string | yes |
category | string (security | performance | email) | yes |
status | string (pass | warn | fail | skip) | yes |
summary | string | yes |
detail | string | yes |
auto_fixable | boolean | yes |
ack | object | no |
ZonePage
| Field | Type | Required |
items | Zone[] | yes |
next_cursor | string | yes |
ZoneUpdate
Partial update; at least one field required. Use a negative
`default_ttl`/`negative_ttl` or an empty `soa_rname` to clear
that field and inherit the default.
| Field | Type | Required |
active | boolean | no |
default_ttl | integer | no |
soa_rname | string | no |
negative_ttl | integer | no |