# Status pages
Public status pages and what they show.
**Common tasks**
- [List status pages](#get-organizations-organization-status-pages)
- [Post an announcement](#post-organizations-organization-status-pages-statuspage-announcements)
- [Add services from your monitors](#post-organizations-organization-status-pages-statuspage-components-bulk)
**Only in the app:** Creating a status page, its custom domain and its look.
**How it works in the app:** [help article](https://infranest.io/docs/status-pages).
**Scopes:** Read with `monitoring.read`, change with `monitoring.write`. See [Tokens and scopes](../tokens-and-scopes.md#scopes).
[Status pages](#status-pages) 24
Every endpoint below takes a token in the `Authorization: Bearer` header and answers JSON. Errors use the shared format in [Errors](../errors.md). Base address: `https://api.infranest.io/api`.
## Status pages
### List status pages {#get-organizations-organization-status-pages}
`GET` `/organizations/{organization}/status-pages`
**Scope:** `monitoring.read` · **Changes data:** no
Every status page in your organization with its component and subscriber counts, how many components are operational or degraded, which are down, and the page’s 90-day uptime.
| Field | Type | Notes |
|---|---|---|
| `organization_id`
path · required | integer | Your organization's ID. |
**Errors:** [`unauthenticated`](../errors.md#unauthenticated), [`scope_missing`](../errors.md#scope_missing), [`wrong_organization`](../errors.md#wrong_organization), [`test_token_required`](../errors.md#test_token_required), [`test_token_sandbox_only`](../errors.md#test_token_sandbox_only), [`permission_denied`](../errors.md#permission_denied), [`not_found`](../errors.md#not_found), [`rate_limited`](../errors.md#rate_limited)
**Request**
```sh
curl "https://api.infranest.io/api/organizations/42/status-pages" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json"
```
**Response** · 200
```json
[
{
"id": 1,
"organization_id": 1,
"name": "Northwind Cloud Status",
"slug": "northwind",
"custom_domain": "status.northwind.example",
"is_public": true,
"password_hash": null,
"description": "Live status of Northwind Cloud services.",
"logo_url": null,
"show_incident_history": true,
"show_uptime_percentage": true,
"subscriber_notifications_enabled": true,
"theme": "light",
"created_at": "2026-01-15T12:00:00.000000Z",
"updated_at": "2026-01-15T12:00:00.000000Z",
"overall_status": "major_outage",
"custom_domain_status": "pending",
"allow_indexing": true,
"show_group_labels": true,
"footer_text": null,
"footer_url": null,
"show_tags": false,
"show_badge_branding": true,
"edge_published": false,
"deleted_at": null,
"purge_after": null,
"purge_reminder_sent_at": null,
"deleted_by_id": null,
"deleted_by_label": null,
"deletion_reason": null,
"header_image_url": null,
"density": "comfortable",
"history_days": 90,
"show_aggregate_bar": true,
"show_maintenance": true,
"show_third_party": true,
"template": "default",
"on_call_note": "Primary: Sam Okoye · +31 6 12 34 56 78 · #northwind-oncall on Slack. Escalation after 15m: Alex Rivera.",
"header_style": "band",
"accent_color": null,
"header_gradient": true,
"links": null,
"subscriber_reply_to": null,
"meta_title": null,
"show_name_with_logo": true,
"custom_domain_pending_since": null,
"components_count": 8,
"subscribers_count": 3,
"components_up": 6,
"down_components": [
"Checkout & payments"
],
"degraded_count": 1,
"uptime_90d": 100,
"edge_publish_eligible": false
}
]
```
---
### Get a status page {#get-organizations-organization-status-pages-statuspage}
`GET` `/organizations/{organization}/status-pages/{statusPage}`
**Scope:** `monitoring.read` · **Changes data:** no
One status page with its settings, its components with the monitor and group behind each, and counts of components, announcements and subscribers.
| Field | Type | Notes |
|---|---|---|
| `organization_id`
path · required | integer | Your organization's ID. |
| `statusPage_id`
path · required | integer | The statusPage's ID. |
**Errors:** [`unauthenticated`](../errors.md#unauthenticated), [`scope_missing`](../errors.md#scope_missing), [`wrong_organization`](../errors.md#wrong_organization), [`test_token_required`](../errors.md#test_token_required), [`test_token_sandbox_only`](../errors.md#test_token_sandbox_only), [`permission_denied`](../errors.md#permission_denied), [`not_found`](../errors.md#not_found), [`rate_limited`](../errors.md#rate_limited)
**Request**
```sh
curl "https://api.infranest.io/api/organizations/42/status-pages/1" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json"
```
**Response** · 200
```json
{
"id": 1,
"organization_id": 1,
"name": "Northwind Cloud Status",
"slug": "northwind",
"custom_domain": "status.northwind.example",
"is_public": true,
"password_hash": null,
"description": "Live status of Northwind Cloud services.",
"logo_url": null,
"show_incident_history": true,
"show_uptime_percentage": true,
"subscriber_notifications_enabled": true,
"theme": "light",
"created_at": "2026-01-15T12:00:00.000000Z",
"updated_at": "2026-01-15T12:00:00.000000Z",
"overall_status": "major_outage",
"custom_domain_status": "pending",
"allow_indexing": true,
"show_group_labels": true,
"footer_text": null,
"footer_url": null,
"show_tags": false,
"show_badge_branding": true,
"edge_published": false,
"deleted_at": null,
"purge_after": null,
"purge_reminder_sent_at": null,
"deleted_by_id": null,
"deleted_by_label": null,
"deletion_reason": null,
"header_image_url": null,
"density": "comfortable",
"history_days": 90,
"show_aggregate_bar": true,
"show_maintenance": true,
"show_third_party": true,
"template": "default",
"on_call_note": "Primary: Sam Okoye · +31 6 12 34 56 78 · #northwind-oncall on Slack. Escalation after 15m: Alex Rivera.",
"header_style": "band",
"accent_color": null,
"header_gradient": true,
"links": null,
"subscriber_reply_to": null,
"meta_title": null,
"show_name_with_logo": true,
"custom_domain_pending_since": null,
"components_count": 8,
"announcements_count": 2,
"subscribers_count": 3,
"edge_publish_eligible": false,
"components": [
{
"id": 1,
"status_page_id": 1,
"monitoring_check_id": 1,
"display_name": "Website",
"sort_order": 0,
"status": "operational",
"status_override": false,
"show_uptime_bar": true,
"created_at": "2026-01-15T12:00:00.000000Z",
"updated_at": "2026-01-15T12:00:00.000000Z",
"runbook_url": null,
"status_page_component_group_id": 1,
"description": null,
"affects_overall_status": true,
"group_name": "Public",
"monitoring_check": {
"id": 1,
"name": "Marketing site",
"type": "http",
"interval_minutes": 0
},
"group": {
"id": 1,
"name": "Public"
}
},
{
"id": 2,
"status_page_id": 1,
"monitoring_check_id": 2,
"display_name": "Web app",
"sort_order": 1,
"status": "operational",
"status_override": false,
"show_uptime_bar": true,
"created_at": "2026-01-15T12:00:00.000000Z",
"updated_at": "2026-01-15T12:00:00.000000Z",
"runbook_url": null,
"status_page_component_group_id": 1,
"description": null,
"affects_overall_status": true,
"group_name": "Public",
"monitoring_check": {
"id": 2,
"name": "App — northwind-app.dev",
"type": "http",
"interval_minutes": 0
},
"group": {
"id": 1,
"name": "Public"
}
}
],
"link_card_url": "http://localhost/api/status/northwind/card.png?v=66f618c615aff8ba"
}
```
---
### Get status page traffic {#get-organizations-organization-status-pages-statuspage-analytics}
`GET` `/organizations/{organization}/status-pages/{statusPage}/analytics`
**Scope:** `monitoring.read` · **Changes data:** no
Views, unique visitors and subscribe clicks over the last `days` (7, 30 or 90; default 30), compared with the period before, with the busiest day and a daily series. Counts only; no individual visits are recorded.
| Field | Type | Notes |
|---|---|---|
| `organization_id`
path · required | integer | Your organization's ID. |
| `statusPage_id`
path · required | integer | The statusPage's ID. |
**Errors:** [`unauthenticated`](../errors.md#unauthenticated), [`scope_missing`](../errors.md#scope_missing), [`wrong_organization`](../errors.md#wrong_organization), [`test_token_required`](../errors.md#test_token_required), [`test_token_sandbox_only`](../errors.md#test_token_sandbox_only), [`permission_denied`](../errors.md#permission_denied), [`not_found`](../errors.md#not_found), [`rate_limited`](../errors.md#rate_limited)
**Request**
```sh
curl "https://api.infranest.io/api/organizations/42/status-pages/1/analytics" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json"
```
**Response** · 200
```json
{
"days": 30,
"totals": {
"views": 0,
"unique_visitors": 0,
"subscribe_clicks": 0
},
"previous": {
"views": 0,
"unique_visitors": 0,
"subscribe_clicks": 0
},
"change_pct": null,
"busiest": null,
"series": [
{
"d": "2025-12-17",
"views": 0,
"unique_visitors": 0,
"subscribe_clicks": 0
},
{
"d": "2025-12-18",
"views": 0,
"unique_visitors": 0,
"subscribe_clicks": 0
}
]
}
```
---
### List status page announcements {#get-organizations-organization-status-pages-statuspage-announcements}
`GET` `/organizations/{organization}/status-pages/{statusPage}/announcements`
**Scope:** `monitoring.read` · **Changes data:** no
The announcements you posted on this page, newest first, including ones scheduled for later or no longer shown.
| Field | Type | Notes |
|---|---|---|
| `organization_id`
path · required | integer | Your organization's ID. |
| `statusPage_id`
path · required | integer | The statusPage's ID. |
**Errors:** [`unauthenticated`](../errors.md#unauthenticated), [`scope_missing`](../errors.md#scope_missing), [`wrong_organization`](../errors.md#wrong_organization), [`test_token_required`](../errors.md#test_token_required), [`test_token_sandbox_only`](../errors.md#test_token_sandbox_only), [`permission_denied`](../errors.md#permission_denied), [`not_found`](../errors.md#not_found), [`rate_limited`](../errors.md#rate_limited)
**Request**
```sh
curl "https://api.infranest.io/api/organizations/42/status-pages/1/announcements" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json"
```
**Response** · 200
```json
[
{
"id": 2,
"status_page_id": 1,
"title": "Released: v2.14.0",
"body": "Faster search and a clearer billing page.",
"show_from": "2026-01-15T09:00:00.000000Z",
"show_until": "2026-01-22T12:00:00.000000Z",
"created_at": "2026-01-15T09:00:00.000000Z",
"updated_at": "2026-01-15T12:00:00.000000Z",
"kind": "information"
},
{
"id": 1,
"status_page_id": 1,
"title": "Scheduled maintenance this weekend",
"body": "We'll be upgrading our database cluster on Saturday 02:00–03:00 UTC. Brief API slowdowns are possible; no downtime is expected.",
"show_from": "2026-01-14T12:00:00.000000Z",
"show_until": "2026-01-21T12:00:00.000000Z",
"created_at": "2026-01-14T12:00:00.000000Z",
"updated_at": "2026-01-15T12:00:00.000000Z",
"kind": "information"
}
]
```
---
### Post a status page announcement {#post-organizations-organization-status-pages-statuspage-announcements}
`POST` `/organizations/{organization}/status-pages/{statusPage}/announcements`
**Scope:** `monitoring.write` · **Changes data:** yes — only where API writes are switched on for the organization
Publishes a notice with a `title` and `body` on the public page. `kind` is `information` or `warning`, and `show_from` and `show_until` limit when it is shown.
| Field | Type | Notes |
|---|---|---|
| `organization_id`
path · required | integer | Your organization's ID. |
| `statusPage_id`
path · required | integer | The statusPage's ID. |
| `title`
body · required | string | Must not be greater than 255 characters. |
| `body`
body · required | string | Must not be greater than 10000 characters. |
| `kind`
body | string, nullable | Two, on purpose: anything louder than a warning is an incident. One of: `information`, `warning`. |
| `show_from`
body | string, nullable | Must be a valid date. |
| `show_until`
body | string, nullable | Must be a valid date. Must be a date after or equal to show_from. |
**Errors:** [`unauthenticated`](../errors.md#unauthenticated), [`scope_missing`](../errors.md#scope_missing), [`wrong_organization`](../errors.md#wrong_organization), [`test_token_required`](../errors.md#test_token_required), [`test_token_sandbox_only`](../errors.md#test_token_sandbox_only), [`permission_denied`](../errors.md#permission_denied), [`write_disabled`](../errors.md#write_disabled), [`organization_suspended`](../errors.md#organization_suspended), [`not_found`](../errors.md#not_found), [`idempotency_in_progress`](../errors.md#idempotency_in_progress), [`validation_failed`](../errors.md#validation_failed), [`idempotency_key_reused`](../errors.md#idempotency_key_reused), [`rate_limited`](../errors.md#rate_limited)
**Request**
```sh
curl -X POST "https://api.infranest.io/api/organizations/42/status-pages/1/announcements" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{"title":"New status page address","body":"This page now also answers at status.northwind.example."}'
```
**Response** · 201 — Created
```json
{
"title": "New status page address",
"body": "This page now also answers at status.northwind.example.",
"status_page_id": 1,
"updated_at": "2026-01-15T12:00:00.000000Z",
"created_at": "2026-01-15T12:00:00.000000Z",
"id": 3
}
```
---
### Update a status page announcement {#patch-organizations-organization-status-pages-statuspage-announcements-announcement}
`PATCH` `/organizations/{organization}/status-pages/{statusPage}/announcements/{announcement}`
**Scope:** `monitoring.write` · **Changes data:** yes — only where API writes are switched on for the organization
Changes the announcement’s title, body, kind or display window.
| Field | Type | Notes |
|---|---|---|
| `organization_id`
path · required | integer | Your organization's ID. |
| `statusPage_id`
path · required | integer | The statusPage's ID. |
| `announcement_id`
path · required | integer | The announcement's ID. |
| `title`
body | string | Must not be greater than 255 characters. |
| `body`
body | string | Must not be greater than 10000 characters. |
| `kind`
body | string, nullable | One of: `information`, `warning`. |
| `show_from`
body | string, nullable | Must be a valid date. |
| `show_until`
body | string, nullable | Must be a valid date. Must be a date after or equal to show_from. |
**Errors:** [`unauthenticated`](../errors.md#unauthenticated), [`scope_missing`](../errors.md#scope_missing), [`wrong_organization`](../errors.md#wrong_organization), [`test_token_required`](../errors.md#test_token_required), [`test_token_sandbox_only`](../errors.md#test_token_sandbox_only), [`permission_denied`](../errors.md#permission_denied), [`write_disabled`](../errors.md#write_disabled), [`organization_suspended`](../errors.md#organization_suspended), [`not_found`](../errors.md#not_found), [`validation_failed`](../errors.md#validation_failed), [`rate_limited`](../errors.md#rate_limited)
**Request**
```sh
curl -X PATCH "https://api.infranest.io/api/organizations/42/status-pages/1/announcements/1" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{"title":"Status page has moved","kind":"information"}'
```
**Response** · 200
```json
{
"id": 1,
"status_page_id": 1,
"title": "Status page has moved",
"body": "We'll be upgrading our database cluster on Saturday 02:00–03:00 UTC. Brief API slowdowns are possible; no downtime is expected.",
"show_from": "2026-01-14T12:00:00.000000Z",
"show_until": "2026-01-21T12:00:00.000000Z",
"created_at": "2026-01-14T12:00:00.000000Z",
"updated_at": "2026-01-15T12:00:00.000000Z",
"kind": "information"
}
```
---
### Delete a status page announcement {#delete-organizations-organization-status-pages-statuspage-announcements-announcement}
`DELETE` `/organizations/{organization}/status-pages/{statusPage}/announcements/{announcement}`
**Scope:** `monitoring.write` · **Changes data:** yes — only where API writes are switched on for the organization
Removes the announcement from the page permanently.
| Field | Type | Notes |
|---|---|---|
| `organization_id`
path · required | integer | Your organization's ID. |
| `statusPage_id`
path · required | integer | The statusPage's ID. |
| `announcement_id`
path · required | integer | The announcement's ID. |
**Errors:** [`unauthenticated`](../errors.md#unauthenticated), [`scope_missing`](../errors.md#scope_missing), [`wrong_organization`](../errors.md#wrong_organization), [`test_token_required`](../errors.md#test_token_required), [`test_token_sandbox_only`](../errors.md#test_token_sandbox_only), [`permission_denied`](../errors.md#permission_denied), [`write_disabled`](../errors.md#write_disabled), [`organization_suspended`](../errors.md#organization_suspended), [`not_found`](../errors.md#not_found), [`rate_limited`](../errors.md#rate_limited)
**Request**
```sh
curl -X DELETE "https://api.infranest.io/api/organizations/42/status-pages/1/announcements/1" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json"
```
**Response** · 200
```json
{
"message": "Deleted."
}
```
---
### Get custom domain CNAME setup {#get-organizations-organization-status-pages-statuspage-cname-setup}
`GET` `/organizations/{organization}/status-pages/{statusPage}/cname-setup`
**Scope:** `monitoring.read` · **Changes data:** no
Whether the page’s custom domain, or the one in `domain`, sits in a DNS zone you manage in InfraNest, whether InfraNest can create the CNAME record there for you, and whether it is already published. Includes the CNAME target to point the domain at.
| Field | Type | Notes |
|---|---|---|
| `organization_id`
path · required | integer | Your organization's ID. |
| `statusPage_id`
path · required | integer | The statusPage's ID. |
**Errors:** [`unauthenticated`](../errors.md#unauthenticated), [`scope_missing`](../errors.md#scope_missing), [`wrong_organization`](../errors.md#wrong_organization), [`test_token_required`](../errors.md#test_token_required), [`test_token_sandbox_only`](../errors.md#test_token_sandbox_only), [`permission_denied`](../errors.md#permission_denied), [`not_found`](../errors.md#not_found), [`rate_limited`](../errors.md#rate_limited)
**Request**
```sh
curl "https://api.infranest.io/api/organizations/42/status-pages/1/cname-setup" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json"
```
**Response** · 200
```json
{
"manageable": false,
"matched": false,
"published": false,
"cname_target": "pages.infranest.io"
}
```
---
### List status page groups {#get-organizations-organization-status-pages-statuspage-component-groups}
`GET` `/organizations/{organization}/status-pages/{statusPage}/component-groups`
**Scope:** `monitoring.read` · **Changes data:** no
The page’s component groups in display order, each with how many components it holds.
| Field | Type | Notes |
|---|---|---|
| `organization_id`
path · required | integer | Your organization's ID. |
| `statusPage_id`
path · required | integer | The statusPage's ID. |
**Errors:** [`unauthenticated`](../errors.md#unauthenticated), [`scope_missing`](../errors.md#scope_missing), [`wrong_organization`](../errors.md#wrong_organization), [`test_token_required`](../errors.md#test_token_required), [`test_token_sandbox_only`](../errors.md#test_token_sandbox_only), [`permission_denied`](../errors.md#permission_denied), [`not_found`](../errors.md#not_found), [`rate_limited`](../errors.md#rate_limited)
**Request**
```sh
curl "https://api.infranest.io/api/organizations/42/status-pages/1/component-groups" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json"
```
**Response** · 200
```json
[
{
"id": 1,
"status_page_id": 1,
"name": "Public",
"sort_order": 0,
"created_at": "2026-01-15T12:00:00.000000Z",
"updated_at": "2026-01-15T12:00:00.000000Z",
"shows_platform_status": false,
"components_count": 5
},
{
"id": 2,
"status_page_id": 1,
"name": "Developer",
"sort_order": 1,
"created_at": "2026-01-15T12:00:00.000000Z",
"updated_at": "2026-01-15T12:00:00.000000Z",
"shows_platform_status": false,
"components_count": 3
}
]
```
---
### Create a status page group {#post-organizations-organization-status-pages-statuspage-component-groups}
`POST` `/organizations/{organization}/status-pages/{statusPage}/component-groups`
**Scope:** `monitoring.write` · **Changes data:** yes — only where API writes are switched on for the organization
Adds a group with a `name` at the end of the page. Names must be unique within the page.
| Field | Type | Notes |
|---|---|---|
| `organization_id`
path · required | integer | Your organization's ID. |
| `statusPage_id`
path · required | integer | The statusPage's ID. |
| `name`
body · required | string | Must not be greater than 255 characters. |
**Errors:** [`unauthenticated`](../errors.md#unauthenticated), [`scope_missing`](../errors.md#scope_missing), [`wrong_organization`](../errors.md#wrong_organization), [`test_token_required`](../errors.md#test_token_required), [`test_token_sandbox_only`](../errors.md#test_token_sandbox_only), [`permission_denied`](../errors.md#permission_denied), [`write_disabled`](../errors.md#write_disabled), [`organization_suspended`](../errors.md#organization_suspended), [`not_found`](../errors.md#not_found), [`idempotency_in_progress`](../errors.md#idempotency_in_progress), [`validation_failed`](../errors.md#validation_failed), [`idempotency_key_reused`](../errors.md#idempotency_key_reused), [`rate_limited`](../errors.md#rate_limited)
**Request**
```sh
curl -X POST "https://api.infranest.io/api/organizations/42/status-pages/1/component-groups" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{"name":"Customer apps"}'
```
**Response** · 201 — Created
```json
{
"name": "Customer apps",
"sort_order": 2,
"status_page_id": 1,
"updated_at": "2026-01-15T12:00:00.000000Z",
"created_at": "2026-01-15T12:00:00.000000Z",
"id": 3
}
```
---
### Update a status page group {#patch-organizations-organization-status-pages-statuspage-component-groups-componentgroup}
`PATCH` `/organizations/{organization}/status-pages/{statusPage}/component-groups/{componentGroup}`
**Scope:** `monitoring.write` · **Changes data:** yes — only where API writes are switched on for the organization
Renames the group for every component in it. Setting `shows_platform_status` to true on one group clears it from every other group on the page.
| Field | Type | Notes |
|---|---|---|
| `organization_id`
path · required | integer | Your organization's ID. |
| `statusPage_id`
path · required | integer | The statusPage's ID. |
| `componentGroup_id`
path · required | integer | The componentGroup's ID. |
| `name`
body | string | Must not be greater than 255 characters. |
| `shows_platform_status`
body | boolean | |
**Errors:** [`unauthenticated`](../errors.md#unauthenticated), [`scope_missing`](../errors.md#scope_missing), [`wrong_organization`](../errors.md#wrong_organization), [`test_token_required`](../errors.md#test_token_required), [`test_token_sandbox_only`](../errors.md#test_token_sandbox_only), [`permission_denied`](../errors.md#permission_denied), [`write_disabled`](../errors.md#write_disabled), [`organization_suspended`](../errors.md#organization_suspended), [`not_found`](../errors.md#not_found), [`validation_failed`](../errors.md#validation_failed), [`rate_limited`](../errors.md#rate_limited)
**Request**
```sh
curl -X PATCH "https://api.infranest.io/api/organizations/42/status-pages/1/component-groups/1" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{"name":"Customer-facing apps"}'
```
**Response** · 200
```json
{
"id": 1,
"status_page_id": 1,
"name": "Customer-facing apps",
"sort_order": 0,
"created_at": "2026-01-15T12:00:00.000000Z",
"updated_at": "2026-01-15T12:00:00.000000Z",
"shows_platform_status": false
}
```
---
### Delete a status page group {#delete-organizations-organization-status-pages-statuspage-component-groups-componentgroup}
`DELETE` `/organizations/{organization}/status-pages/{statusPage}/component-groups/{componentGroup}`
**Scope:** `monitoring.write` · **Changes data:** yes — only where API writes are switched on for the organization
Removes the group but keeps its components, which become ungrouped. The response says how many were ungrouped.
| Field | Type | Notes |
|---|---|---|
| `organization_id`
path · required | integer | Your organization's ID. |
| `statusPage_id`
path · required | integer | The statusPage's ID. |
| `componentGroup_id`
path · required | integer | The componentGroup's ID. |
**Errors:** [`unauthenticated`](../errors.md#unauthenticated), [`scope_missing`](../errors.md#scope_missing), [`wrong_organization`](../errors.md#wrong_organization), [`test_token_required`](../errors.md#test_token_required), [`test_token_sandbox_only`](../errors.md#test_token_sandbox_only), [`permission_denied`](../errors.md#permission_denied), [`write_disabled`](../errors.md#write_disabled), [`organization_suspended`](../errors.md#organization_suspended), [`not_found`](../errors.md#not_found), [`rate_limited`](../errors.md#rate_limited)
**Request**
```sh
curl -X DELETE "https://api.infranest.io/api/organizations/42/status-pages/1/component-groups/1" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json"
```
**Response** · 200
```json
{
"message": "Deleted.",
"components_ungrouped": 5
}
```
---
### Reorder status page groups {#post-organizations-organization-status-pages-statuspage-component-groups-sort}
`POST` `/organizations/{organization}/status-pages/{statusPage}/component-groups/sort`
**Scope:** `monitoring.write` · **Changes data:** yes — only where API writes are switched on for the organization
Sets the display order from `order`, a list of group IDs. Every ID must belong to this page.
| Field | Type | Notes |
|---|---|---|
| `organization_id`
path · required | integer | Your organization's ID. |
| `statusPage_id`
path · required | integer | The statusPage's ID. |
| `order`
body | array | Must match an existing stored value. |
**Errors:** [`unauthenticated`](../errors.md#unauthenticated), [`scope_missing`](../errors.md#scope_missing), [`wrong_organization`](../errors.md#wrong_organization), [`test_token_required`](../errors.md#test_token_required), [`test_token_sandbox_only`](../errors.md#test_token_sandbox_only), [`permission_denied`](../errors.md#permission_denied), [`write_disabled`](../errors.md#write_disabled), [`organization_suspended`](../errors.md#organization_suspended), [`not_found`](../errors.md#not_found), [`idempotency_in_progress`](../errors.md#idempotency_in_progress), [`validation_failed`](../errors.md#validation_failed), [`idempotency_key_reused`](../errors.md#idempotency_key_reused), [`rate_limited`](../errors.md#rate_limited)
**Request**
```sh
curl -X POST "https://api.infranest.io/api/organizations/42/status-pages/1/component-groups/sort" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{"order":[2,1]}'
```
**Response** · 200
```json
{
"message": "Order updated."
}
```
---
### List status page components {#get-organizations-organization-status-pages-statuspage-components}
`GET` `/organizations/{organization}/status-pages/{statusPage}/components`
**Scope:** `monitoring.read` · **Changes data:** no
The page’s components in display order, each with its group, linked monitor and uptime bars over the page’s history window. A component with no monitor has no bars.
| Field | Type | Notes |
|---|---|---|
| `organization_id`
path · required | integer | Your organization's ID. |
| `statusPage_id`
path · required | integer | The statusPage's ID. |
**Errors:** [`unauthenticated`](../errors.md#unauthenticated), [`scope_missing`](../errors.md#scope_missing), [`wrong_organization`](../errors.md#wrong_organization), [`test_token_required`](../errors.md#test_token_required), [`test_token_sandbox_only`](../errors.md#test_token_sandbox_only), [`permission_denied`](../errors.md#permission_denied), [`not_found`](../errors.md#not_found), [`rate_limited`](../errors.md#rate_limited)
**Request**
```sh
curl "https://api.infranest.io/api/organizations/42/status-pages/1/components" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json"
```
**Response** · 200
```json
[
{
"id": 1,
"status_page_id": 1,
"monitoring_check_id": 1,
"display_name": "Website",
"sort_order": 0,
"status": "operational",
"status_override": false,
"show_uptime_bar": true,
"created_at": "2026-01-15T12:00:00.000000Z",
"updated_at": "2026-01-15T12:00:00.000000Z",
"runbook_url": null,
"status_page_component_group_id": 1,
"description": null,
"affects_overall_status": true,
"group_name": "Public",
"monitoring_check": {
"id": 1,
"name": "Marketing site",
"type": "http",
"last_status": "up",
"external_service_id": null,
"interval_minutes": 0
},
"group": {
"id": 1,
"name": "Public",
"sort_order": 0
},
"uptime_bars": [
{
"date": "2025-10-17",
"uptime_pct": 100,
"colour": "green",
"incidents": [],
"imported": false
},
{
"date": "2025-10-18",
"uptime_pct": 100,
"colour": "green",
"incidents": [],
"imported": false
}
]
},
{
"id": 2,
"status_page_id": 1,
"monitoring_check_id": 2,
"display_name": "Web app",
"sort_order": 1,
"status": "operational",
"status_override": false,
"show_uptime_bar": true,
"created_at": "2026-01-15T12:00:00.000000Z",
"updated_at": "2026-01-15T12:00:00.000000Z",
"runbook_url": null,
"status_page_component_group_id": 1,
"description": null,
"affects_overall_status": true,
"group_name": "Public",
"monitoring_check": {
"id": 2,
"name": "App — northwind-app.dev",
"type": "http",
"last_status": "up",
"external_service_id": null,
"interval_minutes": 0
},
"group": {
"id": 1,
"name": "Public",
"sort_order": 0
},
"uptime_bars": [
{
"date": "2025-10-17",
"uptime_pct": 100,
"colour": "green",
"incidents": [],
"imported": false
},
{
"date": "2025-10-18",
"uptime_pct": 100,
"colour": "green",
"incidents": [],
"imported": false
}
]
}
]
```
---
### Add a component to a status page {#post-organizations-organization-status-pages-statuspage-components}
`POST` `/organizations/{organization}/status-pages/{statusPage}/components`
**Scope:** `monitoring.write` · **Changes data:** yes — only where API writes are switched on for the organization
Adds a component with a `display_name`, optionally linked to one of your monitors with `monitoring_check_id`. A `group_name` that does not exist yet creates that group, and a `runbook_url` must start with https:// and is only shown internally.
| Field | Type | Notes |
|---|---|---|
| `organization_id`
path · required | integer | Your organization's ID. |
| `statusPage_id`
path · required | integer | The statusPage's ID. |
| `display_name`
body · required | string | Must not be greater than 255 characters. |
| `description`
body | string, nullable | What this service IS, for the reader who does not already know. Must not be greater than 255 characters. |
| `group_name`
body | string, nullable | Must not be greater than 255 characters. |
| `sort_order`
body | integer | Must be at least 0. |
| `monitoring_check_id`
body | integer, nullable | Must match an existing stored value. |
| `status`
body | string, nullable | |
| `status_override`
body | boolean | |
| `show_uptime_bar`
body | boolean | |
| `affects_overall_status`
body | boolean | |
| `runbook_url`
body | string, nullable | Followed by somebody in a hurry who will not read the scheme first. Must be a valid URL. Must start with one of https:// Must not be greater than 500 characters. |
**Errors:** [`unauthenticated`](../errors.md#unauthenticated), [`scope_missing`](../errors.md#scope_missing), [`wrong_organization`](../errors.md#wrong_organization), [`test_token_required`](../errors.md#test_token_required), [`test_token_sandbox_only`](../errors.md#test_token_sandbox_only), [`permission_denied`](../errors.md#permission_denied), [`write_disabled`](../errors.md#write_disabled), [`organization_suspended`](../errors.md#organization_suspended), [`not_found`](../errors.md#not_found), [`idempotency_in_progress`](../errors.md#idempotency_in_progress), [`validation_failed`](../errors.md#validation_failed), [`idempotency_key_reused`](../errors.md#idempotency_key_reused), [`rate_limited`](../errors.md#rate_limited)
**Request**
```sh
curl -X POST "https://api.infranest.io/api/organizations/42/status-pages/1/components" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{"display_name":"Payments API"}'
```
**Response** · 201 — Created
```json
{
"display_name": "Payments API",
"description": null,
"status_page_component_group_id": null,
"sort_order": 8,
"monitoring_check_id": null,
"status": "operational",
"status_override": false,
"show_uptime_bar": true,
"affects_overall_status": true,
"runbook_url": null,
"status_page_id": 1,
"updated_at": "2026-01-15T12:00:00.000000Z",
"created_at": "2026-01-15T12:00:00.000000Z",
"id": 9,
"group_name": null,
"monitoring_check": null,
"group": null
}
```
---
### Update a status page component {#patch-organizations-organization-status-pages-statuspage-components-component}
`PATCH` `/organizations/{organization}/status-pages/{statusPage}/components/{component}`
**Scope:** `monitoring.write` · **Changes data:** yes — only where API writes are switched on for the organization
Changes the fields you send, such as the name, description, linked monitor, status override, group or runbook link. A new `group_name` creates that group.
| Field | Type | Notes |
|---|---|---|
| `organization_id`
path · required | integer | Your organization's ID. |
| `statusPage_id`
path · required | integer | The statusPage's ID. |
| `component_id`
path · required | integer | The component's ID. |
| `display_name`
body | string | Must not be greater than 255 characters. |
| `description`
body | string, nullable | Must not be greater than 255 characters. |
| `group_name`
body | string, nullable | Must not be greater than 255 characters. |
| `sort_order`
body | integer | Must be at least 0. |
| `monitoring_check_id`
body | integer, nullable | Must match an existing stored value. |
| `status`
body | string, nullable | |
| `status_override`
body | boolean | |
| `show_uptime_bar`
body | boolean | |
| `affects_overall_status`
body | boolean | |
| `runbook_url`
body | string, nullable | Followed by somebody in a hurry who will not read the scheme first. Must be a valid URL. Must start with one of https:// Must not be greater than 500 characters. |
**Errors:** [`unauthenticated`](../errors.md#unauthenticated), [`scope_missing`](../errors.md#scope_missing), [`wrong_organization`](../errors.md#wrong_organization), [`test_token_required`](../errors.md#test_token_required), [`test_token_sandbox_only`](../errors.md#test_token_sandbox_only), [`permission_denied`](../errors.md#permission_denied), [`write_disabled`](../errors.md#write_disabled), [`organization_suspended`](../errors.md#organization_suspended), [`not_found`](../errors.md#not_found), [`validation_failed`](../errors.md#validation_failed), [`rate_limited`](../errors.md#rate_limited)
**Request**
```sh
curl -X PATCH "https://api.infranest.io/api/organizations/42/status-pages/1/components/1" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{"display_name":"Checkout","description":"Payments and order confirmation"}'
```
**Response** · 200
```json
{
"id": 1,
"status_page_id": 1,
"monitoring_check_id": 1,
"display_name": "Checkout",
"sort_order": 0,
"status": "operational",
"status_override": false,
"show_uptime_bar": true,
"created_at": "2026-01-15T12:00:00.000000Z",
"updated_at": "2026-01-15T12:00:00.000000Z",
"runbook_url": null,
"status_page_component_group_id": 1,
"description": "Payments and order confirmation",
"affects_overall_status": true,
"group_name": "Public",
"monitoring_check": {
"id": 1,
"name": "Marketing site",
"type": "http",
"last_status": "up",
"external_service_id": null,
"interval_minutes": 0
},
"group": {
"id": 1,
"name": "Public",
"sort_order": 0
}
}
```
---
### Remove a component from a status page {#delete-organizations-organization-status-pages-statuspage-components-component}
`DELETE` `/organizations/{organization}/status-pages/{statusPage}/components/{component}`
**Scope:** `monitoring.write` · **Changes data:** yes — only where API writes are switched on for the organization
Deletes the component from the page. The monitor behind it is not affected.
| Field | Type | Notes |
|---|---|---|
| `organization_id`
path · required | integer | Your organization's ID. |
| `statusPage_id`
path · required | integer | The statusPage's ID. |
| `component_id`
path · required | integer | The component's ID. |
**Errors:** [`unauthenticated`](../errors.md#unauthenticated), [`scope_missing`](../errors.md#scope_missing), [`wrong_organization`](../errors.md#wrong_organization), [`test_token_required`](../errors.md#test_token_required), [`test_token_sandbox_only`](../errors.md#test_token_sandbox_only), [`permission_denied`](../errors.md#permission_denied), [`write_disabled`](../errors.md#write_disabled), [`organization_suspended`](../errors.md#organization_suspended), [`not_found`](../errors.md#not_found), [`rate_limited`](../errors.md#rate_limited)
**Request**
```sh
curl -X DELETE "https://api.infranest.io/api/organizations/42/status-pages/1/components/1" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json"
```
**Response** · 200
```json
{
"message": "Deleted."
}
```
---
### Add several monitors to a status page {#post-organizations-organization-status-pages-statuspage-components-bulk}
`POST` `/organizations/{organization}/status-pages/{statusPage}/components/bulk`
**Scope:** `monitoring.write` · **Changes data:** yes — only where API writes are switched on for the organization
Adds a component for each of up to 50 monitors in `monitoring_check_ids`, named after the monitor and optionally placed in `group_name`. Monitors already on the page are skipped and listed in `skipped`; third-party monitors are added ungrouped and do not affect the page’s overall status.
| Field | Type | Notes |
|---|---|---|
| `organization_id`
path · required | integer | Your organization's ID. |
| `statusPage_id`
path · required | integer | The statusPage's ID. |
| `monitoring_check_ids`
body | array | Must match an existing stored value. |
| `group_name`
body | string, nullable | Must not be greater than 255 characters. |
**Errors:** [`unauthenticated`](../errors.md#unauthenticated), [`scope_missing`](../errors.md#scope_missing), [`wrong_organization`](../errors.md#wrong_organization), [`test_token_required`](../errors.md#test_token_required), [`test_token_sandbox_only`](../errors.md#test_token_sandbox_only), [`permission_denied`](../errors.md#permission_denied), [`write_disabled`](../errors.md#write_disabled), [`organization_suspended`](../errors.md#organization_suspended), [`not_found`](../errors.md#not_found), [`idempotency_in_progress`](../errors.md#idempotency_in_progress), [`validation_failed`](../errors.md#validation_failed), [`idempotency_key_reused`](../errors.md#idempotency_key_reused), [`rate_limited`](../errors.md#rate_limited)
**Request**
```sh
curl -X POST "https://api.infranest.io/api/organizations/42/status-pages/1/components/bulk" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{"monitoring_check_ids":[1,2,3]}'
```
**Response** · 201 — Created
```json
{
"created": [],
"skipped": [
1,
2
]
}
```
---
### Reorder status page components {#post-organizations-organization-status-pages-statuspage-components-sort}
`POST` `/organizations/{organization}/status-pages/{statusPage}/components/sort`
**Scope:** `monitoring.write` · **Changes data:** yes — only where API writes are switched on for the organization
Sets the display order from `order`, a list of component IDs. Every ID must belong to this page.
| Field | Type | Notes |
|---|---|---|
| `organization_id`
path · required | integer | Your organization's ID. |
| `statusPage_id`
path · required | integer | The statusPage's ID. |
| `order`
body | array | Must match an existing stored value. |
**Errors:** [`unauthenticated`](../errors.md#unauthenticated), [`scope_missing`](../errors.md#scope_missing), [`wrong_organization`](../errors.md#wrong_organization), [`test_token_required`](../errors.md#test_token_required), [`test_token_sandbox_only`](../errors.md#test_token_sandbox_only), [`permission_denied`](../errors.md#permission_denied), [`write_disabled`](../errors.md#write_disabled), [`organization_suspended`](../errors.md#organization_suspended), [`not_found`](../errors.md#not_found), [`idempotency_in_progress`](../errors.md#idempotency_in_progress), [`validation_failed`](../errors.md#validation_failed), [`idempotency_key_reused`](../errors.md#idempotency_key_reused), [`rate_limited`](../errors.md#rate_limited)
**Request**
```sh
curl -X POST "https://api.infranest.io/api/organizations/42/status-pages/1/components/sort" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{"order":[8,7,6,5,4,3,2,1]}'
```
**Response** · 200
```json
{
"message": "Order updated."
}
```
---
### Get the internal view of a status page {#get-organizations-organization-status-pages-statuspage-internal}
`GET` `/organizations/{organization}/status-pages/{statusPage}/internal`
**Scope:** `monitoring.read` · **Changes data:** no
The team-only view of the page: each component with its monitor, runbook link, regions reporting and 30 days of uptime, plus active incidents, the next maintenance and the on-call note. These internal fields are never shown on the public page, and this view needs a plan that includes private status pages.
| Field | Type | Notes |
|---|---|---|
| `organization_id`
path · required | integer | Your organization's ID. |
| `statusPage_id`
path · required | integer | The statusPage's ID. |
**Errors:** [`unauthenticated`](../errors.md#unauthenticated), [`scope_missing`](../errors.md#scope_missing), [`wrong_organization`](../errors.md#wrong_organization), [`test_token_required`](../errors.md#test_token_required), [`test_token_sandbox_only`](../errors.md#test_token_sandbox_only), [`permission_denied`](../errors.md#permission_denied), [`not_found`](../errors.md#not_found), [`rate_limited`](../errors.md#rate_limited)
**Request**
```sh
curl "https://api.infranest.io/api/organizations/42/status-pages/1/internal" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json"
```
**Response** · 200
```json
{
"page": {
"id": 1,
"name": "Northwind Cloud Status",
"slug": "northwind",
"logo_url": null,
"is_public": true,
"on_call_note": "Primary: Sam Okoye · +31 6 12 34 56 78 · #northwind-oncall on Slack. Escalation after 15m: Alex Rivera."
},
"metrics": {
"overall_status": "major_outage",
"monitors_up": 6,
"monitors_total": 8,
"uptime_30d": 100,
"next_maintenance": null
},
"groups": [
{
"name": "Public",
"components": [
{
"id": 1,
"display_name": "Website",
"status": "operational",
"monitoring_check_id": 1,
"monitor_name": "Marketing site",
"runbook_url": null,
"last_checked_at": "2026-01-15T11:58:00+00:00",
"regions_reporting": null,
"regions_total": null,
"uptime_bars": [
{
"date": "2025-12-16",
"uptime_pct": 100,
"colour": "green",
"incidents": [],
"imported": false
},
{
"date": "2025-12-17",
"uptime_pct": 100,
"colour": "green",
"incidents": [],
"imported": false
}
]
},
{
"id": 2,
"display_name": "Web app",
"status": "operational",
"monitoring_check_id": 2,
"monitor_name": "App — northwind-app.dev",
"runbook_url": null,
"last_checked_at": "2026-01-15T11:58:00+00:00",
"regions_reporting": null,
"regions_total": null,
"uptime_bars": [
{
"date": "2025-12-16",
"uptime_pct": 100,
"colour": "green",
"incidents": [],
"imported": false
},
{
"date": "2025-12-17",
"uptime_pct": 100,
"colour": "green",
"incidents": [],
"imported": false
}
]
}
]
},
{
"name": "Developer",
"components": [
{
"id": 6,
"display_name": "API",
"status": "operational",
"monitoring_check_id": 3,
"monitor_name": "API health",
"runbook_url": "https://wiki.northwind.example/runbooks/api",
"last_checked_at": "2026-01-15T11:58:00+00:00",
"regions_reporting": null,
"regions_total": null,
"uptime_bars": [
{
"date": "2025-12-16",
"uptime_pct": 100,
"colour": "green",
"incidents": [],
"imported": false
},
{
"date": "2025-12-17",
"uptime_pct": 100,
"colour": "green",
"incidents": [],
"imported": false
}
]
},
{
"id": 7,
"display_name": "Search API",
"status": "degraded",
"monitoring_check_id": 6,
"monitor_name": "Search API",
"runbook_url": null,
"last_checked_at": "2026-01-15T11:58:00+00:00",
"regions_reporting": null,
"regions_total": null,
"uptime_bars": [
{
"date": "2025-12-16",
"uptime_pct": 100,
"colour": "green",
"incidents": [],
"imported": false
},
{
"date": "2025-12-17",
"uptime_pct": 100,
"colour": "green",
"incidents": [],
"imported": false
}
]
}
]
}
],
"active_incidents": [
{
"id": 1,
"monitoring_check_id": 4,
"title": "Checkout returning 503",
"status": "investigating",
"impact": "major",
"started_at": "2026-01-15T11:20:00+00:00",
"is_planned": false,
"public_url": "/status/northwind/incidents/1"
}
],
"matrix_days": 30
}
```
---
### List incidents and maintenance on a status page {#get-organizations-organization-status-pages-statuspage-other-notices}
`GET` `/organizations/{organization}/status-pages/{statusPage}/other-notices`
**Scope:** `monitoring.read` · **Changes data:** no
The incidents and maintenance windows that appear on this page automatically from its monitors, from the last 90 days or still open. Read-only; edit each one on the incident or maintenance window itself.
| Field | Type | Notes |
|---|---|---|
| `organization_id`
path · required | integer | Your organization's ID. |
| `statusPage_id`
path · required | integer | The statusPage's ID. |
**Errors:** [`unauthenticated`](../errors.md#unauthenticated), [`scope_missing`](../errors.md#scope_missing), [`wrong_organization`](../errors.md#wrong_organization), [`test_token_required`](../errors.md#test_token_required), [`test_token_sandbox_only`](../errors.md#test_token_sandbox_only), [`permission_denied`](../errors.md#permission_denied), [`not_found`](../errors.md#not_found), [`rate_limited`](../errors.md#rate_limited)
**Request**
```sh
curl "https://api.infranest.io/api/organizations/42/status-pages/1/other-notices" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json"
```
**Response** · 200
```json
{
"notices": [
{
"kind": "incident",
"id": 1,
"title": "Checkout returning 503",
"starts_at": "2026-01-15T11:20:00+00:00",
"ends_at": null,
"open": true,
"href": "/monitoring/incidents"
},
{
"kind": "incident",
"id": 2,
"title": "Brief marketing-site blip",
"starts_at": "2026-01-09T11:45:00+00:00",
"ends_at": "2026-01-09T12:00:00+00:00",
"open": false,
"href": "/monitoring/incidents"
}
]
}
```
---
### Get a status page overview {#get-organizations-organization-status-pages-statuspage-overview}
`GET` `/organizations/{organization}/status-pages/{statusPage}/overview`
**Scope:** `monitoring.read` · **Changes data:** no
The page at a glance: setup (components, custom domain, subscribers, whether it is public), uptime over the page’s history window, current status with active incidents, and the next maintenance and announcement due to end.
| Field | Type | Notes |
|---|---|---|
| `organization_id`
path · required | integer | Your organization's ID. |
| `statusPage_id`
path · required | integer | The statusPage's ID. |
**Errors:** [`unauthenticated`](../errors.md#unauthenticated), [`scope_missing`](../errors.md#scope_missing), [`wrong_organization`](../errors.md#wrong_organization), [`test_token_required`](../errors.md#test_token_required), [`test_token_sandbox_only`](../errors.md#test_token_sandbox_only), [`permission_denied`](../errors.md#permission_denied), [`not_found`](../errors.md#not_found), [`rate_limited`](../errors.md#rate_limited)
**Request**
```sh
curl "https://api.infranest.io/api/organizations/42/status-pages/1/overview" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json"
```
**Response** · 200
```json
{
"setup": {
"components": {
"count": 8,
"linked": 8,
"groups": 2
},
"domain": {
"hostname": "status.northwind.example",
"status": "pending"
},
"subscribers": {
"enabled": true,
"count": 3
},
"is_public": true
},
"uptime": {
"days": 90,
"pct": 100,
"bars": [
{
"d": "2025-10-17",
"p": 100,
"c": "green"
},
{
"d": "2025-10-18",
"p": 100,
"c": "green"
}
]
},
"now": {
"overall_status": "major_outage",
"components_total": 8,
"by_status": {
"operational": 6,
"major_outage": 1,
"degraded": 1
},
"incidents": [
{
"id": 1,
"monitoring_check_id": 4,
"title": "Checkout returning 503",
"status": "investigating",
"impact": "major",
"started_at": "2026-01-15T11:20:00+00:00",
"is_planned": false,
"public_url": "/status/northwind/incidents/1"
}
]
},
"upcoming": {
"maintenance": null,
"announcement_ends": {
"id": 1,
"title": "Scheduled maintenance this weekend",
"ends_at": "2026-01-21T12:00:00+00:00"
}
}
}
```
---
### Get status page subscriber counts {#get-organizations-organization-status-pages-statuspage-subscribers}
`GET` `/organizations/{organization}/status-pages/{statusPage}/subscribers`
**Scope:** `monitoring.read` · **Changes data:** no
How many people subscribe to the page, how many have confirmed or are pending, a count per channel, and a 90-day growth curve. Counts only; use the subscriber list for individual entries.
| Field | Type | Notes |
|---|---|---|
| `organization_id`
path · required | integer | Your organization's ID. |
| `statusPage_id`
path · required | integer | The statusPage's ID. |
**Errors:** [`unauthenticated`](../errors.md#unauthenticated), [`scope_missing`](../errors.md#scope_missing), [`wrong_organization`](../errors.md#wrong_organization), [`test_token_required`](../errors.md#test_token_required), [`test_token_sandbox_only`](../errors.md#test_token_sandbox_only), [`permission_denied`](../errors.md#permission_denied), [`not_found`](../errors.md#not_found), [`rate_limited`](../errors.md#rate_limited)
**Request**
```sh
curl "https://api.infranest.io/api/organizations/42/status-pages/1/subscribers" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json"
```
**Response** · 200
```json
{
"total": 3,
"confirmed": 3,
"pending": 0,
"channels": {
"email": 3,
"slack": 0,
"teams": 0,
"discord": 0
},
"growth": {
"days": 90,
"points": [
{
"d": "2025-10-18",
"total": 0,
"confirmed": 0
},
{
"d": "2025-10-19",
"total": 0,
"confirmed": 0
}
]
}
}
```
---
### List status page subscribers {#get-organizations-organization-status-pages-statuspage-subscribers-list}
`GET` `/organizations/{organization}/status-pages/{statusPage}/subscribers/list`
**Scope:** `monitoring.read` · **Changes data:** no
The page’s subscribers, newest first, with their channel, label, confirmation date and whether delivery is failing. Filter with `q` (searches email addresses) and `status` (`confirmed` or `pending`), and page with `per_page` (10 to 100); reading the list is recorded in your audit log, and webhook addresses are never shown in full.
| Field | Type | Notes |
|---|---|---|
| `organization_id`
path · required | integer | Your organization's ID. |
| `statusPage_id`
path · required | integer | The statusPage's ID. |
**Errors:** [`unauthenticated`](../errors.md#unauthenticated), [`scope_missing`](../errors.md#scope_missing), [`wrong_organization`](../errors.md#wrong_organization), [`test_token_required`](../errors.md#test_token_required), [`test_token_sandbox_only`](../errors.md#test_token_sandbox_only), [`permission_denied`](../errors.md#permission_denied), [`not_found`](../errors.md#not_found), [`rate_limited`](../errors.md#rate_limited)
**Request**
```sh
curl "https://api.infranest.io/api/organizations/42/status-pages/1/subscribers/list" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json"
```
**Response** · 200
```json
{
"data": [
{
"id": 3,
"channel": "email",
"label": "oncall@northwind.example",
"confirmed_at": "2026-01-10T12:00:00+00:00",
"subscribed_at": "2026-01-15T12:00:00+00:00",
"undeliverable": null
},
{
"id": 2,
"channel": "email",
"label": "sre@northwind.example",
"confirmed_at": "2025-12-29T12:00:00+00:00",
"subscribed_at": "2026-01-15T12:00:00+00:00",
"undeliverable": null
}
],
"total": 3,
"per_page": 25,
"current_page": 1,
"last_page": 1
}
```