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.