Ionhour Docs
Integrations

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.

MethodPathMin rolePurpose
GET/v1/status-pagesviewerList the workspace's status pages.
GET/v1/status-pages/:id/summaryviewerAuthenticated status summary (works for private pages).
GET/v1/status-pages/:id/announcementsviewerList announcements on a page.
POST/v1/status-pages/:id/announcementsadminPost an announcement.
POST/v1/status-pages/:id/announcements/:announcementId/updatesadminAdd an update to an announcement.
PATCH/v1/status-pages/:id/announcements/:announcementIdadminEdit 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/summary

The 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

FieldTypeRequiredNotes
titlestringYesMax 255 chars.
statusstringNoINVESTIGATING, IDENTIFIED, MONITORING, or RESOLVED.
impactstringNoNONE, MINOR, MAJOR, or CRITICAL.
messagestringNoThe first update shown on the page timeline (max 5000 chars).
componentIdsnumber[]NoComponents 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

FieldTypeRequiredNotes
statusstringYesINVESTIGATING, IDENTIFIED, MONITORING, or RESOLVED.
messagestringYesThe 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.

FieldTypeNotes
titlestringMax 255 chars.
statusstringSetting RESOLVED resolves the announcement.
impactstringNONE, MINOR, MAJOR, or CRITICAL.
componentIdsnumber[]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"