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.
Status page
Section titled “Status page”| Field | Type | Description |
|---|---|---|
friendly_name | string | The page name. The only writable field on the page object itself. |
id | uuid | Read-only. Page ID. |
account_id | uuid | Read-only. Owning account. |
page_url | string | Read-only. Where the public page lives: https://<your-domain> once a custom domain is active, otherwise https://statuspage.siteqwality.com/. Create, get and list all return it. |
created_at | rfc3339 | Read-only. |
Branding, components, incidents, maintenance, and the custom domain are all nested resources (below).
Components
Section titled “Components”A page shows four kinds of component:
| Kind | Layout kind | Status comes from | Uptime bars |
|---|---|---|---|
| HTTP check | http_job | The monitor. | Yes, unless show_uptime is false. |
| Browser check | browser_check | The monitor. | No. |
| Heartbeat | cron_job | A heartbeat monitor: up while its pings arrive on time, down once one is missed. | No. |
| Manual | manual | You. 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.
HTTP and browser checks
Section titled “HTTP and browser checks”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}.
| Field | Type | On | Description |
|---|---|---|---|
friendly_name | string | create + update | Public-facing name shown on the page (independent of the monitor’s internal name). |
sla_target_percentage | number | null | update only | SLA 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.
Heartbeats
Section titled “Heartbeats”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.
Manual components
Section titled “Manual components”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.
| Field | Type | On | Description |
|---|---|---|---|
friendly_name | string | create + update | Required on create, at most 256 characters. |
description | string | null | create + update | One line under the name, at most 200 characters. Send null to clear. |
status | enum | create + update | operational (the default), degraded, down or maintenance. |
group_id | uuid | null | create only | A group on this page. Leave it out for the ungrouped list. |
hidden | bool | create only | true 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.
Status override
Section titled “Status override”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):
| Field | Type | Description |
|---|---|---|
status | enum | operational, degraded, down or maintenance. Required. |
note | string | null | Shown under the component’s name on the public page, at most 500 characters, one line. |
expires_at | rfc3339 | null | When 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.
Branding
Section titled “Branding”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.
| Field | Type | Constraint | Description | Cleared to |
|---|---|---|---|---|
page_title | string | max 100 characters | Browser tab title, and the header heading when there is no logo. | Status Page |
default_theme | enum | light | dark | system | Theme for first-time visitors. | system |
primary_color | string | #rrggbb | Page title and the subscribe heading. Also the accent when accent_color is unset. | body text color |
accent_color | string | #rrggbb | Links, the Subscribe button, focus rings, text selection and the response time line. | primary_color, else Atlas clay |
header_text | string | max 500 characters | Line under the logo or title. | System Status |
footer_text | string | max 500 characters | Line in the footer. | nothing |
meta_description | string | max 160 characters | Search and link preview description. | a generated one |
custom_css | string | max 50 KB | Stylesheet loaded after the page’s own. See Brand your status page. | nothing |
white_label | bool | none | Removes the “Powered by Site Qwality” badge. | false |
logo_s3_key | string | from the upload flow | Header logo. | the title |
logo_dark_s3_key | string | from the upload flow | Header logo in the dark theme. | logo_s3_key |
favicon_s3_key | string | from the upload flow | Browser tab icon. | Site Qwality icon, none when white-labeled |
og_image_s3_key | string | from the upload flow | Link 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).
Colors and contrast
Section titled “Colors and contrast”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.
Asset upload flow
Section titled “Asset upload flow”POST /status_page/{id}/branding/uploadwith{ "file_type": "logo" | "logo_dark" | "favicon" | "og_image", "content_type": "...", "file_size_bytes": n }.file_size_bytesis the file’s exact size.- The response contains a presigned
upload_url, the resultings3_key, andexpires_in_seconds(300). PUTthe file toupload_url, thenPUT /brandingwith the returned key in the matching*_s3_keyfield.- Remove an asset with
DELETE /status_page/{id}/branding/asset/{asset_type}(logo,logo_dark,faviconorog_image), or sendnullfor its key.
file_type | Content types | Max size |
|---|---|---|
logo, logo_dark | image/, image/, image/, image/ | 2 MB |
favicon | image/, image/, image/, image/ | 512 KB |
og_image | image/, image/, image/ | 5 MB |
Custom domain
Section titled “Custom domain”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.
| Field | Type | Description |
|---|---|---|
domain | string | Your domain, lowercased. No scheme prefix, no spaces. |
status | enum | pending_validation, provisioning, active, failed, deleting. |
cname_target | string | The intermediate CNAME to point your domain at: <status_page_id>.custom.siteqwality.com. |
acm_validation.name / .value | string | The DNS validation CNAME record to create while status is pending_validation. |
failure_reason | string | null | Populated when status is failed. |
health | object | Absent 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. |
sender | object | Subscriber 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_at | rfc3339 | Timestamps. |
Deleting the status page removes its custom domain and certificate too. See the custom domain guide for the DNS walkthrough.
Scheduled maintenance
Section titled “Scheduled maintenance”Customer-facing planned-downtime entries under /status_page/{status_page_id}/maintenance. These render on the page; to silence internal paging use maintenance windows.
| Field | Type | On | Description |
|---|---|---|---|
title | string | create + update | Maintenance title. |
body | string | null | create + update | Longer description. |
scheduled_start_at | rfc3339 | create + update | Planned start. |
scheduled_end_at | rfc3339 | create + update | Planned end. |
whole_page | bool | create + update | true puts the whole page under maintenance. Default false. |
affected_http_job_ids | uuid[] | create + update | The HTTP checks the maintenance covers. Default empty. |
status | enum | update only, optional | scheduled, 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 on a page
Section titled “Incidents on a page”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.
Subscribers
Section titled “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.
| Field | Type | Description |
|---|---|---|
id | uuid | Subscriber id, used to remove one. |
email | string | Lower-cased address. |
state | enum | confirmed, pending, queued, expired or quarantined (below). |
subscribed_at | rfc3339 | When the address was first submitted. |
confirmed_at | rfc3339 | When the person confirmed. Absent until then. |
component_ids | uuid[] | The page’s checks the subscriber follows. Empty means every component. |
kinds | string[] | incident, maintenance, or both. Empty means both. |
consent_source | enum | How the address came in: public_form (signed up on the page), owner_add (added by the owner) or import. |
consent_version | string | Version of the confirmation wording the person agreed to, a date such as 2026-10-15. |
quarantined_at | rfc3339 | When the address was quarantined. |
quarantine_reason | enum | bounce (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.
Notice matching
Section titled “Notice matching”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.
States
Section titled “States”| State | Meaning | Gets notices | Counts toward 1000 |
|---|---|---|---|
confirmed | Clicked the confirmation link. | Yes | Yes |
pending | Sent a confirmation link (valid 48 hours), not clicked yet. | No | Yes |
queued | Added by an import, waiting for its confirmation email. | No | Yes |
expired | Never confirmed and the link lapsed. Deleted 7 days after the link expired. | No | No |
quarantined | A permanent bounce or a spam complaint on any mail to the address. Gets no notices and no queued confirmations. | No | No |
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.
Add one
Section titled “Add one”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:
result | Meaning |
|---|---|
confirmation_sent | A confirmation link went out. |
nothing_to_send | The address is already subscribed, or a link went out to it in the last hour. |
quarantined | A 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.
Import
Section titled “Import”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.
result | Meaning |
|---|---|
confirmation_sent | A confirmation email went out during the import. |
queued | Joined as queued; the confirmation goes out when the hourly limits allow, oldest first. |
already_subscribed | Already confirmed on the page. Nothing changed. |
already_pending | Already waiting to confirm. Nothing new was sent. |
quarantined | The address is quarantined. Imports never mail a quarantined address. |
invalid | Not a plain email address. |
duplicate | Appears earlier in the same file. |
page_full | The page reached 1000 subscribers before this row. |
Export
Section titled “Export”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.
Remove
Section titled “Remove”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.
Limits
Section titled “Limits”| Limit | Value |
|---|---|
| Subscribers per page | 1000 (confirmed, pending and queued count) |
| Data rows per import | 1000 |
| Confirmation link | Valid for 48 hours |
| Confirmation emails per page | 30 per hour, of which imports use at most 25 |
| Confirmation emails across Site Qwality | 300 per hour, of which imports use at most 250 |
| Import confirmations per account | 100 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.
Retention
Section titled “Retention”| Data | Kept |
|---|---|
expired subscriber | Deleted 7 days after its link expired. |
quarantined after a bounce | Deleted after 90 days. |
quarantined after a complaint | Until you remove it, even if the address unsubscribes. |
confirmed subscriber | Until it unsubscribes or you remove it. |
| Delivery records of subscriber mail | 90 days at most, and cleared within two days after the address is removed. |
Endpoints
Section titled “Endpoints”| Method | Path | Purpose |
|---|---|---|
POST / GET | /status_page | Create / list pages. |
GET / PUT / DELETE | /status_page/ | Read / rename / delete a page. |
GET / PUT | /status_page/ | Read / replace the groups, order and per-component settings. |
POST | /status_page/ | Create a manual component. |
PATCH / DELETE | /status_page/ | Update / delete a manual component. |
PUT / DELETE | /status_page/ | Set / clear a status override on any component. |
GET | /status_page/ | List the page’s heartbeats. |
POST / PUT / DELETE | /status_page/ | Attach / rename / detach a heartbeat. |
GET | /status_page/ | List attached HTTP checks. |
GET / POST / PUT / DELETE | /status_page/ | Read / attach / update / detach an HTTP check. |
GET | /status_page/ | List attached browser checks. |
GET / POST / PUT / DELETE | /status_page/ | Read / attach / update / detach a browser check. |
GET / POST | /status_page/ | List / add (by confirmation email) subscribers. |
POST | /status_page/ | Import a CSV of addresses (each gets a confirmation email). |
GET | /status_page/ | Download subscribers as CSV or JSON. |
DELETE | /status_page/ | Remove a subscriber in any state. |
POST / GET | /status_page/ | Create / list page incidents. |
GET / PUT / DELETE | /status_page/ | Read / update / delete an incident on the page. |
POST | /status_page/ | Post an incident update and email subscribers. |
POST | /incident/ | Show an existing incident on a page, with {"status_page_id": "..."}. |
POST / GET | /status_page/ | Create / list scheduled maintenance. |
GET / PUT / DELETE | /status_page/ | Read / update / delete maintenance. |
GET / PUT | /status_page/ | Read / update branding. |
POST | /status_page/ | Presigned asset upload. |
DELETE | /status_page/ | Remove an asset. |
POST / GET / DELETE | /status_page/ | Provision / read / remove the custom domain. |
Manage pages over the /v1 API
Section titled “Manage pages over the /v1 API”| Resource | Routes under /v1/ |
|---|---|
| Pages | GET and POST /; GET, PATCH and DELETE on /v1/; GET and PUT on /v1/ |
| Monitors on a page | GET /; GET, POST, PATCH and DELETE on /v1/; the same for browser-monitors and heartbeat-monitors |
| Manual components | POST /; PATCH and DELETE on .../; PUT and DELETE on .../ |
| Subscribers | GET and POST /; POST .../; DELETE .../ |
| Incidents | GET / |
| Scheduled maintenance | GET and POST /; GET, PATCH and DELETE on .../ |
| Branding | GET and PATCH /; POST .../; DELETE .../ |
| Custom domain | GET, POST and DELETE / |
curl "https://api.siteqwality.com/v1/status-pages?limit=50" \ -H "Authorization: Bearer $SITEQWALITY_API_KEY"- They take the same fields as the
/status_pageroutes above and answer in the/v1shapes: lists newest first as{"data": [...], "next_cursor": "..."}, one item as the object itself, errors asapplication/problem+json.Idempotency-Keyworks on everyPOSTandPATCH. - Creates answer
201.DELETEanswers204, also when the item is already gone. Removing a custom domain answers202because the teardown finishes afterwards. PATCHchanges only the fields you send. On a monitor,"sla_target_percentage": nullclears the target; on scheduled maintenance,"body": nullclears the text. The whole window is checked again, so a newscheduled_end_atmust 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 instatus_page_ids. The page’s own route only lists them. POST .../branding/upload-urltakes the same body as/status_page/{id}/branding/upload. Its signed URL is never kept, so a request repeated with the sameIdempotency-Keyanswers409instead of the URL again.- Reads need
read:status_pagesand changeswrite:status_pages; a page’s incidents need theincidentsscopes instead. - The CSV export stays on
GET /status_page/{id}/subscriber/export.
Public status page API
Section titled “Public status page API”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.
| Method | Path | Purpose |
|---|---|---|
GET | /status-page/ | The whole page: headline, components, incidents, maintenance, branding. Optional ? 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/ | A 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/ | One incident on the page, however old, in the active_incidents shape. 404 when the incident is not on the page. |
GET | /status-page/ | Every incident on the page, newest first, a page at a time: {"incidents": [...], "next_before": "..."}. ? sets the page size (default 20, at most 50). Pass next_before back as ? (an RFC 3339 time) for the next, older page; it is absent on the last one. |
POST | /status-page/ | Starts 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:
| Field | Type | Description |
|---|---|---|
global_status | enum | The 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[] | array | Section headings in page order: id, name, description. A group with nothing to show is left out. |
http_jobs[] | array | One 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[] | array | One 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[] | array | Heartbeats and manual components: id, kind (heartbeat or manual), friendly_name, current_status, status_note, group_id, description and order. No daily data. |
active_incidents[] | array | Open incidents with their updates[]. |
upcoming_maintenances[] | array | Maintenance 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[] | array | The latest 30 incidents, same shape as active_incidents, with resolved_at once closed. Older ones come from /history. |
branding | object | null | page_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_url | string | The page’s public address: https://<your-domain> when a custom domain is live, otherwise https://statuspage.siteqwality.com/. Incidents are at <page_url>/ and the full history at <page_url>/. |
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.
Errors
Section titled “Errors”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:
| Status | code |
|---|---|
| 400 | bad_request |
| 404 | not_found |
| 405 | method_not_allowed |
| 409 | conflict |
| 413 | payload_too_large |
| 415 | unsupported_media_type |
| 422 | invalid_body |
| 429 | rate_limited |
| 500 | internal_error |
| 503 | unavailable |
| Any other | error |
The confirm, unsubscribe and preferences links stay HTML pages for people, not JSON.
Published files
Section titled “Published files”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.
See also
Section titled “See also”- Status pages overview for the three-layer model.
- Custom domain guide for DNS setup.
- Brand your status page for colors, dark logos and custom CSS.
- API Reference for wire-level shapes.