For developers · v1.0.0

DomainWarn API

Everything in the dashboard is available through the REST API: create and pause domains, trigger checks, acknowledge incidents, analyse DNS changes and availability. Authenticate with an API token per organization, responses are JSON, described in an OpenAPI 3.1 specification.

Base URL
https://api.domainwarn.com/api/v1
Authentication
Authorization: Bearer
Format
JSON · OpenAPI 3.1

Authentication

Admins and owners create API tokens in the dashboard under Settings → API. The token is shown in plain text exactly once; afterwards only name, scope, last use and expiry remain visible. Every call sends the token as a bearer token and requests JSON:

  • A token is valid for exactly one organization. Calls for another organization respond with 404, as if it did not exist.
  • Optional expiry of 1 to 730 days; 90 days with regular rotation is recommended. Expired and revoked tokens respond with 401.
  • If the creator leaves the organization or the organization is deleted, their tokens become invalid immediately.
  • At most 20 tokens per organization. Every creation and revocation is recorded in the audit log.
Authorization: Bearer <token>
Accept: application/json

Scopes: read and write

When creating a token you choose between two scopes. A token never has more rights than a member, even if an owner created it.

  • read: like the viewer role. All GET endpoints; every writing method responds with 403.
  • write: like the member role. Additionally create, update and delete domains and customers, manage monitors, trigger checks and acknowledge incidents.
  • Never via token, not even with write: account, password, two-factor, passkeys, members, invitations, billing, notification channels, audit log, data export and token management itself. These routes respond with 403.

Base URL and language

All endpoints live under https://api.domainwarn.com/api/v1; the data of an organization under /orgs/{organization}. You find the slug in the dashboard URL, under Settings → API, or via GET /organizations, which with a token returns exactly that one organization.

Findings (findings) are translated: the header Accept-Language: de or en selects the language, without it English is used. All timestamps are ISO 8601 in UTC (suffix Z), IDs are UUIDs.

Limits

  • 300 requests per minute and token, independent of the creator's dashboard session. The headers X-RateLimit-Limit and X-RateLimit-Remaining show the state; when exceeded the server responds with 429 and Retry-After in seconds.
  • Check now: 5 calls per domain and hour, 60 per organization and hour.
  • Bulk import: 200 domains per call, 3 calls per hour and organization.
  • The domain limit of the plan also applies to the API. Domains created beyond it respond with 422; domains above the limit of a smaller plan are plan_paused.

Responses and errors

Successful responses carry the payload under data; lists additionally links and meta. Creating responds with 201, deleting with 204 without content, triggering checks with 202. Every error comes as application/problem+json (RFC 9457) with type, title, status and usually detail:

  • 401: token missing, expired or revoked.
  • 402: the organization is suspended or has no active plan; plan and suspended say why.
  • 403: the token is not allowed to do this (read token on a writing method, blocked area).
  • 404: organization or object not found, also for a foreign organization.
  • 422: invalid input; errors contains the messages per field.
  • 429: limit exceeded, see Retry-After.
{
  "type": "https://domainwarn.com/errors/validation",
  "title": "The input is invalid.",
  "status": 422,
  "detail": "The name field is required.",
  "errors": { "name": ["The name field is required."] }
}

Pagination

Domains and customers are paginated by page: page and per_page as parameters, meta.current_page, meta.last_page and meta.total in the response. Incidents, events and check results are sorted by time and cursor-paginated: the response names the cursor of the next page in meta.next_cursor (links.next for check results), which you pass as the cursor parameter; null means the end.

GET /orgs/my-agency/incidents?status=open&per_page=100
GET /orgs/my-agency/incidents?status=open&per_page=100&cursor=eyJzdGFydGVkX2F0Ijoi…

Example: query critical domains

All domains in a critical state, sorted by health, as input for a ticket system or a Slack bot:

curl -H "Authorization: Bearer $DOMAINWARN_TOKEN" -H "Accept: application/json" \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/domains?status=critical,warning&sort=health_status"

Example: create and check a domain from CI

After a client site goes live, the pipeline creates the domain and triggers the first check right away. The create response contains the id for all further calls:

curl -X POST -H "Authorization: Bearer $DOMAINWARN_TOKEN" -H "Accept: application/json" \
  -H "Content-Type: application/json" -d '{"name":"client.com","customer_id":"3f9c1a52-6a2e-4c0e-9d4b-1c9a1a0e5b77"}' \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/domains"

curl -X POST -H "Authorization: Bearer $DOMAINWARN_TOKEN" -H "Accept: application/json" \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/domains/<domain-id>/check-now"

OpenAPI specification

The complete description of all endpoints, parameters, schemas and errors is available as OpenAPI 3.1 at /openapi.json in the language of this page. Use it to generate clients (openapi-generator, orval, Kiota), import the API into Postman, Insomnia or Bruno, or open it in the Swagger Editor. The specification is built from the same source as this page and changes with every release of the API.

Endpoints

All paths are relative to the base URL https://api.domainwarn.com/api/v1. The placeholder {organization} is the organization slug as shown in the dashboard URL.

read: with any token; write: only with write scope. Required fields are marked with *.

Organization

get/organizationsreadOrganization of the token

Returns exactly the organization the token belongs to, with slug, plan and the role of the token. Useful to look up the slug for all further calls.

Parameters

NameInTypeDescription

Response

200

Example

curl \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  "https://api.domainwarn.com/api/v1/organizations"

Overview

get/orgs/{organization}/dashboardreadOverview

Counters per health state, open incidents, changes of the last 24 hours, plan usage and history of the last 14 days. The response carries an ETag; with If-None-Match the server answers 304 when nothing changed.

Parameters

NameInTypeDescription
organizationpathstringOrganization slug as shown in the dashboard URL and under Settings → API. A token only reaches its own organization; others respond with 404.

Response

200 · { data: Dashboard }

Example

curl \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/dashboard"
get/orgs/{organization}/usagereadPlan usage

Limits of the effective plan and current usage: domains, monitors, members, channels and checks of the last 24 hours.

Parameters

NameInTypeDescription
organizationpathstringOrganization slug as shown in the dashboard URL and under Settings → API. A token only reaches its own organization; others respond with 404.

Response

200 · { data: Usage }

Example

curl \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/usage"

Domains

get/orgs/{organization}/domainsreadList domains

All domains of the organization with health, customer and number of open incidents, paginated. Monitors are not included here; use the single fetch for them.

Parameters

NameInTypeDescription
organizationpathstringOrganization slug as shown in the dashboard URL and under Settings → API. A token only reaches its own organization; others respond with 404.
statusquerystringHealth states, comma-separated: healthy, warning, critical, unknown
customerquerystring (uuid)Only domains of this customer
cmsquerystringCMS keys, comma-separated; none for reachable without a known system, unknown for not detected yet
searchquerystringPart of the domain name
sortquerystring (name, -name, health_status, -health_status, created_at, -created_at, last_checked_at, -last_checked_at) · default nameSort order, minus for descending
pagequeryinteger · default 1Page number
per_pagequeryinteger · default 50Items per page (1 to 200)

Response

200 · { data: Domain[], links, meta }

Example

curl \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/domains"
get/orgs/{organization}/domains/export.csvreadDomains as CSV

The same list as when listing, as a CSV file with all rows instead of pages (UTF-8 with BOM, Content-Disposition: attachment). Columns: domain, customer, health, cms, cms_version, registrar, domain_expires_at, certificate_target, certificate_valid_to, certificate_days_left, open_incidents, last_checked_at, paused, dashboard_url. The certificate is the one of the apex domain on port 443, otherwise of the first enabled certificate monitor (certificate_target names it).

Limit: 30 calls per hour and organization

Parameters

NameInTypeDescription
organizationpathstringOrganization slug as shown in the dashboard URL and under Settings → API. A token only reaches its own organization; others respond with 404.
statusquerystringHealth states, comma-separated: healthy, warning, critical, unknown
customerquerystring (uuid)Only domains of this customer
cmsquerystringCMS keys, comma-separated; none for reachable without a known system, unknown for not detected yet
searchquerystringPart of the domain name
sortquerystring (name, -name, health_status, -health_status, created_at, -created_at, last_checked_at, -last_checked_at) · default nameSort order, minus for descending
delimiterquerystring (comma, semicolon)Delimiter; without it semicolon for language de (Excel), comma otherwise

Response

200 · { data: csv } · CSV file

Example

curl \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/domains/export.csv"
post/orgs/{organization}/domainswriteCreate a domain

Creates the domain with the default monitors and starts the first check. The domain limit of the plan applies; above it the server answers 422.

Parameters

NameInTypeDescription
organizationpathstringOrganization slug as shown in the dashboard URL and under Settings → API. A token only reaches its own organization; others respond with 404.

Request body (JSON)

FieldTypeDescription
name*stringDomain, Unicode or punycode; subdomains and schemes are stripped
customer_idstring | null (uuid)Customer the domain is assigned to
run_checksbooleanStart the first check immediately

Response

201 · { data: Domain }

Example

curl -X POST \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"name":"kunde.de","customer_id":null}' \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/domains"
get/orgs/{organization}/domains/cmsreadDetected systems

Which CMS and shop systems were detected on the domains, with counts; meta.none counts reachable domains without a known system, meta.unknown those not detected yet. Values for the cms filter of the domain list.

Parameters

NameInTypeDescription
organizationpathstringOrganization slug as shown in the dashboard URL and under Settings → API. A token only reaches its own organization; others respond with 404.

Response

200

Example

curl \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/domains/cms"
post/orgs/{organization}/domains/bulkwriteCreate domains in bulk

Up to 200 domains per call, as a list or as text with one domain per line (comma, semicolon and whitespace also separate; lines starting with # are skipped). Invalid or duplicate domains end up in meta.errors, the rest are created.

Limit: 3 calls per hour and organization

Parameters

NameInTypeDescription
organizationpathstringOrganization slug as shown in the dashboard URL and under Settings → API. A token only reaches its own organization; others respond with 404.

Request body (JSON)

FieldTypeDescription
domainsarrayList of domains (alternative to text)
textstringDomains as text (alternative to domains)
customer_idstring | null (uuid)Customer for all created domains

Response

201 · Created domains and errors per input

Example

curl -X POST \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"text":"kunde-a.de\nkunde-b.de\nshop.kunde-c.com","customer_id":null}' \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/domains/bulk"
post/orgs/{organization}/domains/import/zone-filewriteParse a zone file

Reads a BIND zone file and returns the website hostnames (A, AAAA, CNAME) as a preview, each with a flag whether it is already monitored. At most 200 per call, further pages via offset = next_offset. Creates nothing: the confirmed selection goes to the import.

Limit: 60 calls per minute and organization

Parameters

NameInTypeDescription
organizationpathstringOrganization slug as shown in the dashboard URL and under Settings → API. A token only reaches its own organization; others respond with 404.

Request body (JSON)

FieldTypeDescription
text*stringContents of the zone file
originstring | nullZone for files without $ORIGIN (e.g. example.com); if missing with relative names the server answers 422
offsetinteger | nullFirst entry of the page (from next_offset)

Response

200

Example

curl -X POST \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"text":"$ORIGIN kunde.de.\n@ IN A 203.0.113.10\nwww IN CNAME kunde.de.\nshop IN A 203.0.113.11"}' \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/domains/import/zone-file"
post/orgs/{organization}/domains/import/commitwriteConfirm an import

Creates the confirmed list from a zone file in the background, up to 5000 domains per import. The response (202) is the import with its ID; GET /domains/import/{import} reports the progress until status is done or failed. Unlike bulk creation, the monitors start at their regular time instead of immediately. Once the plan's domain limit is reached, the remaining names are rejected with the same reason.

Limit: 10 imports per hour and organization

Parameters

NameInTypeDescription
organizationpathstringOrganization slug as shown in the dashboard URL and under Settings → API. A token only reaches its own organization; others respond with 404.

Request body (JSON)

FieldTypeDescription
domains*arrayConfirmed domains or hostnames
customer_idstring | null (uuid)Customer for all created domains

Response

202 · { data: DomainImport } · The created import (status queued)

Example

curl -X POST \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"domains":["kunde.de","shop.kunde.de"],"customer_id":null}' \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/domains/import/commit"
get/orgs/{organization}/domains/import/{import}readGet import progress

State of an import: counters per batch and, once finished, the list of rejected or skipped names with reason. Poll every few seconds until status is done or failed. Agency-internal: customer accounts cannot see imports.

Parameters

NameInTypeDescription
organizationpathstringOrganization slug as shown in the dashboard URL and under Settings → API. A token only reaches its own organization; others respond with 404.
importpathstring (uuid)Import ID from the confirm response

Response

200 · { data: DomainImport }

Example

curl \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/domains/import/<import-id>"
get/orgs/{organization}/domains/{domain}readGet a domain

A single domain with all monitors, their latest findings and the number of open incidents.

Parameters

NameInTypeDescription
organizationpathstringOrganization slug as shown in the dashboard URL and under Settings → API. A token only reaches its own organization; others respond with 404.
domainpathstring (uuid)Domain ID

Response

200 · { data: Domain }

Example

curl \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/domains/<domain-id>"
patch/orgs/{organization}/domains/{domain}writeUpdate a domain

Assign a customer, switch monitoring on or off, or set notification rules for this domain only. Only fields that are sent change.

Parameters

NameInTypeDescription
organizationpathstringOrganization slug as shown in the dashboard URL and under Settings → API. A token only reaches its own organization; others respond with 404.
domainpathstring (uuid)Domain ID

Request body (JSON)

FieldTypeDescription
customer_idstring | null (uuid)Customer or null to unassign
is_activebooleanfalse pauses monitoring indefinitely, true resumes it
notification_overridesobject | nullNotification overrides

Response

200 · { data: Domain }

Example

curl -X PATCH \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"customer_id":"3f9c1a52-6a2e-4c0e-9d4b-1c9a1a0e5b77","notification_overrides":{"min_severity":"critical"}}' \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/domains/<domain-id>"
delete/orgs/{organization}/domains/{domain}writeDelete a domain

Permanently removes the domain with its monitors, results, incidents and events.

Parameters

NameInTypeDescription
organizationpathstringOrganization slug as shown in the dashboard URL and under Settings → API. A token only reaches its own organization; others respond with 404.
domainpathstring (uuid)Domain ID

Response

204

Example

curl -X DELETE \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/domains/<domain-id>"
post/orgs/{organization}/domains/{domain}/pausewritePause a domain

Suspends monitoring until a point in time, e.g. during a migration. Without until the pause is lifted. Open incidents remain.

Parameters

NameInTypeDescription
organizationpathstringOrganization slug as shown in the dashboard URL and under Settings → API. A token only reaches its own organization; others respond with 404.
domainpathstring (uuid)Domain ID

Request body (JSON)

FieldTypeDescription
untilstring | null (date-time)End of the pause, in the future; null lifts the pause

Response

200 · { data: Domain }

Example

curl -X POST \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"until":"2026-10-01T06:00:00Z"}' \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/domains/<domain-id>/pause"
patch/orgs/{organization}/domains/{domain}/monitoringwriteSwitch monitoring groups

Switches the groups website (web: http, tls, ct_log, redirects, ipv6), mail (mail: mx, spf, dkim, dmarc, mta_sts, tls_rpt, bimi, reverse_dns, smtp, dane) and DNS (dns: dns, dnssec, domain, blacklist, caa, nameservers) on or off. Groups that are switched off close their open incidents.

Parameters

NameInTypeDescription
organizationpathstringOrganization slug as shown in the dashboard URL and under Settings → API. A token only reaches its own organization; others respond with 404.
domainpathstring (uuid)Domain ID

Request body (JSON)

FieldTypeDescription
groups*objectGroups with the desired state; groups not mentioned stay unchanged

Response

200 · { data: Domain }

Example

curl -X PATCH \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"groups":{"mail":false}}' \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/domains/<domain-id>/monitoring"
post/orgs/{organization}/domains/{domain}/detect-cmswriteDetect the system again

Queues CMS and shop system detection for the domain; the result appears in the domain's cms.

Parameters

NameInTypeDescription
organizationpathstringOrganization slug as shown in the dashboard URL and under Settings → API. A token only reaches its own organization; others respond with 404.
domainpathstring (uuid)Domain ID

Response

202 · Detection queued

Example

curl -X POST \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/domains/<domain-id>/detect-cms"
post/orgs/{organization}/domains/{domain}/check-nowwriteCheck now

Queues all enabled monitors of the domain immediately, e.g. after a deploy or a DNS change. Results show up in the monitors a few seconds later.

Limit: 5 per domain and hour, 60 per organization and hour

Parameters

NameInTypeDescription
organizationpathstringOrganization slug as shown in the dashboard URL and under Settings → API. A token only reaches its own organization; others respond with 404.
domainpathstring (uuid)Domain ID

Response

202 · Checks queued

Example

curl -X POST \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/domains/<domain-id>/check-now"

Monitors

get/orgs/{organization}/domains/{domain}/suggestionsreadHostname suggestions

Hostnames under the domain that appear in certificate transparency logs but are not monitored yet. Open ones by default; with all=1 also accepted and dismissed ones, in pages of 200.

Parameters

NameInTypeDescription
organizationpathstringOrganization slug as shown in the dashboard URL and under Settings → API. A token only reaches its own organization; others respond with 404.
domainpathstring (uuid)Domain ID
allqueryboolean · default falseInclude decided suggestions as well
pagequeryinteger · default 1Page number

Response

200

Example

curl \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/domains/<domain-id>/suggestions"
post/orgs/{organization}/suggestions/{suggestion}/acceptwriteAccept a suggestion

Creates a website monitor for the hostname and marks the suggestion as accepted. 422 if the hostname does not belong to the domain or the limit of hostnames per domain is reached.

Parameters

NameInTypeDescription
organizationpathstringOrganization slug as shown in the dashboard URL and under Settings → API. A token only reaches its own organization; others respond with 404.
suggestionpathstring (uuid)Hostname suggestion ID

Response

200 · Accepted

Example

curl -X POST \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/suggestions/<suggestion-id>/accept"
post/orgs/{organization}/suggestions/{suggestion}/dismisswriteDismiss a suggestion

Marks the suggestion as dismissed; the hostname is not suggested again.

Parameters

NameInTypeDescription
organizationpathstringOrganization slug as shown in the dashboard URL and under Settings → API. A token only reaches its own organization; others respond with 404.
suggestionpathstring (uuid)Hostname suggestion ID

Response

200 · { data: HostnameSuggestion } · Dismissed

Example

curl -X POST \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/suggestions/<suggestion-id>/dismiss"
get/orgs/{organization}/domains/{domain}/monitorsreadMonitors of a domain

All monitors of the domain with status, latest findings and raw data, sorted by check type and target.

Parameters

NameInTypeDescription
organizationpathstringOrganization slug as shown in the dashboard URL and under Settings → API. A token only reaches its own organization; others respond with 404.
domainpathstring (uuid)Domain ID

Response

200

Example

curl \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/domains/<domain-id>/monitors"
post/orgs/{organization}/domains/{domain}/monitorswriteCreate a monitor

Additional monitor, e.g. another URL or a mail server certificate. Targets must belong to the domain; only for tls any public hostname is allowed. The interval is capped at the minimum of the plan.

Parameters

NameInTypeDescription
organizationpathstringOrganization slug as shown in the dashboard URL and under Settings → API. A token only reaches its own organization; others respond with 404.
domainpathstring (uuid)Domain ID

Request body (JSON)

FieldTypeDescription
type*string (http, tls, dns, mx, spf, dmarc, domain, dkim, dnssec, mta_sts, blacklist, tls_rpt, bimi, smtp, reverse_dns, ct_log, redirects, caa, nameservers, ipv6, dane)Check type
target*stringURL (http) or hostname; https:// is added when the scheme is missing
interval_secondsintegerCheck interval in seconds
configobjecttls only: port and STARTTLS protocol

Response

201 · { data: Monitor }

Example

curl -X POST \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"type":"tls","target":"mail.kunde.de","config":{"port":587,"starttls":"smtp"}}' \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/domains/<domain-id>/monitors"
patch/orgs/{organization}/monitors/{monitor}writeUpdate a monitor

Interval, activation and configuration per check type: expected_status and slow_ms (http), selectors (dkim). A disabled monitor closes its open incidents.

Parameters

NameInTypeDescription
organizationpathstringOrganization slug as shown in the dashboard URL and under Settings → API. A token only reaches its own organization; others respond with 404.
monitorpathstring (uuid)Monitor ID

Request body (JSON)

FieldTypeDescription
interval_secondsintegerCheck interval in seconds
is_enabledbooleanEnabled
configobjectExpected HTTP status codes, threshold for "slow" in ms (http) or DKIM selectors (dkim)

Response

200 · { data: Monitor }

Example

curl -X PATCH \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"config":{"expected_status":[200,301],"slow_ms":2000}}' \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/monitors/<monitor-id>"
delete/orgs/{organization}/monitors/{monitor}writeDelete a monitor

Removes the monitor and closes its open incidents.

Parameters

NameInTypeDescription
organizationpathstringOrganization slug as shown in the dashboard URL and under Settings → API. A token only reaches its own organization; others respond with 404.
monitorpathstring (uuid)Monitor ID

Response

204

Example

curl -X DELETE \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/monitors/<monitor-id>"
get/orgs/{organization}/maintenance-windowsreadList maintenance windows

All maintenance windows of the organization, enabled first; with domain only those affecting that domain (its own, its customer's and organization-wide ones).

Parameters

NameInTypeDescription
organizationpathstringOrganization slug as shown in the dashboard URL and under Settings → API. A token only reaches its own organization; others respond with 404.
domainquerystring (uuid)Only windows affecting this domain

Response

200

Example

curl \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/maintenance-windows"
post/orgs/{organization}/maintenance-windowswriteCreate a maintenance window

One-off (starts_at, ends_at) or weekly (weekdays, time_from, time_to in timezone). With domain_id it applies to one domain, with customer_id to all domains of the customer, with neither to the whole organization. No incidents or notifications are raised while it is active.

Parameters

NameInTypeDescription
organizationpathstringOrganization slug as shown in the dashboard URL and under Settings → API. A token only reaches its own organization; others respond with 404.

Request body (JSON)

FieldTypeDescription
name*stringName
kind*string (once, weekly)One-off or weekly
customer_idstring | null (uuid)Customer whose domains are affected
domain_idstring | null (uuid)Single domain (resets customer_id)
starts_atstring | null (date-time)Start, one-off (required for once)
ends_atstring | null (date-time)End, one-off, after the start (required for once)
weekdaysarray | nullWeekdays 1 (Monday) to 7 (Sunday) (required for weekly)
time_fromstring | nullStart HH:MM (required for weekly)
time_tostring | nullEnd HH:MM, different from the start; before the start the window spans midnight (required for weekly)
timezonestringTime zone for weekdays and times
is_enabledbooleanEnabled

Response

201 · { data: MaintenanceWindow }

Example

curl -X POST \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"name":"Nächtliches Deploy","kind":"weekly","customer_id":"3f9c1a52-6a2e-4c0e-9d4b-1c9a1a0e5b77","weekdays":[2,4],"time_from":"02:00","time_to":"03:00","timezone":"Europe/Berlin"}' \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/maintenance-windows"
patch/orgs/{organization}/maintenance-windows/{window}writeUpdate a maintenance window

Same fields as on create, all optional; only fields that are sent change. The rules per kind apply to the state after the change.

Parameters

NameInTypeDescription
organizationpathstringOrganization slug as shown in the dashboard URL and under Settings → API. A token only reaches its own organization; others respond with 404.
windowpathstring (uuid)Maintenance window ID

Request body (JSON)

FieldTypeDescription
namestringName
kindstring (once, weekly)One-off or weekly
customer_idstring | null (uuid)Customer or null
domain_idstring | null (uuid)Domain or null
starts_atstring | null (date-time)Start, one-off
ends_atstring | null (date-time)End, one-off
weekdaysarray | nullWeekdays 1 to 7
time_fromstring | nullStart HH:MM
time_tostring | nullEnd HH:MM
timezonestringTime zone
is_enabledbooleanEnabled

Response

200 · { data: MaintenanceWindow }

Example

curl -X PATCH \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"is_enabled":false}' \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/maintenance-windows/<window-id>"
delete/orgs/{organization}/maintenance-windows/{window}writeDelete a maintenance window

Parameters

NameInTypeDescription
organizationpathstringOrganization slug as shown in the dashboard URL and under Settings → API. A token only reaches its own organization; others respond with 404.
windowpathstring (uuid)Maintenance window ID

Response

204

Example

curl -X DELETE \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/maintenance-windows/<window-id>"
get/orgs/{organization}/monitors/{monitor}/resultsreadCheck results

Single checks of a monitor, newest first, cursor-paginated. The cursor of the next page is in links.next.

Parameters

NameInTypeDescription
organizationpathstringOrganization slug as shown in the dashboard URL and under Settings → API. A token only reaches its own organization; others respond with 404.
monitorpathstring (uuid)Monitor ID
fromquerystring (date-time)Only checks from this time on
toquerystring (date-time)Only checks up to this time
per_pagequeryinteger · default 100Items per page (1 to 500)
cursorquerystringCursor of the next page, taken from meta.next_cursor of the previous response

Response

200

Example

curl \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/monitors/<monitor-id>/results"
get/orgs/{organization}/monitors/{monitor}/uptimereadAvailability and response time

Availability, response times (median, 95th percentile) and downtime per range, plus data points for charts.

Parameters

NameInTypeDescription
organizationpathstringOrganization slug as shown in the dashboard URL and under Settings → API. A token only reaches its own organization; others respond with 404.
monitorpathstring (uuid)Monitor ID
rangequerystring (24h, 7d, 30d, 90d) · default 24hRange

Response

200 · { data: Uptime }

Example

curl \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/monitors/<monitor-id>/uptime"

DNS

get/orgs/{organization}/domains/{domain}/fixesreadMissing records

Suggestions for missing DNS records (DMARC, SPF, TLS-RPT, CAA) derived from the current findings of the domain, with the connected Cloudflare integrations and whether the zone is hosted at Cloudflare.

Parameters

NameInTypeDescription
organizationpathstringOrganization slug as shown in the dashboard URL and under Settings → API. A token only reaches its own organization; others respond with 404.
domainpathstring (uuid)Domain ID

Response

200

Example

curl \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/domains/<domain-id>/fixes"
post/orgs/{organization}/domains/{domain}/fixes/{fix}/applywriteCreate the record at Cloudflare

Creates the suggested record through the given Cloudflare integration. Additive only: existing records are never changed; if a matching record already exists or the zone is not (or no longer) hosted at Cloudflare, the server responds with 422. The monitor is re-checked afterwards.

Limit: 20 per minute

Parameters

NameInTypeDescription
organizationpathstringOrganization slug as shown in the dashboard URL and under Settings → API. A token only reaches its own organization; others respond with 404.
domainpathstring (uuid)Domain ID
fixpathstringSuggestion key from the list of missing records

Request body (JSON)

FieldTypeDescription
integration_id*string (uuid)Cloudflare integration of the organization
ruastringReport address for dmarc_missing and tls_rpt_missing (required for these suggestions)
sendersstringAdditional SPF mechanisms for spf_missing, comma-separated (include:…, ip4:…, ip6:…, a, mx); empty confirms that no other services send

Response

200 · Record created

Example

curl -X POST \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"integration_id":"3f9c1a52-6a2e-4c0e-9d4b-1c9a1a0e5b77","rua":"dmarc-reports@agentur.de"}' \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/domains/<domain-id>/fixes/<fix-id>/apply"
get/orgs/{organization}/domains/{domain}/dnsreadCurrent DNS records

The latest DNS snapshot of the domain with all records per type; null while none exists yet.

Parameters

NameInTypeDescription
organizationpathstringOrganization slug as shown in the dashboard URL and under Settings → API. A token only reaches its own organization; others respond with 404.
domainpathstring (uuid)Domain ID

Response

200

Example

curl \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/domains/<domain-id>/dns"
get/orgs/{organization}/domains/{domain}/dns/snapshotsreadDNS history

All snapshots of the domain, newest first, without records (use the diff for those). Each snapshot stands for a period with unchanged configuration.

Parameters

NameInTypeDescription
organizationpathstringOrganization slug as shown in the dashboard URL and under Settings → API. A token only reaches its own organization; others respond with 404.
domainpathstring (uuid)Domain ID
limitqueryinteger · default 50Maximum number

Response

200

Example

curl \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/domains/<domain-id>/dns/snapshots"
get/orgs/{organization}/domains/{domain}/dns/diffreadCompare two DNS snapshots

Both snapshots with records and the differences between them (added, removed and changed records per type).

Parameters

NameInTypeDescription
organizationpathstringOrganization slug as shown in the dashboard URL and under Settings → API. A token only reaches its own organization; others respond with 404.
domainpathstring (uuid)Domain ID
from*querystring (uuid)ID of the older snapshot
to*querystring (uuid)ID of the newer snapshot

Response

200

Example

curl \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/domains/<domain-id>/dns/diff?from=<from>&to=<to>"

Incidents

get/orgs/{organization}/incidentsreadList incidents

By default only open and acknowledged incidents, open and critical first; cursor-paginated.

Parameters

NameInTypeDescription
organizationpathstringOrganization slug as shown in the dashboard URL and under Settings → API. A token only reaches its own organization; others respond with 404.
statusquerystring · default openopen (open and acknowledged), all or statuses comma-separated: open, acknowledged, resolved
severityquerystringSeverities, comma-separated: info, warning, critical
domainquerystring (uuid)Only incidents of this domain
customerquerystring (uuid)Only domains of this customer
per_pagequeryinteger · default 50Items per page (1 to 200)
cursorquerystringCursor of the next page, taken from meta.next_cursor of the previous response

Response

200 · { data: Incident[], links, meta }

Example

curl \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/incidents"
get/orgs/{organization}/incidents/{incident}readGet an incident

A single incident with domain, monitor, cause and the name of the person who acknowledged it.

Parameters

NameInTypeDescription
organizationpathstringOrganization slug as shown in the dashboard URL and under Settings → API. A token only reaches its own organization; others respond with 404.
incidentpathstring (uuid)Incident ID

Response

200 · { data: Incident }

Example

curl \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/incidents/<incident-id>"
post/orgs/{organization}/incidents/{incident}/acknowledgewriteAcknowledge an incident

Marks the incident as seen; reminders stop, the recovery notice is still sent.

Parameters

NameInTypeDescription
organizationpathstringOrganization slug as shown in the dashboard URL and under Settings → API. A token only reaches its own organization; others respond with 404.
incidentpathstring (uuid)Incident ID

Response

200 · { data: Incident }

Example

curl -X POST \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/incidents/<incident-id>/acknowledge"

Events

get/orgs/{organization}/eventsreadList events

Detected changes and incident transitions of all domains, newest first, cursor-paginated. Suitable for your own reports or a change log.

Parameters

NameInTypeDescription
organizationpathstringOrganization slug as shown in the dashboard URL and under Settings → API. A token only reaches its own organization; others respond with 404.
severityquerystringSeverities, comma-separated: info, warning, critical
typequerystringEvent types, comma-separated
domainquerystring (uuid)Only events of this domain
customerquerystring (uuid)Only domains of this customer
fromquerystring (date-time)Only events from this time on
toquerystring (date-time)Only events up to this time
per_pagequeryinteger · default 50Items per page (1 to 200)
cursorquerystringCursor of the next page, taken from meta.next_cursor of the previous response

Response

200 · { data: Event[], links, meta }

Example

curl \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/events"
get/orgs/{organization}/domains/{domain}/timelinereadTimeline of a domain

Events of a single domain, newest first; same filters as for all events.

Parameters

NameInTypeDescription
organizationpathstringOrganization slug as shown in the dashboard URL and under Settings → API. A token only reaches its own organization; others respond with 404.
domainpathstring (uuid)Domain ID
severityquerystringSeverities, comma-separated: info, warning, critical
typequerystringEvent types, comma-separated
fromquerystring (date-time)From time
toquerystring (date-time)Up to time
per_pagequeryinteger · default 100Items per page (1 to 200)
cursorquerystringCursor of the next page, taken from meta.next_cursor of the previous response

Response

200 · { data: Event[], links, meta }

Example

curl \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/domains/<domain-id>/timeline"

Customers

get/orgs/{organization}/customersreadList customers

Customers of the organization with their number of domains, alphabetical; archived ones only on request.

Parameters

NameInTypeDescription
organizationpathstringOrganization slug as shown in the dashboard URL and under Settings → API. A token only reaches its own organization; others respond with 404.
searchquerystringPart of name or reference
archivedquerybooleantrue returns only archived, false only active (default)
pagequeryinteger · default 1Page number
per_pagequeryinteger · default 100Items per page (1 to 200)

Response

200 · { data: Customer[], links, meta }

Example

curl \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/customers"
post/orgs/{organization}/customerswriteCreate a customer

Parameters

NameInTypeDescription
organizationpathstringOrganization slug as shown in the dashboard URL and under Settings → API. A token only reaches its own organization; others respond with 404.

Request body (JSON)

FieldTypeDescription
name*stringName, unique per organization
referencestring | nullYour own reference
notesstring | nullNotes
contact_emailstring | null (email)Contact address for reports
monthly_reportbooleanSend the monthly report
report_localestring | null (de, en)Report language

Response

201 · { data: Customer }

Example

curl -X POST \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"name":"Musterfirma GmbH","reference":"K-1042","contact_email":"it@musterfirma.de","monthly_report":true,"report_locale":"de"}' \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/customers"
get/orgs/{organization}/customers/{customer}readGet a customer

Parameters

NameInTypeDescription
organizationpathstringOrganization slug as shown in the dashboard URL and under Settings → API. A token only reaches its own organization; others respond with 404.
customerpathstring (uuid)Customer ID

Response

200 · { data: Customer }

Example

curl \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/customers/<customer-id>"
get/orgs/{organization}/customers/{customer}/reportreadGet the monthly report

The customer's monthly report as data: summary, per domain availability, downtime, incidents and certificate, plus incidents, changes and upcoming expiries. Without month the previous month, language via locale.

Parameters

NameInTypeDescription
organizationpathstringOrganization slug as shown in the dashboard URL and under Settings → API. A token only reaches its own organization; others respond with 404.
customerpathstring (uuid)Customer ID
monthquerystringReport month as YYYY-MM; defaults to the previous month
localequerystring (de, en)Report language (texts, date formats); without it the customer's report language, else the organization's. Accept-Language does not apply here.

Response

200 · { data: CustomerReport }

Example

curl \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/customers/<customer-id>/report"
get/orgs/{organization}/customers/{customer}/report/pdfreadMonthly report as PDF

The same report as PDF; download=1 returns it as an attachment instead of inline.

Parameters

NameInTypeDescription
organizationpathstringOrganization slug as shown in the dashboard URL and under Settings → API. A token only reaches its own organization; others respond with 404.
customerpathstring (uuid)Customer ID
monthquerystringReport month as YYYY-MM; defaults to the previous month
localequerystring (de, en)Report language (texts, date formats); without it the customer's report language, else the organization's. Accept-Language does not apply here.
downloadqueryboolean · default falseAs download (Content-Disposition attachment)

Response

200 · { data: pdf } · PDF file

Example

curl \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/customers/<customer-id>/report/pdf"
post/orgs/{organization}/customers/{customer}/report/sharewriteShare the report

Creates a signed link to the PDF, valid for 60 days, retrievable without login – to pass on to the customer.

Parameters

NameInTypeDescription
organizationpathstringOrganization slug as shown in the dashboard URL and under Settings → API. A token only reaches its own organization; others respond with 404.
customerpathstring (uuid)Customer ID
monthquerystringReport month as YYYY-MM; defaults to the previous month
localequerystring (de, en)Report language (texts, date formats); without it the customer's report language, else the organization's. Accept-Language does not apply here.

Response

200

Example

curl -X POST \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/customers/<customer-id>/report/share"
patch/orgs/{organization}/customers/{customer}writeUpdate a customer

Same fields as on create, plus is_archived. name must always be sent.

Parameters

NameInTypeDescription
organizationpathstringOrganization slug as shown in the dashboard URL and under Settings → API. A token only reaches its own organization; others respond with 404.
customerpathstring (uuid)Customer ID

Request body (JSON)

FieldTypeDescription
name*stringName
referencestring | nullYour own reference
notesstring | nullNotes
contact_emailstring | null (email)Contact address
is_archivedbooleanArchive or restore
monthly_reportbooleanSend the monthly report
report_localestring | null (de, en)Report language

Response

200 · { data: Customer }

Example

curl -X PATCH \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"name":"Musterfirma GmbH","is_archived":true}' \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/customers/<customer-id>"
delete/orgs/{organization}/customers/{customer}writeDelete a customer

Removes the customer; their domains remain and only lose the assignment.

Parameters

NameInTypeDescription
organizationpathstringOrganization slug as shown in the dashboard URL and under Settings → API. A token only reaches its own organization; others respond with 404.
customerpathstring (uuid)Customer ID

Response

204

Example

curl -X DELETE \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/customers/<customer-id>"
post/orgs/{organization}/customers/{customer}/status-pagewriteEnable the status page

Creates the token of the customer's public status page (reachable without login); an existing one is replaced and the old address stops working. The address is in status_page_url. For archived customers the server answers 422.

Parameters

NameInTypeDescription
organizationpathstringOrganization slug as shown in the dashboard URL and under Settings → API. A token only reaches its own organization; others respond with 404.
customerpathstring (uuid)Customer ID

Response

200 · { data: Customer } · Enabled, address in `status_page_url`

Example

curl -X POST \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/customers/<customer-id>/status-page"
delete/orgs/{organization}/customers/{customer}/status-pagewriteDisable the status page

Deletes the token; the address answers 404 afterwards. Returns the customer (status_page_url is null).

Parameters

NameInTypeDescription
organizationpathstringOrganization slug as shown in the dashboard URL and under Settings → API. A token only reaches its own organization; others respond with 404.
customerpathstring (uuid)Customer ID

Response

200 · { data: Customer } · Disabled

Example

curl -X DELETE \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/customers/<customer-id>/status-page"

Frequently asked questions

Are there webhooks?
Not as part of the API, but as a notification channel: under Notifications in the dashboard you set up a webhook that sends every incident and every change as JSON to your URL; besides that there are e-mail, Slack, Microsoft Teams, Discord, Telegram, Mattermost, PagerDuty, Opsgenie, ntfy, SMS and an Atom feed. Channels can only be managed with a session, not with a token.
Can one token query several organizations?
No, a token belongs to exactly one organization. For several organizations, create one token per organization.
Is the API included in the Free plan?
Yes, the API is available in every plan, with the same domain limits as the dashboard.
How do I learn about API changes?
New fields and endpoints are added without a version change; existing fields are neither removed nor reinterpreted. Should a breaking change become necessary, it gets a new prefix (/api/v2) and v1 stays available in parallel for a transition period. The OpenAPI specification carries the current version in `info.version`.
Where do I see when a token was last used?
In the dashboard under Settings → API each token shows its last use. Revoke tokens you no longer use.

Ready for the first request?

Sign up, add domains, create a token under Settings → API and send the first query from your script within minutes. The API is included in every plan.