Skip to content

API for developers

Everything shown on this site is available as JSON: the current status of a site, its uptime, confirmed outages, and a check on demand from all our locations.

Access

Requests need a key, sent as a Bearer token. Keys are issued by the operator of DownVerdict. Each key has a limit of requests per minute; a check on demand counts as five.

curl -H "Authorization: Bearer YOUR_KEY" \
  https://downverdict.com/api/v1/status/github.com

Errors come as JSON with an error field: 401 without a valid key, 429 when the limit is reached (with a Retry-After header), 404 for a site that is not tracked.

Endpoints

GET/api/v1/status/{domain}

Stored status of a tracked site. Fast, and does not start a new check.

{
  "domain": "github.com",
  "name": "GitHub",
  "status": "up",              // up | down | unconfirmed | unavailable
  "blocked": false,            // reachable, but refused the automated check
  "partial": false,            // reachable from some locations only
  "response_ms": 84,
  "checked_at": "2026-10-09T08:12:41.000Z",
  "uptime_percent": { "day": 100, "week": 99.97, "month": 99.91 },
  "last_outage": { "started_at": "...", "ended_at": "..." },
  "url": "https://downverdict.com/github.com"
}

POST/api/v1/check

Checks a domain now from every location and returns what each of them saw. Works for sites we do not track yet. A result from the last minute is reused.

curl -X POST -H "Authorization: Bearer YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"domain":"example.com"}' https://downverdict.com/api/v1/check
{
  "domain": "example.com",
  "status": "up",
  "locations_answered": 3,
  "locations_total": 3,
  "response_ms": 61,
  "cached": false,
  "locations": [
    { "location": "Berlin 1, Germany", "status": "up", "http_code": 200, "response_ms": 58, "error": null }
  ]
}

A site counts as down only when at least two locations fail to reach it. With one answer the status is unconfirmed.

GET/api/v1/outages

Confirmed outages, newest first. Optional query parameters: domain, ongoing=1, limit (up to 200).

{
  "outages": [
    { "domain": "example.com", "name": "Example", "started_at": "...", "ended_at": null, "duration_seconds": 540 }
  ]
}

Without a key

The status badge needs no key and can be embedded anywhere: https://downverdict.com/api/badge/github.com. Every site page has the embed code ready to copy.