# Create a status page

A status page shows a chosen set of your monitors to your own users at a permanent public address. This page creates
one and explains every field on the editor's **Settings** tab. Components, appearance, announcements and subscribers
have their own pages (linked below).

## Before you start

- At least one [monitor](/monitors/what-a-monitor-is/) is useful - a page can be created empty, but it has nothing to
  show until you add components.
- Your plan decides how many pages you can have (1 to 10) - see [plan limits](/status-pages/plan-limits/).
- Pick the **slug** carefully: it is the page's public address and cannot be changed later.

## Settings reference

| Setting (UI label) | Where | API field | Type / allowed values | Default | Plan | What it does for you |
|---|---|---|---|---|---|---|
| **Name** | Wizard step 2, Settings tab | `title` | Text, required, up to 200 characters | - | all | The page heading and browser-tab title. |
| **Page URL** | Wizard step 2 (read-only afterwards) | `slug` | 3-64 characters: lowercase letters, digits and single hyphens (`^[a-z0-9]+(-[a-z0-9]+)*$`); unique; not a reserved word | - | all | The address: `status.host-tracker.com/<slug>` and `www.host-tracker.com/status/<slug>`. Fixed once the page exists. |
| **Homepage URL** (optional) | Wizard, Settings tab | `settings.homepageUrl` | Absolute `http(s)` URL, up to 500 characters | none | all | Where your logo and title link to. |
| **SLA target** | Settings tab | `settings.slaTarget` | Number greater than 0 and up to 100, for example `99.9`; empty for none | none | Webmaster band and above | Shows "against a 99.9% target" with an error budget, plus a 12-month compliance history visitors can expand and export as CSV. |
| **Google Analytics measurement ID** | Settings tab, **White-label** | `settings.googleAnalyticsId` | `G-` followed by 4-16 letters or digits | none | Webmaster band and above | Adds your GA4 tag so visits appear in your own property. |
| **Password protection** | Wizard (**Password**), Settings tab **Access** | not in the API | Any password; empty for a public page | none | all | Makes the page unlisted - visitors must enter it. See [Password protection](/status-pages/password/). |
| **Search engines** | Wizard, Settings tab **Access** | `settings.robotsIndex` | **Index - allow search engines** (`true`) / **No-index - keep it out of search results** (`false`) | Index | Webmaster band and above (below it, pages are always indexable) | Whether search engines may list the page. |
| **Features** | Settings tab | `settings.features` | Any of the 10 tokens below | see below | all | What visitors see. |
| **Custom domain** | - | `customDomain` (read-only) | - | - | - | Not available yet - see [custom domain](/status-pages/custom-domain/). |

Branding, colours and layout (logo, theme, density, grouping, the display preset) are on the **Appearance** tab -
see [Appearance and branding](/status-pages/branding/). The announcement banner is on the **Announcements** tab.

### Features

| Switch (UI label) | Token | Default (app) | Default (API) | What it does |
|---|---|---|---|---|
| **Show bar charts** | `barCharts` | on | on | The 90-day uptime bar under each component. |
| **Show uptime percentage** | `uptimePercent` | on | on | The uptime % beside each component. |
| **Show outage details** | `outageDetails` | off | off | The reason / error text on outage and incident rows. |
| **Enable details pages** | `detailsPages` | on | on | Click-through incident and history pages. Off, those pages answer 404. |
| **Show floating status bar** | `floatingBar` | off | off | A sticky bar with overall up/down counts. |
| **Show monitor URL** | `monitorUrls` | off | off | Each component's address under its name. |
| **Hide paused monitors** | `hidePaused` | off | off | Leaves paused monitors off the page instead of showing them without data. |
| **Show overall percentage** | `overallUptime` | off | on | A combined 24 h / 7 d / 30 d uptime strip. |
| **Show latest downtime** | `downtimeFeed` | off | off | The automatic "Recent Downtime" feed of every outage the monitors recorded. |
| **Enable subscribe** | `subscribe` | on | on | The email subscribe form, the RSS/Atom feeds, and email delivery to existing subscribers. Off also stops updates to people already subscribed by email. |

In the API, `settings.features` is the page's **whole** feature set: a token you leave out is off.

## Create it in the app

1. Open **Status pages** in the sidebar (`/status-pages`) and click **Create status page**.
2. **Step 1 - Monitors.** Search for a monitor and click **Add**, or use **Bulk add** to add every monitor matching
   tags or a name filter (optionally into a group). Under **Selected monitors** you can set a **Public label** and a
   **Group (optional)** per monitor, remove rows and choose a **Sort** order. You can also skip this and add
   components later. Click **Next step: Settings**.
3. **Step 2 - Settings.** Enter the **Name** and the **Page URL** slug. Optionally set the **Homepage URL**,
   **Branding** (**Logo URL**, **Favicon URL**), **Layout** (**Show monitors under groups**, density and logo
   position), and **Access** (**Password**, **Search engines**).
4. Create the page. The editor opens with a "Your status page is live!" note, and the page is public immediately at
   its address (unless you set a password).
5. Use the editor's four tabs to finish: **Monitors**, **Appearance**, **Settings**, **Announcements**. Save each
   tab's changes with its own save button (for example **Save settings**).
6. Click **View page** to open the public page, or **Share** to copy the public link and the embed snippets.

The **Status pages** list shows each page with its address, monitor count, creation date, an amber badge for open
incidents, a **Private** badge when it has a password, and buttons to **Edit**, **View**, declare an incident, or
**Delete**.

## Do it with the API or MCP

`POST /statuspage` (scope `statuspage:write`). `slug` and `title` are required; `settings` and `components` are
optional:

```bash
curl -X POST https://api2.host-tracker.com/statuspage \
  -H "Authorization: Bearer $HT_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: create-acme-status" \
  -d '{
    "slug": "acme",
    "title": "Acme status",
    "settings": {
      "homepageUrl": "https://acme.example.com",
      "theme": "light",
      "showGroups": true,
      "features": ["barCharts", "uptimePercent", "detailsPages", "subscribe"]
    },
    "components": [
      { "monitorId": "WEB_MONITOR_ID", "name": "Website", "group": "Web" },
      { "monitorId": "API_MONITOR_ID", "name": "Public API", "group": "API" },
      { "thirdParty": true, "name": "Payment provider", "manualState": "operational" }
    ]
  }'
```

The answer is `201 Created` with the page and a `Location: /statuspage/{id}` header. The page view carries `id`,
`slug`, `title`, `componentCount`, `unresolvedIncidents`, `hasPassword`, `created`, `customDomain`, `settings` and
`components`.

| Task | Operation |
|---|---|
| List pages | `GET /statuspage` (sort `created`, `title`, `slug`) |
| Read one | `GET /statuspage/{id}` |
| Change title or settings | `PATCH /statuspage/{id}` - only what you send changes; `null` clears a member |
| Replace the components | `PUT /statuspage/{id}/component` - see [components](/status-pages/components/) |
| Delete | `DELETE /statuspage/{id}` - frees the slug; the receipt counts removed components, incidents, subscribers and templates |

**MCP:** `create_status_page` takes `slug`, `title`, `componentsJson` (a JSON array like the `components` above) and
`settingsJson`, both JSON passed as strings. `update_status_page` takes `title` and/or `settingsJson`; the settings
you send are merged into the page's settings field by field (members you leave out keep their values; only
`features` replaces its whole list) - the tool's own text says it replaces the object, which is not what the API
does. The page is public as soon as it is created, so agree the slug, title and monitors with the page owner first.

## What happens next

- The page is live at `https://status.host-tracker.com/<slug>` immediately.
- Components show their monitors' live state; uptime bars fill from the monitors' existing history.
- If **Enable subscribe** is on, visitors can subscribe by email. Declare incidents from the **Announcements** tab.
- Changes you save reach the public page within about a minute (the page, `status.json` and the badge are cached
  briefly).

## Limits and gotchas

- **The slug is permanent.** To change the address, create a new page and delete the old one.
- **Slug refusals** answer `422 validation_failed` at `/slug`: reason `duplicate` when another page already uses it,
  `invalid` for a bad format or a reserved word (`api`, `admin`, `www`, `status`, `help`, `app`, `login`, `signup`,
  `profile`, `billing`, `new`, `edit`, `dist`, `content`, `img`, `lib`, `healthz`, `account`, `user`, `error`,
  `home`, `ic`, `status-pages`).
- **Page cap.** Creating more pages than your plan allows answers `403 package_limit` with
  `feature: "statusPages"` (in the app: "Your plan allows N status page(s). Upgrade to create more.").
- **Plan-gated settings** (SLA target, Google Analytics ID, no-index) are saved on any plan but only take effect on
  the public page from the Webmaster band up.
- **Deleting a page** removes it, its components, incidents and subscribers, and the slug stops working at once.
  Your monitors are not affected.
- The "Powered by HostTracker" credit is always shown; `settings.hideBranding` is accepted but has no effect.

## Related

- [Add and group components](/status-pages/components/)
- [Appearance and branding](/status-pages/branding/)
- [Post announcements and incident updates](/status-pages/announcements/)
- [Status page plan limits](/status-pages/plan-limits/)
