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/openapiDevelopers
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
Expand an endpoint for its parameters and a copyable request, or open its full reference page for the complete example response.
/api/v1/statusDirectory stats, every tracked provider with current status, and the most recent incidents.
Request
curl https://outagedeck.com/api/v1/status/api/v1/providersList providers
| Parameter | In | Type | Description |
|---|---|---|---|
q | query | string | Free-text search over names, aliases, services. |
status | query | operational | degraded | partial_outage | major_outage | maintenance | unknown | — |
category | query | cloud | hosting | ai | devtools | data | monitoring | auth | security | email | comms | telecom | productivity | fintech | Filter by directory category. |
sort | query | severity | name | Defaults to severity. |
Request
curl "https://outagedeck.com/api/v1/providers?category=cloud&status=degraded&sort=severity"/api/v1/providers/{providerSlug}Provider detail
| Parameter | In | Type | Description |
|---|---|---|---|
providerSlugrequired | path | string | — |
Request
curl https://outagedeck.com/api/v1/providers/github/api/v1/incidentsList incidents
| Parameter | In | Type | Description |
|---|---|---|---|
provider | query | string | Filter by provider slug. An unknown slug answers an empty result set. |
severity | query | minor | major | critical | maintenance | Filter by incident severity. |
state | query | active | resolved | Filter by lifecycle state; wins over the deprecated active flag when both are sent. |
active | query | boolean | Deprecated alias of state: true maps to state=active, false to state=resolved. |
page | query | integer | 1-based page number. Pages past the end clamp to the last page. |
limit | query | integer (1-100) | Page size. |
Request
curl "https://outagedeck.com/api/v1/incidents?provider=aws&state=resolved&severity=minor&limit=10"/api/v1/incidents/{incidentSlug}Incident detail with update timeline
| Parameter | In | Type | Description |
|---|---|---|---|
incidentSlugrequired | path | string | — |
Request
curl https://outagedeck.com/api/v1/incidents/cloudflare-durable-objects-increased-error-rate-in-enam-2026-07-06/api/v1/services/{serviceSlug}Service detail
| Parameter | In | Type | Description |
|---|---|---|---|
serviceSlugrequired | path | string | — |
Request
curl https://outagedeck.com/api/v1/services/github-actions/api/v1/badges/{providerSlug}Embeddable shields-style SVG badge with the provider's current status. Not rate limited and safe to hotlink.
| Parameter | In | Type | Description |
|---|---|---|---|
providerSlugrequired | path | string | — |
Request

curl https://outagedeck.com/api/v1/badges/github/api/healthReports 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/healthGetting started
No signup, no token: every read endpoint answers anonymous requests within the public rate limit.
Request
curl https://outagedeck.com/api/v1/statusEvery 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
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/statusX-API-Key header
curl -H "X-API-Key: YOUR_API_KEY" \
https://outagedeck.com/api/v1/statusEvery 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
Quotas reset at the top of each UTC hour. Every JSON response reports where you stand.
| Plan | Hourly limit |
|---|---|
| Anonymous | 120 requests per IP |
| starter | 1,000 requests per key |
| pro | 5,000 requests per key |
| business | 20,000 requests per key (raisable on request) |
Badges and feeds are excluded from rate limiting entirely.
X-RateLimit-Limit | Request allowance for the current hourly window. |
X-RateLimit-Remaining | Requests left in the current window. |
X-RateLimit-Reset | Unix epoch seconds when the window resets. |
X-RateLimit-Policy | Always "hourly". |
X-Api-Plan | Plan the request was accounted against. |
Retry-After | Seconds until reset. Sent with 429 responses only. |
Errors
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."
}
}
}| Status | Code | Meaning |
|---|---|---|
| 400 | invalid_query | A query parameter failed validation; the body lists each issue under data.error.issues. |
| 401 | invalid_api_key | The supplied API key does not exist or has been deactivated. |
| 404 | not_found | No resource matches the requested slug. |
| 429 | rate_limited | The hourly quota is spent. Retry after the window resets (see Retry-After). |
OpenAPI & tooling
The whole surface is machine-readable, so generators and API clients work out of the box.
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/openapiEvery 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 setupFeeds & badges
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/githubNative Markdown badge
[](https://outagedeck.com/providers/github)Shields.io Markdown badge
[](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.
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.