Status pages let you communicate your service health to users. Through the API, you can manage pages, attach monitors, post updates, and manage reusable update templates.
Example request:
$ OHDEAR_TOKEN="your API token"
$ curl https://ohdear.app/api/status-pages \
-H "Authorization: Bearer $OHDEAR_TOKEN" \
-H 'Accept: application/json' \
-H 'Content-Type: application/json'
All endpoints below follow the same authentication pattern.
Status page response fields #
Every status page endpoint returns an object with these fields:
{
"id": 1,
"team": {
"id": 1,
"name": "My Team"
},
"title": "Acme Status",
"domain": "status.acme.com",
"secret": null,
"badge_id": "01HQ3...",
"slug": "acme-status",
"full_url": "https://status.acme.com",
"timezone": "Europe/Brussels",
"summarized_status": "up",
"updates": [
{
"id": 10,
"title": "All systems operational",
"text": "Everything is running smoothly.",
"pinned": false,
"severity": "resolved",
"time": "2026-02-10 09:00:00",
"status_page_url": "https://status.acme.com"
}
],
"monitors": [
{
"id": 1,
"url": "https://acme.com",
"..."
}
],
"prevent_indexing": false,
"add_hsts_header": true,
"created_at": "2025-06-01T10:00:00.000000Z",
"updated_at": "2025-06-01T10:00:00.000000Z"
}
id: unique identifier
team: the team this status page belongs to
title: display title
domain: custom domain (if configured)
secret: secret token for accessing hidden status pages
badge_id: unique identifier for badge integration
slug: URL slug
full_url: the complete public URL of the status page
timezone: timezone used for displaying times
summarized_status: overall status -- Possible values: up, down, warning, unknown
updates: array of recent status page updates
monitors: array of monitors displayed on this page
prevent_indexing: whether search engines are asked not to index the page
add_hsts_header: whether the HSTS header is added
created_at: when the status page was created (UTC)
updated_at: when the status page was last modified (UTC)
Get a status page #
GET /api/status-pages/{statusPageId}
Returns a single status page by its ID. The response follows the status page shape above.
List all status pages #
GET /api/status-pages
Returns a paginated list of all status pages you have access to. Each item follows the same status page shape above.
Create a status page #
POST /api/status-pages
Creates a new status page.
Request body (JSON):
team_id (integer, required) -- the team this status page belongs to
title (string, required) -- the title of the status page
monitors (array, required) -- array of monitors to display on the status page
id (integer, required) -- the monitor ID
clickable (boolean, optional) -- whether the monitor name links to its URL (default false)
Returns the status page object.
Delete a status page #
DELETE /api/status-pages/{statusPageId}
Deletes a status page. Returns 204 No Content on success.
Attach and detach monitors #
Add or sync monitors #
POST /api/status-pages/{statusPageId}/monitors
Adds monitors to a status page, or synchronizes the full list.
Request body (JSON):
monitors (array, required) -- array of monitors to add
id (integer, required) -- the monitor ID
clickable (boolean, optional) -- whether the monitor name links to its URL
sync (boolean, optional) -- when true, monitors not present in the payload are removed from the status page. When false (default), monitors are only added
Remove a monitor #
DELETE /api/status-pages/{statusPageId}/monitors/{monitorId}
Removes a single monitor from a status page. Returns 204 No Content on success.
Status page updates #
Updates are messages posted to your status page to communicate incidents, maintenance, or resolutions to your users.
Update response fields #
Each update object has these fields:
{
"id": 10,
"title": "Investigating elevated error rates",
"text": "We are investigating elevated errors on our API cluster.",
"pinned": false,
"severity": "high",
"time": "2026-02-11 09:30:00",
"status_page_url": "https://status.acme.com"
}
id: unique identifier
title: the update headline
text: detailed body text
pinned: whether this update is pinned to the top
severity: severity level -- Possible values: info, warning, high, resolved, scheduled
time: when this update occurred, in the status page's timezone
status_page_url: the public URL of the status page
List updates #
GET /api/status-pages/{statusPageId}/updates
Returns a paginated list of updates from the past 7 days.
Create an update #
POST /api/status-page-updates
Posts a new update to a status page.
Request body (JSON):
status_page_id (integer, required) -- the status page to post this update to
title (string, required) -- the update headline
severity (string, required) -- one of info, warning, high, resolved, scheduled
time (string, required) -- when this update happened, in the status page's timezone (Y-m-d H:i format)
text (string, optional) -- detailed update body text
pinned (boolean, optional) -- whether to pin this update to the top
Returns the update object.
Update an update #
PUT /api/status-page-updates/{statusPageUpdateId}
Updates an existing status page update.
Request body (JSON):
title (string, required) -- the update headline
severity (string, required) -- one of info, warning, high, resolved, scheduled
text (string, optional) -- detailed update body text
pinned (boolean, optional) -- whether to pin this update
time (string, optional) -- update the timestamp, in the status page's timezone (Y-m-d H:i format)
Returns the updated update object.
Delete an update #
DELETE /api/status-page-updates/{statusPageUpdateId}
Deletes a status page update. Returns 204 No Content on success.
Update templates #
Templates let you prepare reusable update messages so your team can respond quickly during incidents.
Template response fields #
Each template object has these fields:
{
"id": 1,
"team_id": 1,
"name": "Deployment",
"title": "Scheduled maintenance",
"text": "We're performing a scheduled deployment. Expect brief downtime.",
"severity": "scheduled"
}
id: unique identifier
team_id: the team this template belongs to
name: internal template name
title: default update title
text: default update body text
severity: severity level -- Possible values: info, warning, high, resolved, scheduled
List templates #
GET /api/status-page-update-templates
Returns all update templates across your teams.
Create a template #
POST /api/status-page-update-templates
Creates a new update template.
Request body (JSON):
team_id (integer, required) -- the team this template belongs to
name (string, optional) -- internal name for the template
title (string, optional) -- default update title
text (string, optional) -- default update body text
severity (string, optional) -- one of info, warning, high, resolved, scheduled
Returns the template object.
Update a template #
PUT /api/status-page-update-templates/{statusPageUpdateTemplateId}
Updates an existing template. All fields are optional -- only include the ones you want to change.
Request body (JSON):
name (string, optional) -- internal name for the template
title (string, optional) -- default update title
text (string, optional) -- default update body text
severity (string, optional) -- one of info, warning, high, resolved, scheduled
Returns the updated template object.
Delete a template #
DELETE /api/status-page-update-templates/{statusPageUpdateTemplateId}
Deletes an update template. Returns 204 No Content on success.