GET
Required scope https://app.honeybadger.io/v3/status_pages/{status_page_id}
status_pages:read
Returns a single status page.
Example request
curl "https://app.honeybadger.io/v3/status_pages/$STATUS_PAGE_ID" \ -H "Authorization: Bearer $HONEYBADGER_API_TOKEN"Parameters
1Path parameters
| Field | Type | Description |
|---|---|---|
status_page_id required | string | Status page ID. |
Responses
1200 Success
Example payload
{ "data": { "id": "Sp7bMq", "account_id": "Ab3kL9", "name": "Acme Status", "domain": "status.acme.com", "features": { "home_link": "https://www.example.com", "up_caption": "Everything is running smoothly", "down_caption": "We're working on an outage", "mixed_caption": "Some services are degraded", "custom_css": ".header { background: #1d4ed8; }" }, "hide_branding": true, "password_protected": true, "username": null, "incidents_enabled": true, "search_engine_indexing_disabled": true, "message_enabled": true, "message_title": "Scheduled maintenance", "message_body": "We're upgrading our database on Saturday at 02:00 UTC.", "google_analytics_id": null, "url": "https://acme.statuspage.honeybadger.io", "created_at": "2026-01-01T00:00:00Z", "domain_verified_at": "2026-01-01T00:00:00Z", "sites": [ { "site_id": "9f8b6d2e-4c1a-4b7f-9e35-2a6c8d0f1b47", "display_name": "Website", "description": null } ], "check_ins": [ { "check_in_id": "Ci5xWq", "display_name": "Nightly backup", "description": null } ], "links": { "web": "https://app.honeybadger.io/projects/Xk9mZp" } }, "meta": { "request_id": "6f1c2b0e-8d4a-4f6e-9b2a-3c5d7e9f1a2b" }}Response schema35
| Field | Type | Description |
|---|---|---|
data required | object | A public status page. Readable and deletable after the plan loses status pages; creating and editing need the feature. |
data.id required | string | |
data.account_id required | string | ID of the account this status page belongs to. |
data.name required | string | Status page name. |
data.domain required | string | null | Custom domain for the status page. |
data.features required | object | Presentation copy and styling. Replaced whole by an update. A key that was never set is absent from a read; one sent as null reads back as null. |
data.features.home_link | string | null | URL the page header links to, usually your own site. |
data.features.up_caption | string | null | Text shown when every check is up. Unset, the page says "All systems are operational". |
data.features.down_caption | string | null | Text shown when every check is down. Unset, the page says "All systems are experiencing issues". |
data.features.mixed_caption | string | null | Text shown when only some checks are down. Unset, the page says "Some systems are experiencing issues". |
data.features.custom_css | string | null | CSS added to the page after its own styles. |
data.hide_branding required | boolean | |
data.password_protected required | boolean | |
data.username required | string | null | Basic-auth user when password protected. The password is never returned. |
data.incidents_enabled required | boolean | Whether the page shows incidents. |
data.search_engine_indexing_disabled required | boolean | Whether search engines are asked not to index the page. |
data.message_enabled required | boolean | Whether the message banner shows. |
data.message_title required | string | null | The message banner's title. |
data.message_body required | string | null | The message banner's text. |
data.google_analytics_id required | string | null | The page's Google Analytics measurement ID. |
data.url required | string | URL of the status page. |
data.created_at required | date-time | When the status page was created. |
data.domain_verified_at required | date-time | null | When the custom domain was verified. |
data.sites required | array<object> | Uptime sites displayed on the status page. An ordered list; the order is the order on the page. |
data.sites[].site_id required | uuid | Identifier of the site. |
data.sites[].display_name required | string | null | Display name on the status page. |
data.sites[].description required | string | null | Description shown on the status page. |
data.check_ins required | array<object> | Check-ins displayed on the status page. An ordered list; the order is the order on the page. |
data.check_ins[].check_in_id required | string | ID of the check-in. |
data.check_ins[].display_name required | string | null | Display name on the status page. |
data.check_ins[].description required | string | null | Description shown on the status page. |
data.links required | object | Links into the Honeybadger web UI. |
data.links.web required | uri | The resource's page in the Honeybadger web UI, as an absolute URL. Resources without a page, such as outages and deploys, don't have links. For a project provisioned through Heroku, error, notice and comment links go through Heroku's single sign-on. |
meta | object | |
meta.request_id | string | Unique identifier for the request, for correlating with support. |
Errors
4
401
Unauthorized
The credential is missing, invalid, expired or revoked (unauthorized), or was sent in a way v3 doesn’t accept (see the examples).
Example payload: unauthorized (Missing, malformed, expired or revoked credential)
{ "error": { "code": "unauthorized", "message": "Access denied" }, "meta": { "request_id": "abc123" }}Example payload: unsupported_auth_scheme (Sent as HTTP basic, which v3 does not accept)
{ "error": { "code": "unsupported_auth_scheme", "message": "Send the credential as `Authorization: Bearer <token>`; v3 does not accept HTTP basic" }, "meta": { "request_id": "abc123" }}Example payload: credential_in_query (Sent as the `auth_token` query parameter)
{ "error": { "code": "credential_in_query", "message": "Credentials must be sent in the Authorization header" }, "meta": { "request_id": "abc123" }}Response schema6
| Field | Type | Description |
|---|---|---|
error required | object | |
error.code required | string | Machine-readable code. Branch on this, not the message. Allowed values: unauthorized, unsupported_auth_scheme, credential_in_query, access_denied, insufficient_scope, requires_user_token, project_restricted, account_inactive, account_parked, feature_unavailable, not_found, validation_error, delete_failed, limit_reached, rate_limit_exceeded, concurrent_request, streams_provisioning, ingestion_key_not_accepted, maintenance_mode, invalid_parameter, forbidden_attributes, service_unavailable, ambiguous_account, fault_merged. |
error.message required | string | Human-readable explanation. |
error.details | array<object> | object | A list of {field, message} on validation_error and invalid_parameter, and on feature_unavailable or limit_reached when one field caused the refusal; {required_scope, token_scopes} on insufficient_scope; {merged_into, location} on fault_merged. Absent when there's nothing to add. |
meta | object | |
meta.request_id | string | Unique identifier for the request, for correlating with support. |
403
Forbidden
The credential isn’t allowed to do this. error.code says why. An account or project the credential doesn’t cover is 404 not_found, not 403.
Example payload: access_denied (The credential isn't allowed to do this to this record)
{ "error": { "code": "access_denied", "message": "Access denied" }, "meta": { "request_id": "abc123" }}Example payload: insufficient_scope (The credential lacks the permission this endpoint requires)
{ "error": { "code": "insufficient_scope", "message": "Insufficient scope", "details": { "required_scope": "faults:write", "token_scopes": [ "faults:read", "insights:read" ] } }, "meta": { "request_id": "abc123" }}Example payload: requires_user_token (The endpoint records who acted, and an account token has nobody)
{ "error": { "code": "requires_user_token", "message": "This endpoint records the person who acted, so it requires a user credential rather than an account token" }, "meta": { "request_id": "abc123" }}Example payload: project_restricted (A project-restricted credential cannot create a project)
{ "error": { "code": "project_restricted", "message": "Project-restricted tokens cannot create projects" }, "meta": { "request_id": "abc123" }}Response schema6
| Field | Type | Description |
|---|---|---|
error required | object | |
error.code required | string | Machine-readable code. Branch on this, not the message. Allowed values: unauthorized, unsupported_auth_scheme, credential_in_query, access_denied, insufficient_scope, requires_user_token, project_restricted, account_inactive, account_parked, feature_unavailable, not_found, validation_error, delete_failed, limit_reached, rate_limit_exceeded, concurrent_request, streams_provisioning, ingestion_key_not_accepted, maintenance_mode, invalid_parameter, forbidden_attributes, service_unavailable, ambiguous_account, fault_merged. |
error.message required | string | Human-readable explanation. |
error.details | array<object> | object | A list of {field, message} on validation_error and invalid_parameter, and on feature_unavailable or limit_reached when one field caused the refusal; {required_scope, token_scopes} on insufficient_scope; {merged_into, location} on fault_merged. Absent when there's nothing to add. |
meta | object | |
meta.request_id | string | Unique identifier for the request, for correlating with support. |
404
Not Found
Resource not found
Example payload
{ "error": { "code": "not_found", "message": "Resource not found" }, "meta": { "request_id": "abc123" }}Response schema6
| Field | Type | Description |
|---|---|---|
error required | object | |
error.code required | string | Machine-readable code. Branch on this, not the message. Allowed values: unauthorized, unsupported_auth_scheme, credential_in_query, access_denied, insufficient_scope, requires_user_token, project_restricted, account_inactive, account_parked, feature_unavailable, not_found, validation_error, delete_failed, limit_reached, rate_limit_exceeded, concurrent_request, streams_provisioning, ingestion_key_not_accepted, maintenance_mode, invalid_parameter, forbidden_attributes, service_unavailable, ambiguous_account, fault_merged. |
error.message required | string | Human-readable explanation. |
error.details | array<object> | object | A list of {field, message} on validation_error and invalid_parameter, and on feature_unavailable or limit_reached when one field caused the refusal; {required_scope, token_scopes} on insufficient_scope; {merged_into, location} on fault_merged. Absent when there's nothing to add. |
meta | object | |
meta.request_id | string | Unique identifier for the request, for correlating with support. |
422
Unprocessable Content
No path names the account, so the API token has to. This is returned when the token covers more than one account and the account a request applies to cannot be determined. Use a token bound to a single account.
Example payload
{ "error": { "code": "ambiguous_account", "message": "This credential covers more than one account, so the account a request applies to is ambiguous. Use a token bound to a single account." }, "meta": { "request_id": "abc123" }}Response schema6
| Field | Type | Description |
|---|---|---|
error required | object | |
error.code required | string | Machine-readable code. Branch on this, not the message. Allowed values: unauthorized, unsupported_auth_scheme, credential_in_query, access_denied, insufficient_scope, requires_user_token, project_restricted, account_inactive, account_parked, feature_unavailable, not_found, validation_error, delete_failed, limit_reached, rate_limit_exceeded, concurrent_request, streams_provisioning, ingestion_key_not_accepted, maintenance_mode, invalid_parameter, forbidden_attributes, service_unavailable, ambiguous_account, fault_merged. |
error.message required | string | Human-readable explanation. |
error.details | array<object> | object | A list of {field, message} on validation_error and invalid_parameter, and on feature_unavailable or limit_reached when one field caused the refusal; {required_scope, token_scopes} on insufficient_scope; {merged_into, location} on fault_merged. Absent when there's nothing to add. |
meta | object | |
meta.request_id | string | Unique identifier for the request, for correlating with support. |