Status Pages
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 identifierteam: the team this status page belongs totitle: display titledomain: custom domain (if configured)secret: secret token for accessing hidden status pagesbadge_id: unique identifier for badge integrationslug: URL slugfull_url: the complete public URL of the status pagetimezone: timezone used for displaying timessummarized_status: overall status -- Possible values:up,down,warning,unknownupdates: array of recent status page updatesmonitors: array of monitors displayed on this pageprevent_indexing: whether search engines are asked not to index the pageadd_hsts_header: whether the HSTS header is addedcreated_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 totitle(string, required) -- the title of the status pagemonitors(array, required) -- array of monitors to display on the status pageid(integer, required) -- the monitor IDclickable(boolean, optional) -- whether the monitor name links to its URL (defaultfalse)
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 addid(integer, required) -- the monitor IDclickable(boolean, optional) -- whether the monitor name links to its URL
sync(boolean, optional) -- whentrue, monitors not present in the payload are removed from the status page. Whenfalse(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 identifiertitle: the update headlinetext: detailed body textpinned: whether this update is pinned to the topseverity: severity level -- Possible values:info,warning,high,resolved,scheduledtime: when this update occurred, in the status page's timezonestatus_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 totitle(string, required) -- the update headlineseverity(string, required) -- one ofinfo,warning,high,resolved,scheduledtime(string, required) -- when this update happened, in the status page's timezone (Y-m-d H:iformat)text(string, optional) -- detailed update body textpinned(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 headlineseverity(string, required) -- one ofinfo,warning,high,resolved,scheduledtext(string, optional) -- detailed update body textpinned(boolean, optional) -- whether to pin this updatetime(string, optional) -- update the timestamp, in the status page's timezone (Y-m-d H:iformat)
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 identifierteam_id: the team this template belongs toname: internal template nametitle: default update titletext: default update body textseverity: 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 toname(string, optional) -- internal name for the templatetitle(string, optional) -- default update titletext(string, optional) -- default update body textseverity(string, optional) -- one ofinfo,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 templatetitle(string, optional) -- default update titletext(string, optional) -- default update body textseverity(string, optional) -- one ofinfo,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.
Feel free to reach out via [email protected] or on X via @OhDearApp if you have any other questions. We'd love to help!