Docs/API

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

Was this page helpful?

Feel free to reach out via [email protected] or on X via @OhDearApp if you have any other questions. We'd love to help!