Skip to content

Data API

Status, metrics, incidents and drift as JSON, under /api/v1. The machine-readable description is at /api/v1/openapi.json.

Authentication

Send your key in the X-API-Key header. API keys are coming soon. Join the waitlist. GET /status and POST /report/{slug} need no key. Each address may send GET /status 60 requests every 60 s, and 1 report per service every 10 min; a report sent from another site’s page is refused with 403.

curl -H "X-API-Key: opensi_..." https://opensi.health/api/v1/services/{slug}

Endpoints

EndpointAccessReturns
GET /statusPublic, rate-limitedEvery service: headline status and the signals we have for it. measured is our own check: model calls, an API endpoint check or, for a service we cannot call, a check of its website
GET /services/{slug}API keyOne service with its models, uptime and open incident
GET /monitors/{id}/metrics?from&to&grain=1m|1h|1dAPI keyRollups. A from older than your plan’s history window is moved up to it
GET /incidents?service&from&toAPI keyIncidents with lead time
GET /drift/{monitor_id}API keyDrift score and trend of one model
POST /report/{slug}Public, per-IP limitCounts one problem report

Quotas

  • Free: no API keys
  • Pro: 10,000 calls a month, history window 90 days
  • Team: 200,000 calls a month, history window 365 days
  • Enterprise: unlimited calls, no plan limit on history

A request over quota answers 429. Minute figures are kept for a shorter time than hourly and daily ones, whatever the plan. Times are RFC 3339 in UTC. Errors use the shape {"error":{"message":"…"}}.

Badges and widgets

No key needed: /badge/{slug}.svg for a README, /embed/{slug} for an iframe, and /rss/incidents.xml for a feed. The badge is an image only: the snippet on each status page wraps it in a link back to that page.