Skip to content

Developers

Public JSON APIs for provider status and incident history

Versioned under /api/v1, served from https://outagedeck.com, CORS-enabled for every origin, and described by an OpenAPI 3.1 document. Anonymous requests work out of the box; API keys raise the hourly quota.

Endpoints

Browse the API

Expand an endpoint for its parameters and a copyable request, or open its full reference page for the complete example response.

Status

GET/api/v1/status

Directory stats, every tracked provider with current status, and the most recent incidents.

Request

curl https://outagedeck.com/api/v1/status

Providers

GET/api/v1/providers

List providers

ParameterInTypeDescription
qquerystringFree-text search over names, aliases, services.
statusqueryoperational | degraded | partial_outage | major_outage | maintenance | unknown
categoryquerycloud | hosting | ai | devtools | data | monitoring | auth | security | email | comms | telecom | productivity | fintechFilter by directory category.
sortqueryseverity | nameDefaults to severity.

Request

curl "https://outagedeck.com/api/v1/providers?category=cloud&status=degraded&sort=severity"
GET/api/v1/providers/{providerSlug}

Provider detail

ParameterInTypeDescription
providerSlugrequiredpathstring

Request

curl https://outagedeck.com/api/v1/providers/github

Incidents

GET/api/v1/incidents

List incidents

ParameterInTypeDescription
providerquerystringFilter by provider slug. An unknown slug answers an empty result set.
severityqueryminor | major | critical | maintenanceFilter by incident severity.
statequeryactive | resolvedFilter by lifecycle state; wins over the deprecated active flag when both are sent.
activequerybooleanDeprecated alias of state: true maps to state=active, false to state=resolved.
pagequeryinteger1-based page number. Pages past the end clamp to the last page.
limitqueryinteger (1-100)Page size.

Request

curl "https://outagedeck.com/api/v1/incidents?provider=aws&state=resolved&severity=minor&limit=10"
GET/api/v1/incidents/{incidentSlug}

Incident detail with update timeline

ParameterInTypeDescription
incidentSlugrequiredpathstring

Request

curl https://outagedeck.com/api/v1/incidents/cloudflare-durable-objects-increased-error-rate-in-enam-2026-07-06

Services

GET/api/v1/services/{serviceSlug}

Service detail

ParameterInTypeDescription
serviceSlugrequiredpathstring

Request

curl https://outagedeck.com/api/v1/services/github-actions

Badges

GET/api/v1/badges/{providerSlug}

Embeddable shields-style SVG badge with the provider's current status. Not rate limited and safe to hotlink.

ParameterInTypeDescription
providerSlugrequiredpathstring

Request

![GitHub status](https://outagedeck.com/api/v1/badges/github)

curl https://outagedeck.com/api/v1/badges/github

Monitoring

GET/api/health

Reports data mode and database reachability. Returns 503 when the configured database is unreachable, which makes it suitable for uptime monitors.

Request

curl https://outagedeck.com/api/health

Getting started

Your first request

No signup, no token: every read endpoint answers anonymous requests within the public rate limit.

Request

curl https://outagedeck.com/api/v1/status

Every response shares one envelope

{
  "meta": {
    "version": "v1",
    "generatedAt": "2026-07-07T18:20:04Z"
  },
  "data": { ... }
}

The base URL is https://outagedeck.com. Responses are JSON with a stable meta/data envelope, timestamps are ISO 8601 UTC, and successful responses are edge-cached for up to five minutes. Polling faster than that returns cached data, so once per minute is a sensible ceiling. Breaking changes will only ever ship under a new version prefix; additive fields can appear at any time, so parse tolerantly.

Authentication

Anonymous by default, keyed for volume

API keys are optional and only change your rate limit. Send one with either header; both are equivalent.

Bearer token

curl -H "Authorization: Bearer YOUR_API_KEY" \
  https://outagedeck.com/api/v1/status

X-API-Key header

curl -H "X-API-Key: YOUR_API_KEY" \
  https://outagedeck.com/api/v1/status

Every paid plan (Starter, Pro, and Business) includes a key, emailed automatically after checkout. Keep it server-side when you can; if one leaks, rotate it yourself in seconds from your account page. An invalid key is rejected with 401 invalid_api_key rather than silently downgraded to anonymous access.

Rate limits

Hourly windows, visible on every response

Quotas reset at the top of each UTC hour. Every JSON response reports where you stand.

Plans

PlanHourly limit
Anonymous120 requests per IP
starter1,000 requests per key
pro5,000 requests per key
business20,000 requests per key (raisable on request)

Badges and feeds are excluded from rate limiting entirely.

Headers

X-RateLimit-LimitRequest allowance for the current hourly window.
X-RateLimit-RemainingRequests left in the current window.
X-RateLimit-ResetUnix epoch seconds when the window resets.
X-RateLimit-PolicyAlways "hourly".
X-Api-PlanPlan the request was accounted against.
Retry-AfterSeconds until reset. Sent with 429 responses only.

Errors

One error contract everywhere

Non-2xx responses keep the same envelope and carry a machine-readable code.

404 example

{
  "meta": { "version": "v1", "generatedAt": "..." },
  "data": {
    "error": {
      "code": "not_found",
      "message": "No provider matches that slug."
    }
  }
}
StatusCodeMeaning
400invalid_queryA query parameter failed validation; the body lists each issue under data.error.issues.
401invalid_api_keyThe supplied API key does not exist or has been deactivated.
404not_foundNo resource matches the requested slug.
429rate_limitedThe hourly quota is spent. Retry after the window resets (see Retry-After).

OpenAPI & tooling

Bring your own client

The whole surface is machine-readable, so generators and API clients work out of the box.

Import the spec

Point Postman, Insomnia, Bruno, or any OpenAPI 3.1 code generator at the live document. It always matches what is deployed.

OpenAPI 3.1

https://outagedeck.com/api/v1/openapi

Works in the browser

Every endpoint sends CORS headers for all origins, so status widgets and internal dashboards can call the API with plain fetch, no proxy needed.

fetch

const res = await fetch(
  "https://outagedeck.com/api/v1/providers/github",
);
const { data } = await res.json();
console.log(data.currentStatus.code); // "operational"
console.log(data.links.alerts); // prefilled GitHub alert setup

Feeds & badges

Zero-code integrations

RSS for readers and alert tooling, plus native and Shields.io SVG badges for READMEs and wikis. None needs a key.

RSS 2.0

https://outagedeck.com/feeds/incidents.xml
https://outagedeck.com/feeds/providers/github

Native Markdown badge

[![GitHub status](https://outagedeck.com/api/v1/badges/github)](https://outagedeck.com/providers/github)

Shields.io Markdown badge

[![GitHub status](https://img.shields.io/outagedeck/status/github)](https://outagedeck.com/providers/github?utm_source=shields&utm_medium=badge&utm_campaign=shields_provider_status)

Need another provider or a multi-provider wall? The badge and embed builder generates copy-ready snippets. Want a push instead of a poll? Email outage alerts are free; paid plans add Slack, Teams, Discord, and webhook delivery. The alerts guide covers setup, the JSON payload, and delivery guarantees. Working in Claude Code or Cursor? The same data is one URL away over the MCP server.

Versioning & stability

The API is versioned in the URL. Fields may be added to existing responses without notice, so clients should ignore unknown keys. Removing or renaming fields, changing types, or changing error codes only happens under a new version prefix, with the old one kept online through a deprecation window announced on this page.

On the roadmap

  • Historical exports (CSV/JSON) for reporting and BI pipelines
  • Per-category reliability roundups and uptime trend endpoints
  • Team-level alert routing and shared watchlists