Status Pages
Read authenticated status summaries and post announcements that fan out to your status-page subscribers.
The status-page endpoints let an external system read a workspace's status pages and post announcements to them. They require an ionh_ key scoped to the mcp:status_pages resource (or an unrestricted key). All routes are under https://api.ionhour.com/api/v1.
| Method | Path | Min role | Purpose |
|---|---|---|---|
GET | /v1/status-pages | viewer | List the workspace's status pages. |
GET | /v1/status-pages/:id/summary | viewer | Authenticated status summary (works for private pages). |
GET | /v1/status-pages/:id/announcements | viewer | List announcements on a page. |
POST | /v1/status-pages/:id/announcements | admin | Post an announcement. |
POST | /v1/status-pages/:id/announcements/:announcementId/updates | admin | Add an update to an announcement. |
PATCH | /v1/status-pages/:id/announcements/:announcementId | admin | Edit or resolve an announcement. |
:id accepts either a numeric page id or a slug. A numeric id resolves any page in the workspace; a slug resolves only enabled pages. To reach a disabled page, use its numeric id.
List pages
GET /v1/status-pages returns the workspace's pages in the standard paginated envelope. Each item is a summary:
{
"items": [
{ "id": 12, "slug": "acme", "name": "Acme Status", "visibility": "PUBLIC" }
],
"total": 1,
"page": 1,
"itemCount": 1,
"pageCount": 1,
"limit": 25
}visibility is PUBLIC, PASSWORD_PROTECTED, or PRIVATE.
Read a status summary
GET /v1/status-pages/:id/summary returns the same document the public status page renders — overall status, component groups, active incidents, scheduled maintenances, announcements, and dependencies — but authenticated, so it works for PRIVATE and PASSWORD_PROTECTED pages of the key's workspace (no page password required).
curl -H "Authorization: Bearer ionh_your_api_key" \
https://api.ionhour.com/api/v1/status-pages/acme/summaryThe response is a rich document. The fields most integrations read:
{
"name": "Acme Status",
"slug": "acme",
"overallStatus": "OPERATIONAL",
"componentGroups": [
{
"key": "grp:API",
"groupName": "API",
"components": [ { "name": "REST API", "status": "OPERATIONAL" } ]
}
],
"activeIncidents": [],
"announcements": [],
"scheduledMaintenances": [],
"dependencies": []
}overallStatus and component status values are OPERATIONAL, DEGRADED_PERFORMANCE, PARTIAL_OUTAGE, MAJOR_OUTAGE, or UNDER_MAINTENANCE. The document also carries branding and page-configuration blocks; treat any field you don't consume as additive.
Post an announcement
POST /v1/status-pages/:id/announcements
| Field | Type | Required | Notes |
|---|---|---|---|
title | string | Yes | Max 255 chars. |
status | string | No | INVESTIGATING, IDENTIFIED, MONITORING, or RESOLVED. |
impact | string | No | NONE, MINOR, MAJOR, or CRITICAL. |
message | string | No | The first update shown on the page timeline (max 5000 chars). |
componentIds | number[] | No | Components this announcement affects. |
Posting an announcement notifies the page's subscribers and pushes a real-time update to anyone viewing the page.
curl -X POST https://api.ionhour.com/api/v1/status-pages/acme/announcements \
-H "Authorization: Bearer ionh_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"title": "Degraded API performance",
"status": "INVESTIGATING",
"impact": "MINOR",
"message": "We are investigating elevated error rates on the REST API.",
"componentIds": [45]
}'const res = await fetch(
'https://api.ionhour.com/api/v1/status-pages/acme/announcements',
{
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.IONHOUR_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
title: 'Degraded API performance',
status: 'INVESTIGATING',
impact: 'MINOR',
message: 'We are investigating elevated error rates on the REST API.',
componentIds: [45],
}),
},
);
if (!res.ok) throw new Error(`Ionhour ${res.status}: ${await res.text()}`);
const announcement = await res.json();import os, requests
res = requests.post(
"https://api.ionhour.com/api/v1/status-pages/acme/announcements",
headers={"Authorization": f"Bearer {os.environ['IONHOUR_API_KEY']}"},
json={
"title": "Degraded API performance",
"status": "INVESTIGATING",
"impact": "MINOR",
"message": "We are investigating elevated error rates on the REST API.",
"componentIds": [45],
},
timeout=10,
)
res.raise_for_status()
announcement = res.json()The call returns the announcement, including its publicId, status, impact, componentIds, and any updates:
{
"id": 88,
"publicId": "ann_9f2c",
"statusPageId": 12,
"title": "Degraded API performance",
"status": "INVESTIGATING",
"impact": "MINOR",
"resolvedAt": null,
"createdAt": "2026-07-10T14:20:00.000Z",
"componentIds": [45],
"updates": [
{
"id": 301,
"status": "INVESTIGATING",
"body": "We are investigating elevated error rates on the REST API.",
"createdAt": "2026-07-10T14:20:00.000Z"
}
]
}Add an update
As the incident progresses, append timeline updates. POST /v1/status-pages/:id/announcements/:announcementId/updates
| Field | Type | Required | Notes |
|---|---|---|---|
status | string | Yes | INVESTIGATING, IDENTIFIED, MONITORING, or RESOLVED. |
message | string | Yes | The update text (max 5000 chars). |
curl -X POST \
https://api.ionhour.com/api/v1/status-pages/acme/announcements/88/updates \
-H "Authorization: Bearer ionh_your_api_key" \
-H "Content-Type: application/json" \
-d '{ "status": "IDENTIFIED", "message": "Root cause found — a bad deploy." }'Edit or resolve
PATCH /v1/status-pages/:id/announcements/:announcementId performs a partial update.
| Field | Type | Notes |
|---|---|---|
title | string | Max 255 chars. |
status | string | Setting RESOLVED resolves the announcement. |
impact | string | NONE, MINOR, MAJOR, or CRITICAL. |
componentIds | number[] | Replaces the affected-components set. |
PATCH does not accept a message. Timeline text belongs to the updates route — post a RESOLVED update to leave a closing note while resolving.
curl -X PATCH \
https://api.ionhour.com/api/v1/status-pages/acme/announcements/88 \
-H "Authorization: Bearer ionh_your_api_key" \
-H "Content-Type: application/json" \
-d '{ "status": "RESOLVED" }'List announcements
GET /v1/status-pages/:id/announcements returns the standard paginated envelope. Filter with status=open or status=resolved, and page with page / limit.
curl -H "Authorization: Bearer ionh_your_api_key" \
"https://api.ionhour.com/api/v1/status-pages/acme/announcements?status=open"