Public endpoints

The visitor-facing surfaces a published status page exposes on its address: the rendered page, the live version fingerprint, status.json, the SVG badge, Atom and RSS feeds, and subscriptions.

A published status page exposes these unauthenticated surfaces on its address. None take an API key; access is governed by the page being published, not suspended, and not expired. Replace <your-address> with your custom domain or <slug>.status.hep.gg.

The rendered page

GEThttps://<your-address>/Public
Server-rendered public status page.

The status page itself: a mobile-friendly render with an overall status hero, a color legend, the component tree with 90-day uptime bars, active incidents, scheduled maintenance, and the incident history with published postmortems. When you allow subscriptions, a Subscribe button opens a small form with an Email tab and a Feeds tab.

Live auto-refresh

The rendered page refreshes itself when you change anything. It polls the version endpoint every 30 to 45 seconds (and when the tab regains focus) and reloads only when the fingerprint changes, so visitors who leave the tab open see new updates within about a minute.

Live version

GEThttps://<your-address>/status-version.jsonPublic
Cheap change fingerprint the page polls to auto-refresh.

A tiny opaque fingerprint of everything a visitor sees. Compare it for equality against your last-seen value; do not parse it.

200 response
{ "v": "mpsgxslc-13.mpsjyydk-1.mpsjxznk-2.mpsjxyvs" }

Status JSON

GEThttps://<your-address>/status.jsonPublic
Machine-readable status snapshot.

A compact JSON snapshot of the page for dashboards, bots, or your own integrations.

  • status.indicator is the worst component status; components lists each visible leaf component; incidents lists active incidents; scheduled_maintenances lists maintenance that is booked or under way.
  • version is the same fingerprint served by /status-version.json.
200 response
{
  "page": { "name": "Acme", "url": "https://status.acme.example" },
  "version": "mpsgxslc-13.mpsjyydk-1.mpsjxznk-2.mpsjxyvs",
  "status": { "indicator": "operational", "description": "All Systems Operational" },
  "components": [
    { "id": "c_api", "name": "API", "status": "operational", "label": "Online" }
  ],
  "incidents": [
    {
      "id": "i_123",
      "name": "Elevated API latency",
      "impact": "minor",
      "state": "monitoring",
      "startedAt": "2026-05-30T18:00:00.000Z",
      "latestUpdate": "We are monitoring the fix."
    }
  ],
  "scheduled_maintenances": [
    { "id": "i_124", "name": "Database upgrade", "impact": "none", "state": "scheduled", "scheduledFor": "2026-10-05T02:00:00.000Z", "scheduledUntil": "2026-10-05T03:00:00.000Z" }
  ]
}
curl
curl https://your-address.example/status.json

Status badge

GEThttps://<your-address>/badge.svgPublic
Embeddable SVG status badge.

A shields-style SVG badge showing the overall status, colored to match, cached for a minute.

Markdown
[![Status](https://your-address.example/badge.svg)](https://your-address.example)

Feeds

GEThttps://<your-address>/history.atomPublic
Atom feed of the latest 50 incident updates.
GEThttps://<your-address>/history.rssPublic
RSS feed of the latest 50 incident updates.

One entry per update, titled with the incident and its state, linking back to the page. The rendered page advertises the Atom feed with a <link rel="alternate"> tag, so feed readers find it from the page URL.

Subscriptions

When the page owner allows subscriptions, visitors can leave an email address through the page's Subscribe form. Hep.gg sends a confirmation link (double opt-in), and every email carries a one-click unsubscribe link. The form, the confirmation page and the unsubscribe page all live on the page's own address. Webhook and Discord channels are added by the page owner in the dashboard rather than by visitors.