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 RSSGET /history.atom- the same as AtomGET /feed.rss- an alias ofhistory.rss
These carry resolved incidents too, so they are the right source for history.
Status badge
GET /badge.svg returns an SVG badge for a README or a docs page. Without parameters it shows the overall status of the page:
[](https://acme.loadfoc.us)
Add component=<id> to badge one component instead. The id is the one /data lists for that component, and metric picks what the badge says:
metric=status(default): the component name and its current status.metric=uptime: its uptime percentage. Adddays=30ordays=90; without it the page's history window is used. Green from 99.9%, amber from 99%, red below.metric=latency: its average response time over the last 24 hours. Green under 500 ms, amber under 1500 ms.logo=1: adds the LoadFocus mark on the left, on any of the variants above.

An unknown component id renders a grey "not found" badge rather than an error, so a mistyped snippet never shows a broken image. Badges are cached for 60 seconds and are not served for password-protected or IP-restricted pages.
shields.io styles
GET /badge.json returns the same badge in the shields.io endpoint format, with the same parameters, so any shields style works:

The query string inside url= must be URL-encoded: ? as %3F, & as %26 and = as %3D.
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.
Related
Migrating from Atlassian Statuspage
If you are moving from Atlassian Statuspage, two endpoints mirror its schema, so most existing integrations keep working with only the host changed:
/api/v2/status.json- overall page status/api/v2/summary.json- status, components, unresolved incidents and upcoming maintenance
LoadFocus does not serve Statuspage's components.json or incidents.json. Everything
those return is already inside summary.json.
See also the Statuspage alternative comparison.