Status Pages API
Create, configure, and manage status pages, components, announcements, and public feeds.
Status pages let you communicate service health to your users. Each status page has a unique slug, configurable components, and public endpoints for RSS feeds, badges, and real-time event streams.
List Status Pages
GET /status-pagesReturns all status pages in the workspace.
Query Parameters
| Parameter | Type | Description |
|---|---|---|
workspaceId | number | Filter by workspace |
Example
curl -H "Authorization: Bearer ionh_your_key" \
"https://api.ionhour.com/api/status-pages?workspaceId=1"Get Status Page
GET /status-pages/:idReturns a single status page with its components.
curl -H "Authorization: Bearer ionh_your_key" \
https://api.ionhour.com/api/status-pages/1Create Status Page
POST /status-pagesRequest Body
| Field | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Page name (max 255 characters) |
slug | string | Yes | URL slug (max 128 characters, lowercase letters, numbers, and hyphens only) |
visibility | string | No | PUBLIC (default), PASSWORD_PROTECTED, or PRIVATE |
password | string | No | Required when visibility is PASSWORD_PROTECTED |
logoUrl | string | No | URL of the logo to display |
primaryColor | string | No | Primary brand color (hex) |
backgroundColor | string | No | Page background color (hex) |
faviconUrl | string | No | URL of the favicon |
showUptimeHistory | boolean | No | Show uptime history bars (default: true) |
uptimeHistoryDays | number | No | Number of days to show in uptime history (1--365, default: 90) |
showIncidentHistory | boolean | No | Show past incidents on the page (default: true) |
headerHtml | string | No | Custom HTML injected into the page header (max 10,000 characters) |
footerHtml | string | No | Custom HTML injected into the page footer (max 10,000 characters) |
Example
curl -X POST https://api.ionhour.com/api/status-pages \
-H "Authorization: Bearer ionh_your_key" \
-H "Content-Type: application/json" \
-d '{
"name": "Acme Status",
"slug": "acme-status",
"visibility": "PUBLIC",
"primaryColor": "#4A90D9",
"showUptimeHistory": true,
"uptimeHistoryDays": 90
}'Update Status Page
PATCH /status-pages/:idAccepts the same fields as creation, plus:
| Field | Type | Description |
|---|---|---|
enabled | boolean | Enable or disable the status page |
customDomain | string | Custom domain for the status page (e.g., status.example.com) |
Only include fields you want to change.
curl -X PATCH https://api.ionhour.com/api/status-pages/1 \
-H "Authorization: Bearer ionh_your_key" \
-H "Content-Type: application/json" \
-d '{
"customDomain": "status.example.com",
"enabled": true
}'Delete Status Page
DELETE /status-pages/:idDeletes the status page and all its components and announcements.
curl -X DELETE https://api.ionhour.com/api/status-pages/1 \
-H "Authorization: Bearer ionh_your_key"Verify Custom Domain
POST /status-pages/:id/verify-domainVerifies that the custom domain's DNS is correctly configured. You must set a CNAME record pointing your custom domain to status.ionhour.com before calling this endpoint.
curl -X POST https://api.ionhour.com/api/status-pages/1/verify-domain \
-H "Authorization: Bearer ionh_your_key"Check Slug Availability
GET /status-pages/check-slugCheck whether a slug is available before creating a status page.
Query Parameters
| Parameter | Type | Description |
|---|---|---|
slug | string | The slug to check |
Example
curl -H "Authorization: Bearer ionh_your_key" \
"https://api.ionhour.com/api/status-pages/check-slug?slug=acme-status"Response
{ "isAvailable": true }Components
Components represent the individual services displayed on a status page. Each component is linked to a check, project, or dependency.
List Components
GET /status-pages/:id/componentsReturns all components for the status page, ordered by position.
curl -H "Authorization: Bearer ionh_your_key" \
https://api.ionhour.com/api/status-pages/1/componentsAdd Component
POST /status-pages/:id/componentsRequest Body
| Field | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Component display name (max 255 characters) |
description | string | No | Short description of the component |
groupName | string | No | Group label for visual grouping (max 128 characters) |
position | number | No | Display order (default: 0) |
showUptimeBar | boolean | No | Show uptime history bar for this component (default: true) |
checkId | number | Conditional | Link to a check |
projectId | number | Conditional | Link to a project |
dependencyId | number | Conditional | Link to a dependency |
Exactly one of checkId, projectId, or dependencyId is required. A component must be linked to a single monitoring source.
curl -X POST https://api.ionhour.com/api/status-pages/1/components \
-H "Authorization: Bearer ionh_your_key" \
-H "Content-Type: application/json" \
-d '{
"name": "API Gateway",
"groupName": "Core Services",
"checkId": 42,
"position": 1,
"showUptimeBar": true
}'Reorder Components
PATCH /status-pages/:id/components/reorderReorders all components in a single request. Pass the component IDs in the desired display order.
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
componentIds | number[] | Yes | Ordered array of component IDs |
curl -X PATCH https://api.ionhour.com/api/status-pages/1/components/reorder \
-H "Authorization: Bearer ionh_your_key" \
-H "Content-Type: application/json" \
-d '{
"componentIds": [5, 3, 1, 4, 2]
}'Update Component
PATCH /status-pages/:id/components/:componentIdUpdates a single component. Only include fields you want to change.
curl -X PATCH https://api.ionhour.com/api/status-pages/1/components/5 \
-H "Authorization: Bearer ionh_your_key" \
-H "Content-Type: application/json" \
-d '{"name": "API Gateway v2", "groupName": "Platform"}'Delete Component
DELETE /status-pages/:id/components/:componentIdRemoves a component from the status page. The linked check, project, or dependency is not affected.
curl -X DELETE https://api.ionhour.com/api/status-pages/1/components/5 \
-H "Authorization: Bearer ionh_your_key"Announcements
Announcements let you communicate planned maintenance, ongoing incidents, and resolutions to status page visitors.
Create Announcement
POST /status-pages/:id/announcementsRequest Body
| Field | Type | Required | Description |
|---|---|---|---|
title | string | Yes | Announcement title |
body | string | Yes | Announcement body (Markdown supported) |
status | string | No | INVESTIGATING, IDENTIFIED, MONITORING, or RESOLVED |
impact | string | No | NONE, MINOR, MAJOR, or CRITICAL |
componentIds | number[] | No | Components affected by this announcement |
scheduledFor | ISO string | No | Scheduled maintenance start time |
scheduledUntil | ISO string | No | Scheduled maintenance end time |
To create a scheduled maintenance window, set both scheduledFor and scheduledUntil. The announcement will appear as "Scheduled" until the start time, then transition to active.
curl -X POST https://api.ionhour.com/api/status-pages/1/announcements \
-H "Authorization: Bearer ionh_your_key" \
-H "Content-Type: application/json" \
-d '{
"title": "Database maintenance window",
"body": "We are performing scheduled maintenance on the primary database cluster.",
"status": "INVESTIGATING",
"impact": "MAJOR",
"componentIds": [3, 5],
"scheduledFor": "2025-03-15T02:00:00Z",
"scheduledUntil": "2025-03-15T04:00:00Z"
}'List Announcements
GET /status-pages/:id/announcementsReturns announcements for the status page, with optional filtering.
Query Parameters
| Parameter | Type | Description |
|---|---|---|
status | string | Filter by open (active/investigating) or resolved |
take | number | Number of results to return |
skip | number | Number of results to skip (for pagination) |
curl -H "Authorization: Bearer ionh_your_key" \
"https://api.ionhour.com/api/status-pages/1/announcements?status=open&take=10"Post Announcement Update
POST /status-pages/:id/announcements/:announcementId/updatesAdds a status update to an existing announcement. Use this to keep visitors informed as an incident progresses.
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
body | string | Yes | Update message (Markdown supported) |
status | string | No | New status: INVESTIGATING, IDENTIFIED, MONITORING, or RESOLVED |
curl -X POST https://api.ionhour.com/api/status-pages/1/announcements/10/updates \
-H "Authorization: Bearer ionh_your_key" \
-H "Content-Type: application/json" \
-d '{
"body": "We have identified the root cause and are deploying a fix.",
"status": "IDENTIFIED"
}'Update Announcement
PATCH /status-pages/:id/announcements/:announcementIdUpdates the announcement metadata. Only include fields you want to change.
| Field | Type | Description |
|---|---|---|
title | string | Updated title |
status | string | INVESTIGATING, IDENTIFIED, MONITORING, or RESOLVED |
impact | string | NONE, MINOR, MAJOR, or CRITICAL |
componentIds | number[] | Updated list of affected components |
curl -X PATCH https://api.ionhour.com/api/status-pages/1/announcements/10 \
-H "Authorization: Bearer ionh_your_key" \
-H "Content-Type: application/json" \
-d '{
"impact": "CRITICAL",
"componentIds": [3, 5, 7]
}'Public Endpoints
These endpoints are unauthenticated and intended for status page visitors, integrations, and monitoring tools. They are accessed via the status page slug.
Public endpoints use the slug (e.g., acme-status) rather than the numeric status page ID. Rate limits are stricter on public endpoints to prevent abuse.
Get Status Page Data
GET /public/status/:slugReturns the full status page data including components, current status, and active announcements. No authentication required. Rate limit: 30 requests per 60 seconds.
curl https://api.ionhour.com/api/public/status/acme-statusPassword-protected status pages return a 401 response. Use the password verification endpoint to obtain a session token first.
Verify Password
POST /public/status/:slug/authVerifies the password for a password-protected status page and returns a session token. Rate limit: 5 requests per 5 minutes.
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
password | string | Yes | The status page password |
curl -X POST https://api.ionhour.com/api/public/status/acme-status/auth \
-H "Content-Type: application/json" \
-d '{"password": "viewer-password"}'Component Uptime History
GET /public/status/:slug/components/:componentId/uptimeReturns daily uptime data for a specific component. No authentication required.
Query Parameters
| Parameter | Type | Description |
|---|---|---|
days | number | Number of days of history (1--365, default: 90) |
offset | number | Offset in days from today |
curl "https://api.ionhour.com/api/public/status/acme-status/components/5/uptime?days=30"Incident History
GET /public/status/:slug/historyReturns past incidents and announcements for the status page. No authentication required.
Query Parameters
| Parameter | Type | Description |
|---|---|---|
months | number | Number of months of history |
offset | number | Offset in months from the current month |
curl "https://api.ionhour.com/api/public/status/acme-status/history?months=3"Subscribe to Updates
POST /public/status/:slug/subscribeSubscribe to status page notifications via email or webhook. Rate limit: 5 requests per 60 seconds.
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
email | string | Conditional | Subscriber email (required when channel is EMAIL) |
channel | string | Yes | EMAIL or WEBHOOK |
webhookUrl | string | Conditional | Webhook URL (required when channel is WEBHOOK) |
componentIds | number[] | No | Subscribe to specific components only (default: all) |
curl -X POST https://api.ionhour.com/api/public/status/acme-status/subscribe \
-H "Content-Type: application/json" \
-d '{
"email": "[email protected]",
"channel": "EMAIL",
"componentIds": [3, 5]
}'RSS Feed
GET /public/status/:slug/feed.rssReturns an RSS 2.0 feed of announcements and incidents. No authentication required. Rate limit: 10 requests per 60 seconds.
curl https://api.ionhour.com/api/public/status/acme-status/feed.rssAtom Feed
GET /public/status/:slug/feed.atomReturns an Atom feed of announcements and incidents. No authentication required. Rate limit: 10 requests per 60 seconds.
curl https://api.ionhour.com/api/public/status/acme-status/feed.atomStatus Badge
GET /public/status/:slug/badge.svgReturns a shields.io-style SVG badge reflecting the current overall status. No authentication required.
Embeddable Widget
GET /public/status/:slug/widget.jsReturns a JavaScript snippet that renders a lightweight status widget on any page. No authentication required.
<script src="https://api.ionhour.com/api/public/status/acme-status/widget.js"></script>Real-Time Event Stream (SSE)
GET /public/status/:slug/eventsOpens a Server-Sent Events stream for real-time status updates. No authentication required. The stream emits events when component statuses change, new announcements are posted, or announcement updates are published.
curl -N https://api.ionhour.com/api/public/status/acme-status/eventsconst eventSource = new EventSource(
'https://api.ionhour.com/api/public/status/acme-status/events'
);
eventSource.onmessage = (event) => {
const data = JSON.parse(event.data);
console.log('Status update:', data);
};