← ChangelogBreaking

Status pages: Statuspage-compatible API v2, a widget, badges and an incident archive

2026.10.14-api-status
The Forumulate team
3 min read
apistatus

Public status routes below sit under /public/orgs/{orgId}/spaces/{spaceId}/status. A status page also serves each one at its own address (/st/{org}/{space}/… or your domain), with CORS and Cross-Origin-Resource-Policy: cross-origin, so a tool on another origin can read them.

Changed

summary.json lists maintenance under scheduled_maintenances. Maintenance windows are no longer in incidents. They are in their own array, scheduled_maintenances, which holds every window that has not completed. incidents now holds only open incidents. A poller that read maintenance out of incidents must read scheduled_maintenances instead. summary.json also gains Statuspage's id, position, group_id, impact, shortlink and incident_updates fields, plus page.id, page.time_zone and page.updated_at. Components keep our state words (degraded, maintenance, unknown).

Incidents take components, times and an audience. On create and PATCH:

  • components: [{monitorId, impact}] names what an incident affects. A component from another space answers 422.

  • startedAt / resolvedAt record when it really happened. Both are clamped to the server clock.

  • audience limits who can see it.

Severity gains notice, which paints no day on the bars. Maintenance has its own states, Scheduled → In progress → Verifying → Completed, with autoStart / autoComplete.

Added

Statuspage-compatible api/v2. …/status/api/v2/ serves summary.json, status.json, components.json, incidents.json, incidents/unresolved.json, scheduled-maintenances.json, scheduled-maintenances/upcoming.json and scheduled-maintenances/active.json. They use Statuspage's words (operational, degraded_performance, partial_outage, major_outage, under_maintenance), and groups appear as group entries. One exception to Statuspage's vocabulary: a component nothing has measured yet reads unknown, not operational. We will not report a measurement we do not have. Tools built for a Statuspage page can point at a Forumulate one.

An embeddable widget. …/status/widget.js is a small script you can drop on any site. It shows a dismissible notice only while an incident or maintenance window is open, and polls every two minutes. It builds its DOM without innerHTML, so it runs under a strict host CSP. Placement and look come from theme.status.widget or data-* attributes. …/status/widget.json is the same data as JSON, for drawing your own banner.

Badges. …/status/badge.svg takes style=uptime|status, theme=light|dark, size=s|m|l and component=<slug or id> for a single component. With no options it draws the same badge as before.

An incident archive. GET …/status/incidents pages back through every incident and maintenance window. It takes the cursor before, plus since, limit (≤100), component, kind and scope=past|upcoming, and answers nextBefore and oldestAt. GET …/status/incidents/{id} returns one incident with its updates and affected components. Feeds, maintenance.ics and notification emails now link to each incident's own page.

Response times and custom metrics. GET …/status/latency?range=24h|7d|30d gives p50/p95 response times per component, worked out from your checks. GET …/status/metrics gives your custom series. Write a series with PUT /orgs/{orgId}/spaces/{spaceId}/status/metrics/{key}, then push to it with POST …/metrics/{key}/points: one point, or up to 500 at a time. A personal access token can push.

More public reads.

  • …/status/day.json: one day, hour by hour.

  • …/status/siblings: the org's other status pages.

  • atom.xml and feed.json, beside rss.xml. All three take ?component= and ?severity=.

Incident templates. You can save an incident as a template. CRUD is at /orgs/{orgId}/spaces/{spaceId}/status/templates, and POST …/templates/{id}/incidents opens an incident from a template.

Webhooks. status.incident.created, status.incident.updated and status.incident.resolved. Automations can use them as triggers too.

Component kinds. Besides your own checks and manual components, a component can roll up another status page in the org (space) or mirror a vendor's public Statuspage (statuspage). Components also take a region.