Browse the docs

Status pages

Create pages from templates, publish them, change settings, and attach custom domains.

A page is created as a draft and published once. After that, every change to it or its components rebuilds the public snapshot automatically. The public address is always {slug}.statusbee.co; custom domains are added on top. See the status pages guide.

List pages

GET/user/pages

Needs the dashboard.read permission, or an API key with the matching scope.

Query parameters

workspace_idintegerrequired
The workspace to read from.
Request
curl "https://api.statusbee.co/user/pages?workspace_id=5" \
  -H "Authorization: Bearer sb_live_…"
Response
{
  "statusCode": 200,
  "error": false,
  "message": null,
  "data": {
    "rows": [
      {
        "id": 4,
        "workspace_id": 5,
        "org_id": 5,
        "slug": "acme-cloud",
        "name": "Acme Cloud",
        "visibility": "public",
        "template_key": "saas",
        "theme": {
          "mode": "light",
          "colors": {
            "accent": "#f59e0b"
          }
        },
        "branding": null,
        "seo": null,
        "timezone": "UTC",
        "uptime_display_days": 90,
        "powered_by_hidden": false,
        "published_at": "2026-09-14T09:02:11.000Z",
        "created_at": "2026-09-14T09:02:11.000Z",
        "updated_at": "2026-09-14T09:02:11.000Z"
      }
    ]
  }
}

Create a page

POST/user/pages

Counts against the plan's pages limit. A template_key seeds component groups and components; list templates with GET /user/page_templates.

Needs the pages.manage permission, or an API key with the matching scope.

Body

workspace_idintegerrequired
Workspace the page belongs to.
namestringrequired
Page name, up to 100 characters.
slugstring
Address prefix. Generated from the name and made unique when omitted.
template_keystring
saas, api, agency or another key from the template gallery.
Request
curl -X POST "https://api.statusbee.co/user/pages" \
  -H "Authorization: Bearer sb_live_…" \
  -H "Content-Type: application/json" \
  -d '{
  "workspace_id": 5,
  "name": "Acme Cloud",
  "template_key": "saas"
}'
Response
{
  "statusCode": 200,
  "error": false,
  "message": null,
  "data": {
    "id": 4,
    "workspace_id": 5,
    "org_id": 5,
    "slug": "acme-cloud",
    "name": "Acme Cloud",
    "visibility": "public",
    "template_key": "saas",
    "theme": {
      "mode": "light",
      "colors": {
        "accent": "#f59e0b"
      }
    },
    "branding": null,
    "seo": null,
    "timezone": "UTC",
    "uptime_display_days": 90,
    "powered_by_hidden": false,
    "published_at": null,
    "created_at": "2026-09-14T09:02:11.000Z",
    "updated_at": "2026-09-14T09:02:11.000Z"
  }
}

Get a page

GET/user/pages/:id

The page with its custom domains and its default hostname.

Needs the dashboard.read permission, or an API key with the matching scope.

Path parameters

idintegerrequired
Page id.
Request
curl "https://api.statusbee.co/user/pages/4" \
  -H "Authorization: Bearer sb_live_…"
Response
{
  "statusCode": 200,
  "error": false,
  "message": null,
  "data": {
    "page": {
      "id": 4,
      "workspace_id": 5,
      "org_id": 5,
      "slug": "acme-cloud",
      "name": "Acme Cloud",
      "visibility": "public",
      "template_key": "saas",
      "theme": {
        "mode": "light",
        "colors": {
          "accent": "#f59e0b"
        }
      },
      "branding": null,
      "seo": null,
      "timezone": "UTC",
      "uptime_display_days": 90,
      "powered_by_hidden": false,
      "published_at": "2026-09-14T09:02:11.000Z",
      "created_at": "2026-09-14T09:02:11.000Z",
      "updated_at": "2026-09-14T09:02:11.000Z"
    },
    "domains": [
      {
        "id": 2,
        "page_id": 4,
        "workspace_id": 5,
        "org_id": 5,
        "hostname": "status.acme.cloud",
        "txt_token": "statusbee-verify=8c1f…",
        "verified_at": null,
        "ssl_status": null,
        "created_at": "2026-09-14T09:02:11.000Z"
      }
    ],
    "default_hostname": "acme-cloud.statusbee.co"
  }
}

Update a page

PATCH/user/pages/:id

Send only the fields you are changing. Some fields are gated by plan: non-public visibility needs private_pages, powered_by_hidden needs its entitlement, and uptime_display_days is capped at the plan's history_days.

Needs the pages.manage permission, or an API key with the matching scope.

Path parameters

idintegerrequired
Page id.

Body

namestring
Page name.
visibilitystring
public, password, sso or private. Only public pages are served today.
timezonestring
IANA zone for displayed times, for example Europe/Berlin.
uptime_display_daysinteger
Days of history each component shows, up to the plan limit.
powered_by_hiddenboolean
Hide the footer credit.
themeobject
Theme object: { mode, colors }.
brandingobject
Logo, colours, from-name for emails.
seoobject
Title and description overrides for the public page.
Request
curl -X PATCH "https://api.statusbee.co/user/pages/4" \
  -H "Authorization: Bearer sb_live_…" \
  -H "Content-Type: application/json" \
  -d '{
  "timezone": "Europe/Berlin",
  "uptime_display_days": 180
}'
Response
{
  "statusCode": 200,
  "error": false,
  "message": null,
  "data": {
    "id": 4,
    "workspace_id": 5,
    "org_id": 5,
    "slug": "acme-cloud",
    "name": "Acme Cloud",
    "visibility": "public",
    "template_key": "saas",
    "theme": {
      "mode": "light",
      "colors": {
        "accent": "#f59e0b"
      }
    },
    "branding": null,
    "seo": null,
    "timezone": "Europe/Berlin",
    "uptime_display_days": 180,
    "powered_by_hidden": false,
    "published_at": "2026-09-14T09:02:11.000Z",
    "created_at": "2026-09-14T09:02:11.000Z",
    "updated_at": "2026-09-14T09:02:11.000Z"
  }
}

Publish a page

POST/user/pages/:id/publish

Makes the page live at its address and emits page.published. Idempotent: publishing again changes nothing.

Needs the pages.manage permission, or an API key with the matching scope.

Path parameters

idintegerrequired
Page id.
Request
curl -X POST "https://api.statusbee.co/user/pages/4/publish" \
  -H "Authorization: Bearer sb_live_…"
Response
{
  "statusCode": 200,
  "error": false,
  "message": null,
  "data": {
    "id": 4,
    "workspace_id": 5,
    "org_id": 5,
    "slug": "acme-cloud",
    "name": "Acme Cloud",
    "visibility": "public",
    "template_key": "saas",
    "theme": {
      "mode": "light",
      "colors": {
        "accent": "#f59e0b"
      }
    },
    "branding": null,
    "seo": null,
    "timezone": "UTC",
    "uptime_display_days": 90,
    "powered_by_hidden": false,
    "published_at": "2026-09-14T09:02:11.000Z",
    "created_at": "2026-09-14T09:02:11.000Z",
    "updated_at": "2026-09-14T09:02:11.000Z"
  }
}

Delete a page

DELETE/user/pages/:id

Removes the page, its components, incidents, subscribers and domains. The public address stops serving immediately.

Needs the pages.manage permission, or an API key with the matching scope.

Path parameters

idintegerrequired
Page id.
Request
curl -X DELETE "https://api.statusbee.co/user/pages/4" \
  -H "Authorization: Bearer sb_live_…"
Response
{
  "statusCode": 200,
  "error": false,
  "message": null,
  "data": {
    "deleted": 1
  }
}

List custom domains

GET/user/pages/:id/domains

Needs the workspace.settings permission, or an API key with the matching scope.

Path parameters

idintegerrequired
Page id.
Request
curl "https://api.statusbee.co/user/pages/4/domains" \
  -H "Authorization: Bearer sb_live_…"
Response
{
  "statusCode": 200,
  "error": false,
  "message": null,
  "data": {
    "rows": [
      {
        "id": 2,
        "page_id": 4,
        "workspace_id": 5,
        "org_id": 5,
        "hostname": "status.acme.cloud",
        "txt_token": "statusbee-verify=8c1f…",
        "verified_at": null,
        "ssl_status": null,
        "created_at": "2026-09-14T09:02:11.000Z"
      }
    ]
  }
}

Add a custom domain

POST/user/pages/:id/domains

Needs the custom_domain entitlement. Returns the DNS records to create; verify afterwards.

Needs the workspace.settings permission, or an API key with the matching scope.

Path parameters

idintegerrequired
Page id.

Body

hostnamestringrequired
A hostname such as status.acme.cloud. No scheme, no path.
Request
curl -X POST "https://api.statusbee.co/user/pages/4/domains" \
  -H "Authorization: Bearer sb_live_…" \
  -H "Content-Type: application/json" \
  -d '{
  "hostname": "status.acme.cloud"
}'
Response
{
  "statusCode": 200,
  "error": false,
  "message": null,
  "data": {
    "domain": {
      "id": 2,
      "page_id": 4,
      "workspace_id": 5,
      "org_id": 5,
      "hostname": "status.acme.cloud",
      "txt_token": "statusbee-verify=8c1f…",
      "verified_at": null,
      "ssl_status": null,
      "created_at": "2026-09-14T09:02:11.000Z"
    },
    "instructions": {
      "txt_record": {
        "name": "_statusbee.status.acme.cloud",
        "value": "statusbee-verify=8c1f…"
      },
      "cname": {
        "name": "status.acme.cloud",
        "value": "acme-cloud.statusbee.co"
      }
    }
  }
}

Verify a custom domain

POST/user/pages/:id/domains/:domainId/verify

Looks up the TXT record now. 400 with an explanation while DNS has not propagated; call again later.

Needs the workspace.settings permission, or an API key with the matching scope.

Path parameters

idintegerrequired
Page id.
domainIdintegerrequired
Domain id.
Request
curl -X POST "https://api.statusbee.co/user/pages/4/domains/2/verify" \
  -H "Authorization: Bearer sb_live_…"
Response
{
  "statusCode": 200,
  "error": false,
  "message": null,
  "data": {
    "id": 2,
    "page_id": 4,
    "workspace_id": 5,
    "org_id": 5,
    "hostname": "status.acme.cloud",
    "txt_token": "statusbee-verify=8c1f…",
    "verified_at": "2026-09-14T09:02:11.000Z",
    "ssl_status": "pending",
    "created_at": "2026-09-14T09:02:11.000Z"
  }
}

Remove a custom domain

DELETE/user/pages/:id/domains/:domainId

Needs the workspace.settings permission, or an API key with the matching scope.

Path parameters

idintegerrequired
Page id.
domainIdintegerrequired
Domain id.
Request
curl -X DELETE "https://api.statusbee.co/user/pages/4/domains/2" \
  -H "Authorization: Bearer sb_live_…"
Response
{
  "statusCode": 200,
  "error": false,
  "message": null,
  "data": {
    "deleted": 1
  }
}

List page templates

GET/user/page_templates

The global template gallery. Pass a template's key when creating a page.

Request
curl "https://api.statusbee.co/user/page_templates" \
  -H "Authorization: Bearer sb_live_…"
Response
{
  "statusCode": 200,
  "error": false,
  "message": null,
  "data": {
    "rows": [
      {
        "key": "saas",
        "name": "SaaS",
        "category": "saas",
        "position": 0,
        "starter_components": [
          {
            "group": "Application",
            "components": [
              {
                "name": "Web App"
              },
              {
                "name": "Dashboard"
              }
            ]
          },
          {
            "group": "API",
            "components": [
              {
                "name": "REST API"
              },
              {
                "name": "Webhooks"
              }
            ]
          }
        ]
      }
    ]
  }
}