API reference
The complete dnswiz HTTP API. New to it? Start with the Quickstart, it walks the create-zone → add-record → verify thread end to end.
Example requests below assume $DNSWIZ_API_KEY is exported.
Mint one in console → Settings → API keys.
Auth & conventions
- Base URL.
https://api.dnswiz.appin prod,http://localhost:8787for local dev. - Auth. Bearer token in
Authorization. Two kinds: session tokens fromPOST /v1/auth/verifyand API keys minted at/v1/api-keys(prefixdnswiz_). - Errors. RFC 7807
problem+json; thetypeURI links to an error doc. - Lists. Cursor pagination, envelope
{ items, next_cursor }. - Mutations. Accept
Idempotency-Key.
auth
/v1/auth/send Send a magic-link sign-in email.
object | Status | Description | Schema |
|---|---|---|
200 | link sent (always 200, no enumeration leak) | object |
default | Problem | |
curl -X POST https://api.dnswiz.app/v1/auth/send /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.
object | Status | Description | Schema |
|---|---|---|
200 | session created | object |
default | Problem | |
curl -X POST https://api.dnswiz.app/v1/auth/verify /v1/auth/logout Revoke the current session.
| Status | Description | Schema |
|---|---|---|
204 | revoked | |
default | Problem | |
curl -X POST https://api.dnswiz.app/v1/auth/logout \
-H "Authorization: Bearer $DNSWIZ_API_KEY" me
/v1/me Get the current user, tenant, plan, usage, and onboarding state.
| Status | Description | Schema |
|---|---|---|
200 | profile | Me |
default | Problem | |
curl https://api.dnswiz.app/v1/me \
-H "Authorization: Bearer $DNSWIZ_API_KEY" /v1/me/dashboard Workspace cockpit, vital signs, top names/zones, certs, incidents.
| Status | Description | Schema |
|---|---|---|
200 | dashboard payload | Dashboard |
default | Problem | |
curl https://api.dnswiz.app/v1/me/dashboard \
-H "Authorization: Bearer $DNSWIZ_API_KEY" /v1/me/incidents Recent endpoint incidents + 30-day summary.
| Status | Description | Schema |
|---|---|---|
200 | incidents | IncidentsSummary |
default | Problem | |
curl https://api.dnswiz.app/v1/me/incidents \
-H "Authorization: Bearer $DNSWIZ_API_KEY" /v1/me/export Download every zone + record as a zonefile/JSON bundle.
| Status | Description | Schema |
|---|---|---|
200 | tarball | |
default | Problem | |
curl https://api.dnswiz.app/v1/me/export \
-H "Authorization: Bearer $DNSWIZ_API_KEY" /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.
| Name | In | Type | Required |
|---|---|---|---|
Idempotency-Key | header | string | no |
object | Status | Description | Schema |
|---|---|---|
204 | deleted (soft) | |
default | Problem | |
curl -X DELETE https://api.dnswiz.app/v1/me/tenant \
-H "Authorization: Bearer $DNSWIZ_API_KEY" plans
/v1/plans List public pricing tiers.
| Status | Description | Schema |
|---|---|---|
200 | plans | Plan[] |
default | Problem | |
curl https://api.dnswiz.app/v1/plans zones
/v1/zones List zones.
| Name | In | Type | Required |
|---|---|---|---|
cursor | query | string | no |
limit | query | integer | no |
| Status | Description | Schema |
|---|---|---|
200 | page of zones | ZonePage |
default | Problem | |
curl https://api.dnswiz.app/v1/zones \
-H "Authorization: Bearer $DNSWIZ_API_KEY" /v1/zones Create a zone.
| Name | In | Type | Required |
|---|---|---|---|
Idempotency-Key | header | string | no |
ZoneCreate | Status | Description | Schema |
|---|---|---|
201 | created | Zone |
default | Problem | |
curl -X POST https://api.dnswiz.app/v1/zones \
-H "Authorization: Bearer $DNSWIZ_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "example.com"
}' {
"id": "a1b2c3d4-0000-0000-0000-000000000000",
"name": "example.com.",
"active": true,
"created_at": "2026-05-28T09:00:00Z",
"updated_at": "2026-05-28T09:00:00Z"
} /v1/zones/{zone_id} Get a zone.
| Status | Description | Schema |
|---|---|---|
200 | zone | Zone |
default | Problem | |
curl https://api.dnswiz.app/v1/zones/{zone_id} \
-H "Authorization: Bearer $DNSWIZ_API_KEY" {
"id": "a1b2c3d4-0000-0000-0000-000000000000",
"name": "example.com.",
"active": true,
"created_at": "2026-05-28T09:00:00Z",
"updated_at": "2026-05-28T09:00:00Z"
} /v1/zones/{zone_id} Delete a zone.
| Name | In | Type | Required |
|---|---|---|---|
Idempotency-Key | header | string | no |
| Status | Description | Schema |
|---|---|---|
204 | deleted | |
default | Problem | |
curl -X DELETE https://api.dnswiz.app/v1/zones/{zone_id} \
-H "Authorization: Bearer $DNSWIZ_API_KEY" /v1/zones/{zone_id}/health Zone health score (gauge + sub-scores).
| Status | Description | Schema |
|---|---|---|
200 | health | ZoneHealth |
default | Problem | |
curl https://api.dnswiz.app/v1/zones/{zone_id}/health \
-H "Authorization: Bearer $DNSWIZ_API_KEY" records
/v1/zones/{zone_id}/records List records in a zone.
| Name | In | Type | Required |
|---|---|---|---|
cursor | query | string | no |
limit | query | integer | no |
| Status | Description | Schema |
|---|---|---|
200 | page of records | RecordPage |
default | Problem | |
curl https://api.dnswiz.app/v1/zones/{zone_id}/records \
-H "Authorization: Bearer $DNSWIZ_API_KEY" /v1/zones/{zone_id}/records Create a record.
| Name | In | Type | Required |
|---|---|---|---|
Idempotency-Key | header | string | no |
RecordCreate | Status | Description | Schema |
|---|---|---|
201 | created | Record |
default | Problem | |
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"
}
}' {
"id": "11111111-0000-0000-0000-000000000000",
"zone_id": "a1b2c3d4-0000-0000-0000-000000000000",
"name": "www",
"type": "A",
"ttl": 300,
"data": {
"value": "203.0.113.10"
},
"created_at": "2026-05-28T09:01:00Z",
"updated_at": "2026-05-28T09:01:00Z"
} /v1/records/{record_id} Get a record.
| Status | Description | Schema |
|---|---|---|
200 | record | Record |
default | Problem | |
curl https://api.dnswiz.app/v1/records/{record_id} \
-H "Authorization: Bearer $DNSWIZ_API_KEY" {
"id": "11111111-0000-0000-0000-000000000000",
"zone_id": "a1b2c3d4-0000-0000-0000-000000000000",
"name": "www",
"type": "A",
"ttl": 300,
"data": {
"value": "203.0.113.10"
},
"created_at": "2026-05-28T09:01:00Z",
"updated_at": "2026-05-28T09:01:00Z"
} /v1/records/{record_id} Update a record.
| Name | In | Type | Required |
|---|---|---|---|
Idempotency-Key | header | string | no |
RecordUpdate | Status | Description | Schema |
|---|---|---|
200 | updated | Record |
default | Problem | |
curl -X PATCH https://api.dnswiz.app/v1/records/{record_id} \
-H "Authorization: Bearer $DNSWIZ_API_KEY" {
"id": "11111111-0000-0000-0000-000000000000",
"zone_id": "a1b2c3d4-0000-0000-0000-000000000000",
"name": "www",
"type": "A",
"ttl": 300,
"data": {
"value": "203.0.113.10"
},
"created_at": "2026-05-28T09:01:00Z",
"updated_at": "2026-05-28T09:01:00Z"
} /v1/records/{record_id} Delete a record.
| Name | In | Type | Required |
|---|---|---|---|
Idempotency-Key | header | string | no |
| Status | Description | Schema |
|---|---|---|
204 | deleted | |
default | Problem | |
curl -X DELETE https://api.dnswiz.app/v1/records/{record_id} \
-H "Authorization: Bearer $DNSWIZ_API_KEY" /v1/records/{record_id}/test Live-dig, resolve the record from the dnswiz edge fleet and return raw answers.
| Status | Description | Schema |
|---|---|---|
200 | dig result | LiveDig |
default | Problem | |
curl -X POST https://api.dnswiz.app/v1/records/{record_id}/test \
-H "Authorization: Bearer $DNSWIZ_API_KEY" /v1/records/{record_id}/canary/abort Snap a CANARY record back to its primary (set ramp to 0%).
| Status | Description | Schema |
|---|---|---|
200 | aborted | Record |
default | Problem | |
curl -X POST https://api.dnswiz.app/v1/records/{record_id}/canary/abort \
-H "Authorization: Bearer $DNSWIZ_API_KEY" {
"id": "11111111-0000-0000-0000-000000000000",
"zone_id": "a1b2c3d4-0000-0000-0000-000000000000",
"name": "www",
"type": "A",
"ttl": 300,
"data": {
"value": "203.0.113.10"
},
"created_at": "2026-05-28T09:01:00Z",
"updated_at": "2026-05-28T09:01:00Z"
} /v1/records/{record_id}/canary/resume Resume a paused CANARY record from its current percentage.
| Status | Description | Schema |
|---|---|---|
200 | resumed | Record |
default | Problem | |
curl -X POST https://api.dnswiz.app/v1/records/{record_id}/canary/resume \
-H "Authorization: Bearer $DNSWIZ_API_KEY" {
"id": "11111111-0000-0000-0000-000000000000",
"zone_id": "a1b2c3d4-0000-0000-0000-000000000000",
"name": "www",
"type": "A",
"ttl": 300,
"data": {
"value": "203.0.113.10"
},
"created_at": "2026-05-28T09:01:00Z",
"updated_at": "2026-05-28T09:01:00Z"
} pools
/v1/pools List pools.
| Name | In | Type | Required |
|---|---|---|---|
cursor | query | string | no |
limit | query | integer | no |
| Status | Description | Schema |
|---|---|---|
200 | page of pools | PoolPage |
default | Problem | |
curl https://api.dnswiz.app/v1/pools \
-H "Authorization: Bearer $DNSWIZ_API_KEY" /v1/pools Create a pool.
| Name | In | Type | Required |
|---|---|---|---|
Idempotency-Key | header | string | no |
PoolCreate | Status | Description | Schema |
|---|---|---|
201 | created | Pool |
default | Problem | |
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",
"selection_method": "active-passive"
}' /v1/pools/{id} Get a pool with its members.
| Status | Description | Schema |
|---|---|---|
200 | pool | Pool |
default | Problem | |
curl https://api.dnswiz.app/v1/pools/{id} \
-H "Authorization: Bearer $DNSWIZ_API_KEY" /v1/pools/{id} Update pool name or selection method.
PoolCreate | Status | Description | Schema |
|---|---|---|
200 | updated | Pool |
default | Problem | |
curl -X PATCH https://api.dnswiz.app/v1/pools/{id} \
-H "Authorization: Bearer $DNSWIZ_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "api-us-east",
"selection_method": "active-passive"
}' /v1/pools/{id} Delete a pool. Fails (409) if any record still references it.
| Status | Description | Schema |
|---|---|---|
204 | deleted | |
default | Problem | |
curl -X DELETE https://api.dnswiz.app/v1/pools/{id} \
-H "Authorization: Bearer $DNSWIZ_API_KEY" /v1/pools/{id}/members Attach an existing endpoint as a pool member.
object | Status | Description | Schema |
|---|---|---|
201 | attached | PoolMember |
default | Problem | |
curl -X POST https://api.dnswiz.app/v1/pools/{id}/members \
-H "Authorization: Bearer $DNSWIZ_API_KEY" /v1/pools/{id}/members/{member_id} Update member weight or priority.
object | Status | Description | Schema |
|---|---|---|
200 | updated | PoolMember |
default | Problem | |
curl -X PATCH https://api.dnswiz.app/v1/pools/{id}/members/{member_id} \
-H "Authorization: Bearer $DNSWIZ_API_KEY" /v1/pools/{id}/members/{member_id} Detach a member from a pool.
| Status | Description | Schema |
|---|---|---|
204 | detached | |
default | Problem | |
curl -X DELETE https://api.dnswiz.app/v1/pools/{id}/members/{member_id} \
-H "Authorization: Bearer $DNSWIZ_API_KEY" /v1/pools/{id}/members/{member_id}/enabled Flip member enabled (drain / un-drain without deleting).
object | Status | Description | Schema |
|---|---|---|
200 | updated | PoolMember |
default | Problem | |
curl -X PATCH https://api.dnswiz.app/v1/pools/{id}/members/{member_id}/enabled \
-H "Authorization: Bearer $DNSWIZ_API_KEY" endpoints
/v1/endpoints List health-checked endpoints.
| Name | In | Type | Required |
|---|---|---|---|
cursor | query | string | no |
limit | query | integer | no |
| Status | Description | Schema |
|---|---|---|
200 | page of endpoints | EndpointPage |
default | Problem | |
curl https://api.dnswiz.app/v1/endpoints \
-H "Authorization: Bearer $DNSWIZ_API_KEY" /v1/endpoints Create an endpoint.
| Name | In | Type | Required |
|---|---|---|---|
Idempotency-Key | header | string | no |
EndpointCreate | Status | Description | Schema |
|---|---|---|
201 | created | Endpoint |
default | Problem | |
curl -X POST https://api.dnswiz.app/v1/endpoints \
-H "Authorization: Bearer $DNSWIZ_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "api-us-east-1",
"kind": "https",
"target": "https://api-us-east.example.com/healthz",
"value": "203.0.113.10",
"expected_status": 200
}' /v1/endpoints/{id} Get an endpoint with current health + recent incidents.
| Status | Description | Schema |
|---|---|---|
200 | endpoint | Endpoint |
default | Problem | |
curl https://api.dnswiz.app/v1/endpoints/{id} \
-H "Authorization: Bearer $DNSWIZ_API_KEY" /v1/endpoints/{id} Update an endpoint.
EndpointCreate | Status | Description | Schema |
|---|---|---|
200 | updated | Endpoint |
default | Problem | |
curl -X PATCH https://api.dnswiz.app/v1/endpoints/{id} \
-H "Authorization: Bearer $DNSWIZ_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "api-us-east-1",
"kind": "https",
"target": "https://api-us-east.example.com/healthz",
"value": "203.0.113.10",
"expected_status": 200
}' /v1/endpoints/{id} Delete an endpoint (also removes pool memberships).
| Status | Description | Schema |
|---|---|---|
204 | deleted | |
default | Problem | |
curl -X DELETE https://api.dnswiz.app/v1/endpoints/{id} \
-H "Authorization: Bearer $DNSWIZ_API_KEY" health-monitors
/v1/health-monitors List reusable probe policies.
| Status | Description | Schema |
|---|---|---|
200 | monitors | HealthMonitor[] |
default | Problem | |
curl https://api.dnswiz.app/v1/health-monitors \
-H "Authorization: Bearer $DNSWIZ_API_KEY" /v1/health-monitors Create a named monitor (interval/timeout/thresholds/expected status).
| Name | In | Type | Required |
|---|---|---|---|
Idempotency-Key | header | string | no |
HealthMonitorCreate | Status | Description | Schema |
|---|---|---|
201 | created | HealthMonitor |
default | Problem | |
curl -X POST https://api.dnswiz.app/v1/health-monitors \
-H "Authorization: Bearer $DNSWIZ_API_KEY" /v1/health-monitors/{id} Update a monitor (changes propagate to every attached endpoint on next probe tick).
HealthMonitorCreate | Status | Description | Schema |
|---|---|---|
200 | updated | HealthMonitor |
default | Problem | |
curl -X PATCH https://api.dnswiz.app/v1/health-monitors/{id} \
-H "Authorization: Bearer $DNSWIZ_API_KEY" /v1/health-monitors/{id} Delete a monitor. Endpoints that referenced it fall back to defaults.
| Status | Description | Schema |
|---|---|---|
204 | deleted | |
default | Problem | |
curl -X DELETE https://api.dnswiz.app/v1/health-monitors/{id} \
-H "Authorization: Bearer $DNSWIZ_API_KEY" policies
/v1/me/policies List tenant-default policies (apply across every zone unless overridden).
| Status | Description | Schema |
|---|---|---|
200 | policies | Policy[] |
default | Problem | |
curl https://api.dnswiz.app/v1/me/policies \
-H "Authorization: Bearer $DNSWIZ_API_KEY" /v1/me/policies/{kind} Update a tenant-default policy (enable/disable, set config).
PolicyUpdate | Status | Description | Schema |
|---|---|---|
200 | updated | Policy |
default | Problem | |
curl -X PATCH https://api.dnswiz.app/v1/me/policies/{kind} \
-H "Authorization: Bearer $DNSWIZ_API_KEY" /v1/zones/{zone_id}/security List per-zone policies (firewall, hijack monitor) with their effective config.
| Status | Description | Schema |
|---|---|---|
200 | policies | Policy[] |
default | Problem | |
curl https://api.dnswiz.app/v1/zones/{zone_id}/security \
-H "Authorization: Bearer $DNSWIZ_API_KEY" /v1/zones/{zone_id}/security/{kind} Update a per-zone policy (overrides tenant default).
PolicyUpdate | Status | Description | Schema |
|---|---|---|
200 | updated | Policy |
default | Problem | |
curl -X PATCH https://api.dnswiz.app/v1/zones/{zone_id}/security/{kind} \
-H "Authorization: Bearer $DNSWIZ_API_KEY" /v1/zones/{zone_id}/security/hijack-probes Recent hijack-probe results (every 5 min from 8 public resolvers).
| Status | Description | Schema |
|---|---|---|
200 | probes | HijackProbe[] |
default | Problem | |
curl https://api.dnswiz.app/v1/zones/{zone_id}/security/hijack-probes \
-H "Authorization: Bearer $DNSWIZ_API_KEY" certs
/v1/certs List cert issuances (audit ledger).
| Name | In | Type | Required |
|---|---|---|---|
cursor | query | string | no |
limit | query | integer | no |
| Status | Description | Schema |
|---|---|---|
200 | page of issuances | CertIssuancePage |
default | Problem | |
curl https://api.dnswiz.app/v1/certs \
-H "Authorization: Bearer $DNSWIZ_API_KEY" /v1/certs/issue Issue (or re-issue) a TLS cert via ACME DNS-01. Returns the signed cert + chain.
The client generates the private key locally and submits a CSR. dnswiz solves the DNS-01 challenge against its own authoritative zones, returns cert+chain. Private key is never seen server-side.
| Name | In | Type | Required |
|---|---|---|---|
Idempotency-Key | header | string | no |
CertIssueRequest | Status | Description | Schema |
|---|---|---|
200 | issued | CertIssueResponse |
default | Problem | |
curl -X POST https://api.dnswiz.app/v1/certs/issue \
-H "Authorization: Bearer $DNSWIZ_API_KEY" /v1/certs/coverage Names that resolve to a public IP but have no covering TLS cert (gap detector).
| Status | Description | Schema |
|---|---|---|
200 | coverage | CertCoverage |
default | Problem | |
curl https://api.dnswiz.app/v1/certs/coverage \
-H "Authorization: Bearer $DNSWIZ_API_KEY" /v1/certs/{id} Get a cert issuance (status, expiry, last_error).
| Status | Description | Schema |
|---|---|---|
200 | issuance | CertIssuance |
default | Problem | |
curl https://api.dnswiz.app/v1/certs/{id} \
-H "Authorization: Bearer $DNSWIZ_API_KEY" firewall
/v1/me/firewall/refused Live ring buffer of recent firewall refusals (in-memory, ~1h, ≤200/tenant).
| Name | In | Type | Required |
|---|---|---|---|
limit | query | integer | no |
| Status | Description | Schema |
|---|---|---|
200 | refusals, newest first | object |
default | Problem | |
curl https://api.dnswiz.app/v1/me/firewall/refused \
-H "Authorization: Bearer $DNSWIZ_API_KEY" insights
/v1/zones/{zone_id}/insights Query stats, top names, latency, refused-rcode breakdown for a zone.
| Name | In | Type | Required |
|---|---|---|---|
range | query | string (24h | 7d | 30d | 90d) | no |
| Status | Description | Schema |
|---|---|---|
200 | insights payload | Insights |
default | Problem | |
curl https://api.dnswiz.app/v1/zones/{zone_id}/insights \
-H "Authorization: Bearer $DNSWIZ_API_KEY" notifications
/v1/notifications List notification channels (email, slack, webhook).
| Status | Description | Schema |
|---|---|---|
200 | channels | NotificationChannel[] |
default | Problem | |
curl https://api.dnswiz.app/v1/notifications \
-H "Authorization: Bearer $DNSWIZ_API_KEY" /v1/notifications Create a notification channel.
| Name | In | Type | Required |
|---|---|---|---|
Idempotency-Key | header | string | no |
NotificationChannelCreate | Status | Description | Schema |
|---|---|---|
201 | created | NotificationChannel |
default | Problem | |
curl -X POST https://api.dnswiz.app/v1/notifications \
-H "Authorization: Bearer $DNSWIZ_API_KEY" /v1/notifications/{id} Update a notification channel.
NotificationChannelCreate | Status | Description | Schema |
|---|---|---|
200 | updated | NotificationChannel |
default | Problem | |
curl -X PATCH https://api.dnswiz.app/v1/notifications/{id} \
-H "Authorization: Bearer $DNSWIZ_API_KEY" /v1/notifications/{id} Delete a notification channel.
| Status | Description | Schema |
|---|---|---|
204 | deleted | |
default | Problem | |
curl -X DELETE https://api.dnswiz.app/v1/notifications/{id} \
-H "Authorization: Bearer $DNSWIZ_API_KEY" team
/v1/team/members List workspace members.
| Status | Description | Schema |
|---|---|---|
200 | members | Member[] |
default | Problem | |
curl https://api.dnswiz.app/v1/team/members \
-H "Authorization: Bearer $DNSWIZ_API_KEY" /v1/team/members/{user_id} Change a member's role.
object | Status | Description | Schema |
|---|---|---|
200 | updated | Member |
default | Problem | |
curl -X PATCH https://api.dnswiz.app/v1/team/members/{user_id} \
-H "Authorization: Bearer $DNSWIZ_API_KEY" /v1/team/members/{user_id} Remove a member from the workspace.
| Status | Description | Schema |
|---|---|---|
204 | removed | |
default | Problem | |
curl -X DELETE https://api.dnswiz.app/v1/team/members/{user_id} \
-H "Authorization: Bearer $DNSWIZ_API_KEY" /v1/team/invitations List pending invitations.
| Status | Description | Schema |
|---|---|---|
200 | invitations | Invitation[] |
default | Problem | |
curl https://api.dnswiz.app/v1/team/invitations \
-H "Authorization: Bearer $DNSWIZ_API_KEY" /v1/team/invitations Invite someone by email.
| Name | In | Type | Required |
|---|---|---|---|
Idempotency-Key | header | string | no |
object | Status | Description | Schema |
|---|---|---|
201 | invited | Invitation |
default | Problem | |
curl -X POST https://api.dnswiz.app/v1/team/invitations \
-H "Authorization: Bearer $DNSWIZ_API_KEY" /v1/team/invitations/{id} Revoke a pending invitation.
| Status | Description | Schema |
|---|---|---|
204 | revoked | |
default | Problem | |
curl -X DELETE https://api.dnswiz.app/v1/team/invitations/{id} \
-H "Authorization: Bearer $DNSWIZ_API_KEY" billing
/v1/me/billing/checkout Start a Stripe Checkout session for a plan upgrade.
object | Status | Description | Schema |
|---|---|---|
200 | redirect target | object |
default | Problem | |
curl -X POST https://api.dnswiz.app/v1/me/billing/checkout \
-H "Authorization: Bearer $DNSWIZ_API_KEY" /v1/me/billing/portal Start a Stripe Customer Portal session.
| Status | Description | Schema |
|---|---|---|
200 | redirect target | object |
default | Problem | |
curl -X POST https://api.dnswiz.app/v1/me/billing/portal \
-H "Authorization: Bearer $DNSWIZ_API_KEY" api-keys
/v1/api-keys List API keys.
| Name | In | Type | Required |
|---|---|---|---|
cursor | query | string | no |
limit | query | integer | no |
| Status | Description | Schema |
|---|---|---|
200 | page of api keys | ApiKeyPage |
default | Problem | |
curl https://api.dnswiz.app/v1/api-keys \
-H "Authorization: Bearer $DNSWIZ_API_KEY" /v1/api-keys Create an API key (returns plaintext exactly once).
| Name | In | Type | Required |
|---|---|---|---|
Idempotency-Key | header | string | no |
ApiKeyCreate | Status | Description | Schema |
|---|---|---|
201 | created | ApiKeyWithSecret |
default | Problem | |
curl -X POST https://api.dnswiz.app/v1/api-keys \
-H "Authorization: Bearer $DNSWIZ_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "ci-runner",
"scopes": []
}' audit
/v1/audit List audit events.
| Name | In | Type | Required |
|---|---|---|---|
cursor | query | string | no |
limit | query | integer | no |
resource | query | string | no |
action | query | string | no |
| Status | Description | Schema |
|---|---|---|
200 | page of audit events | AuditEventPage |
default | Problem | |
curl https://api.dnswiz.app/v1/audit \
-H "Authorization: Bearer $DNSWIZ_API_KEY" public
/v1/public/check Free failover-readiness checker, paste a hostname, get a DNS + latency audit + score.
object | Status | Description | Schema |
|---|---|---|
200 | audit result | ReadinessCheck |
default | Problem | |
curl -X POST https://api.dnswiz.app/v1/public/check system-settings
/healthz Liveness probe.
| Status | Description | Schema |
|---|---|---|
200 | alive | object |
curl https://api.dnswiz.app/healthz /readyz Readiness probe (DB reachable).
| Status | Description | Schema |
|---|---|---|
200 | ready | |
503 | not ready | |
curl https://api.dnswiz.app/readyz /v1/system-settings Get all system settings (admin-only). Secret values are masked.
| Status | Description | Schema |
|---|---|---|
200 | settings | Setting[] |
default | Problem | |
curl https://api.dnswiz.app/v1/system-settings \
-H "Authorization: Bearer $DNSWIZ_API_KEY" /v1/system-settings/{key} Upsert a system setting (admin-only).
| Name | In | Type | Required |
|---|---|---|---|
Idempotency-Key | header | string | no |
SettingUpsert | Status | Description | Schema |
|---|---|---|
200 | upserted | Setting |
default | Problem | |
curl -X PUT https://api.dnswiz.app/v1/system-settings/{key} \
-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 |
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 |
expires_at | string <date-time> | no |
ApiKeyPage | Field | Type | Required |
|---|---|---|
items | ApiKey[] | yes |
next_cursor | string | yes |
ApiKeyWithSecret AuditEvent | Field | Type | Required |
|---|---|---|
id | integer <int64> | yes |
user_id | string <uuid> | 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 |
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 | Field | Type | Required |
|---|---|---|
id | string <uuid> | yes |
name | string | yes |
status | string (pending | issued | failed | revoked) | yes |
expires_at | string <date-time> | no |
fingerprint | string | no |
last_error | string | no |
issued_at | string <date-time> | no |
created_at | string <date-time> | no |
CertIssuancePage | Field | Type | Required |
|---|---|---|
items | CertIssuance[] | yes |
next_cursor | string | yes |
CertIssueRequest | Field | Type | Required |
|---|---|---|
csr_pem | string | yes |
CertIssueResponse | Field | Type | Required |
|---|---|---|
issuance_id | string <uuid> | yes |
cert_pem | string | yes |
chain_pem | string | yes |
expires_at | string <date-time> | 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 | Field | Type | Required |
|---|---|---|
id | string <uuid> | yes |
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 |
health | object | no |
created_at | string <date-time> | no |
updated_at | string <date-time> | no |
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 |
EndpointPage | Field | Type | Required |
|---|---|---|
items | Endpoint[] | yes |
next_cursor | string | yes |
HealthMonitor | Field | Type | Required |
|---|---|---|
id | string <uuid> | yes |
name | string | yes |
kind | string (http | https | tcp | udp) | yes |
path | string | no |
expected_status | integer | no |
interval_seconds | integer | no |
timeout_seconds | integer | no |
healthy_after | integer | no |
unhealthy_after | integer | no |
HealthMonitorCreate | Field | Type | Required |
|---|---|---|
name | string | yes |
kind | string (http | https | tcp | udp) | yes |
path | string | no |
expected_status | integer | no |
interval_seconds | integer | no |
timeout_seconds | integer | no |
healthy_after | integer | no |
unhealthy_after | integer | no |
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 |
IncidentsSummary | Field | Type | Required |
|---|---|---|
items | object[] | yes |
summary | object | yes |
Insights Per-zone insights payload. Wide and evolving, only the always-present fields are listed.
| Field | Type | Required |
|---|---|---|
range | string (24h | 7d | 30d | 90d) | no |
total | integer <int64> | no |
timeseries | object[] | no |
top_names | object[] | no |
rcodes | object | no |
latency | object | no |
Invitation | Field | Type | Required |
|---|---|---|
id | string <uuid> | yes |
email | string <email> | yes |
role | string (owner | admin | member) | yes |
created_at | string <date-time> | no |
expires_at | string <date-time> | yes |
LiveDig | Field | Type | Required |
|---|---|---|
name | string | yes |
type | string | yes |
answers | string[] | yes |
rcode | string | no |
elapsed_ms | integer | no |
Me | Field | Type | Required |
|---|---|---|
user | object | yes |
tenant | object | yes |
plan | Plan | yes |
usage | object | yes |
onboarding | object | yes |
Member | Field | Type | Required |
|---|---|---|
user_id | string <uuid> | yes |
email | string <email> | yes |
role | string (owner | admin | member) | yes |
joined_at | string <date-time> | no |
NotificationChannel | Field | Type | Required |
|---|---|---|
id | string <uuid> | yes |
name | string | yes |
kind | string (email | slack | webhook) | yes |
config | object | no |
enabled | boolean | yes |
created_at | string <date-time> | no |
NotificationChannelCreate | Field | Type | Required |
|---|---|---|
name | string | yes |
kind | string (email | slack | webhook) | yes |
config | object | yes |
enabled | 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 | Field | Type | Required |
|---|---|---|
id | string <uuid> | yes |
name | string | yes |
selection_method | string (weighted | active-passive | round-robin) | yes |
members | PoolMember[] | no |
created_at | string <date-time> | no |
updated_at | string <date-time> | no |
PoolCreate | Field | Type | Required |
|---|---|---|
name | string | yes |
selection_method | string (weighted | active-passive | round-robin) | yes |
PoolMember | Field | Type | Required |
|---|---|---|
id | string <uuid> | yes |
pool_id | string <uuid> | yes |
endpoint_id | string <uuid> | yes |
weight | integer | no |
priority | integer | no |
enabled | boolean | no |
PoolPage | Field | Type | Required |
|---|---|---|
items | Pool[] | yes |
next_cursor | string | yes |
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 |
ReadinessCheck | Field | Type | Required |
|---|---|---|
hostname | string | yes |
score | integer | yes |
latency_ms | number | no |
findings | object[] | no |
Record | Field | Type | Required |
|---|---|---|
id | string <uuid> | yes |
zone_id | string <uuid> | yes |
name | string | yes |
type | RecordType | yes |
ttl | integer | yes |
data | object | yes |
created_at | string <date-time> | yes |
updated_at | string <date-time> | yes |
RecordCreate | Field | Type | Required |
|---|---|---|
name | string | yes |
type | RecordType | yes |
ttl | integer | yes |
data | object | yes |
RecordPage | Field | Type | Required |
|---|---|---|
items | Record[] | yes |
next_cursor | string | yes |
RecordType RecordUpdate | Field | Type | Required |
|---|---|---|
ttl | integer | no |
data | object | no |
RefusedQuery | Field | Type | Required |
|---|---|---|
tenant_id | string <uuid> | yes |
zone_id | string <uuid> | yes |
qname | string | yes |
qtype | string | yes |
source_ip | string | yes |
country | string | no |
reason | string (qtype-refused | ip-not-allowed | ip-denied | country-not-allowed | country-denied | rate-limited) | yes |
checked_at_ms | integer <int64> | yes |
Setting | Field | Type | Required |
|---|---|---|
key | string | yes |
value | | no |
masked_value | string | no |
is_secret | boolean | yes |
description | string | yes |
updated_by | string <uuid> | no |
updated_at | string <date-time> | yes |
SettingUpsert | Field | Type | Required |
|---|---|---|
value | | no |
secret | string | no |
is_secret | boolean | yes |
description | string | no |
Zone | Field | Type | Required |
|---|---|---|
id | string <uuid> | yes |
name | string | yes |
active | boolean | yes |
created_at | string <date-time> | yes |
updated_at | string <date-time> | yes |
ZoneCreate | Field | Type | Required |
|---|---|---|
name | string | yes |
ZoneHealth | Field | Type | Required |
|---|---|---|
score | integer | yes |
sub_scores | object | no |
ZonePage | Field | Type | Required |
|---|---|---|
items | Zone[] | yes |
next_cursor | string | yes |