isitdown.io API
JSON surface for the same data the homepage and check pages render. Server-rendered, no API key, rate-limited per IP. 42 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 via 4 probe methods. 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 via all probe methods",
"timings": { "totalMs": 142 },
"regions": [{ "id": "h1-strict", "status": "up", "responseTimeMs": 138 }, ...],
"protocolData": { "httpStatus": 200 },
"checkedAt": "2026-04-26T15:30:00.000Z"
}
Use ?refresh=1 to bypass the 60-second result cache.
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": []
}
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
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.
TLS certificate inspection — issuer, SAN, expiry, chain. Validates the hostname against the served cert.
Example
curl -s https://isitdown.io/api/ssl/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
Catalog
Read-only references for every service / country / publisher we track. Useful for building dashboards on top of our data.
Full service catalog grouped by category.
Example
curl -s https://isitdown.io/api/services
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
Country metadata — display name + flag — for every country we have services in.
Example
curl -s https://isitdown.io/api/countries
The four probe methods 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
Recently checked targets across all engines.
Example
curl -s https://isitdown.io/api/recent
Targets with the most user-reported issues in the last 24h.
Example
curl -s https://isitdown.io/api/trending
GET
/api/speed/example.com
Speed test: one measured GET from our edge — phase timings (DNS/connect/TLS/TTFB/download), transfer size, compression, HTTP/2, redirect hops, rubric grades. Rate-limited to 8/min.
Example
curl -s https://isitdown.io/api/speed/example.com
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
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
Source server catalog.
Example
curl -s https://isitdown.io/api/source/servers
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.
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
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"}'
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, reminder, cert_expiring, and latency_degraded 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.
Sample payload your endpoint receives. kind is incident_opened | incident_resolved | reminder | cert_expiring | latency_degraded. 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.
RSS 2.0 feed of currently-open incidents. ttl=5; subscribe with any reader.
Example
curl -s https://isitdown.io/feed/outages.xml
Sitemap of every public page (homepage in 5 locales, /outages, blog, country pages, tools).
Example
curl -s https://isitdown.io/sitemap.xml