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
| Endpoint | Access | Returns |
|---|---|---|
| GET /status | Public, rate-limited | Every 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 key | One service with its models, uptime and open incident |
| GET /monitors/{id}/metrics?from&to&grain=1m|1h|1d | API key | Rollups. A from older than your plan’s history window is moved up to it |
| GET /incidents?service&from&to | API key | Incidents with lead time |
| GET /drift/{monitor_id} | API key | Drift score and trend of one model |
| POST /report/{slug} | Public, per-IP limit | Counts 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.