Status Page API, RSS Feeds and Status Badge

What your status page exposes

Every LoadFocus status page serves machine-readable endpoints alongside the human page. They need no authentication, they are rate limited per IP, and they are cached for 30 seconds.

The JSON endpoints follow the Statuspage schema, which is the de-facto shape most dashboards, bots and Slack integrations already speak. If you are moving from Atlassian Statuspage, existing integrations pointed at the new host keep working without code changes.

All paths below are relative to your page: https://your-slug.loadfoc.us, or your own hostname if you have set up a custom domain.

GET /api/v2/status.json

The overall state, and nothing else. Use this for a lightweight poll.

{
"page": {
"id": "8f3c1e02-5b74-4a9d-9e21-6c0af7d3b514",
"name": "Acme Status",
"url": "https://acme.loadfoc.us",
"time_zone": "Etc/UTC",
"updated_at": "2026-08-26T14:05:00.000Z"
},
"status": {
"indicator": "none",
"description": "All Systems Operational"
}
}

indicator is one of none, minor, major, critical or maintenance.

Note that when the page has no fresh data, the indicator is reported as minor rather than none. A dead worker should never read as confident green over the API.

GET /api/v2/summary.json

Everything the page shows: overall status, every component, unresolved incidents and upcoming or in-progress maintenance.

{
"page": { "id": "8f3c1e02-5b74-4a9d-9e21-6c0af7d3b514", "name": "Acme Status", "url": "https://acme.loadfoc.us", "time_zone": "Etc/UTC", "updated_at": "2026-08-26T14:05:00.000Z" },
"status": { "indicator": "minor", "description": "Degraded Performance" },
"components": [
{
"id": "api",
"name": "Public API",
"status": "degraded_performance",
"position": 1,
"description": null,
"updated_at": "2026-08-26T14:05:00.000Z"
}
],
"incidents": [
{
"id": "inc_1a2b",
"name": "Elevated API latency",
"status": "identified",
"impact": "minor",
"created_at": "2026-08-26T13:40:00.000Z",
"updated_at": "2026-08-26T14:02:00.000Z",
"monitoring_at": null,
"resolved_at": null,
"shortlink": "https://acme.loadfoc.us/incidents/inc_1a2b",
"incident_updates": [
{ "status": "identified", "body": "A slow query has been identified.", "created_at": "2026-08-26T14:02:00.000Z" }
]
}
],
"scheduled_maintenances": [
{
"id": "mnt_9x8y",
"name": "Database upgrade",
"status": "scheduled",
"impact": "maintenance",
"scheduled_for": "2026-08-28T22:00:00.000Z",
"scheduled_until": "2026-08-29T00:00:00.000Z",
"incident_updates": []
}
]
}

components[].status is one of operational, degraded_performance, partial_outage, major_outage or under_maintenance.

incidents contains only unresolved incidents, and scheduled_maintenances only windows that have not finished. Both mirror Statuspage behaviour. For resolved history, use the feeds below.

Error behaviour

Both JSON endpoints answer HTTP 200 with an empty shape if something goes wrong internally, rather than a 5xx. A consumer should therefore treat an empty components array as "no data available", not as "no components configured".

Incident feeds

For readers and bots that follow feeds rather than poll JSON:

  • GET /history.rss - incident history as RSS
  • GET /history.atom - the same as Atom
  • GET /feed.rss - an alias of history.rss

These carry resolved incidents too, so they are the right source for history.

Status badge

GET /badge.svg returns an SVG badge reflecting current overall status. It is designed to be embedded in a README or a docs page:

[![Status](https://acme.loadfoc.us/badge.svg)](https://acme.loadfoc.us)

Search visibility

Status pages are indexable by default. A page created in the app stores hideFromSearch: false, so it serves no noindex, its robots.txt returns Allow: / with a Sitemap: line, and /sitemap.xml lists the page, its incidents and its maintenance history.

To hide a page from search, set hideFromSearch to true on it. The page then serves <meta name="robots" content="noindex,follow">, robots.txt returns Disallow: /, /sitemap.xml returns 404, and the canonical and Open Graph tags are suppressed so the page does not advertise itself. There is no control for this in the editor: set it through the API.