isitdown.io API

JSON surface for the same data the homepage and check pages render. Server-rendered, no API key, rate-limited per IP. 41 endpoints across 7 groups.

Base URL: https://isitdown.io Auth: none for public reads · X-Owner-Token for /api/monitors Rate limits: 60/min/IP (most) · 5/min/IP (subscribe) Cache headers: Cache-Control: no-store on live data

Live status

Real-time probe data from 4 monitoring regions. No authentication required; rate-limited to 60 req/min/IP.

GET /api/check?target=discord.com

Auto-detects engine (website / Minecraft / Source / publisher) and runs a fresh probe. Returns the full NormalizedCheck shape used everywhere on the site.

Example

curl -s https://isitdown.io/api/check?target=discord.com

Response (excerpt)

{
  "id": "website:discord.com",
  "type": "website",
  "target": "discord.com",
  "status": "up",
  "summary": "Reachable from all regions",
  "timings": { "totalMs": 142 },
  "regions": [{ "id": "us-east", "status": "up", "responseTimeMs": 138 }, ...],
  "protocolData": { "httpStatus": 200 },
  "checkedAt": "2026-04-26T15:30:00.000Z"
}

Use ?refresh=1 to bypass the 60-second result cache.

GET /api/dashboard

Snapshot of every monitored service plus active-incident count. Drives the homepage grid; payload is ~30 KB JSON.

Example

curl -s https://isitdown.io/api/dashboard

Response (excerpt)

{
  "stats": { "lastRunAt": "...", "intervalMinutes": 5, "monitoredHttp": 100, "monitoredMc": 9 },
  "services": [{ "type": "http", "name": "Discord", "domain": "discord.com",
                 "status": "up", "responseTime": 142, "latencies": [128, 142, 138, ...],
                 "regions": [...], "checkedAt": "..." }, ...],
  "activeIncidents": 0,
  "incidentsTop": []
}
GET /api/incidents

Every currently-open incident across the monitored catalog (state-machine debounced, not raw probe snapshots).

Example

curl -s https://isitdown.io/api/incidents

Response (excerpt)

{
  "incidents": [{
    "id": "evt_451",
    "type": "website",
    "target": "discord.com",
    "name": "Discord",
    "openedAt": "2026-04-26T15:14:39Z",
    "resolvedAt": null,
    "durationMs": 840000,
    "isOpen": true
  }]
}
GET /api/incidents/website/discord.com

Current open incident plus the last 20 paired open+resolved incidents for one target.

Example

curl -s https://isitdown.io/api/incidents/website/discord.com
GET /api/health

Liveness probe. Returns 200 with uptime + node version. Decoupled from monitor state so a broken engine doesn't make the process look unhealthy.

Example

curl -s https://isitdown.io/api/health

Diagnostic tools

JSON twins of the SSL / DNS / redirect / header-inspector pages. Same SSRF guard + 60-second result cache.

GET /api/ssl/example.com

TLS certificate inspection — issuer, SAN, expiry, chain. Validates the hostname against the served cert.

Example

curl -s https://isitdown.io/api/ssl/example.com
GET /api/dns/example.com

Resolves A / AAAA / CNAME / MX / NS / TXT / SOA in parallel via the system resolver. 5-second per-record-type timeout.

Example

curl -s https://isitdown.io/api/dns/example.com
GET /api/redirect/example.com

Follows up to 10 hops manually with SSRF-guarded each step. Detects scheme downgrades and cross-origin chains.

Example

curl -s https://isitdown.io/api/redirect/example.com
GET /api/headers/example.com

Captures every response header and grades the six load-bearing security headers. Returns A–F per header plus an overall letter grade.

Example

curl -s https://isitdown.io/api/headers/example.com

Catalog

Read-only references for every service / country / publisher we track. Useful for building dashboards on top of our data.

GET /api/services

Full service catalog grouped by category.

Example

curl -s https://isitdown.io/api/services
GET /api/services/hot

Top-trending services right now. Used by the homepage hot row.

Example

curl -s https://isitdown.io/api/services/hot
GET /api/services/country/US

Services tagged for one country code (ISO 3166 alpha-2).

Example

curl -s https://isitdown.io/api/services/country/US
GET /api/countries

Country metadata — display name + flag — for every country we have services in.

Example

curl -s https://isitdown.io/api/countries
GET /api/regions

The four monitoring regions with id / name / flag.

Example

curl -s https://isitdown.io/api/regions
GET /api/top-searched?limit=20

Most-searched targets across recent traffic (best-effort, in-memory).

Example

curl -s https://isitdown.io/api/top-searched?limit=20
GET /api/recent

Recently checked targets across all engines.

Example

curl -s https://isitdown.io/api/recent

Per-engine endpoints

Direct probe routes for each engine. Use /api/check with auto-detect for most cases; these are for callers that already know the engine.

GET /api/mc/check/mc.hypixel.net

Minecraft Server List Ping (SLP). Returns players, version, MOTD, latency.

Example

curl -s https://isitdown.io/api/mc/check/mc.hypixel.net
GET /api/mc/servers

MC server catalog.

Example

curl -s https://isitdown.io/api/mc/servers
GET /api/source/check/208.103.169.34:27015

Source-engine A2S_INFO query. Returns name, map, players, game, latency.

Example

curl -s https://isitdown.io/api/source/check/208.103.169.34:27015
GET /api/source/servers

Source server catalog.

Example

curl -s https://isitdown.io/api/source/servers
GET /api/publishers

Publisher catalog (Discord, GitHub, Twitch, Reddit, Cloudflare, Epic).

Example

curl -s https://isitdown.io/api/publishers
GET /api/publishers/status

Status for every publisher in one call (cached upstream).

Example

curl -s https://isitdown.io/api/publishers/status
GET /api/publisher/discord

Single publisher status with incident list.

Example

curl -s https://isitdown.io/api/publisher/discord

Saved monitors + alert subscriptions

Ownership is by opaque token (mint via POST /api/monitors). Save the token; it's shown once. The subscribe endpoint creates monitor + channel atomically and is rate-limited to 5/min/IP.

POST /api/monitors/subscribe

One-shot anonymous subscribe — create a monitor and attach a webhook or email channel in one call. Powers the Notify-me form on /check pages.

Request body

{
  "type": "website",
  "target": "discord.com",
  "channelKind": "webhook",
  "channelTarget": "https://your.app/hook"
}

Example

curl -s -X POST https://isitdown.io/api/monitors/subscribe \
  -H 'Content-Type: application/json' \
  -d '{"type": "website","target": "discord.com","channelKind": "webhook","channelTarget": "https://your.app/hook"}'

Response (excerpt)

{
  "ok": true,
  "monitorId": "mon_…",
  "channelId": 1,
  "ownerToken": "…",
  "unsubscribeUrl": "/api/monitors/mon_…?owner=…"
}

Save the ownerToken — it's the only way to unsubscribe.

GET /api/notify/config

Whether the deployment can deliver each channel kind. Email returns true only when both NOTIFICATION_EMAIL_API_KEY and NOTIFICATION_EMAIL_FROM are configured.

Example

curl -s https://isitdown.io/api/notify/config
POST /api/monitors

Create a saved monitor. Returns a fresh owner token if no X-Owner-Token header is provided.

Request body

{
  "type": "website",
  "target": "discord.com",
  "intervalSeconds": 300,
  "name": "Discord production"
}

Example

curl -s -X POST https://isitdown.io/api/monitors \
  -H 'Content-Type: application/json' \
  -d '{"type": "website","target": "discord.com","intervalSeconds": 300,"name": "Discord production"}'
GET /api/monitors

List monitors owned by the caller (X-Owner-Token required).

Example

curl -s https://isitdown.io/api/monitors
GET /api/monitors/mon_xxx

Single monitor detail.

Example

curl -s https://isitdown.io/api/monitors/mon_xxx
PATCH /api/monitors/mon_xxx

Partial update — name, interval, expectedStatus, expectedText.

Example

curl -s -X PATCH https://isitdown.io/api/monitors/mon_xxx
DELETE /api/monitors/mon_xxx

Delete the monitor (acts as unsubscribe).

Example

curl -s -X DELETE https://isitdown.io/api/monitors/mon_xxx
POST /api/monitors/mon_xxx/pause

Freeze the state machine for a monitor.

Example

curl -s -X POST https://isitdown.io/api/monitors/mon_xxx/pause
POST /api/monitors/mon_xxx/resume

Resume a paused monitor.

Example

curl -s -X POST https://isitdown.io/api/monitors/mon_xxx/resume
POST /api/monitors/mon_xxx/channels

Attach an additional notification channel.

Example

curl -s -X POST https://isitdown.io/api/monitors/mon_xxx/channels
GET /api/monitors/mon_xxx/channels

List a monitor's channels (targets are masked).

Example

curl -s https://isitdown.io/api/monitors/mon_xxx/channels
DELETE /api/monitors/mon_xxx/channels/1

Soft-delete one channel.

Example

curl -s -X DELETE https://isitdown.io/api/monitors/mon_xxx/channels/1
GET /api/monitors/mon_xxx/notifications

Last 50 delivery attempts for a monitor's channels.

Example

curl -s https://isitdown.io/api/monitors/mon_xxx/notifications

Webhook payload

Every incident_opened, incident_resolved, and reminder event delivered to a registered webhook channel uses this shape. POST application/json; redelivery is deduped via the UNIQUE (event_fk, channel_fk) row in notification_attempts. Test it with the test endpoint below.

POST /your-webhook-url

Sample payload your endpoint receives. kind is incident_opened | incident_resolved | reminder. event.detail shape varies by kind. event.test: true on payloads from the test button.

Example

curl -s -X POST https://isitdown.io/your-webhook-url

Response (excerpt)

{
  "kind": "incident_opened",
  "monitor": {
    "id": "mon_xxx",
    "type": "website",
    "target": "discord.com",
    "name": "subscriber: discord.com"
  },
  "event": {
    "occurredAt": "2026-04-26T15:14:39.000Z",
    "detail": {
      "consecutiveFailures": 2,
      "failureThreshold": 2,
      "openedAt": "2026-04-26T15:14:39.000Z"
    }
  },
  "summary": "discord.com is down (2 consecutive failed checks).",
  "dashboardUrl": "https://isitdown.io/website/discord.com"
}

Respond with 2xx within 8 seconds. Non-2xx is logged as a failure but doesn't unsubscribe — the next event re-tries.

POST /api/monitors/mon_xxx/channels/1/test

Fire a synthetic incident_opened payload to one channel so you can verify your webhook handler before a real outage triggers it. Requires X-Owner-Token. Returns the delivery status (HTTP code, duration, error if any).

Example

curl -s -X POST https://isitdown.io/api/monitors/mon_xxx/channels/1/test

Response (excerpt)

{
  "channelId": 1,
  "kind": "webhook",
  "target": "https://your.app/...",
  "result": { "status": "ok", "httpStatus": 200, "durationMs": 142 }
}

The test payload contains event.test: true + a [TEST] prefix on the summary so handlers can route it differently than real events.

Feeds

Crawlable feeds for outage tracking and SEO.

GET /feed/outages.xml

RSS 2.0 feed of currently-open incidents. ttl=5; subscribe with any reader.

Example

curl -s https://isitdown.io/feed/outages.xml
GET /sitemap.xml

Sitemap of every public page (homepage in 5 locales, /outages, blog, country pages, tools).

Example

curl -s https://isitdown.io/sitemap.xml