Documentation · 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
On this page

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.
HTTP
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.
JSON
{
  "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.

HTTP
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:

Shell
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:

Shell
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"

Code examples for curl, PHP, Python, JavaScript, Go and PowerShell

Pick a language or tool and a use case; replace <TOKEN> with your token. Use cases with write access are marked and need a token with write scope.

GET /domainsA read token is enough
curl
curl "https://api.domainwarn.com/api/v1/orgs/my-agency/domains?status=critical,warning&sort=health_status" \
  -H "Authorization: Bearer <TOKEN>" \
  -H "Accept: application/json"

“my-agency” stands for the slug of your organization; under Settings → API in the dashboard the examples show your own address.

Asking in your editor (MCP)

DomainWarn is an MCP server itself: POST /mcp speaks the Model Context Protocol, and editors and assistants connect with one address plus the token – nothing to install. The assistant then answers questions like “Which client domains are critical right now?” or “Check example.com” with your real data.

Nine tools in three tiers: without a token the free checks run (check_domain, run_check), with a token list_domains, get_domain, list_incidents and get_dns_history come along, and a token with write scope unlocks add_domain, check_now and acknowledge_incident. With a read token the writing tools never even appear.

Run in the terminal; with --scope user DomainWarn is available in every project.

Claude Code
claude mcp add --transport http domainwarn https://api.domainwarn.com/api/v1/mcp \
  --header "Authorization: Bearer <TOKEN>"

Connecting monitoring systems

Prometheus, Grafana Alloy, VictoriaMetrics, Telegraf and Datadog read the metrics of all domains in Prometheus format at /orgs/{organization}/metrics; Checkmk, Nagios/Icinga, Uptime Kuma and PRTG query the JSON overview /orgs/{organization}/dashboard and alert as soon as a domain is critical. Pick your system and copy the ready-made configuration:

Scrape job for prometheus.yml; afterwards all metrics are available to Grafana and Alertmanager. (Uses the Prometheus metrics)

prometheus.yml
scrape_configs:
  - job_name: domainwarn
    scheme: https
    metrics_path: /api/v1/orgs/my-agency/metrics
    scrape_interval: 60s
    static_configs: [{ targets: ['api.domainwarn.com'] }]
    authorization: { credentials: '<TOKEN>' }

“my-agency” stands for the slug of your organization; under Settings → API in the dashboard the examples show your own address.

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

Shell
curl \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  "https://api.domainwarn.com/api/v1/organizations"
get/orgs/{organization}/mail-deliveriesreadEmail deliveries per recipient

Every email of the organization (alerts, reports, invitations, status page mails) per recipient, newest first, cursor-paginated, kept for 90 days. meta.unreachable lists addresses that receive no more mail after three bounces within 30 days or a complaint; meta.stats counts the statuses in the period and gives the delivery rate (rate). Not available to customer accounts.

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 (sent, failed, bounced, complained, suppressed)Only entries with this status
daysqueryinteger · default 30Period in days
cursorquerystringCursor of the next page, taken from meta.next_cursor of the previous response

Response

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

Example

Shell
curl \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/mail-deliveries"
post/orgs/{organization}/mail-deliveries/reactivatewriteReactivate an unreachable address

Lifts the block on an address marked unreachable; earlier bounces no longer count. Recorded in the audit log. 404 if the address is not blocked. Requires the permission to manage settings.

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
emailstring (email)The address (or recipient_hash)
recipient_hashstringIdentifier from the delivery log (or email)

Response

200

Example

Shell
curl -X POST \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"email":"bereitschaft@agentur.de"}' \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/mail-deliveries/reactivate"

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

Shell
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

Shell
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

Shell
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

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

What expires in the coming days, by date: domain registration (RDAP), certificate (TLS check), contract end and last day to cancel (contract end minus notice period) from the contract data, each row with customer, responsible member and cost. Overdue rows stay visible with negative days left. meta.totals sums the annual cost per customer and currency over the domains in the list. A customer login sees only domain and certificate expiries of its domains.

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.
daysqueryinteger · default 90Horizon in calendar days from today
customerquerystring (uuid)Only domains of this customer
kindquerystringKinds, comma-separated: domain, certificate, contract_end, notice_deadline
action_requiredquerybooleanOnly rows that need action

Response

200

Example

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

The same list as when listing, as a CSV file (UTF-8 with BOM, Content-Disposition: attachment). Columns: date, days_left, kind, domain, customer, target, provider, auto_renews, responsible, annual_cost, currency, cost_reference, action_required, dashboard_url.

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.
daysqueryinteger · default 90Horizon in calendar days from today
customerquerystring (uuid)Only domains of this customer
kindquerystringKinds, comma-separated: domain, certificate, contract_end, notice_deadline
action_requiredquerybooleanOnly rows that need action
delimiterquerystring (comma, semicolon)Delimiter; without it semicolon for language de (Excel), comma otherwise

Response

200 · { data: csv } · CSV file

Example

Shell
curl \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/expirations/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

Shell
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

Shell
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

Shell
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/bulk-actionswriteBulk action on domains

One action on up to 500 domains of the organization: pause (optional until), resume, assign_customer (customer_id or null), set_areas (groups as in PATCH /domains/{domain}/monitoring), set_interval (type and interval_seconds, not below the plan's minimum), check_now (at most 50 domains, counts against the same limits as “check now”; domains without remaining quota are skipped) and delete (only with confirm: true, frees plan slots). Up to 100 domains the server answers 200 with the result per domain, above that 202 with the bulk action in status queued; GET /domains/bulk-actions/{operation} reports the progress. IDs of other organizations or unknown IDs appear as skipped (not_found) without a name. The audit log receives one summary entry.

Limit: 10 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
action*string (pause, resume, assign_customer, set_areas, set_interval, check_now, delete)Action
ids*arrayDomain IDs (at most 50 for check_now)
untilstring | null (date-time)pause: until this time, indefinitely without it
customer_idstring | null (uuid)assign_customer: a client of the organization or null (remove the assignment); required for this action
groupsobjectset_areas: areas on or off
typestringset_interval: check type (all except heartbeat)
interval_secondsintegerset_interval: interval in seconds
confirmbooleandelete: must be true

Response

200 · { data: DomainBulkOperation } · Result per domain (status done); for more than 100 domains 202 with status queued

Example

Shell
curl -X POST \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"action":"set_areas","ids":["9a1c6d2e-4b7f-4e1a-9c3d-2f5e8a7b6c10","9a1c6d2e-4b7f-4e1a-9c3d-2f5e8a7b6c11"],"groups":{"mail":false}}' \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/domains/bulk-actions"
get/orgs/{organization}/domains/bulk-actions/{operation}readGet bulk action progress

State of a background bulk action: counters and the result per domain so far. Poll every few seconds until status is done or failed. Agency-internal: customer accounts cannot see bulk actions.

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.
operationpathstring (uuid)Bulk action ID from the start response

Response

200 · { data: DomainBulkOperation }

Example

Shell
curl \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/domains/bulk-actions/<operation-id>"
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

Shell
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

Shell
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

Shell
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

Shell
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

Shell
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

Shell
curl -X DELETE \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/domains/<domain-id>"
get/orgs/{organization}/domains/{domain}/contractreadGet contract and costs

Contract and cost data of the domain: registrar, hosting provider, contract end, notice period, automatic renewal, annual cost, cost centre, responsible member, note. Without a stored contract the fields come back empty with exists: false and the registrar detected by the domain check as a suggestion. Agency-internal: customer logins cannot reach this route.

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: DomainContract }

Example

Shell
curl \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/domains/<domain-id>/contract"
put/orgs/{organization}/domains/{domain}/contractwriteSet contract and costs

Replaces the whole contract: omitted fields become empty, a call without fields deletes the contract. The last day to cancel is contract end minus notice period; 30 and 7 days before it (and, without automatic renewal, before the contract end) DomainWarn reminds you via the organization's notification rules, and both dates appear in the calendar subscription.

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
registrarstring | nullRegistrar (free text)
hosting_providerstring | nullHosting provider
ends_atstring | null (date)Contract end as YYYY-MM-DD
notice_period_daysinteger | nullNotice period in days
auto_renewsbooleanRenews automatically
annual_costnumber | nullAnnual cost
currencystringCurrency (ISO 4217)
cost_referencestring | nullCost centre or reference
responsible_user_idstring | null (uuid)Member of the organization (not a customer login)
notesstring | nullNote

Response

200 · { data: DomainContract }

Example

Shell
curl -X PUT \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"registrar":"IONOS SE","hosting_provider":"Hetzner","ends_at":"2026-12-31","notice_period_days":90,"auto_renews":false,"annual_cost":119.5,"currency":"EUR","cost_reference":"KST-4711","responsible_user_id":"3f9c1a52-6a2e-4c0e-9d4b-1c9a1a0e5b77"}' \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/domains/<domain-id>/contract"
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

Shell
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"
post/orgs/{organization}/domains/{domain}/movewriteMove a domain to another organisation

Moves the domain with its monitors, results, history, incidents and certificates to another organisation in which the caller has write access. Customer assignment, domain-specific rules and maintenance windows stay behind; the target plan and intervals apply afterwards (above the limit the domain is paused there). 409 domain-exists if the target already monitors the domain.

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
organization*stringSlug of the target organisation

Response

200

Example

Shell
curl -X POST \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"organization":"zweite-agentur"}' \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/domains/<domain-id>/move"
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, autodiscover) 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

Shell
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

Shell
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

Shell
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"
get/orgs/{organization}/domains/{domain}/site-insightsreadInside view of the site

What an extension inside the system reports (Shopware, WordPress): exact version, PHP, installed extensions with available updates, mail setup, maintenance mode – plus the assessment. None of this is visible from the outside. null while nothing has been reported.

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

Shell
curl \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/domains/<domain-id>/site-insights"
get/orgs/{organization}/plugin-installationsreadExtensions and their reporting state

All installations of the WordPress plugin and the Shopware extension across the organization's domains: platform and version, extension version, last report and its state (current up to two hours, late up to a day, stale older) and the heartbeat the extension set up for its scheduled run. An installation reporting to two domains appears twice.

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

Shell
curl \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/plugin-installations"
post/orgs/{organization}/domains/{domain}/site-insightswriteReport the inside view

The extension reports facts only; the assessment happens in DomainWarn so that it can change without anyone updating the site. The latest report per domain is kept.

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
platform*string (shopware, wordpress)System
platform_versionstring | nullVersion of the system
php_versionstring | nullPHP version
maintenancebooleanMaintenance mode active
extensionsarrayInstalled extensions; latest_version is the version the system knows as an update
mailerobjectMail setup of the site
channelsarraySales channels (Shopware) or sites of a network (WordPress)
agentstring | nullReporting extension
agent_versionstring | nullVersion of the extension

Response

200

Example

Shell
curl -X POST \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"platform":"shopware","platform_version":"6.7.3.1","php_version":"8.3.26","maintenance":false,"extensions":[{"name":"SwagPayPal","version":"9.0.0","latest_version":"9.1.0","active":true}],"mailer":{"transport":"smtp","host":"smtp.hoster.de","sender":"shop@kunde.de"},"agent":"shopware","agent_version":"1.2.0"}' \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/domains/<domain-id>/site-insights"
get/orgs/{organization}/domains/{domain}/mta-stsreadMTA-STS policy of the domain

Setting plus the two records the client has to create (CNAME to the website, TXT with the id). If DomainWarn serves the policy, its text is included.

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

Shell
curl \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/domains/<domain-id>/mta-sts"
patch/orgs/{organization}/domains/{domain}/mta-stswriteHost MTA-STS with DomainWarn

The policy file has to live at https://mta-sts.<domain>/.well-known/mta-sts.txt with a valid certificate; DomainWarn serves it. Every change issues a new id – the TXT record has to follow (through an integration with a click or automatically, see hosting-dns). Without known MX hosts nothing is served on purpose.

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
hosted*booleanLet DomainWarn serve the policy
modestring (testing, enforce)testing only reports failures, enforce makes sending servers abort
max_ageintegerLifetime in seconds
mxarrayMX hosts for the policy; empty = the resolved MX records of the domain

Response

200

Example

Shell
curl -X PATCH \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"hosted":true,"mode":"enforce","max_age":604800}' \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/domains/<domain-id>/mta-sts"
get/orgs/{organization}/domains/{domain}/bimireadBIMI logo of the domain

Whether DomainWarn serves a BIMI logo for the domain, at which URL, and the TXT record default._bimi.<domain> the client has to create.

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

Shell
curl \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/domains/<domain-id>/bimi"
post/orgs/{organization}/domains/{domain}/bimi/previewwriteConvert the BIMI logo (preview)

Converts an SVG to SVG Tiny PS without storing anything: profile, title element (client name, otherwise the domain), square viewBox, CSS as attributes, no scripts, animations, editor data or external references. The response holds the result (svg, preview as data URL, size) and changes: per change code, params, message in the language of the request and severity (warning if the look may change). Sending the same SVG to updateBimi stores exactly this result. Raster images cannot be converted: 422. At most 30 conversions per minute and organization, preview and upload combined (429).

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
svg*stringThe logo as SVG text, up to 512 KB

Response

200

Example

Shell
curl -X POST \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"svg":"<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"200\" height=\"100\"><circle cx=\"100\" cy=\"50\" r=\"40\" fill=\"#0a7\"/></svg>"}' \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/domains/<domain-id>/bimi/preview"
post/orgs/{organization}/domains/{domain}/bimiwriteHost the BIMI logo with DomainWarn

Uploads or replaces the logo. DomainWarn converts it to SVG Tiny PS (like previewBimi) and stores the result; changes in the response lists what was changed. A logo that already is Tiny PS stays unchanged. Anything that cannot be converted (raster images, entities, not an SVG, over 512 KB or over 32 KB after conversion) is rejected with 422 and every reason. On replacement the URL keeps its token, only the version in the file name changes.

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
svg*stringThe logo as SVG text, up to 512 KB

Response

200

Example

Shell
curl -X POST \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"svg":"<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.2\" baseProfile=\"tiny-ps\" viewBox=\"0 0 100 100\"><title>Kunde GmbH</title><circle cx=\"50\" cy=\"50\" r=\"40\" fill=\"#0a7\"/></svg>"}' \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/domains/<domain-id>/bimi"
delete/orgs/{organization}/domains/{domain}/bimiwriteRemove the BIMI logo

The logo URL answers with 404 from now on. A later upload gets a new URL.

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

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

Score (0–100) and key metrics per weekly measurement for mobile and desktop (points, both strategies of one run share the timestamp t), plus the latest and the previous measurement per strategy (latest, previous) for the trend. Metrics: lab lcp_ms, fcp_ms, tbt_ms, cls, speed_index_ms, and field with real-user overall, lcp_ms, inp_ms and cls (Chrome UX Report) or null. The strategy monitor.rated_strategy (default mobile) is the one rated. Without a PageSpeed monitor monitor is null and the history is empty.

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
monthsqueryintegerPeriod in months (default 12; the history is kept for 13 months)
monitorquerystring (uuid)A specific PageSpeed monitor of the domain (default: the first enabled one)

Response

200

Example

Shell
curl \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/domains/<domain-id>/pagespeed"
get/orgs/{organization}/domains/{domain}/security-txtreadsecurity.txt of the domain

Whether DomainWarn serves a security.txt (RFC 9116) for the domain, the stored details, the generated file (content) and the URL (url) the client redirects /.well-known/security.txt to.

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

Shell
curl \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/domains/<domain-id>/security-txt"
patch/orgs/{organization}/domains/{domain}/security-txtwriteHost the security.txt with DomainWarn

Stores the details and switches serving on or off. Only fields sent change, null clears an optional field. DomainWarn generates Canonical (the URL on the client domain) and Expires (start of day plus 180 days, fresh on every request). Values with line breaks or control characters are rejected with 422. The URL keeps its token across all changes, including switching off and on.

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
enabled*booleanServe the file
contactsarray1 to 10 contacts: mailto:, tel: (without spaces) or https://; required on the first save
encryptionstring | nullHTTPS URL of the OpenPGP key
policystring | nullHTTPS URL of the disclosure policy
acknowledgmentsstring | nullHTTPS URL of the acknowledgments page
hiringstring | nullHTTPS URL of security job openings
preferred_languagesarray | nullLanguage tags (RFC 5646), at most 10

Response

200

Example

Shell
curl -X PATCH \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"enabled":true,"contacts":["mailto:security@kunde.de","https://kunde.de/sicherheit"],"policy":"https://kunde.de/disclosure","preferred_languages":["de","en"]}' \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/domains/<domain-id>/security-txt"
get/orgs/{organization}/domains/{domain}/hosted-spfreadSPF flattening of the domain

Status of hosted SPF flattening: the source (source_record), the resolved networks (networks), the TXT records at _spf.<domain> (split into _spf1, _spf2 … for long results, records), the SPF record the client sets at the domain (pointer), DNS lookups before and after, notices, the error of the last resolution and the history of changes. published and pointer_active come fresh from the DNS. Switched off (enabled: false) a preview from the domain's SPF record; error then says why it cannot be flattened (macros, exists, ptr, loops, limits). Not for client accounts.

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

Shell
curl \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/domains/<domain-id>/hosted-spf"
put/orgs/{organization}/domains/{domain}/hosted-spfwriteSwitch on SPF flattening

Switches flattening on or changes the source. Without source DomainWarn takes the domain's SPF record (if it already includes _spf.<domain>, the previous source). If it cannot be flattened: 422 with the explanation. applyHostingDns with the feature spf creates the records at the DNS provider: the parts first, the pointer at the domain last – DomainWarn only replaces the client's SPF record with replace: true. From Freelancer on (plan feature hosted_spf, otherwise 402).

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

Request body (JSON)

FieldTypeDescription
sourcestring | nullSPF record DomainWarn flattens (starts with v=spf1); without it the domain's record

Response

200

Example

Shell
curl -X PUT \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"source":"v=spf1 include:_spf.google.com include:spf.protection.outlook.com include:servers.mcsv.net -all"}' \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/domains/<domain-id>/hosted-spf"
delete/orgs/{organization}/domains/{domain}/hosted-spfwriteSwitch off SPF flattening

DomainWarn stops updating the records. As long as the domain's SPF record still includes _spf.<domain>: 422 – put the original record back first, otherwise the networks would stay frozen. The records at _spf.<domain> stay in place.

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 · Switched off

Example

Shell
curl -X DELETE \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/domains/<domain-id>/hosted-spf"
post/orgs/{organization}/domains/{domain}/hosted-spf/syncwriteResolve SPF flattening now

Resolves immediately (otherwise daily and after every SPF check). meta.result: changed (new networks – with automatic updates DomainWarn rewrites the records, otherwise there is the warning "Flattened SPF record outdated"), unchanged or failed (reason in data.error, the published networks stay). 422 if flattening is off.

Limit: 6 per 10 minutes and domain

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

Shell
curl -X POST \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/domains/<domain-id>/hosted-spf/sync"
get/orgs/{organization}/domains/{domain}/hostingreadHosted features at a glance

Status of security.txt, MTA-STS and BIMI in one response, meant for extensions on the website (WordPress, Shopware): per feature enabled, state (as in the dashboard: off, pending, active, missing, outdated, elsewhere, unreachable, noMx), the dashboard page (dashboard_url), for security.txt the redirect target (url, only while it is served) and the host names that should redirect (hosts), for MTA-STS and BIMI the records to copy (records). Not for client accounts.

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

Shell
curl \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/domains/<domain-id>/hosting"
get/orgs/{organization}/domains/{domain}/mail-reportsreadDMARC and TLS-RPT reports

Figures from the received reports: messages, aligned, sources per IP with DKIM and SPF result, TLS sessions and failures. The report address of the domain is part of the response.

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
daysqueryinteger · default 30Period in days (1 to 90, default 30)

Response

200

Example

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

For domains without a mailbox: a DMARC aggregate report (XML, gzip, ZIP or the whole mail) or a TLS-RPT report (JSON). Duplicates are detected.

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
contentstringReport as text (XML, JSON or mail)
content_base64stringReport as base64 (gzip, ZIP)
filenamestringFile name, helps with classification

Response

200

Example

Shell
curl -X POST \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"content":"<?xml version=\"1.0\"?><feedback>…</feedback>","filename":"google.com!kunde.de!1!2.xml"}' \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/domains/<domain-id>/mail-reports"
get/orgs/{organization}/domains/{domain}/dmarc-assistantreadDMARC assistant

Analyses the DMARC reports in the window (messages, rate of legitimate messages, sources per IP classified as aligned, partial, unaligned or unauthenticated, days with data) and recommends the next step from p=none via quarantine to reject (with a pct ramp 25/50/100 if the record uses pct; a weaker sp moves along). recommendation.status: not_checked, no_record, invalid_record, no_reports, collecting, blocked, ready or done; checks lists every requirement (days with reports since the current policy, minimum number of messages, 98 % passing, no significant legitimate-looking sender failing). proposed is the record after the step, all other tags stay. meta with integrations only for the agency team.

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
daysqueryintegerWindow in days (default 30)

Response

200

Example

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

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

Shell
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

Shell
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

Shell
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

Shell
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, cms, privacy, pagespeed, heartbeat, security_txt, ports, lookalike, crawl, journey)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

Shell
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

Shell
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

Shell
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}/domains/{domain}/journeysreadJourneys of a domain

Journeys (transaction checks) of the domain: a real browser loads the start address and performs the steps (add product to cart, go to checkout, log in). Every 15 minutes; a failure is confirmed by a second run before the incident journey_failed opens. From the Agency plan (one per domain, Agency Pro three).

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

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

Name, start address (must belong to the domain) and steps. Values of fill steps are stored encrypted and never returned. Without the plan feature journeys the API answers 402, above the per-domain limit 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.
domainpathstring (uuid)Domain ID

Request body (JSON)

FieldTypeDescription
name*stringName, unique per domain
start_url*stringStart address; https:// is added when the scheme is missing
steps*arraySteps in order (1 to 30)
slow_msintegerThreshold for "slow" in ms (default 20000)
interval_secondsintegerCheck interval in seconds (capped by the plan)

Response

201 · { data: Journey }

Example

Shell
curl -X POST \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"name":"Warenkorb bis Kasse","start_url":"https://shop.kunde.de/","steps":[{"type":"click","selector":".product-box a.product-name"},{"type":"click","selector":".btn-buy"},{"type":"expect_text","text":"Warenkorb"},{"type":"goto","url":"/checkout/cart"},{"type":"expect_url","contains":"/checkout"}]}' \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/domains/<domain-id>/journeys"
post/orgs/{organization}/domains/{domain}/journeys/testwriteTest a journey

Runs start address and steps in the browser right away without saving anything (budget 60 s) and returns the outcome per step; with journey, a fill step with keep_value uses the stored value of that journey. At most 20 test runs per domain and 60 per organization per hour (429).

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
start_url*stringStart address
steps*arraySteps
journeystring (uuid)Stored journey whose fill values apply for keep_value
slow_msintegerThreshold for "slow" in ms

Response

200

Example

Shell
curl -X POST \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"start_url":"https://shop.kunde.de/","steps":[{"type":"click","text":"In den Warenkorb"},{"type":"expect_text","text":"Warenkorb"}]}' \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/domains/<domain-id>/journeys/test"
get/orgs/{organization}/journeys/{journey}readGet a journey

One journey with its steps (without fill values), the last result per step and the recent runs.

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.
journeypathstring (uuid)Journey ID (also the ID of its monitor of type journey)

Response

200 · { data: Journey }

Example

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

Name, start address, steps, threshold, interval and activation. New steps reset the failure streak; a fill step with keep_value keeps the stored value (same index and selector). A disabled journey 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.
journeypathstring (uuid)Journey ID (also the ID of its monitor of type journey)

Request body (JSON)

FieldTypeDescription
namestringName
start_urlstringStart address
stepsarraySteps
slow_msintegerThreshold for "slow" in ms
interval_secondsintegerCheck interval in seconds
is_enabledbooleanEnabled

Response

200 · { data: Journey }

Example

Shell
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/journeys/<journey-id>"
delete/orgs/{organization}/journeys/{journey}writeDelete a journey

Removes the journey 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.
journeypathstring (uuid)Journey ID (also the ID of its monitor of type journey)

Response

204

Example

Shell
curl -X DELETE \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/journeys/<journey-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

Shell
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

Shell
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

Shell
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

Shell
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; not before from and at most 366 days after it
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

Shell
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

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

Health, availability (24 h), response time, certificate and domain expiry and open incidents of all domains in Prometheus text format (version 0.0.4) for Grafana, Zabbix, Checkmk, PRTG and others. Labels domain, customer, for monitors type and target. 30 requests 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.

Response

200 · { data: prometheus } · Prometheus text format

Example

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

DNS

get/orgs/{organization}/domains/{domain}/fixesreadSuggestions for findings

Suggestions derived from the current findings of the domain – missing DNS records (DMARC, SPF, TLS-RPT, CAA), ~all instead of a permissive SPF ending, the issuing CA for a CAA set that locks it out – with the connected integrations and the DNS provider hosting the zone according to its name servers (dns_provider); only an integration of that provider can create records.

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

Shell
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}/applywriteApply the suggestion at the DNS provider

Creates the suggested record through the given integration (action create). The server changes an existing record only for action update, with replace: true and the value shown in current; if the record at the provider no longer looks like that, it responds with 422. Nothing is ever deleted; if a matching record already exists or the zone is not (or no longer) hosted at the integration's provider, it also responds with 422. Every application is recorded in the audit log, 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)Integration of the organization (Settings → Integrations)
ruastringReport address for dmarc_missing and tls_rpt_missing (required for these suggestions)
sendersstringAdditional SPF mechanisms for spf_missing and spf_all, comma-separated (include:…, ip4:…, ip6:…, a, mx); empty confirms that no other services send
replacebooleanExplicit confirmation to change an existing record (required for action update)
currentstringThe existing value as the suggestion states it (required for action update); if the record differs, DomainWarn changes nothing

Response

200 · Record created

Example

Shell
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}/hosting-dns/{feature}readRecords of a hosted feature at the DNS provider

Compares the records MTA-STS, BIMI, SPF flattening (spf) or the security.txt redirect need with the state at the integration's provider, without changing anything. Per record state: missing (will be created), current, outdated (created by DomainWarn, old value or duplicate – will be updated or cleaned up), conflict (foreign content, e.g. A records next to the CNAME or several policy records – only with replace), blocked (the credentials lack a permission) or manual (provider without redirect rules). deletes lists per record what applying would delete. Queries the provider with the integration's credentials; not available to client accounts.

Limit: 30 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
featurepathstring (mta_sts, bimi, security_txt)Hosted feature: mta_sts (CNAME and TXT), bimi (TXT) or security_txt (redirect, only with providers offering redirect rules such as Cloudflare)
integration_id*querystring (uuid)Integration of the organization whose provider hosts the zone according to its name servers

Response

200

Example

Shell
curl \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/domains/<domain-id>/hosting-dns/<feature-id>?integration_id=<integration_id>"
post/orgs/{organization}/domains/{domain}/hosting-dns/{feature}/applywriteCreate or update the records of a hosted feature

Creates missing records and updates outdated ones created by DomainWarn (new MTA-STS id, new logo URL). DomainWarn cleans up its own duplicate records (listed in deletes of the preview); records with foreign content – including A/AAAA next to the CNAME or several policy records – are only replaced or deleted with replace: true. Deleted records appear in changes with action: deleted; other records under the same name stay untouched. At Cloudflare the MTA-STS CNAME is not proxied ("DNS only"), the security.txt redirect is a rule of its own with the ref domainwarn_security_txt (permission "Zone → Single Redirect → Edit"). 422 if the credentials lack permissions, if a conflict is not confirmed, or if the zone is not (or no longer) hosted at the provider.

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
featurepathstring (mta_sts, bimi, security_txt)Hosted feature: mta_sts (CNAME and TXT), bimi (TXT) or security_txt (redirect, only with providers offering redirect rules such as Cloudflare)

Request body (JSON)

FieldTypeDescription
integration_id*string (uuid)Integration of the organization
replacebooleanReplace records with foreign content (state conflict)

Response

200 · Records written

Example

Shell
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"}' \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/domains/<domain-id>/hosting-dns/<feature-id>/apply"
patch/orgs/{organization}/domains/{domain}/hosting-dns/{feature}/syncwriteKeep the TXT record up to date automatically

mta_sts, bimi and spf only: with an integration, DomainWarn updates the TXT record itself whenever the policy, the logo or the resolved networks change (for SPF flattening only the parts at _spf.<domain>, never the domain's SPF record) (in the background, with retries; a failure creates a change event). Requires a record already created by DomainWarn; if it is missing or foreign, set it up with apply first. null switches it off.

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
featurepathstring (mta_sts, bimi, security_txt)Hosted feature: mta_sts (CNAME and TXT), bimi (TXT) or security_txt (redirect, only with providers offering redirect rules such as Cloudflare)

Request body (JSON)

FieldTypeDescription
integration_id*string | null (uuid)Integration used for writing; null switches off

Response

200

Example

Shell
curl -X PATCH \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"integration_id":"3f9c1a52-6a2e-4c0e-9d4b-1c9a1a0e5b77"}' \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/domains/<domain-id>/hosting-dns/<feature-id>/sync"
get/orgs/{organization}/domains/{domain}/dmarc-assistant/previewreadPreview a DMARC step at the DNS provider

Reads the DMARC record at the integration's provider and shows what applying would turn it into (current, proposed, changes), without changing anything. status ready or blocked with reason: missing, multiple, changed (differs from the last check), not_ready, unauthorized, no_address or up_to_date. Not available to client accounts.

Limit: 30 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
integration_id*querystring (uuid)Integration of the organization whose provider hosts the zone
action*querystring (advance, add_rua)advance: next policy step; add_rua: report address as an additional rua target
daysqueryintegerWindow of the recommendation (default 30)

Response

200

Example

Shell
curl \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/domains/<domain-id>/dmarc-assistant/preview?integration_id=<integration_id>&action=<action>"
post/orgs/{organization}/domains/{domain}/dmarc-assistant/applywriteApply a DMARC step at the DNS provider

Changes exactly the one existing DMARC record the way the preview shows. Requires confirm: true and expected (the content from the preview's current): if the provider holds something else by now, if there is no or more than one DMARC record, or if the step is not recommended, the server responds with 422. Only p, pct and sp (or rua) change; DomainWarn never creates or deletes records.

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

Request body (JSON)

FieldTypeDescription
integration_id*string (uuid)Integration of the organization
action*string (advance, add_rua)As in the preview
expected*stringThe DMARC record as the preview read it
confirm*booleanExplicit confirmation
daysintegerWindow of the recommendation (default 30)

Response

200 · Record changed

Example

Shell
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","action":"advance","expected":"v=DMARC1; p=none; rua=mailto:dmarc@kunde.de","confirm":true}' \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/domains/<domain-id>/dmarc-assistant/apply"
get/orgs/{organization}/domains/{domain}/mail-reports/connect/previewreadPreview the report address at the DNS provider

Reads the DMARC record (_dmarc) and the TLS-RPT record (_smtp._tls) at the integration's provider and shows per record what applying would turn it into (current, proposed, changes, operation update or create), without changing anything. mode add adds the report address, replace makes it the only rua target. status ready or blocked with reason: missing (no DMARC record), multiple, invalid, unauthorized (the report domain does not accept reports for other domains), no_address or up_to_date. Not available to client accounts.

Limit: 30 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
integration_id*querystring (uuid)Integration of the organization whose provider hosts the zone
mode*querystring (add, replace)add: in addition to existing targets; replace: the only rua target

Response

200

Example

Shell
curl \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/domains/<domain-id>/mail-reports/connect/preview?integration_id=<integration_id>&mode=<mode>"
post/orgs/{organization}/domains/{domain}/mail-reports/connectwriteAdd the report address at the DNS provider

Writes every record the preview shows as ready: the existing DMARC record (only rua changes) and the TLS-RPT record (created if missing). Requires confirm: true and expected with the content from the preview's current per record (null if there was none): if the provider holds something else by now or there is nothing to do, the server responds with 422. DomainWarn never deletes records.

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

Request body (JSON)

FieldTypeDescription
integration_id*string (uuid)Integration of the organization
mode*string (add, replace)As in the preview
expected*objectThe records as the preview read them
confirm*booleanExplicit confirmation

Response

200 · Records written

Example

Shell
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","mode":"add","expected":{"dmarc":"v=DMARC1; p=quarantine; rua=mailto:dmarc@kunde.de","tls_rpt":null},"confirm":true}' \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/domains/<domain-id>/mail-reports/connect"
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

Shell
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

Shell
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

Shell
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>"
get/orgs/{organization}/domains/{domain}/zone-backupsreadZone backup: states

Complete states of the zone, read through the DNS provider integration (including records nobody sees from outside), newest first, with a summary of the difference to the previous state. A new state is only stored when the zone changes; otherwise last_seen_at moves on. meta.state tells whether a backup is possible: available, not_delegated (zone not at a connected provider), no_integration (no verified integration for the provider) or unsupported; meta.last_error names the error of the last run. Available to client accounts too.

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

Shell
curl \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/domains/<domain-id>/zone-backups"
get/orgs/{organization}/domains/{domain}/zone-backups/{backup}readZone backup: one state

One state with all records (key = "name|TYPE", as restoring expects it) and the difference to the previous state per name and type: added, removed or changed with the values before and after.

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
backuppathstring (uuid)ID of the zone backup state

Response

200 · { data: ZoneBackup }

Example

Shell
curl \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/domains/<domain-id>/zone-backups/<backup-id>"
get/orgs/{organization}/domains/{domain}/zone-backups/{backup}/export.zonereadZone backup as BIND zone file

The state as an RFC 1035 zone file ($ORIGIN, $TTL, names relative to the zone, @ for the domain, TXT quoted in strings of up to 255 bytes), as a download (Content-Disposition: attachment). Can be imported at any provider with zone import; records behind the Cloudflare proxy carry the comment ; proxied.

Limit: 30 exports 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.
domainpathstring (uuid)Domain ID
backuppathstring (uuid)ID of the zone backup state

Response

200 · { data: zonefile } · Zone file (text/plain)

Example

Shell
curl \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/domains/<domain-id>/zone-backups/<backup-id>/export.zone"
get/orgs/{organization}/domains/{domain}/zone-backups/{backup}/export.jsonreadZone backup as JSON

The state as a JSON file to download: zone, provider, timestamps, hash and the canonical record list.

Limit: 30 exports 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.
domainpathstring (uuid)Domain ID
backuppathstring (uuid)ID of the zone backup state

Response

200

Example

Shell
curl \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/domains/<domain-id>/zone-backups/<backup-id>/export.json"
post/orgs/{organization}/domains/{domain}/zone-backups/runwriteTake a zone backup now

Reads the zone at the provider right away (otherwise this happens daily): status is created if the zone changed (then with the timeline event zone.changed) or unchanged. 422 if the zone is not at a connected provider or cannot be read.

Limit: 10 per hour and domain, 60 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.
domainpathstring (uuid)Domain ID

Response

200

Example

Shell
curl -X POST \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/domains/<domain-id>/zone-backups/run"
post/orgs/{organization}/domains/{domain}/zone-backups/{backup}/restorewriteRestore records from the zone backup

Writes records of this state back into the zone through the integration: per key ("name|TYPE") the zone gets exactly the values of the state – missing ones are created (with the state's TTL), surplus ones deleted, equal numbers changed. all: true takes all differences between state and zone in one run, at most 200 changes. The name servers are resolved fresh beforehand; DomainWarn does not touch records behind the Cloudflare proxy (skipped). Recorded in the audit log and the timeline (zone.restored). Not available to client accounts.

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
backuppathstring (uuid)ID of the zone backup state

Request body (JSON)

FieldTypeDescription
keysarrayRecord keys (name|type); required without all
allbooleanRestore all differences between state and zone

Response

200

Example

Shell
curl -X POST \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"keys":["kunde.de|MX","_dmarc.kunde.de|TXT"]}' \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/domains/<domain-id>/zone-backups/<backup-id>/restore"

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

Shell
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

Shell
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

Shell
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"
put/orgs/{organization}/incidents/{incident}/reportwriteIncident in the customer report

Free text “cause and actions” for the customer (empty or null removes it) and whether the incident is hidden from the monthly report. At least one of both. What the customer sees of it is governed by the customer's report settings. The current state is part of the incident under report.

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

Request body (JSON)

FieldTypeDescription
notestring | nullCause and actions
hiddenbooleanHide from the customer report

Response

200

Example

Shell
curl -X PUT \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"note":"Der Hoster hat das Rechenzentrum gewechselt; die Website war 95 Minuten nicht erreichbar."}' \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/incidents/<incident-id>/report"

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; not before from and at most 366 days after it
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

Shell
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; not before from and at most 366 days after it
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

Shell
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}/customers/{customer}/announcementsreadAnnouncements on the status page

Incidents, maintenance and notices in your own words, as they appear at the top of the status page: active ones immediately, scheduled maintenance up to 14 days ahead.

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

Example

Shell
curl \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/customers/<customer-id>/announcements"
post/orgs/{organization}/customers/{customer}/announcementswritePublish an announcement

Appears on the status page of the customer. Without a start it applies immediately, without an end until it is marked resolved.

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
kind*string (incident, maintenance, info)Kind of announcement
title*stringTitle
bodystring | nullText
starts_atstring | null (date-time)Start; empty = now
ends_atstring | null (date-time)End

Response

201

Example

Shell
curl -X POST \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"kind":"maintenance","title":"Serverumzug am Samstag","body":"Von 8 bis 10 Uhr ist der Shop nicht erreichbar.","starts_at":"2026-10-03T06:00:00Z","ends_at":"2026-10-03T08:00:00Z"}' \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/customers/<customer-id>/announcements"
patch/orgs/{organization}/customers/{customer}/announcements/{announcement}writeUpdate an announcement

Change text, period or kind; marking it resolved ends 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.
customerpathstring (uuid)Customer ID
announcementpathstring (uuid)ID of the announcement on the status page

Response

200

Example

Shell
curl -X PATCH \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/customers/<customer-id>/announcements/<announcement-id>"
delete/orgs/{organization}/customers/{customer}/announcements/{announcement}writeDelete an announcement

Removes the announcement from the status page.

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
announcementpathstring (uuid)ID of the announcement on the status page

Response

204

Example

Shell
curl -X DELETE \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/customers/<customer-id>/announcements/<announcement-id>"
get/orgs/{organization}/customers/{customer}/status-subscribersreadStatus page subscribers

Email addresses that signed up for incident notifications on the customer’s status page, with language and time of confirmation (empty = not yet confirmed). At most 500, newest first.

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

Example

Shell
curl \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/customers/<customer-id>/status-subscribers"
delete/orgs/{organization}/customers/{customer}/status-subscribers/{subscriber}writeRemove a subscriber

Removes the address; it receives no further incident notifications and can sign up again on the page.

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
subscriberpathstring (uuid)ID of the status page subscriber

Response

204

Example

Shell
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-subscribers/<subscriber-id>"
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

Shell
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
logostring | nullLogo as data URL (PNG, JPEG or SVG without scripts, up to 300 KB); null removes it
monthly_reportbooleanSend the monthly report
report_localestring | null (de, en)Report language

Response

201 · { data: Customer }

Example

Shell
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

Shell
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

Shell
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

Shell
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

Shell
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"
put/orgs/{organization}/customers/{customer}/report/settingswriteMonthly report content

What the customer's report shows – preview, PDF, link and mailing: sections, details per incident and which incidents. Missing keys stay unchanged; the default matches the report without settings (all sections, incidents with duration, no further details). The current state is part of the customer under report_settings.

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
sectionsobjectReport sections
incident_detailsobjectDetails per incident: duration, timeline, notified channel types, who acknowledged, cause and actions, changes with before/after
incident_filterobjectWhich incidents: all or critical only, all or resolved only

Response

200

Example

Shell
curl -X PUT \
  -H "Authorization: Bearer $DOMAINWARN_TOKEN" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"sections":{"changes":false},"incident_details":{"timeline":true,"note":true},"incident_filter":{"severity":"critical"}}' \
  "https://api.domainwarn.com/api/v1/orgs/my-agency/customers/<customer-id>/report/settings"
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
logostring | nullLogo as data URL; null removes it, omitted keeps it
is_archivedbooleanArchive or restore
monthly_reportbooleanSend the monthly report
report_localestring | null (de, en)Report language

Response

200 · { data: Customer }

Example

Shell
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

Shell
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

Shell
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

Shell
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"
post/orgs/{organization}/customers/{customer}/status-page/host/verifywriteVerify the custom status page address

Checks the TXT record from status_page_host_record (name _domainwarn.<address>). Only after verification does the website serve the status page at status_page_host. If the record is missing or DNS cannot be queried right now, 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 } · Verified, `status_page_host_verified` is true

Example

Shell
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/host/verify"

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.