Reading needs
monitoring.manage, proxy.manage or incidents.manage; changing needs
monitoring.manage. Creating, editing and updating incidents also accepts incidents.manage
(the built-in Helpdesk role); deleting one doesn’t. On a DNZ
secondary following a primary, changes are refused: manage monitors on the primary.Endpoints
A monitor
Answers add
status (up, degraded, down, unknown, paused), state_since, checked_at,
latency_ms, status_code, error, recent ([unix seconds, ms or null], newest last), days
(90 days: checks, down, degraded, uptime, latency_ms, level, incidents, and filled: how many of the checks stand for time DNZ wasn’t checking, filled in by incidents), uptime_24h,
uptime_7d, uptime_30d, uptime_90d, avg_latency_ms and open_incident.
A check (/check, /test) answers {"ok": true, "slow": false, "latency_ms": 42, "status_code": 200, "error": ""}.
An incident
impact is minor, major, critical or maintenance; status is investigating,
identified, monitoring or resolved; message is the first update.
Written afterwards, it takes started_at, resolved_at (it is then resolved) and at (the first
update’s time; default: when it was resolved, else now), or gap (a gap’s id: its times unless
given). Times are RFC 3339 or a wall-clock time on the server’s clock (2026-11-01 13:04, what a
datetime-local field sends), never in the future (up to 2 minutes ahead counts as now), and in
order: started, updates, resolved; else 400 says which. The newest update sets the status; an at
before it fills in the timeline and leaves the status as it is (not as resolved). Answers add automatic,
cause (what a failing check saw, never on the public page), resolved_at, duration_secs and
updates (newest first: status, message, at, author; an empty author is DNZ).
The public page’s settings
The page as JSON
/status.json carries what the public page shows, for scripts and widgets, and nothing more. It
needs no sign-in, answers with Access-Control-Allow-Origin: *, and a page that is off answers 404.