Status Pages
Public Runframe V1 status page API for external status aggregators, dashboards, and monitoring tools.
Expose public status page data to external tools without scraping the hosted status page HTML.
The status page API is public and read-only. It does not require an API key, and every operation explicitly bypasses the authenticated Runframe V1 API security model.
Base URLs
Use the same host as the public status page you want to read. health.runframe.io is an example for Runframe's own status page; customer status pages use their own custom domain or shared-host slug.
| Status page type | Base URL | Example |
|---|---|---|
| Custom domain | https://<status-page-domain>/api/v1/status | https://health.runframe.io/api/v1/status |
| Shared Runframe status host | https://status.runframe.io/<slug>/api/v1/status | https://status.runframe.io/runframe/api/v1/status |
https://status.runframe.io/api/v1/status without a status page slug does not resolve to a page.
The public status page API is available for enabled public status pages. During rollout, some pages may return 404 until the API is enabled for that status page.
Authentication
No authentication is required.
Do not send an Authorization header. Public status endpoints are intended for external consumers such as IncidentHub, status aggregators, customer dashboards, and monitoring tools.
Response Envelope
Successful responses use the standard Runframe envelope:
{
"success": true,
"data": { },
"meta": {
"request_id": "req_1770000000000_ab12cd34",
"timestamp": "2026-05-13T10:30:00.000Z"
}
}Errors use:
{
"error": {
"code": "not_found",
"message": "Status page not found"
},
"meta": {
"request_id": "req_1770000000000_ab12cd34",
"timestamp": "2026-05-13T10:30:00.000Z"
}
}CORS
Status page API responses are CORS-accessible from browsers.
| Header | Value |
|---|---|
Access-Control-Allow-Origin | * |
Access-Control-Allow-Methods | GET, OPTIONS |
Throttling
Public status reads may be throttled to protect status page availability. Avoid polling more often than your integration needs.
Responses may include:
| Header | Description |
|---|---|
X-RateLimit-Remaining | Requests remaining in the current window |
X-RateLimit-Reset | Window reset timestamp |
Retry-After | Seconds to wait after a 429 |
Get Status Summary
GET /api/v1/statusReturns the page-level status summary.
curl https://health.runframe.io/api/v1/statusResponse:
{
"success": true,
"data": {
"page": {
"name": "Runframe System Health",
"url": "https://health.runframe.io"
},
"status": "operational",
"updated_at": "2026-05-13T10:30:00.000Z",
"active_incident_count": 0,
"active_maintenance_count": 0
},
"meta": {
"request_id": "req_1770000000000_ab12cd34",
"timestamp": "2026-05-13T10:30:00.000Z"
}
}List Components
GET /api/v1/status/componentsReturns the public component tree grouped by sections and component groups.
curl https://health.runframe.io/api/v1/status/componentsResponse:
{
"success": true,
"data": {
"sections": [
{
"section_id": "sec_Q7K2MNPQ8R",
"name": "Core Services",
"components": [
{
"component_id": "cmp_K7M4Q9TZ2H",
"name": "Web App",
"status": "operational",
"updated_at": "2026-05-13T10:30:00.000Z"
}
],
"groups": []
}
]
},
"meta": {
"request_id": "req_1770000000000_ab12cd34",
"timestamp": "2026-05-13T10:30:00.000Z"
}
}Component status values are operational, degraded_performance, partial_outage, major_outage, and maintenance.
List Incidents
GET /api/v1/status/incidentsReturns public incident history for the status page.
| Parameter | Type | Description |
|---|---|---|
limit | integer | Results per page, max 50, default 20 |
cursor | string | Cursor from the previous response |
status | string | open, resolved, or all; default all |
updates_limit | integer | Updates per incident, max 20, default 5; use 0 to omit updates |
curl "https://health.runframe.io/api/v1/status/incidents?status=all&limit=20"Response:
{
"success": true,
"data": {
"incidents": [
{
"incident_id": "inc_Q7K2MNPQ8R",
"title": "Elevated API error rate",
"status": "monitoring",
"impact": "minor",
"started_at": "2026-05-13T09:10:00.000Z",
"resolved_at": null,
"updated_at": "2026-05-13T09:45:00.000Z",
"updates": [
{
"status": "monitoring",
"body": "Error rates have returned to normal and we are monitoring.",
"published_at": "2026-05-13T09:45:00.000Z"
}
],
"affected_components": [
{
"component_id": "cmp_K7M4Q9TZ2H",
"name": "API"
}
]
}
],
"next_cursor": null
},
"meta": {
"request_id": "req_1770000000000_ab12cd34",
"timestamp": "2026-05-13T10:30:00.000Z"
}
}Incident status values are investigating, identified, monitoring, and resolved.
Impact values are none, minor, major, and critical.
List Unresolved Incidents
GET /api/v1/status/incidents/unresolvedReturns only open public incidents. The response shape is the same as List Incidents.
| Parameter | Type | Description |
|---|---|---|
limit | integer | Results per page, max 50, default 20 |
cursor | string | Cursor from the previous response |
updates_limit | integer | Updates per incident, max 20, default 5; use 0 to omit updates |
curl https://health.runframe.io/api/v1/status/incidents/unresolvedList Maintenance
GET /api/v1/status/maintenanceReturns scheduled and historical maintenance windows.
| Parameter | Type | Description |
|---|---|---|
limit | integer | Results per page, max 50, default 20 |
cursor | string | Cursor from the previous response |
status | string | scheduled, in_progress, completed, cancelled, or all; default all |
curl "https://health.runframe.io/api/v1/status/maintenance?status=all&limit=20"Response:
{
"success": true,
"data": {
"maintenance": [
{
"maintenance_id": "mnt_Q7K2MNPQ8R",
"title": "Database maintenance",
"status": "scheduled",
"scheduled_start": "2026-05-14T01:00:00.000Z",
"scheduled_end": "2026-05-14T02:00:00.000Z",
"updated_at": "2026-05-13T10:30:00.000Z",
"affected_components": [
{
"component_id": "cmp_K7M4Q9TZ2H",
"name": "API"
}
]
}
],
"next_cursor": null
},
"meta": {
"request_id": "req_1770000000000_ab12cd34",
"timestamp": "2026-05-13T10:30:00.000Z"
}
}Error Codes
| HTTP status | Code | Meaning |
|---|---|---|
400 | invalid_query | A query parameter such as cursor, status, or limit is invalid |
404 | not_found | The status page was not found, is not public, or the public API is not enabled for it |
405 | Method not allowed | Only GET and OPTIONS are supported |
429 | rate_limited | The anonymous rate limit has been exceeded |
503 | status_page_not_ready or public_keys_not_ready | Status page data is still being prepared |
OpenAPI
The status page endpoints are included in the Runframe OpenAPI document under the Status Page tag.