Skip to content

Get a public status page

GET
/public/status-pages/{slug}
curl --request GET \
--url https://api.perstat.io/public/status-pages/example

Returns a published status page by slug with overall state, components, active incidents, and maintenance windows. Public pages need no authentication; protected pages answer 401 with a login_required marker instead of any page data. A renamed page may return a redirect hint pointing to its new slug.

slug
required
string
Media typeapplication/json
object
collapsed_groups
required

Gruppen-Namen, die initial eingeklappt dargestellt werden (Anzeige-Vorgabe; der Viewer kann sie manuell aufklappen).

Array<string>
components
required
Array<object>
object
bars
required

Status je Tag, alt → neu (Uptime-Balken).

Array<object>
object
impact_seconds
required

Akkumulierte Ausfall-/Beeinträchtigungsdauer des Tages in Sekunden (0 = keine).

integer format: int64
status
required

Passed | degraded | failed | unknown.

string
ts
required

Tagesbeginn (Unix-Sekunden, UTC).

integer format: int64
group
required

Effektive Gruppe (Override oder Projektname) — Sektions-Bündelung.

string
label
required
string
show_sparkline
required
boolean
show_uptime_bars
required
boolean
show_uptime_chart
required
boolean
sparkline
required

Ø-Antwortzeit (ms) je Tag, alt → neu (Sparkline).

Array<number>
status
required

Passed | degraded | failed | unknown.

string
uptime_pct

Uptime% im Anzeigefenster; null, wenn keine Daten.

number | null format: double
uptime_window_days
required

Effektives Fenster in Tagen (auf Tarif-Retention geklammert).

integer format: int32
description
string | null
has_logo
required

Ob ein Logo existiert (→ /public/status-pages/{slug}/logo).

boolean
has_logo_dark
required

Ob ein Dark-Mode-Logo existiert (→ /public/status-pages/{slug}/logo/dark). Die Public-SPA nutzt es im Dark-Theme, sonst Fallback aufs Standard-Logo.

boolean
header_nav
required

Header-Navigation (Label + URL).

Array<object>

Ein Navigationselement der Header-Bar.

object
href
required
string
label
required
string
headline

Optionaler Untertitel/Tagline.

string | null
incidents
required

Aktive + innerhalb des Fensters behobene Incidents (öffentlich sichtbar), offene zuerst. Leer, wenn keine.

Array<object>
object
component
required

Betroffene Komponente (Seiten-Label des Monitors).

string
id
required

Opake Incident-ID (Permalink/React-Key).

string
lifecycle_state
required

Detected|acknowledged|investigating|identified|monitoring|resolved.

string
postmortem
One of:
null
resolved_at
integer | null format: int64
severity
required

Critical | degraded (technische Schwere; steuert die Tönung).

string
started_at
required

Unix-Sekunden (UTC).

integer format: int64
status
required

Open | resolved.

string
summary
required

Optionale öffentliche Zusammenfassung (“” = keine).

string
updates
required

Öffentliche Timeline-Updates (älteste zuerst).

Array<object>
object
body
required
string
created_at
required

Unix-Sekunden (UTC).

integer format: int64
kind
required

Note | status.

string
state

Lebenszyklus-Phase, falls dieses Update eine Statusänderung war.

string | null
maintenances
required

Laufende + demnächst geplante Wartungsfenster, die Monitore dieser Seite betreffen. Leer, wenn keine.

Array<object>

Öffentlich sichtbares Wartungsfenster (für die Status-Seite).

object
body
required
string
components
required

Betroffene Komponenten (Seiten-Labels).

Array<string>
id
required
string
scheduled_end
required
integer format: int64
scheduled_start
required

Unix-Sekunden (UTC).

integer format: int64
title
required
string
name
required

Öffentlicher Titel = der Seitenname (prominentes Editor-Feld).

string
overall
required

Gesamtstatus = schlechtester Komponenten-Status.

string
redirect_slug

Gesetzt, wenn der angefragte Slug ein reservierter Alt-Slug ist: die SPA leitet dann hart auf <redirect_slug>.perstat.io um.

string | null
subscriptions_enabled
required

Ob die Org dieser Seite Statusseiten-Abonnements anbieten darf (Tarif-Cap monitor.status_page_subscribers). Die Public-SPA blendet das Abo-Formular nur dann ein. Der Subscribe-Endpoint gated zusätzlich serverseitig.

boolean
vantage_points
required

Aktive Prüf-Standorte (PoPs) der Plattform für die „Geprüft aus“-Transparenz (ADR-0010). Global (kein Tenant-Bezug); leer, wenn keine bekannten Standorte.

Array<object>

Aktiver Vantage-Point für die „Geprüft aus“-Transparenz auf der öffentlichen Statusseite (ADR-0010). Trägt NUR den Kontinent-Key — Produkt-Entscheid 2026-06-24: keine PoP-/Städtenamen mehr im Frontend, „nur Region (=Kontinent)“. Clients lokalisieren über region.<continent>.

object
continent
required
string
white_label
required

EFFEKTIVES White-Label dieser Seite: Tarif-Cap monitor.white_label (ab Command) UND Per-Seite-Toggle hide_datargo_brand. Blendet „Powered by Perstat“ aus; die Public-SPA versteckt den Footer-Hinweis.

boolean
Examplegenerated
{
"collapsed_groups": [
"example"
],
"components": [
{
"bars": [
{
"impact_seconds": 1,
"status": "example",
"ts": 1
}
],
"group": "example",
"label": "example",
"show_sparkline": true,
"show_uptime_bars": true,
"show_uptime_chart": true,
"sparkline": [
1
],
"status": "example",
"uptime_pct": 1,
"uptime_window_days": 1
}
],
"description": "example",
"has_logo": true,
"has_logo_dark": true,
"header_nav": [
{
"href": "example",
"label": "example"
}
],
"headline": "example",
"incidents": [
{
"component": "example",
"id": "example",
"lifecycle_state": "example",
"postmortem": {
"impact": "example",
"lessons": "example",
"published_at": 1,
"root_cause": "example",
"summary": "example"
},
"resolved_at": 1,
"severity": "example",
"started_at": 1,
"status": "example",
"summary": "example",
"updates": [
{
"body": "example",
"created_at": 1,
"kind": "example",
"state": "example"
}
]
}
],
"maintenances": [
{
"body": "example",
"components": [
"example"
],
"id": "example",
"scheduled_end": 1,
"scheduled_start": 1,
"title": "example"
}
],
"name": "example",
"overall": "example",
"redirect_slug": "example",
"subscriptions_enabled": true,
"vantage_points": [
{
"continent": "example"
}
],
"white_label": true
}

Private Seite: {error:“login_required”, name, has_logo, has_logo_dark}