These endpoints exist only while status pages are switched on for AperioFlow. Admins and owners manage status pages and write incidents; what an incident says is public, so it must not hold personal data.
GET /api/incident-templates
Members. Starting texts for incident updates, the stages, the limits and the hint shown beside the editor.
Responses:
| Status | Meaning |
|---|---|
| 200 | The templates |
POST /api/incidents
Admins. Write an incident for the status page of the components it affects. Public, so no personal data. Only when MONITORS=on.
Request body (application/json, required).
| Field | Type | Required | Description |
|---|---|---|---|
title | string | Yes | Up to 150 characters. |
monitor_ids | array of integer | Yes | Up to 50 items. |
stage | string | No | One of: investigating, identified, monitoring, resolved. Default "investigating". |
body | string | Yes | Up to 1000 characters. |
Responses:
| Status | Meaning |
|---|---|
| 201 | {id} |
| 400 | A limit is passed |
| 403 | Not an admin |
POST /api/incidents/{id}/updates
Admins. Add an update to an incident written by hand. "resolved" closes it; a later update reopens it.
Parameters:
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | integer | Yes |
Request body (application/json, required).
| Field | Type | Required | Description |
|---|---|---|---|
stage | string | Yes | One of: investigating, identified, monitoring, resolved. |
body | string | Yes | Up to 1000 characters. |
Responses:
| Status | Meaning |
|---|---|
| 201 | {id} |
| 404 | Not found |
DELETE /api/incidents/{id}/updates/{updateId}
Admins. Delete one update for good (it leaves the status page at once). The last update takes the incident with it.
Parameters:
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | integer | Yes | |
updateId | path | integer | Yes |
Responses:
| Status | Meaning |
|---|---|
| 204 | Deleted |
| 404 | Not found |
DELETE /api/incidents/{id}
Admins. Delete an incident written by hand, with its updates, for good.
Parameters:
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | integer | Yes |
Responses:
| Status | Meaning |
|---|---|
| 204 | Deleted |
| 404 | Not found |
GET /api/status-pages
Members. The organisation's status pages, the plan's limit and the domain pages sit under. Only when STATUS_PAGES=on.
Responses:
| Status | Meaning |
|---|---|
| 200 | The pages |
POST /api/status-pages
Admins. Make a status page (unpublished). The slug must pass the reserved-name and look-alike rules; it needs an owner with a verified email.
Request body (application/json, required).
| Field | Type | Required | Description |
|---|---|---|---|
slug | string | Yes | 3 to 40 lowercase letters, digits and single hyphens. |
title | string | Yes | Up to 100 characters. |
description | string or null | No | Up to 500 characters. |
project_id | integer or null | No | One of the organisation's own projects, or null. Only groups the page in the app: the project is never shown on the public page. |
components | array of object | No | Up to 50 items. |
Responses:
| Status | Meaning |
|---|---|
| 201 | Created |
| 400 | The slug is reserved |
| 402 | The plan's page limit is reached |
| 409 | No owner has a verified email address |
GET /api/status-pages/check
Admins. Says whether a slug can be used (problem is null) or why not.
Parameters:
| Name | In | Type | Required | Description |
|---|---|---|---|---|
slug | query | string | Yes |
Responses:
| Status | Meaning |
|---|---|
| 200 | {problem} |
GET /api/status-pages/{id}/domain
Admins. The organisation custom domain for a status page (hostname, status pending/active/failed, the DNS records to add) and whether the plan allows one. Only when CUSTOM_DOMAINS=on.
Parameters:
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | integer | Yes |
Responses:
| Status | Meaning |
|---|---|
| 200 | The domain or null |
PUT /api/status-pages/{id}/domain
Owners, Solo and Team. Add a custom domain; a Custom Hostname is made at Cloudflare and the DNS records to add are returned. One for each organisation.
Parameters:
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | integer | Yes |
Request body (application/json, required).
| Field | Type | Required | Description |
|---|---|---|---|
hostname | string | Yes | A sub-domain you control, for example status.example.com. |
Responses:
| Status | Meaning |
|---|---|
| 200 | The domain with its records |
| 400 | Not an acceptable name |
| 402 | Not on the Free plan |
| 409 | This organisation already has a custom domain |
DELETE /api/status-pages/{id}/domain
Owners. Remove the custom domain; it stops being served at once and the Custom Hostname at Cloudflare is deleted (retried if that fails).
Parameters:
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | integer | Yes |
Responses:
| Status | Meaning |
|---|---|
| 200 | The page without a domain |
| 404 | No custom domain |
GET /api/status-pages/{id}/subscribers
Admins. Counts by status and a page of masked addresses (50 at a time, offset). Needs email subscribers switched on for the server.
Parameters:
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | integer | Yes | |
offset | query | integer | No |
Responses:
| Status | Meaning |
|---|---|
| 200 | Counts and masked subscribers |
GET /api/status-pages/{id}/subscribers/search
Owners. Whether an exact address is subscribed (matched through a keyed hash).
Parameters:
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | integer | Yes | |
email | query | string | Yes |
Responses:
| Status | Meaning |
|---|---|
| 200 | {found, status, subscribed_at, confirmed_at} |
GET /api/status-pages/{id}/subscribers/export
Owners. All subscriber addresses with status and times. Each export is logged with a count, never addresses.
Parameters:
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | integer | Yes |
Responses:
| Status | Meaning |
|---|---|
| 200 | The subscribers |
DELETE /api/status-pages/{id}/subscribers/{subscriberId}
Admins. Delete one subscriber and their address.
Parameters:
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | integer | Yes | |
subscriberId | path | integer | Yes |
Responses:
| Status | Meaning |
|---|---|
| 204 | Deleted |
| 404 | Not found |
PATCH /api/status-pages/{id}
Admins. Change the title, description, published flag, project link, slug (at most twice; the old one is held 90 days) or components. A component without a name uses the monitor's own name as its public name (a Coolify monitor must always be given one); each component in the answer says whether its public name is the same as the monitor's (uses_monitor_name).
Parameters:
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | integer | Yes |
Request body (application/json, required).
| Field | Type | Required | Description |
|---|---|---|---|
title | string | No | |
description | string or null | No | |
published | boolean | No | |
subscribers_enabled | boolean | No | Let visitors subscribe by email. |
search_listing | boolean | No | Let search engines list the page. Off by default. |
project_id | integer or null | No | One of the organisation's own projects, or null. Only groups the page in the app: the project is never shown on the public page. |
slug | string | No | |
components | array of values | No |
Responses:
| Status | Meaning |
|---|---|
| 200 | Updated |
| 404 | Not found |
DELETE /api/status-pages/{id}
Admins. Delete a status page; its address stays reserved for 90 days.
Parameters:
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | integer | Yes |
Responses:
| Status | Meaning |
|---|---|
| 204 | Deleted |
| 404 | Not found |