{"openapi":"3.1.0","info":{"title":"OutageDeck Public API","version":"1.0.0","description":"Read-only JSON API for cloud and SaaS provider status, services, and incident history. Anonymous requests are allowed with a lower hourly rate limit; API keys raise the limit. All endpoints support CORS from any origin.","contact":{"name":"OutageDeck support","email":"hello@outagedeck.com","url":"https://outagedeck.com/developers/api"}},"servers":[{"url":"https://outagedeck.com"}],"security":[{},{"bearerAuth":[]},{"apiKeyHeader":[]}],"tags":[{"name":"Status","description":"Platform-wide overview."},{"name":"Providers","description":"Provider directory and detail."},{"name":"Incidents","description":"Incident archive and timelines."},{"name":"Services","description":"Service-level status."},{"name":"Badges","description":"Embeddable SVG status badges."},{"name":"Monitoring","description":"Operational health."}],"paths":{"/api/v1/status":{"get":{"operationId":"getStatusOverview","tags":["Status"],"summary":"Platform-wide status overview","description":"Directory stats, every tracked provider with current status, and the most recent incidents.","responses":{"200":{"description":"Overview envelope","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Policy":{"$ref":"#/components/headers/X-RateLimit-Policy"},"X-Api-Plan":{"$ref":"#/components/headers/X-Api-Plan"}},"content":{"application/json":{"schema":{"type":"object","properties":{"meta":{"type":"object","properties":{"version":{"type":"string","const":"v1"},"generatedAt":{"type":"string","format":"date-time"}}},"data":{"type":"object","properties":{"stats":{"type":"object"},"providers":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"slug":{"type":"string"},"name":{"type":"string"},"currentStatus":{"type":"object","properties":{"code":{"type":"string","enum":["operational","degraded","partial_outage","major_outage","maintenance","unknown"]},"label":{"type":"string"},"headline":{"type":"string"},"summary":{"type":"string"},"capturedAt":{"type":"string","format":"date-time"}}},"counts":{"type":"object","properties":{"services":{"type":"integer"},"activeIncidents":{"type":"integer"},"incidents":{"type":"integer"}}},"services":{"type":"array","items":{"type":"object"}},"activeIncidents":{"type":"array","items":{"type":"object"}},"links":{"type":"object"}}}},"recentIncidents":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"slug":{"type":"string"},"title":{"type":"string"},"summary":{"type":"string"},"status":{"type":"string","enum":["investigating","identified","monitoring","resolved"]},"severity":{"type":"string","enum":["minor","major","critical","maintenance"]},"startedAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"resolvedAt":{"type":["string","null"],"format":"date-time"},"provider":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":"string"}}},"affectedServices":{"type":"array","items":{"type":"object"}},"links":{"type":"object"}}}}}}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/providers":{"get":{"operationId":"listProviders","tags":["Providers"],"summary":"List providers","parameters":[{"name":"q","in":"query","schema":{"type":"string","maxLength":100},"description":"Free-text search over names, aliases, services."},{"name":"status","in":"query","schema":{"type":"string","enum":["operational","degraded","partial_outage","major_outage","maintenance","unknown"]}},{"name":"sort","in":"query","schema":{"type":"string","enum":["severity","name"],"default":"severity"}}],"responses":{"200":{"description":"Provider collection envelope","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Policy":{"$ref":"#/components/headers/X-RateLimit-Policy"},"X-Api-Plan":{"$ref":"#/components/headers/X-Api-Plan"}},"content":{"application/json":{"schema":{"type":"object","properties":{"meta":{"type":"object","properties":{"version":{"type":"string","const":"v1"},"generatedAt":{"type":"string","format":"date-time"}}},"data":{"type":"object","properties":{"count":{"type":"integer"},"providers":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"slug":{"type":"string"},"name":{"type":"string"},"currentStatus":{"type":"object","properties":{"code":{"type":"string","enum":["operational","degraded","partial_outage","major_outage","maintenance","unknown"]},"label":{"type":"string"},"headline":{"type":"string"},"summary":{"type":"string"},"capturedAt":{"type":"string","format":"date-time"}}},"counts":{"type":"object","properties":{"services":{"type":"integer"},"activeIncidents":{"type":"integer"},"incidents":{"type":"integer"}}},"services":{"type":"array","items":{"type":"object"}},"activeIncidents":{"type":"array","items":{"type":"object"}},"links":{"type":"object"}}}}}}}}}}},"400":{"$ref":"#/components/responses/InvalidQuery"},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/providers/{providerSlug}":{"get":{"operationId":"getProvider","tags":["Providers"],"summary":"Provider detail","parameters":[{"name":"providerSlug","in":"path","required":true,"schema":{"type":"string"},"example":"github"}],"responses":{"200":{"description":"Provider detail envelope","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Policy":{"$ref":"#/components/headers/X-RateLimit-Policy"},"X-Api-Plan":{"$ref":"#/components/headers/X-Api-Plan"}},"content":{"application/json":{"schema":{"type":"object","properties":{"meta":{"type":"object","properties":{"version":{"type":"string","const":"v1"},"generatedAt":{"type":"string","format":"date-time"}}},"data":{"type":"object","properties":{"id":{"type":"string"},"slug":{"type":"string"},"name":{"type":"string"},"currentStatus":{"type":"object","properties":{"code":{"type":"string","enum":["operational","degraded","partial_outage","major_outage","maintenance","unknown"]},"label":{"type":"string"},"headline":{"type":"string"},"summary":{"type":"string"},"capturedAt":{"type":"string","format":"date-time"}}},"counts":{"type":"object","properties":{"services":{"type":"integer"},"activeIncidents":{"type":"integer"},"incidents":{"type":"integer"}}},"services":{"type":"array","items":{"type":"object"}},"activeIncidents":{"type":"array","items":{"type":"object"}},"links":{"type":"object"}}}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/incidents":{"get":{"operationId":"listIncidents","tags":["Incidents"],"summary":"List incidents","parameters":[{"name":"provider","in":"query","schema":{"type":"string"},"description":"Filter by provider slug."},{"name":"active","in":"query","schema":{"type":"boolean"},"description":"true for unresolved incidents only."},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100}}],"responses":{"200":{"description":"Incident collection envelope","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Policy":{"$ref":"#/components/headers/X-RateLimit-Policy"},"X-Api-Plan":{"$ref":"#/components/headers/X-Api-Plan"}},"content":{"application/json":{"schema":{"type":"object","properties":{"meta":{"type":"object","properties":{"version":{"type":"string","const":"v1"},"generatedAt":{"type":"string","format":"date-time"}}},"data":{"type":"object","properties":{"count":{"type":"integer"},"incidents":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"slug":{"type":"string"},"title":{"type":"string"},"summary":{"type":"string"},"status":{"type":"string","enum":["investigating","identified","monitoring","resolved"]},"severity":{"type":"string","enum":["minor","major","critical","maintenance"]},"startedAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"resolvedAt":{"type":["string","null"],"format":"date-time"},"provider":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":"string"}}},"affectedServices":{"type":"array","items":{"type":"object"}},"links":{"type":"object"}}}}}}}}}}},"400":{"$ref":"#/components/responses/InvalidQuery"},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/incidents/{incidentSlug}":{"get":{"operationId":"getIncident","tags":["Incidents"],"summary":"Incident detail with update timeline","parameters":[{"name":"incidentSlug","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Incident detail envelope","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Policy":{"$ref":"#/components/headers/X-RateLimit-Policy"},"X-Api-Plan":{"$ref":"#/components/headers/X-Api-Plan"}},"content":{"application/json":{"schema":{"type":"object","properties":{"meta":{"type":"object","properties":{"version":{"type":"string","const":"v1"},"generatedAt":{"type":"string","format":"date-time"}}},"data":{"type":"object","properties":{"id":{"type":"string"},"slug":{"type":"string"},"title":{"type":"string"},"summary":{"type":"string"},"status":{"type":"string","enum":["investigating","identified","monitoring","resolved"]},"severity":{"type":"string","enum":["minor","major","critical","maintenance"]},"startedAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"resolvedAt":{"type":["string","null"],"format":"date-time"},"provider":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":"string"}}},"affectedServices":{"type":"array","items":{"type":"object"}},"links":{"type":"object"}}}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/services/{serviceSlug}":{"get":{"operationId":"getService","tags":["Services"],"summary":"Service detail","parameters":[{"name":"serviceSlug","in":"path","required":true,"schema":{"type":"string"},"example":"github-actions"}],"responses":{"200":{"description":"Service detail envelope","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Policy":{"$ref":"#/components/headers/X-RateLimit-Policy"},"X-Api-Plan":{"$ref":"#/components/headers/X-Api-Plan"}},"content":{"application/json":{"schema":{"type":"object","properties":{"meta":{"type":"object","properties":{"version":{"type":"string","const":"v1"},"generatedAt":{"type":"string","format":"date-time"}}},"data":{"type":"object"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/badges/{providerSlug}":{"get":{"operationId":"getProviderBadge","tags":["Badges"],"summary":"SVG status badge","description":"Embeddable shields-style SVG badge with the provider's current status. Not rate limited and safe to hotlink.","security":[{}],"parameters":[{"name":"providerSlug","in":"path","required":true,"schema":{"type":"string"},"example":"github"}],"responses":{"200":{"description":"SVG badge","content":{"image/svg+xml":{"schema":{"type":"string"}}}},"404":{"description":"Unknown provider"}}}},"/api/health":{"get":{"operationId":"getHealth","tags":["Monitoring"],"summary":"Service health","description":"Reports data mode and database reachability. Returns 503 when the configured database is unreachable, which makes it suitable for uptime monitors.","security":[{}],"responses":{"200":{"description":"Healthy","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"time":{"type":"string","format":"date-time"},"dataMode":{"type":"string","enum":["database","seed"]},"database":{"type":"object","properties":{"configured":{"type":"boolean"},"reachable":{"type":"boolean"}}}}}}}},"503":{"description":"Configured database is unreachable."}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"API key as a bearer token."},"apiKeyHeader":{"type":"apiKey","in":"header","name":"x-api-key"}},"headers":{"X-RateLimit-Limit":{"description":"Request allowance for the current hourly window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in the current hourly window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix epoch seconds when the hourly window resets.","schema":{"type":"integer"}},"X-RateLimit-Policy":{"description":"Always \"hourly\".","schema":{"type":"string"}},"X-Api-Plan":{"description":"Plan the request was accounted against.","schema":{"type":"string"}}},"responses":{"NotFound":{"description":"The requested resource does not exist.","content":{"application/json":{"schema":{"type":"object","properties":{"meta":{"type":"object","properties":{"version":{"type":"string","const":"v1"},"generatedAt":{"type":"string","format":"date-time"}}},"data":{"type":"object","properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","invalid_query","invalid_api_key","rate_limited"]},"message":{"type":"string"},"issues":{"type":"array","description":"Present on validation errors only.","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"}}}}}}}}}}}}},"InvalidQuery":{"description":"Query parameters failed validation.","content":{"application/json":{"schema":{"type":"object","properties":{"meta":{"type":"object","properties":{"version":{"type":"string","const":"v1"},"generatedAt":{"type":"string","format":"date-time"}}},"data":{"type":"object","properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","invalid_query","invalid_api_key","rate_limited"]},"message":{"type":"string"},"issues":{"type":"array","description":"Present on validation errors only.","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"}}}}}}}}}}}}},"Unauthorized":{"description":"The provided API key is invalid or inactive.","content":{"application/json":{"schema":{"type":"object","properties":{"meta":{"type":"object","properties":{"version":{"type":"string","const":"v1"},"generatedAt":{"type":"string","format":"date-time"}}},"data":{"type":"object","properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","invalid_query","invalid_api_key","rate_limited"]},"message":{"type":"string"},"issues":{"type":"array","description":"Present on validation errors only.","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"}}}}}}}}}}}}},"RateLimited":{"description":"Hourly rate limit exceeded. Inspect the X-RateLimit-* headers and retry after the window resets.","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Policy":{"$ref":"#/components/headers/X-RateLimit-Policy"},"X-Api-Plan":{"$ref":"#/components/headers/X-Api-Plan"},"Retry-After":{"description":"Seconds until the hourly window resets.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"meta":{"type":"object","properties":{"version":{"type":"string","const":"v1"},"generatedAt":{"type":"string","format":"date-time"}}},"data":{"type":"object","properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","invalid_query","invalid_api_key","rate_limited"]},"message":{"type":"string"},"issues":{"type":"array","description":"Present on validation errors only.","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"}}}}}}}}}}}}}}}}