Build integrations against Skysnag with scoped API tokens.
Authenticate using the X-Api-Token header — not Bearer auth. All responses are JSON with predictable error shapes.
Paste a token to enable the Try it console on GET endpoints below (read-only). Requests run against your live account at https://developers.skysnag.com/api/v1. The token is stored only in this browser (localStorage) and is never sent anywhere except this API.
No key set
Base URL & headers
All v1 paths are relative to the base URL below.
https://developers.skysnag.com/api/v1
https://api.skysnag.com/v1
Header
Value
Notes
Accept
application/json
Always
Content-Type
application/json
When sending a body
X-Api-Token
Your API token
Protected endpoints
X-Request-Id
Optional UUID
Correlate logs; echoed in errors
Responses
Success payloads are wrapped in a data envelope.
JSON — success envelope
{
"data": { ... }
}
JSON — GET /health
{
"data": {
"status": "ok",
"version": "v1"
}
}
Errors
Errors return a stable code, human message, and request_id for support.
Manage account team members. Requires the authenticated account to be the team owner. Schemas: users, roles, teams, domain_accesses, password_securities, webauthn_credentials, user_detail_changes_history.
GET/rolesusers:read
List roles that can be assigned when inviting or updating team members. Owner, Admin, and Editor are excluded.
GET/roles/{role_id}users:read
Get details for a single assignable role.
GET/usersusers:read
List account users on the current team.
POST/usersusers:write
Create an account member invitation. Sends an invite email by default.
GET/users/{user_id}users:read
Get user details.
PATCH/users/{user_id}users:write
Update user details.
DELETE/users/{user_id}users:write
Delete a team member.
PATCH/users/{user_id}/statususers:write
Toggle user status. Body: {"enabled": true}
PATCH/users/{user_id}/roleusers:write
Change role. Body: {"role_id": 5}
PATCH/users/{user_id}/enforce-2fausers:write
Toggle 2FA enforcement. Body: {"enabled": true}
POST/users/{user_id}/reinvite-userusers:write
Resend the account invitation email to an existing team member.
GET/users/{user_id}/domainsusers:read
List domain access for a user.
Domain Management API
Manage account domains. Write operations require the team owner account. Schemas: domains, domain_groups, domain_accesses, domain_states, domain_snapshot, parked_domains, license_domain, domains_services, cloudflare_records.
GET/domainsdomains:read
List domains visible to the account. Supports page and limit.
POST/domainsdomains:write
Create a domain. Body: {"fqdn": "example.com", "parent_domain_id": null}
Get the latest DNS fetch result stored by check-dns (cached for 7 days). The check-dns response body already includes the full result; use this endpoint to retrieve it later without re-running the check.
GET/domains/{domain_id}/statusdomains:read
Get protocol verification status (DMARC, SPF, MTA-STS, TLS-RPT, BIMI).
Paginated rows with TLS failures (non-zero failure counts or failure reason codes).
Domain Health & Security Score API
Read-only domain health, email security score, mail volume, sending services, failing sources, and cached dashboard data. All endpoints are scoped to {domain_id} and require domains:read. Volume/source endpoints accept optional start_date/end_date (YYYY-MM-DD, default last 30 days).
Get domain health
get/domains/{domain_id}/healthdomains:read
Current domain health snapshot: a per-protocol pass/fail map, a qualitative result label, the detected mail provider, and the live DMARC record. Sourced from the latest Domain Guard scan, falling back to live verification flags when no scan exists (source tells you which).
Returns
source (guard_history | live), result, mail_provider, a protocols map of booleans, protocols_passing/total_protocols, the dmarc_record, and scanned_at.
Paginated history of Domain Guard health snapshots, newest first. Each row captures the protocol pass/fail state and result label at the time of a scan, letting you chart protection over time.
Query Parameters
start_date:
optionalstring · date
Inclusive window start (YYYY-MM-DD). Defaults to 30 days ago.
end_date:
optionalstring · date
Inclusive window end (YYYY-MM-DD). Defaults to today.
page:
optionalinteger
Page number, 1-based (default 1).
limit:
optionalinteger
Items per page (1–100, default 25).
Returns
A paginated array of snapshot rows (id, result, mail_provider, protocols map, protocols_passing/total_protocols, scanned_at) plus pagination.
The current Email Security Score (0–10) with a human-readable interpretation and message. Computed on demand from cached external checker results, so the first call after a cache miss may be slower. Returns 503score_unavailable if it cannot be computed.
Returns
score, max_score (10), interpretation (e.g. excellent), a message, and computed_at.
A derived security-score series computed from Domain Guard snapshots, where derived_score = passing protocols / 5 × 10. Use this for a trend line when you do not need the full live-checker score.
Query Parameters
start_date:
optionalstring · date
Inclusive window start (YYYY-MM-DD). Defaults to 30 days ago.
end_date:
optionalstring · date
Inclusive window end (YYYY-MM-DD). Defaults to today.
limit:
optionalinteger
Maximum rows to return (1–100, default 10).
Returns
max_score, an explanatory note, and a history array of points (derived_score, protocols_passing/total_protocols, result, scanned_at).
Daily mail-volume history derived from DMARC aggregate data: delivered / quarantined / rejected counts and DMARC pass/fail per day, plus rolled-up totals for the whole window.
Query Parameters
start_date:
optionalstring · date
Inclusive window start (YYYY-MM-DD). Defaults to 30 days ago.
end_date:
optionalstring · date
Inclusive window end (YYYY-MM-DD). Defaults to today.
Returns
A totals object and a timeline array, each entry keyed by date with volume and pass/fail counts.
Sending sources with volume, DMARC metrics, a compliance percentage, and a status of compliant, partial, or failing. The is_registered_threat flag marks sources known to be malicious.
Query Parameters
start_date:
optionalstring · date
Inclusive window start (YYYY-MM-DD). Defaults to 30 days ago.
end_date:
optionalstring · date
Inclusive window end (YYYY-MM-DD). Defaults to today.
limit:
optionalinteger
Maximum rows to return (1–100, default 10).
Returns
An array of services, each with source_name, the metrics object, compliance, status, and is_registered_threat.
Sources that failed DMARC alignment in the window, ordered by failing volume. These are the highest-priority sources to investigate — either legitimate senders that need authentication fixed, or spoofers.
Query Parameters
start_date:
optionalstring · date
Inclusive window start (YYYY-MM-DD). Defaults to 30 days ago.
end_date:
optionalstring · date
Inclusive window end (YYYY-MM-DD). Defaults to today.
limit:
optionalinteger
Maximum rows to return (1–100, default 10).
Returns
An array of failed_sources with the same shape as sending-services, ordered by failing volume descending.
Returns the precomputed dashboard snapshot payload for the domain, if one exists. This is the fastest way to render a dashboard without recomputing aggregates. When no snapshot exists, cached is false and data is null.
Query Parameters
start_date:
optionalstring · date
Inclusive window start (YYYY-MM-DD). Defaults to 30 days ago.
end_date:
optionalstring · date
Inclusive window end (YYYY-MM-DD). Defaults to today.
Returns
cached (boolean), cached_at, the requested window, and the snapshot data payload (or null).
Read-only DNS connect/disconnect timeline, current records, record-value history, change events, and stored snapshots. All endpoints are scoped to {domain_id} and require domains:read. Filterable by record_type and start_date/end_date (YYYY-MM-DD).
Get DNS timeline
get/domains/{domain_id}/dns/timelinedomains:read
A per-protocol status summary (current status, last connected/disconnected timestamps, and connection counts) plus the most recent connect/disconnect events. This is the headline view of how each protocol record has come and gone over time.
Query Parameters
record_type:
optionalstring
Filter events to one of dmarc, spf, mta_sts, tls_rpt, bimi.
action:
optionalstring
Filter to connected or disconnected.
start_date:
optionalstring · date
Inclusive window start (YYYY-MM-DD). Defaults to 30 days ago.
end_date:
optionalstring · date
Inclusive window end (YYYY-MM-DD). Defaults to today.
limit:
optionalinteger
Maximum rows to return (1–100, default 10).
Returns
A summary keyed by protocol and an events array (id, record_type, action, record_value, status_before/status_after, occurred_at).
The current state of each protocol record: connection status, verification flag, last connected/disconnected timestamps, and the latest known record value. SPF additionally reports its DNS lookup_count (the 10-lookup limit matters for validity).
Returns
A protocols map keyed by protocol, each with current_status, verified, status, last_connected/last_disconnected, and record_value.
A unified, paginated, chronological history of record values — merging DMARC and SPF snapshots so you can see exactly what each record contained at each point in time. SPF rows include lookup_count.
Query Parameters
record_type:
optionalstring
Limit to dmarc or spf (default both).
start_date:
optionalstring · date
Inclusive window start (YYYY-MM-DD). Defaults to 30 days ago.
end_date:
optionalstring · date
Inclusive window end (YYYY-MM-DD). Defaults to today.
page:
optionalinteger
Page number, 1-based (default 1).
limit:
optionalinteger
Items per page (1–100, default 25).
Returns
A paginated array of history rows (record_type, record_value, occurred_at; SPF adds lookup_count) plus pagination.
A paginated feed of connect/disconnect change events across all protocols, with the status transition (status_before → status_after). Use this for an audit-style activity feed of DNS health.
Query Parameters
record_type:
optionalstring
One of dmarc, spf, mta_sts, tls_rpt, bimi.
action:
optionalstring
Filter to connected or disconnected.
start_date:
optionalstring · date
Inclusive window start (YYYY-MM-DD). Defaults to 30 days ago.
end_date:
optionalstring · date
Inclusive window end (YYYY-MM-DD). Defaults to today.
page:
optionalinteger
Page number, 1-based (default 1).
limit:
optionalinteger
Items per page (1–100, default 25).
Returns
A paginated array of change events (id, record_type, action, record_value, status_before/status_after, occurred_at) plus pagination.
The raw stored snapshot rows, grouped by record type. Unlike /dns/history (which merges and paginates), this returns the underlying dmarc and spf snapshot arrays separately.
Query Parameters
record_type:
optionalstring
Limit to dmarc or spf (default both).
start_date:
optionalstring · date
Inclusive window start (YYYY-MM-DD). Defaults to 30 days ago.
end_date:
optionalstring · date
Inclusive window end (YYYY-MM-DD). Defaults to today.
limit:
optionalinteger
Maximum rows to return (1–100, default 10).
Returns
A dmarc array and an spf array of snapshot rows (id, record_value, occurred_at; SPF adds lookup_count).
Read-only account API audit logs — every mutating API request (POST/PUT/PATCH/DELETE) plus sensitive reads are recorded with method, path, status, IP, token, and timestamp. Scoped to the token owner's account and require the account:read scope.
The audit log object
Every endpoint in this section returns rows of this shape. action is a stable, human-readable label for the operation; request_id matches the request_id echoed in the response envelope of the original call.
Search audit logs via a JSON body using the same filters as the list endpoint. Prefer this over the query-string list when you need to pass method as an array or build long, structured queries.
Body parameters (JSON)
q:
optionalstring
Free-text search across action, path and IP.
method:
optionalstring | array
A single method or an array, e.g. ["POST","PATCH","DELETE"].