Skip to content

Status page reference

The full request schemas live in the auto-generated API Reference. This page is the human-readable cheat sheet for the /status_page endpoint family and its /v1 routes.

FieldTypeDescription
friendly_namestringThe page name. The only writable field on the page object itself.
iduuidRead-only. Page ID.
account_iduuidRead-only. Owning account.
page_urlstringRead-only. Where the public page lives: https://<your-domain> once a custom domain is active, otherwise https://statuspage.siteqwality.com/<account-id>/<page-id>. Create, get and list all return it.
created_atrfc3339Read-only.

Branding, components, incidents, maintenance, and the custom domain are all nested resources (below).

A page shows four kinds of component:

KindLayout kindStatus comes fromUptime bars
HTTP checkhttp_jobThe monitor.Yes, unless show_uptime is false.
Browser checkbrowser_checkThe monitor.No.
Heartbeatcron_jobA heartbeat monitor: up while its pings arrive on time, down once one is missed.No.
ManualmanualYou. There is no monitor behind it.No.

A page shows at most 100 components, all four kinds together. Adding a 101st returns 400 with A status page can show at most 100 components. Attaching a monitor already on the page updates its friendly_name.

Group, order, describe and hide every kind in the dashboard’s Layout tab or with PUT /status_page/{id}/layout, which saves the whole layout at once. See Group and order status page components.

Attach an HTTP check with POST /status_page/{status_page_id}/http_job/{http_job_id} or a browser check with POST /status_page/{status_page_id}/browser_check/{browser_check_id}.

FieldTypeOnDescription
friendly_namestringcreate + updatePublic-facing name shown on the page (independent of the monitor’s internal name).
sla_target_percentagenumber | nullupdate onlySLA target shown next to the component, e.g. 99.9. Send null to clear.

GET /status_page/{status_page_id}/http_job/{http_job_id} (or /browser_check/{browser_check_id}) reads one attached monitor with its page settings. It and PUT return 404 when the monitor is not on that page.

Show a heartbeat monitor with POST /status_page/{status_page_id}/cron_job/{cron_job_id} and {"friendly_name": "Nightly backup"} (required, at most 256 characters). Posting it again renames it, and so does PUT on the same path. DELETE takes it off the page and leaves the heartbeat monitor running; it answers 200 whether or not it was on the page. A heartbeat monitor that is not in your account returns 404. Deleting the heartbeat monitor removes it from every page.

The heartbeat shows operational while pings arrive on time and down once one is missed. A paused heartbeat monitor shows paused, one that has never been checked or whose checks stopped shows unknown, and a maintenance covering the whole page shows maintenance.

A component with no monitor, for something you cannot check from outside (a support desk, a supplier, an internal process). You set its status.

POST /status_page/{status_page_id}/component creates one and answers 201 with the component as the layout shows it. It goes last in its group.

FieldTypeOnDescription
friendly_namestringcreate + updateRequired on create, at most 256 characters.
descriptionstring | nullcreate + updateOne line under the name, at most 200 characters. Send null to clear.
statusenumcreate + updateoperational (the default), degraded, down or maintenance.
group_iduuid | nullcreate onlyA group on this page. Leave it out for the ungrouped list.
hiddenboolcreate onlytrue keeps it off the public page for now. Change it later in the layout.

PATCH /status_page/{status_page_id}/component/{component_id} changes any of friendly_name, description and status; fields you leave out stay as they are. DELETE on the same path removes it and answers 204. Both return 404 for an id that is not a manual component on this page.

Force what the page shows for any component, whatever its monitor says: for example degraded while a supplier you depend on is slow, or operational while a monitor is misreading.

PUT /status_page/{status_page_id}/component/{component_id}/override, where component_id is the component’s id in the layout (the HTTP check, browser check or heartbeat monitor id, or the manual component’s own id):

FieldTypeDescription
statusenumoperational, degraded, down or maintenance. Required.
notestring | nullShown under the component’s name on the public page, at most 500 characters, one line.
expires_atrfc3339 | nullWhen the override lapses on its own. Must be in the future. Leave it out to keep it until you clear it.

It answers with the component, including its status_override. Setting it again replaces it. DELETE on the same path clears it and answers 204, also when there was none. Both return 404 for a component that is not on this page.

An override wins over the monitor, a pause and any maintenance, and it counts toward the page headline: a component forced to down can turn the headline into an outage, and maintenance turns it into under_maintenance. The public page shows the change within a minute, and again when the override expires.

PUT /status_page/{status_page_id}/branding. Every field is optional. A field you leave out keeps its value; null clears it. Blank text (empty or only whitespace) clears too. Saving republishes the page, and the change is live within a minute.

FieldTypeConstraintDescriptionCleared to
page_titlestringmax 100 charactersBrowser tab title, and the header heading when there is no logo.Status Page
default_themeenumlight | dark | systemTheme for first-time visitors.system
primary_colorstring#rrggbbPage title and the subscribe heading. Also the accent when accent_color is unset.body text color
accent_colorstring#rrggbbLinks, the Subscribe button, focus rings, text selection and the response time line.primary_color, else Atlas clay
header_textstringmax 500 charactersLine under the logo or title.System Status
footer_textstringmax 500 charactersLine in the footer.nothing
meta_descriptionstringmax 160 charactersSearch and link preview description.a generated one
custom_cssstringmax 50 KBStylesheet loaded after the page’s own. See Brand your status page.nothing
white_labelboolnoneRemoves the “Powered by Site Qwality” badge.false
logo_s3_keystringfrom the upload flowHeader logo.the title
logo_dark_s3_keystringfrom the upload flowHeader logo in the dark theme.logo_s3_key
favicon_s3_keystringfrom the upload flowBrowser tab icon.Site Qwality icon, none when white-labeled
og_image_s3_keystringfrom the upload flowLink preview image.none

An *_s3_key must be the s3_key the upload endpoint returned for that asset type on this page; any other key returns 400. Sending back the key already stored is accepted. Replacing or clearing a key deletes the old file.

GET and PUT return the stored fields plus logo_url, logo_dark_url, favicon_url and og_image_url, the CDN addresses of the assets (null when unset).

The page never draws a brand color where it would be hard to read. For each theme it uses the color as given when it meets WCAG 2.2 AA on the page’s backgrounds, and otherwise the nearest shade of the same hue that does: 4.5:1 for text (the title, links), 3:1 for focus rings and the chart line. The Subscribe button keeps 4.5:1 between its fill and its label, which is ink or cream, whichever reads better. No color reaches 4.5:1 on both the light and the dark background, so a strong brand color usually shows a lighter or darker shade in one theme.

  1. POST /status_page/{id}/branding/upload with { "file_type": "logo" | "logo_dark" | "favicon" | "og_image", "content_type": "...", "file_size_bytes": n }. file_size_bytes is the file’s exact size.
  2. The response contains a presigned upload_url, the resulting s3_key, and expires_in_seconds (300).
  3. PUT the file to upload_url, then PUT /branding with the returned key in the matching *_s3_key field.
  4. Remove an asset with DELETE /status_page/{id}/branding/asset/{asset_type} (logo, logo_dark, favicon or og_image), or send null for its key.
file_typeContent typesMax size
logo, logo_darkimage/png, image/jpeg, image/svg+xml, image/webp2 MB
faviconimage/png, image/x-icon, image/vnd.microsoft.icon, image/svg+xml512 KB
og_imageimage/png, image/jpeg, image/webp5 MB

POST /status_page/{status_page_id}/custom_domain with { "domain": "status.example.com" }. Creating one requires a verified email address; reads and deletes do not.

FieldTypeDescription
domainstringYour domain, lowercased. No scheme prefix, no spaces.
statusenumpending_validation, provisioning, active, failed, deleting.
cname_targetstringThe intermediate CNAME to point your domain at: <status_page_id>.custom.siteqwality.com.
acm_validation.name / .valuestringThe DNS validation CNAME record to create while status is pending_validation.
failure_reasonstring | nullPopulated when status is failed.
healthobjectAbsent until the first check. Once active, the domain is checked every 6 hours: checked_at, problem (a sentence on what to fix, or absent when all is well) and certificate_expires_at.
senderobjectSubscriber email from the domain, for a white-labeled page: status (not_started until the domain is provisioned, then pending, verified or failed), dkim_record (name and value of the CNAME to add) and from_address, where the mail comes from once verified.
created_at / updated_atrfc3339Timestamps.

Deleting the status page removes its custom domain and certificate too. See the custom domain guide for the DNS walkthrough.

Customer-facing planned-downtime entries under /status_page/{status_page_id}/maintenance. These render on the page; to silence internal paging use maintenance windows.

FieldTypeOnDescription
titlestringcreate + updateMaintenance title.
bodystring | nullcreate + updateLonger description.
scheduled_start_atrfc3339create + updatePlanned start.
scheduled_end_atrfc3339create + updatePlanned end.
whole_pageboolcreate + updatetrue puts the whole page under maintenance. Default false.
affected_http_job_idsuuid[]create + updateThe HTTP checks the maintenance covers. Default empty.
statusenumupdate only, optionalscheduled, in_progress, or completed. New entries start as scheduled. Leave it out to keep the current status.

Every create and update names the scope: whole_page: true with no affected_http_job_ids, or at least one id in affected_http_job_ids with whole_page left false. Anything else returns 400, including both left out, so an empty list never means the whole page.

{
"title": "Database migration",
"scheduled_start_at": "2026-11-06T02:00:00Z",
"scheduled_end_at": "2026-11-06T02:30:00Z",
"whole_page": true
}

Responses return id, status_page_id, title, body, status, scheduled_start_at, scheduled_end_at, affected_http_job_ids, whole_page and created_at. affected_http_job_ids is empty when whole_page is true.

The page shows a scheduled entry as in progress once scheduled_start_at passes, and drops it after scheduled_end_at. Setting in_progress starts it early, and completed ends it early. Moving the window while sending the status back unchanged gives it the status the new window implies, and subscribers hear about the new start and end. Creating a maintenance, its start and its end each email the matching subscribers (see Notice matching). See Publish a status page maintenance.

Incidents published to a page (via status_page_id at creation, POST /incident/{id}/publish, or a service that publishes the incidents it opens) render with their updates. Field-by-field: Incident reference. An incident’s affected monitors, and the impact set on each, decide how the page marks their components; see affected monitors and impact. A published incident that is merged into another gets a public “Merged into” update, and the incident it merged into is added to the page.

The routes under /status_page/{status_page_id}/incident only reach incidents shown on that page. Any other incident id answers 404, even one from the same account. API keys need the incidents scopes for them, not status_pages. POST /status_page/{id}/incident/{incident_id}/update posts an update and emails the page’s confirmed subscribers.

The people who signed up for email about a page. Subscriptions are email only. A page holds at most 1000; confirmed, pending and queued addresses count, expired and quarantined ones do not. Beyond that the public form and POST below answer 409. For the walkthrough, see Manage subscribers.

FieldTypeDescription
iduuidSubscriber id, used to remove one.
emailstringLower-cased address.
stateenumconfirmed, pending, queued, expired or quarantined (below).
subscribed_atrfc3339When the address was first submitted.
confirmed_atrfc3339When the person confirmed. Absent until then.
component_idsuuid[]The page’s checks the subscriber follows. Empty means every component.
kindsstring[]incident, maintenance, or both. Empty means both.
consent_sourceenumHow the address came in: public_form (signed up on the page), owner_add (added by the owner) or import.
consent_versionstringVersion of the confirmation wording the person agreed to, a date such as 2026-10-15.
quarantined_atrfc3339When the address was quarantined.
quarantine_reasonenumbounce (a permanent bounce) or complaint (a spam complaint).

Optional fields (confirmed_at, consent_source, consent_version, quarantined_at, quarantine_reason) are left out when unset. Addresses that subscribed before consent records were kept have no consent_source or consent_version. No IP address is stored.

Subscribers change their choices or unsubscribe on https://statuspageapi.siteqwality.com/subscribe/preferences?token=..., a page linked from every notice email (Manage preferences) and from the page shown after confirming.

A notice goes only to confirmed subscribers whose kinds are empty or include that kind, and whose component_ids are empty or include at least one component the incident or maintenance affects. Incident notices are opened, updated and resolved; maintenance notices are scheduled, started and completed. An incident with no affected components, or a maintenance with whole_page: true, goes to everyone who takes that kind. Each subscriber gets each notice once.

StateMeaningGets noticesCounts toward 1000
confirmedClicked the confirmation link.YesYes
pendingSent a confirmation link (valid 48 hours), not clicked yet.NoYes
queuedAdded by an import, waiting for its confirmation email.NoYes
expiredNever confirmed and the link lapsed. Deleted 7 days after the link expired.NoNo
quarantinedA permanent bounce or a spam complaint on any mail to the address. Gets no notices and no queued confirmations.NoNo

quarantined takes precedence over the other states and applies to the address on every page it is subscribed to. After a bounce, subscribing again through the page form or adding the address again sends a fresh confirmation, and confirming lifts the quarantine. A link sent before the bounce does not. After a complaint, the form, POST and import send nothing to it; only removing the address and a fresh confirmation bring it back.

GET /status_page/{id}/subscriber returns one page, newest first, as {"data": [...], "total": N, "counts": {"confirmed", "pending", "queued", "expired", "quarantined"}, "capacity": 1000}. total is the number matching your filters; counts always covers the whole list. Filters: state (one of the five states), q (part of an address, ignoring case), limit (default 50, at most 200) and offset.

POST /status_page/{id}/subscriber with {"email": "you@example.com"} sends that address a confirmation link. It joins the list as pending and receives nothing until the person clicks. Optional component_ids and kinds preselect what the person gets; leave both out for everything. Once an address is confirmed, only the subscriber’s preferences page changes its choices.

The answer is {"email": "...", "result": "..."} with one of:

resultMeaning
confirmation_sentA confirmation link went out.
nothing_to_sendThe address is already subscribed, or a link went out to it in the last hour.
quarantinedA spam complaint quarantined the address, so nothing was sent.

It returns 400 for an invalid request (not a plain address, or a component the page does not show), 409 for a full page and 429 when the page (30) or Site Qwality as a whole (300) has reached its hourly confirmation limit.

POST /status_page/{id}/subscriber/import with {"csv": "<file contents>"}. Every new address gets a confirmation email; there is no way to import confirmed subscribers. A header row with a column named email, e-mail, email address or e-mail address (in any case) picks that column; without one, the first cell in each row that contains @ is the address. Blank lines are ignored. The CSV from the export below can be imported back. A file with no rows or more than 1000 data rows returns 400.

The answer is {"rows": [{"row", "email", "result"}], "counts": {...}, "sends_per_hour": N}. row is the 1-based record number in the file, header included. counts has the number of rows for each result, and sends_per_hour is the page’s import sending rate.

resultMeaning
confirmation_sentA confirmation email went out during the import.
queuedJoined as queued; the confirmation goes out when the hourly limits allow, oldest first.
already_subscribedAlready confirmed on the page. Nothing changed.
already_pendingAlready waiting to confirm. Nothing new was sent.
quarantinedThe address is quarantined. Imports never mail a quarantined address.
invalidNot a plain email address.
duplicateAppears earlier in the same file.
page_fullThe page reached 1000 subscribers before this row.

GET /status_page/{id}/subscriber/export downloads the whole list as CSV, or JSON with ?format=json. It takes the same state and q filters. The CSV columns are email, state, subscribed_at, confirmed_at, consent_source, consent_version, quarantined_at, quarantine_reason, component_ids and kinds; component_ids and kinds are space-separated lists.

DELETE /status_page/{id}/subscriber/{subscriber_id} removes one address in any state, quarantined included, for an erasure request or a mistake. Nothing more is mailed to it, and 404 means no such subscriber on that page.

LimitValue
Subscribers per page1000 (confirmed, pending and queued count)
Data rows per import1000
Confirmation linkValid for 48 hours
Confirmation emails per page30 per hour, of which imports use at most 25
Confirmation emails across Site Qwality300 per hour, of which imports use at most 250
Import confirmations per account100 per hour across all of the account’s pages

The first import confirmations go out during the import; the rest stay queued and are sent automatically, oldest first, as room frees up.

DataKept
expired subscriberDeleted 7 days after its link expired.
quarantined after a bounceDeleted after 90 days.
quarantined after a complaintUntil you remove it, even if the address unsubscribes.
confirmed subscriberUntil it unsubscribes or you remove it.
Delivery records of subscriber mail90 days at most, and cleared within two days after the address is removed.
MethodPathPurpose
POST / GET/status_pageCreate / list pages.
GET / PUT / DELETE/status_page/{status_page_id}Read / rename / delete a page.
GET / PUT/status_page/{id}/layoutRead / replace the groups, order and per-component settings.
POST/status_page/{id}/componentCreate a manual component.
PATCH / DELETE/status_page/{id}/component/{component_id}Update / delete a manual component.
PUT / DELETE/status_page/{id}/component/{component_id}/overrideSet / clear a status override on any component.
GET/status_page/{id}/cron_jobList the page’s heartbeats.
POST / PUT / DELETE/status_page/{id}/cron_job/{cron_job_id}Attach / rename / detach a heartbeat.
GET/status_page/{id}/http_jobList attached HTTP checks.
GET / POST / PUT / DELETE/status_page/{id}/http_job/{http_job_id}Read / attach / update / detach an HTTP check.
GET/status_page/{id}/browser_checkList attached browser checks.
GET / POST / PUT / DELETE/status_page/{id}/browser_check/{browser_check_id}Read / attach / update / detach a browser check.
GET / POST/status_page/{id}/subscriberList / add (by confirmation email) subscribers.
POST/status_page/{id}/subscriber/importImport a CSV of addresses (each gets a confirmation email).
GET/status_page/{id}/subscriber/exportDownload subscribers as CSV or JSON.
DELETE/status_page/{id}/subscriber/{subscriber_id}Remove a subscriber in any state.
POST / GET/status_page/{id}/incidentCreate / list page incidents.
GET / PUT / DELETE/status_page/{id}/incident/{incident_id}Read / update / delete an incident on the page.
POST/status_page/{id}/incident/{incident_id}/updatePost an incident update and email subscribers.
POST/incident/{incident_id}/publishShow an existing incident on a page, with {"status_page_id": "..."}.
POST / GET/status_page/{id}/maintenanceCreate / list scheduled maintenance.
GET / PUT / DELETE/status_page/{id}/maintenance/{maintenance_id}Read / update / delete maintenance.
GET / PUT/status_page/{id}/brandingRead / update branding.
POST/status_page/{id}/branding/uploadPresigned asset upload.
DELETE/status_page/{id}/branding/asset/{asset_type}Remove an asset.
POST / GET / DELETE/status_page/{id}/custom_domainProvision / read / remove the custom domain.
ResourceRoutes under /v1/status-pages
PagesGET and POST /v1/status-pages; GET, PATCH and DELETE on /v1/status-pages/{id}; GET and PUT on /v1/status-pages/{id}/layout
Monitors on a pageGET /v1/status-pages/{id}/http-monitors; GET, POST, PATCH and DELETE on /v1/status-pages/{id}/http-monitors/{monitor_id}; the same for browser-monitors and heartbeat-monitors
Manual componentsPOST /v1/status-pages/{id}/components; PATCH and DELETE on .../components/{component_id}; PUT and DELETE on .../components/{component_id}/status-override
SubscribersGET and POST /v1/status-pages/{id}/subscribers; POST .../subscribers/import; DELETE .../subscribers/{subscriber_id}
IncidentsGET /v1/status-pages/{id}/incidents
Scheduled maintenanceGET and POST /v1/status-pages/{id}/maintenances; GET, PATCH and DELETE on .../maintenances/{maintenance_id}
BrandingGET and PATCH /v1/status-pages/{id}/branding; POST .../branding/upload-url; DELETE .../branding/assets/{asset_type}
Custom domainGET, POST and DELETE /v1/status-pages/{id}/custom-domain
Terminal window
curl "https://api.siteqwality.com/v1/status-pages?limit=50" \
-H "Authorization: Bearer $SITEQWALITY_API_KEY"
  • They take the same fields as the /status_page routes above and answer in the /v1 shapes: lists newest first as {"data": [...], "next_cursor": "..."}, one item as the object itself, errors as application/problem+json. Idempotency-Key works on every POST and PATCH.
  • Creates answer 201. DELETE answers 204, also when the item is already gone. Removing a custom domain answers 202 because the teardown finishes afterwards.
  • PATCH changes only the fields you send. On a monitor, "sla_target_percentage": null clears the target; on scheduled maintenance, "body": null clears the text. The whole window is checked again, so a new scheduled_end_at must still come after the start.
  • POST .../http-monitors/{monitor_id} shows that monitor on the page, with {"friendly_name": "..."}. A page lists its monitors in a fixed order, not newest first.
  • Create and change incidents with /v1/incidents, naming the page in status_page_ids. The page’s own route only lists them.
  • POST .../branding/upload-url takes the same body as /status_page/{id}/branding/upload. Its signed URL is never kept, so a request repeated with the same Idempotency-Key answers 409 instead of the URL again.
  • Reads need read:status_pages and changes write:status_pages; a page’s incidents need the incidents scopes instead.
  • The CSV export stays on GET /status_page/{id}/subscriber/export.

The status page front-end reads a public, unauthenticated JSON API. You can use it to show your status inside your own app. Base URL: https://statuspageapi.siteqwality.com. CORS allows any origin for GET and POST.

MethodPathPurpose
GET/status-page/{account_id}/{status_page_id}The whole page: headline, components, incidents, maintenance, branding. Optional ?limit= sets how many days of performance_data come back for each HTTP check (default 45, at most 100); the status page asks for 90.
GET/status-page/{account_id}/{status_page_id}/liveA fresh status for each HTTP check, for polling. The page calls it every 60 seconds. Heartbeats and manual components are not in it; read them from the page itself.
GET/status-page/{account_id}/{status_page_id}/incidents/{incident_id}One incident on the page, however old, in the active_incidents shape. 404 when the incident is not on the page.
GET/status-page/{account_id}/{status_page_id}/historyEvery incident on the page, newest first, a page at a time: {"incidents": [...], "next_before": "..."}. ?limit= sets the page size (default 20, at most 50). Pass next_before back as ?before= (an RFC 3339 time) for the next, older page; it is absent on the last one.
POST/status-page/{account_id}/{status_page_id}/subscribeStarts an email subscription with {"email": "you@example.com"}, plus optional component_ids and kinds (as in Subscribers); leave both out for everything. The address gets a confirmation link and receives nothing until it confirms. A confirmed address’s choices do not change here. Returns 200 with {"message": "Check your email to confirm the subscription."}. Errors: 400 for an invalid address, or with Unknown component for an id the page does not show, 404 for an unknown page, 409 when the page already holds 1000 subscribers and 429 when rate limited.

Each client address can make 3,000 requests to this API in a five-minute window: at most 600 to /status-page/ paths other than /live, and at most 30 subscription calls, the email links included. Past that the API answers 429 with rate_limited and a Retry-After header in seconds.

Both ids are in the page’s address: https://statuspage.siteqwality.com/<account-id>/<page-id>. An unknown page returns 404. Every error comes back as JSON, described in Errors below.

The page response has these fields:

FieldTypeDescription
global_statusenumThe headline: operational, unknown, degraded_performance, partial_outage, major_outage or under_maintenance. unknown means no component has a current reading. Every visible component counts, with any status override applied.
groups[]arraySection headings in page order: id, name, description. A group with nothing to show is left out.
http_jobs[]arrayOne entry per HTTP check: http_job_id, friendly_name, sla_target_percentage (or null), current_status, group_id (null for ungrouped), description, show_uptime, order (rank among the page’s components, compare within one group), and performance_data[] (empty when show_uptime is false) with one row for every UTC day of the window, oldest first (day, uptime_percentage, avg_response_time_ms, p50_response_time_ms, p95_response_time_ms, p99_response_time_ms). A day with no checks has null for every figure.
browser_checks[]arrayOne entry per browser check: browser_check_id, friendly_name, sla_target_percentage, current_status, and the same group_id, description, show_uptime and order. No daily data.
components[]arrayHeartbeats and manual components: id, kind (heartbeat or manual), friendly_name, current_status, status_note, group_id, description and order. No daily data.
active_incidents[]arrayOpen incidents with their updates[].
upcoming_maintenances[]arrayMaintenance that is scheduled or in progress: id, title, body, status, scheduled_start_at, scheduled_end_at, affected_http_job_ids, whole_page (true when it covers the whole page, and then affected_http_job_ids is empty).
incident_history[]arrayThe latest 30 incidents, same shape as active_incidents, with resolved_at once closed. Older ones come from /history.
brandingobject | nullpage_title, default_theme, logo_url, logo_dark_url (absent when there is no dark logo), favicon_url, og_image_url, primary_color, accent_color, header_text, footer_text, white_label, meta_description and custom_css. null when none is saved.
page_urlstringThe page’s public address: https://<your-domain> when a custom domain is live, otherwise https://statuspage.siteqwality.com/<account-id>/<page-id>. Incidents are at <page_url>/incidents/<incident-id> and the full history at <page_url>/history.

current_status is one of operational, degraded (failing, not yet confirmed down), down, paused, maintenance or unknown. With a status override in force it is the override’s status, and every entry in http_jobs, browser_checks and components carries the override’s note as status_note (null otherwise). The /live response is a list with http_job_id, status (the same values), status_note, success, response_time_ms and checked_at for each HTTP check.

Every error from this API has Content-Type: application/json and the same body:

{
"error": {
"code": "not_found",
"message": "Status page not found"
}
}

message is a sentence for people. Branch on code, which follows the HTTP status:

Statuscode
400bad_request
404not_found
405method_not_allowed
409conflict
413payload_too_large
415unsupported_media_type
422invalid_body
429rate_limited
500internal_error
503unavailable
Any othererror

The confirm, unsubscribe and preferences links stay HTML pages for people, not JSON.

The same page is also published as static files that update within a minute of a change: the page JSON above at https://statuspagecdn.siteqwality.com/v1/pages/<account-id>/<page-id>.json, and beside it summary.json, incidents.rss, incidents.atom and badge.svg, plus an embed script at https://statuspagecdn.siteqwality.com/v1/embed.js. See Feeds, badge and embed.