Runframe
API Reference

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 typeBase URLExample
Custom domainhttps://<status-page-domain>/api/v1/statushttps://health.runframe.io/api/v1/status
Shared Runframe status hosthttps://status.runframe.io/<slug>/api/v1/statushttps://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.

HeaderValue
Access-Control-Allow-Origin*
Access-Control-Allow-MethodsGET, OPTIONS

Throttling

Public status reads may be throttled to protect status page availability. Avoid polling more often than your integration needs.

Responses may include:

HeaderDescription
X-RateLimit-RemainingRequests remaining in the current window
X-RateLimit-ResetWindow reset timestamp
Retry-AfterSeconds to wait after a 429

Get Status Summary

GET /api/v1/status

Returns the page-level status summary.

curl https://health.runframe.io/api/v1/status

Response:

{
  "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/components

Returns the public component tree grouped by sections and component groups.

curl https://health.runframe.io/api/v1/status/components

Response:

{
  "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/incidents

Returns public incident history for the status page.

ParameterTypeDescription
limitintegerResults per page, max 50, default 20
cursorstringCursor from the previous response
statusstringopen, resolved, or all; default all
updates_limitintegerUpdates 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/unresolved

Returns only open public incidents. The response shape is the same as List Incidents.

ParameterTypeDescription
limitintegerResults per page, max 50, default 20
cursorstringCursor from the previous response
updates_limitintegerUpdates per incident, max 20, default 5; use 0 to omit updates
curl https://health.runframe.io/api/v1/status/incidents/unresolved

List Maintenance

GET /api/v1/status/maintenance

Returns scheduled and historical maintenance windows.

ParameterTypeDescription
limitintegerResults per page, max 50, default 20
cursorstringCursor from the previous response
statusstringscheduled, 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 statusCodeMeaning
400invalid_queryA query parameter such as cursor, status, or limit is invalid
404not_foundThe status page was not found, is not public, or the public API is not enabled for it
405Method not allowedOnly GET and OPTIONS are supported
429rate_limitedThe anonymous rate limit has been exceeded
503status_page_not_ready or public_keys_not_readyStatus page data is still being prepared

OpenAPI

The status page endpoints are included in the Runframe OpenAPI document under the Status Page tag.