---
title: "Update a status page"
method: PATCH
path: "/status-pages/{statusPage}"
tags: ["Status pages"]
---

# Update a status page

`PATCH /status-pages/{statusPage}`

## Request

- Base URL: `https://api.spectate.net/v1`
- URL: `https://api.spectate.net/v1/status-pages/{statusPage}`
- Auth: HTTP bearer

Changes only the settings you send; inside `theme`, also only the keys you send. A new
`slug` moves the page: the old address stops working. A new `custom_domain` needs to be
verified again before visitors use it. Turning off issue reports or traffic alerts ends the
alerts they fired. Private pages, password protection and custom domains need a plan that
includes them (`403` `PLAN_FEATURE_UNAVAILABLE`); a page that is private already stays so.

## Path parameters

- `statusPage` string, uuid, required

## Request body

- UpdateStatusPage: Changes to a status page; settings left out keep their value.
  - `name` string: Name, shown as the page title
  - `slug` string: The page's subdomain under spectate.page: lowercase letters, digits and dashes. The old address stops working
  - `visibility` 'public' | 'private': Who can open a status page. | | |---| | `public` <br/> Anyone. | | `private` <br/> Visitors with the access link, or the password when the page has one. Part of the Team plan and up. |
  - `custom_domain` string, nullable: Your own domain for the page, such as `status.acme.com`; `null` for none. Part of paid plans (`403` `PLAN_FEATURE_UNAVAILABLE` otherwise). A new domain needs to be verified again: see `custom_domain_verification` and `verifyStatusPageCustomDomain`
  - `password_protected` boolean: Let visitors of a private page also get in with a password. Part of paid plans (`403` `PLAN_FEATURE_UNAVAILABLE` otherwise); turning it on needs a `password` unless the page has one
  - `password` string, nullable: The password, 8 to 255 characters. Write-only; leave out or send `null` to keep the current one
  - `language` 'en' | 'nl' | 'de' | 'fr' | 'es' | 'it': Languages of the public status page chrome and the subscriber emails. Customer-written content (names, incident titles and updates) is never translated. | | |---| | `en` <br/> English. | | `nl` <br/> Dutch. | | `de` <br/> German. | | `fr` <br/> French. | | `es` <br/> Spanish. | | `it` <br/> Italian. |
  - `match_browser_language` boolean: Give visitors their browser's language when it is supported
  - `logo_link_url` string, uri, nullable: Where the logo goes on the public page, an `http:` or `https:` URL of up to 2048 characters. It opens in a new tab. `null` for the page's home
  - `contact_url` string, uri, nullable: Where the "Get in touch" button on the public page goes, an `https:` or `mailto:` address of up to 2048 characters. It opens in a new tab. `null` for no button
  - `theme` StatusPageThemeInput: Changes to how a status page looks. Settings left out keep their value, also inside `light`, `dark` and `display`; `null` goes back to the default. Logos and the favicon are uploaded in the dashboard.
    - `accent` string, nullable: Brand colour, as hex; `null` for Spectate's yellow
    - `mode` 'light' | 'dark' | 'system': The colour scheme visitors of a status page get before they pick one. | | |---| | `light` <br/> Light. | | `dark` <br/> Dark. | | `system` <br/> The visitor's operating system setting. |
    - `preset` 'spectate' | 'paper' | 'graphite' | 'ocean' | 'forest' | 'lavender' | 'ember' | 'contrast': Colour presets of a status page. Colours set in `light` and `dark` override the preset. | | |---| | `spectate` <br/> Neutral greys (default). | | `paper` <br/> Warm cream and sepia ink. | | `graphite` <br/> Soft charcoal, strong lines. | | `ocean` <br/> Clear blues, navy in dark mode. | | `forest` <br/> Sage greens, deep pine in dark mode. | | `lavender` <br/> Lilac, aubergine in dark mode. | | `ember` <br/> Peach and terracotta, warm in dark mode. | | `contrast` <br/> High contrast: pure black and white, bold lines. |
    - `font` 'geist' | 'inter' | 'ibm-plex-sans' | 'dm-sans' | 'manrope' | 'space-grotesk' | 'source-serif' | 'system': Typefaces of a status page. | | |---| | `geist` <br/> Geist (default). | | `inter` <br/> Inter. | | `ibm-plex-sans` <br/> IBM Plex Sans. | | `dm-sans` <br/> DM Sans. | | `manrope` <br/> Manrope. | | `space-grotesk` <br/> Space Grotesk. | | `source-serif` <br/> Source Serif. | | `system` <br/> The visitor's system font. |
    - `light` StatusPageThemeColorsInput: Colours that override the preset in one colour scheme, as hex (`#0f766e` or `#0f7`). Colours left out keep their value; `null` goes back to the preset's colour.
      - `background` string, nullable: Page background
      - `surface` string, nullable: Background of cards and panels
      - `foreground` string, nullable: Text
      - `muted` string, nullable: Secondary text
      - `border` string, nullable: Lines and borders
      - `success` string, nullable: Operational
      - `warning` string, nullable: Degraded performance and maintenance
      - `partial` string, nullable: Partial outage
      - `danger` string, nullable: Major outage
      - `info` string, nullable: Information, such as scheduled maintenance
    - `dark` StatusPageThemeColorsInput: Colours that override the preset in one colour scheme, as hex (`#0f766e` or `#0f7`). Colours left out keep their value; `null` goes back to the preset's colour.
      - `background` string, nullable: Page background
      - `surface` string, nullable: Background of cards and panels
      - `foreground` string, nullable: Text
      - `muted` string, nullable: Secondary text
      - `border` string, nullable: Lines and borders
      - `success` string, nullable: Operational
      - `warning` string, nullable: Degraded performance and maintenance
      - `partial` string, nullable: Partial outage
      - `danger` string, nullable: Major outage
      - `info` string, nullable: Information, such as scheduled maintenance
    - `display` StatusPageDisplayInput: What a status page shows; settings left out keep their value.
      - `show_uptime_history` boolean: Show each component's uptime history
      - `show_latency_charts` boolean: Show response time charts under components that have them on
      - `show_incidents` boolean: Show incidents
      - `show_maintenances` boolean: Show scheduled maintenance
      - `show_subscriptions` boolean: Show the Subscribe button. When false, visitors can't subscribe by email or with Discord. Feeds follow `show_feeds`
      - `show_email_subscriptions` boolean: Let visitors subscribe by email (when the plan includes subscribers)
      - `show_discord_subscriptions` boolean: Let visitors subscribe a Discord channel (when the plan includes subscribers)
      - `show_feeds` boolean: Offer the RSS and Atom feeds. When false, the feed URLs answer 404
      - `show_slack_feed` boolean: Show visitors the Slack `/feed` command for the RSS feed (public pages with `show_feeds` on). A Slack channel is not a subscriber and doesn't count towards the plan limit
      - `history_layout` 'calendar' | 'timeline': How a status page shows the uptime history of its components. | | |---| | `calendar` <br/> A calendar of days (default). | | `timeline` <br/> One row of bars per component. |
      - `uptime_bars` 'fill' | 'solid': How a day with problems is drawn in a status page's uptime history. | | |---| | `fill` <br/> Colour part of the bar, by how long the problem lasted (default). | | `solid` <br/> Colour the whole bar. |
  - `collapsed_groups` string[]: Component groups that start collapsed; replaces the current list
  - `automation_enabled` boolean: Monitor automation: when a monitor linked to a component goes down, open an incident "{component} is down" (major outage), and resolve it when the monitor recovers
  - `automation_down_message` string, nullable: Posted when a linked monitor goes down, up to 5000 characters; `{component}` and `{status_page}` are filled in. `null` for a default message
  - `automation_recovered_message` string, nullable: Posted when the monitor recovers, up to 5000 characters; `null` for a default message
  - `issue_reports_enabled` boolean: Let visitors report problems from the page
  - `issue_reports_show_on_page` boolean: While reports are above the threshold, say on the page that users are reporting issues
  - `issue_reports_alerts_enabled` boolean: Fire an alert when reports reach the threshold
  - `issue_reports_threshold` integer: Reports within `issue_reports_window_minutes` that count as above the threshold, 1 to 1000
  - `issue_reports_window_minutes` integer: The window for the threshold, in minutes, 1 to 1440
  - `traffic_alerts_enabled` boolean: Alert when views reach `traffic_alert_multiplier` times the usual views for the time of day
  - `traffic_alert_multiplier` integer: How many times the usual views alert, 2 to 100
  - `traffic_alert_min_views` integer: Fewer views than this in 15 minutes never alert, 10 to 1000000
  - `escalation_path_ids` string[]: Escalation paths for the page's alerts (issue reports and traffic spikes); replaces the current ones. Empty for the team's default path

## Response `200`

The updated status page.

- StatusPage: A status page: the public page that shows your components' status, incidents and maintenance.
  - `id` string, uuid, required: Status page ID
  - `name` string, required: Name, shown as the page title
  - `slug` string, required: The page's subdomain under spectate.page
  - `visibility` 'public' | 'private', required: Who can open a status page. | | |---| | `public` <br/> Anyone. | | `private` <br/> Visitors with the access link, or the password when the page has one. Part of the Team plan and up. |
  - `status` 'operational' | 'degraded_performance' | 'partial_outage' | 'major_outage' | 'under_maintenance', required: A status page component's status, derived from incidents and maintenance. | | |---| | `operational` <br/> Working normally. | | `degraded_performance` <br/> Slower or less reliable than usual. | | `partial_outage` <br/> Down for some visitors or some functions. | | `major_outage` <br/> Down. | | `under_maintenance` <br/> In planned maintenance. |
  - `public_url` string, uri, required: Where visitors open the page: the custom domain once it is verified, else the spectate.page address
  - `access_url` string, uri, required: Opens the page while it is private. Anyone with it gets in; `rotateStatusPageAccessKey` replaces it
  - `custom_domain` string, nullable, required: Your own domain for the page; `null` for none. Visitors use it once it is verified
  - `custom_domain_verification` StatusPageCustomDomainVerification, required: How to prove you own a status page's custom domain: create the TXT record, or point the domain at the CNAME target (which also routes visitors to the page). Then call `verifyStatusPageCustomDomain`.
    - `verified` boolean, required: Whether ownership is proven. A proven domain stays verified when a later check fails
    - `verified_at` string, date-time, nullable, required: When ownership was proven; `null` before
    - `txt_record_name` string, required: Name of the TXT record to create
    - `txt_record_value` string, required: Value of the TXT record
    - `cname_target` string, required: Host to point a CNAME at (subdomains), or an ALIAS (root domains); unique to the page
  - `password_protected` boolean, required: Whether visitors of a private page can also get in with the password
  - `has_password` boolean, required: Whether the page has a password. The password itself is never returned
  - `language` 'en' | 'nl' | 'de' | 'fr' | 'es' | 'it', required: Languages of the public status page chrome and the subscriber emails. Customer-written content (names, incident titles and updates) is never translated. | | |---| | `en` <br/> English. | | `nl` <br/> Dutch. | | `de` <br/> German. | | `fr` <br/> French. | | `es` <br/> Spanish. | | `it` <br/> Italian. |
  - `match_browser_language` boolean, required: Visitors get their browser's language when it is supported, and can switch languages in the footer
  - `logo_link_url` string, uri, nullable, required: Where the logo goes on the public page; `null` for the page's home
  - `contact_url` string, uri, nullable, required: Where the "Get in touch" button on the public page goes, an `https:` or `mailto:` address; `null` for no button
  - `theme` StatusPageTheme, required: How a status page looks. `null` values use the default.
    - `accent` string, nullable, required: Brand colour, as hex; `null` for Spectate's yellow (`#ffea00`)
    - `mode` 'light' | 'dark' | 'system', required: The colour scheme visitors of a status page get before they pick one. | | |---| | `light` <br/> Light. | | `dark` <br/> Dark. | | `system` <br/> The visitor's operating system setting. |
    - `preset` 'spectate' | 'paper' | 'graphite' | 'ocean' | 'forest' | 'lavender' | 'ember' | 'contrast', required: Colour presets of a status page. Colours set in `light` and `dark` override the preset. | | |---| | `spectate` <br/> Neutral greys (default). | | `paper` <br/> Warm cream and sepia ink. | | `graphite` <br/> Soft charcoal, strong lines. | | `ocean` <br/> Clear blues, navy in dark mode. | | `forest` <br/> Sage greens, deep pine in dark mode. | | `lavender` <br/> Lilac, aubergine in dark mode. | | `ember` <br/> Peach and terracotta, warm in dark mode. | | `contrast` <br/> High contrast: pure black and white, bold lines. |
    - `font` 'geist' | 'inter' | 'ibm-plex-sans' | 'dm-sans' | 'manrope' | 'space-grotesk' | 'source-serif' | 'system', required: Typefaces of a status page. | | |---| | `geist` <br/> Geist (default). | | `inter` <br/> Inter. | | `ibm-plex-sans` <br/> IBM Plex Sans. | | `dm-sans` <br/> DM Sans. | | `manrope` <br/> Manrope. | | `space-grotesk` <br/> Space Grotesk. | | `source-serif` <br/> Source Serif. | | `system` <br/> The visitor's system font. |
    - `light` StatusPageThemeColors, required: Colours that override the preset in one colour scheme, as hex (`#0f766e`). `null` keeps the preset's colour.
      - `background` string, nullable, required: Page background
      - `surface` string, nullable, required: Background of cards and panels
      - `foreground` string, nullable, required: Text
      - `muted` string, nullable, required: Secondary text
      - `border` string, nullable, required: Lines and borders
      - `success` string, nullable, required: Operational
      - `warning` string, nullable, required: Degraded performance and maintenance
      - `partial` string, nullable, required: Partial outage
      - `danger` string, nullable, required: Major outage
      - `info` string, nullable, required: Information, such as scheduled maintenance
    - `dark` StatusPageThemeColors, required: Colours that override the preset in one colour scheme, as hex (`#0f766e`). `null` keeps the preset's colour.
      - `background` string, nullable, required: Page background
      - `surface` string, nullable, required: Background of cards and panels
      - `foreground` string, nullable, required: Text
      - `muted` string, nullable, required: Secondary text
      - `border` string, nullable, required: Lines and borders
      - `success` string, nullable, required: Operational
      - `warning` string, nullable, required: Degraded performance and maintenance
      - `partial` string, nullable, required: Partial outage
      - `danger` string, nullable, required: Major outage
      - `info` string, nullable, required: Information, such as scheduled maintenance
    - `display` StatusPageDisplay, required: What a status page shows.
      - `show_uptime_history` boolean, required: Show each component's uptime history
      - `show_latency_charts` boolean, required: Show response time charts under components that have them on
      - `show_incidents` boolean, required: Show incidents
      - `show_maintenances` boolean, required: Show scheduled maintenance
      - `show_subscriptions` boolean, required: Show the Subscribe button. When false, visitors can't subscribe by email or with Discord. Feeds follow `show_feeds`
      - `show_email_subscriptions` boolean, required: Let visitors subscribe by email (when the plan includes subscribers)
      - `show_discord_subscriptions` boolean, required: Let visitors subscribe a Discord channel (when the plan includes subscribers)
      - `show_feeds` boolean, required: Offer the RSS and Atom feeds. When false, the feed URLs answer 404
      - `show_slack_feed` boolean, required: Show visitors the Slack `/feed` command for the RSS feed (public pages with `show_feeds` on). A Slack channel is not a subscriber and doesn't count towards the plan limit
      - `history_layout` 'calendar' | 'timeline', required: How a status page shows the uptime history of its components. | | |---| | `calendar` <br/> A calendar of days (default). | | `timeline` <br/> One row of bars per component. |
      - `uptime_bars` 'fill' | 'solid', required: How a day with problems is drawn in a status page's uptime history. | | |---| | `fill` <br/> Colour part of the bar, by how long the problem lasted (default). | | `solid` <br/> Colour the whole bar. |
    - `logo_url` string, uri, nullable, required: The logo, uploaded in the dashboard; `null` for none (the page shows its name)
    - `logo_dark_url` string, uri, nullable, required: The logo for dark mode; `null` shows `logo_url` in dark mode too
    - `favicon_url` string, uri, nullable, required: The favicon, uploaded in the dashboard; `null` for Spectate's
  - `collapsed_groups` string[], required: Component groups that start collapsed
  - `automation_enabled` boolean, required: Monitor automation: when a monitor linked to a component goes down, an incident "{component} is down" (major outage) opens with `automation_down_message`, and resolves with `automation_recovered_message` when the monitor recovers
  - `automation_down_message` string, nullable, required: Posted when a linked monitor goes down; `{component}` and `{status_page}` are filled in. `null` for a default message
  - `automation_recovered_message` string, nullable, required: Posted when the monitor recovers; `null` for a default message
  - `issue_reports_enabled` boolean, required: Visitors can report problems from the page
  - `issue_reports_show_on_page` boolean, required: While reports are above the threshold, the page says that users are reporting issues
  - `issue_reports_alerts_enabled` boolean, required: Reaching the threshold fires an alert
  - `issue_reports_threshold` integer, required: Reports within `issue_reports_window_minutes` that count as above the threshold, 1 to 1000
  - `issue_reports_window_minutes` integer, required: The window for the threshold, in minutes, 1 to 1440
  - `issue_reports_triggered_at` string, date-time, nullable, required: Since when reports are above the threshold; `null` when they aren't
  - `traffic_alerts_enabled` boolean, required: Alert when views reach `traffic_alert_multiplier` times the usual views for the time of day
  - `traffic_alert_multiplier` integer, required: How many times the usual views alert, 2 to 100
  - `traffic_alert_min_views` integer, required: Fewer views than this in 15 minutes never alert, 10 to 1000000
  - `escalation_paths` EscalationPathReference[], required: Escalation paths the page's alerts (issue reports and traffic spikes) follow; empty for the team's default path
    - `id` string, uuid, required: Escalation path ID
    - `name` string, required: Escalation path name
  - `paused_reason` 'plan_limit' | 'team_paused', required: Why the system (not the user) paused a monitor, host, domain or status page. | | |---| | `plan_limit` <br/> Over the plan limit (trial expired, downgrade); the oldest resources stay active. | | `team_paused` <br/> The whole team's monitoring is paused (no paid plan, staff action or scheduled deletion). |
  - `created_at` string, date-time, required: When the page was created

## Other responses

- `401`: `UNAUTHENTICATED`: no token was sent. `INVALID_TOKEN`: the token is unknown or revoked. `TOKEN_EXPIRED`: the token has expired.
- `403`: `PLAN_FEATURE_UNAVAILABLE`: the plan doesn't include this feature; `details.feature` names it. `FORBIDDEN`: the token lacks an ability this endpoint requires (listed in `details.required_abilities`). `TEAM_PENDING_DELETION`: the team is scheduled for deletion. `TEAM_SUSPENDED`: Spectate suspended the team.
- `404`: `RESOURCE_NOT_FOUND`: there is no such resource in this team.
- `422`: `VALIDATION_FAILED`: the request is invalid; `details.errors` lists the fields.
- `429`: `RATE_LIMITED`: too many requests for this token. Wait for the number of seconds in `Retry-After`.

---

[API](https://skmtc.dev/spectate/apis/spectate-api.md) - [All operations](https://skmtc.dev/spectate/apis/spectate-api/llms.txt) - [OpenAPI document](https://skmtc.dev/spectate/apis/spectate-api/revisions/9b1a233997de?raw)
