Badges, feeds and metrics
Embeddable SVG badges, RSS and Atom feeds, and the Prometheus exposition.
Embed a live badge in a README, let visitors follow incidents through RSS or Atom, or scrape metrics with Prometheus. All three endpoints are public. Badges and feeds are on by default; Prometheus must be enabled in the config.
Embed a badge
Badges are enabled by metrics.badges (default true).
| Query | Values | Default |
|---|---|---|
metric | status, uptime, latency | status |
period | 24h, 7d, 30d, 90d | 24h (uptime only) |
label | any string | the monitor name, or status |
overall is reserved for the page-level state. Percent-encode names with
spaces: /badge/Web%20App.svg.
| Response | When |
|---|---|
200 | SVG, cache-control: public, max-age=60. |
400 | Unknown metric or period, or invalid percent-encoding. |
404 | Unknown monitor, a path not ending in .svg, or badges off. |
Colours follow the value: green at or above 99.9% uptime (or healthy), amber at or above 95% (or degraded), red below, grey when there is no data.
The one-minute cache is deliberate: badges are embedded in third-party READMEs, and without it every page view would become a database read.
Follow incidents with RSS or Atom
Feeds are enabled by incidents.enabled (default true).
Both publish the newest 50 incidents — feeds are public and unauthenticated, so they serve a bounded window rather than a history that only grows.
Entries link to the #incident-<id> anchor that every bundled theme renders,
so a reader lands on the incident itself. Absolute URLs come from siteUrl,
falling back to the request origin — set siteUrl before publishing, or a
feed behind a proxy will advertise the wrong host.
Build the same XML yourself from any incident list:
Scrape Prometheus metrics
Enable this endpoint with metrics.prometheus (default false).
Served as text/plain; version=0.0.4; charset=utf-8.
| Metric | Labels |
|---|---|
heyo_status_up | monitor, type, group |
heyo_status_latency_milliseconds | monitor, type, group |
heyo_status_uptime_ratio | monitor, period |
heyo_status_last_check_timestamp_seconds | monitor |
heyo_status_overall | state |
heyo_status_monitors | — |
heyo_status_active_incidents | — |
heyo_status_scheduled_maintenances | — |
heyo_status_snapshot_timestamp_seconds | — |
Only aggregate, already-public data is exposed: no incident content, no monitor targets, nothing from a private monitor.
If a scrape endpoint should not be world-readable, leave
prometheus: false and expose the same numbers behind your own
gateway with createPrometheusMetrics(), or restrict the path at
the edge.
Health
Answers whether the status API is serving. It does not read the database and does not reflect monitor state.