Ionhour Docs

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-pages

Returns all status pages in the workspace.

Query Parameters

ParameterTypeDescription
workspaceIdnumberFilter 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/:id

Returns a single status page with its components.

curl -H "Authorization: Bearer ionh_your_key" \
  https://api.ionhour.com/api/status-pages/1

Create Status Page

POST /status-pages

Request Body

FieldTypeRequiredDescription
namestringYesPage name (max 255 characters)
slugstringYesURL slug (max 128 characters, lowercase letters, numbers, and hyphens only)
visibilitystringNoPUBLIC (default), PASSWORD_PROTECTED, or PRIVATE
passwordstringNoRequired when visibility is PASSWORD_PROTECTED
logoUrlstringNoURL of the logo to display
primaryColorstringNoPrimary brand color (hex)
backgroundColorstringNoPage background color (hex)
faviconUrlstringNoURL of the favicon
showUptimeHistorybooleanNoShow uptime history bars (default: true)
uptimeHistoryDaysnumberNoNumber of days to show in uptime history (1--365, default: 90)
showIncidentHistorybooleanNoShow past incidents on the page (default: true)
headerHtmlstringNoCustom HTML injected into the page header (max 10,000 characters)
footerHtmlstringNoCustom 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/:id

Accepts the same fields as creation, plus:

FieldTypeDescription
enabledbooleanEnable or disable the status page
customDomainstringCustom 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/:id

Deletes 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-domain

Verifies 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-slug

Check whether a slug is available before creating a status page.

Query Parameters

ParameterTypeDescription
slugstringThe 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/components

Returns all components for the status page, ordered by position.

curl -H "Authorization: Bearer ionh_your_key" \
  https://api.ionhour.com/api/status-pages/1/components

Add Component

POST /status-pages/:id/components

Request Body

FieldTypeRequiredDescription
namestringYesComponent display name (max 255 characters)
descriptionstringNoShort description of the component
groupNamestringNoGroup label for visual grouping (max 128 characters)
positionnumberNoDisplay order (default: 0)
showUptimeBarbooleanNoShow uptime history bar for this component (default: true)
checkIdnumberConditionalLink to a check
projectIdnumberConditionalLink to a project
dependencyIdnumberConditionalLink 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/reorder

Reorders all components in a single request. Pass the component IDs in the desired display order.

Request Body

FieldTypeRequiredDescription
componentIdsnumber[]YesOrdered 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/:componentId

Updates 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/:componentId

Removes 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/announcements

Request Body

FieldTypeRequiredDescription
titlestringYesAnnouncement title
bodystringYesAnnouncement body (Markdown supported)
statusstringNoINVESTIGATING, IDENTIFIED, MONITORING, or RESOLVED
impactstringNoNONE, MINOR, MAJOR, or CRITICAL
componentIdsnumber[]NoComponents affected by this announcement
scheduledForISO stringNoScheduled maintenance start time
scheduledUntilISO stringNoScheduled 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/announcements

Returns announcements for the status page, with optional filtering.

Query Parameters

ParameterTypeDescription
statusstringFilter by open (active/investigating) or resolved
takenumberNumber of results to return
skipnumberNumber 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/updates

Adds a status update to an existing announcement. Use this to keep visitors informed as an incident progresses.

Request Body

FieldTypeRequiredDescription
bodystringYesUpdate message (Markdown supported)
statusstringNoNew 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/:announcementId

Updates the announcement metadata. Only include fields you want to change.

FieldTypeDescription
titlestringUpdated title
statusstringINVESTIGATING, IDENTIFIED, MONITORING, or RESOLVED
impactstringNONE, MINOR, MAJOR, or CRITICAL
componentIdsnumber[]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/:slug

Returns 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-status

Password-protected status pages return a 401 response. Use the password verification endpoint to obtain a session token first.

Verify Password

POST /public/status/:slug/auth

Verifies the password for a password-protected status page and returns a session token. Rate limit: 5 requests per 5 minutes.

Request Body

FieldTypeRequiredDescription
passwordstringYesThe 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/uptime

Returns daily uptime data for a specific component. No authentication required.

Query Parameters

ParameterTypeDescription
daysnumberNumber of days of history (1--365, default: 90)
offsetnumberOffset 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/history

Returns past incidents and announcements for the status page. No authentication required.

Query Parameters

ParameterTypeDescription
monthsnumberNumber of months of history
offsetnumberOffset 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/subscribe

Subscribe to status page notifications via email or webhook. Rate limit: 5 requests per 60 seconds.

Request Body

FieldTypeRequiredDescription
emailstringConditionalSubscriber email (required when channel is EMAIL)
channelstringYesEMAIL or WEBHOOK
webhookUrlstringConditionalWebhook URL (required when channel is WEBHOOK)
componentIdsnumber[]NoSubscribe 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.rss

Returns 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.rss

Atom Feed

GET /public/status/:slug/feed.atom

Returns 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.atom

Status Badge

GET /public/status/:slug/badge.svg

Returns a shields.io-style SVG badge reflecting the current overall status. No authentication required.

![Status](https://api.ionhour.com/api/public/status/acme-status/badge.svg)

Embeddable Widget

GET /public/status/:slug/widget.js

Returns 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/events

Opens 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/events
const 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);
};