Status API

Your status is also available as JSON and RSS, so you can show it in your own app, post it to chat or feed it to an internal dashboard. Both are public and need no API key: they show exactly what your status page shows.

Endpoints

Endpoint Returns
GET https://signalpost.services/{name}/api/status Your services as JSON
GET https://signalpost.services/{name}/feed.xml Your incidents as RSS 2.0

{name} is your page address, like acme. With a custom domain, use https://status.acme.com/api/status and https://status.acme.com/feed.xml.

JSON

curl https://signalpost.services/acme/api/status

The response is an array with one object per service on your page:

[
  {
    "Service": {
      "ID": 503,
      "Name": "API",
      "Protocol": "http",
      "CheckIntervalSecs": 60,
      "TimeoutSecs": 10,
      "Group": "Customer-Facing",
      "CreatedAt": "2026-08-11T09:00:00Z"
    },
    "LatestCheck": {
      "Status": "healthy",
      "ResponseTimeMs": 81,
      "CheckedAt": "2026-11-08T23:11:59Z"
    },
    "UptimePercentage": 99.97,
    "LatencyP50Ms": 128,
    "DailyChecks": [
      {
        "Date": "2026-10-02",
        "Status": "down",
        "UptimePercentage": 96.88,
        "DowntimePeriods": [
          { "start_time": "01:30", "end_time": "02:15", "start_ts": 1790904600, "end_ts": 1790907300, "duration_mins": 45, "status": "down" }
        ],
        "TotalDowntimeMins": 45,
        "TotalDegradedMins": 0,
        "P50Ms": 131
      }
    ],
    "Incidents": [
      { "ServiceID": 503, "Status": "down", "Start": "2026-10-02T01:30:00Z", "End": "2026-10-02T02:15:00Z" }
    ]
  }
]

Some fields are trimmed from this example. Use the names exactly as shown: most are PascalCase, while downtime periods use snake_case.

Service

Field Type Description
Service.ID integer Service ID
Service.Name string Name shown on your page
Service.Protocol string http or grpc
Service.CheckIntervalSecs integer Seconds between checks
Service.TimeoutSecs integer Seconds before a check fails
Service.Group string Group heading on your page, or empty
Service.CreatedAt string When the service was added (ISO 8601, UTC)
LatestCheck object or null The most recent check, or null before the first one
LatestCheck.Status string healthy, degraded or down
LatestCheck.ResponseTimeMs integer or null Response time in milliseconds
LatestCheck.CheckedAt string When the check ran (ISO 8601, UTC)
UptimePercentage number Uptime over the last 90 days
LatencyP50Ms integer or null Median response time over the last 24 hours
DailyChecks array One entry per day for 90 days, oldest first
Incidents array Incidents in the last 90 days, oldest first

Daily checks

Field Type Description
Date string YYYY-MM-DD (UTC)
Status string The day's worst incident: down, degraded, healthy, or unknown with no checks
UptimePercentage number Uptime that day
DowntimePeriods array or null That day's incidents
TotalDowntimeMins integer Minutes down
TotalDegradedMins integer Minutes degraded
P50Ms integer or null Median response time that day

Each downtime period has start_time and end_time (HH:MM UTC, or ongoing), start_ts and end_ts (Unix seconds, end_ts is null while ongoing), duration_mins and status (down or degraded).

Incidents

Field Type Description
ServiceID integer The affected service
Status string Worst status during the incident: down or degraded
Start string First failed check (ISO 8601, UTC)
End string or null First successful check after it, or null while ongoing

Errors

Status Meaning
404 Not Found No status page at that address

RSS

curl https://signalpost.services/acme/feed.xml

An RSS 2.0 feed with your 50 most recent incidents, newest first. Each item links to the incident on your status page. Feed readers and chat integrations (Slack, Microsoft Teams) can subscribe to it directly.