API reference

Domains API

Everything you can do on the dashboard, you can do over the API. Base URL:https://dominder.co/api/v1

MethodPath
GET/meReturn the account profile this key belongs to.
GET/domainsList every domain on your account.
POST/domainsStart monitoring a new domain.
GET/domains/:idFetch one domain and its latest status.
PATCH/domains/:idUpdate a domain's settings or records.
DELETE/domains/:idStop monitoring and delete the domain.

The domain object

{
  "id":                  "66a1c0ffeec0ffee12345678",  // 24-char MongoDB ObjectId
  "hostname":            "example.com",
  "monitor": {
    "status":  true,    // HTTP(S) reachability
    "ssl":     true,    // TLS certificate health
    "records": true     // DNS record verification (requires `records`)
  },
  "records": [
    {
      "id":       "66a1...",
      "type":     "A",          // A | AAAA | CNAME | MX | TXT | NS
      "host":     "",           // "" means apex, otherwise the subdomain
      "expected": "93.184.216.34"
    }
  ],
  "intervalMinutes":     null,  // null = server default (usually 5)
  "paused":              false, // when true, scheduler skips this domain
  "lastStatus":          "ok",  // unknown | ok | warning | failing
  "lastCheckedAt":       "2026-04-22T12:34:56.000Z",
  "lastFailureAt":       null,
  "consecutiveFailures": 0,
  "createdAt":           "2026-04-20T09:00:00.000Z",
  "updatedAt":           "2026-04-22T12:34:56.000Z"
}

Field meanings:
hostname - just the bare hostname, nohttps://, no path, no port.
monitor - which checks to run. Toggles are independent; set only the ones you care about.
records - only used whenmonitor.recordsis true. SeeMonitoring checksfor the matching rules.
intervalMinutes - 1 to 1440 (24 h). Leave null to inherit the server default.
lastStatus - aggregate result of the most recent check run.


GET /me

Return the account this API key belongs to.

curl https://dominder.co/api/v1/me \
  -H "Authorization: Bearer $DOMINDER_API_KEY"
{
  "email":              "you@example.com",
  "name":               "Your Name",
  "tenantId":           "66a1c0ffeec0ffee12345678",
  "webhookUrl":         "https://your-app.example.com/dominder-webhook",
  "subscriptionStatus": "active"
}

GET /domains

Return every domain on your account, sorted by hostname.

curl https://dominder.co/api/v1/domains \
  -H "Authorization: Bearer $DOMINDER_API_KEY"
{
  "domains": [
    { "id": "66a1...", "hostname": "example.com",     "lastStatus": "ok",      ... },
    { "id": "66a2...", "hostname": "other.example.com", "lastStatus": "failing", ... }
  ]
}

POST /domains

Start monitoring a new domain. Request body:

FieldType
hostnamestring, requiredBare hostname. Must be syntactically valid; we normalize to lowercase.
monitorobjectAny combination ofstatus,ssl,records(booleans). Defaults to{ status: true, ssl: true, records: false }.
recordsarrayZero or morerecord definitions. If you pass any, we flipmonitor.recordson automatically.
intervalMinutesintegerOverride how often this domain is checked. 1 to 1440. Null/absent uses the server default.
curl -X POST https://dominder.co/api/v1/domains \
  -H "Authorization: Bearer $DOMINDER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "hostname": "example.com",
    "monitor":  { "status": true, "ssl": true, "records": true },
    "intervalMinutes": 5,
    "records":  [
      { "type": "A",     "host": "",    "expected": "93.184.216.34" },
      { "type": "CNAME", "host": "www", "expected": "example.com"   }
    ]
  }'

Successful response (HTTP 201):

{ "domain": { "id": "66a1...", ... } }

Common errors:

  • 400 - invalid hostname or record definition (seeerrors)
  • 409 - that hostname is already on your account
  • 402 - subscription inactive

GET /domains/:id

Fetch a single domain.

curl https://dominder.co/api/v1/domains/66a1c0ffeec0ffee12345678 \
  -H "Authorization: Bearer $DOMINDER_API_KEY"

Response is a single{ "domain": {...} }object. Returns404if the id doesn't exist on your account.


PATCH /domains/:id

Partially update a domain. Only the fields you include are changed. All top-level fields fromPOST /domainsare accepted, plus:

  • paused - whentrue, the scheduler skips this domain until you flip it back tofalse. Records and settings are kept intact.
curl -X PATCH https://dominder.co/api/v1/domains/66a1c0ffeec0ffee12345678 \
  -H "Authorization: Bearer $DOMINDER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "paused": true, "intervalMinutes": 15 }'

Sendingrecordsreplaces the whole array - to append, fetch, append, then PATCH back.


DELETE /domains/:id

Stop monitoring and delete the domain. Historical check results are also removed.

curl -X DELETE https://dominder.co/api/v1/domains/66a1c0ffeec0ffee12345678 \
  -H "Authorization: Bearer $DOMINDER_API_KEY"
{ "ok": true }

Pagination, filtering, and search

Not yet supported. All domains are returned in one call, sorted by hostname. If you're managing tens of thousands of domains and need pagination, contact support.