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
/user/pagesNeeds the dashboard.read permission, or an API key with the matching scope.
Query parameters
workspace_idintegerrequired- The workspace to read from.
curl "https://api.statusbee.co/user/pages?workspace_id=5" \
-H "Authorization: Bearer sb_live_…"{
"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
/user/pagesCounts 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_keystringsaas,api,agencyor another key from the template gallery.
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"
}'{
"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
/user/pages/:idThe 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.
curl "https://api.statusbee.co/user/pages/4" \
-H "Authorization: Bearer sb_live_…"{
"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
/user/pages/:idSend 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.
visibilitystringpublic,password,ssoorprivate. 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.
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
}'{
"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
/user/pages/:id/publishMakes 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.
curl -X POST "https://api.statusbee.co/user/pages/4/publish" \
-H "Authorization: Bearer sb_live_…"{
"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
/user/pages/:idRemoves 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.
curl -X DELETE "https://api.statusbee.co/user/pages/4" \
-H "Authorization: Bearer sb_live_…"{
"statusCode": 200,
"error": false,
"message": null,
"data": {
"deleted": 1
}
}List custom domains
/user/pages/:id/domainsNeeds the workspace.settings permission, or an API key with the matching scope.
Path parameters
idintegerrequired- Page id.
curl "https://api.statusbee.co/user/pages/4/domains" \
-H "Authorization: Bearer sb_live_…"{
"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
/user/pages/:id/domainsNeeds 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.
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"
}'{
"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
/user/pages/:id/domains/:domainId/verifyLooks 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.
curl -X POST "https://api.statusbee.co/user/pages/4/domains/2/verify" \
-H "Authorization: Bearer sb_live_…"{
"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
/user/pages/:id/domains/:domainIdNeeds the workspace.settings permission, or an API key with the matching scope.
Path parameters
idintegerrequired- Page id.
domainIdintegerrequired- Domain id.
curl -X DELETE "https://api.statusbee.co/user/pages/4/domains/2" \
-H "Authorization: Bearer sb_live_…"{
"statusCode": 200,
"error": false,
"message": null,
"data": {
"deleted": 1
}
}List page templates
/user/page_templatesThe global template gallery. Pass a template's key when creating a page.
curl "https://api.statusbee.co/user/page_templates" \
-H "Authorization: Bearer sb_live_…"{
"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"
}
]
}
]
}
]
}
}