---
title: "Create Status Page"
description: "Creates a new status page. Requires admin role."
---

`POST /api/status-pages`

## Request Body

| Field | Type | Required | Default | Description |
|-------|------|----------|---------|-------------|
| `customerId` | number | Yes | - | Customer ID (must belong to your organization) |
| `name` | string | Yes | - | Display name (1-120 chars). Slug auto-generated from name. |
| `slug` | string | No | auto | URL slug (1-120 chars, auto-normalized to lowercase-hyphens) |
| `description` | string | No | null | Description (max 1000 chars) |
| `visibility` | string | No | `public` | `public` or `customer_members_only` |
| `isPublished` | boolean | No | true | Whether the page is publicly visible |
| `customDomainHostname` | string | No | null | Custom domain (3-253 chars). Creates a pending DNS verification record. |
| `hiddenMonitors` | array | No | `[]` | Monitors to hide from this status page. Each entry is `{ "type": "http"\|"dns"\|"icmp"\|"smtp"\|"ssh"\|"ftp"\|"imap_pop", "id": <monitor id> }`. Omit or send `[]` to show all monitors (the default). Monitors added later appear automatically. Maximum 500 entries. |

## Example (cURL)

```bash
curl -X POST "$BASE_URL/api/status-pages" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "customerId": 5,
    "name": "Production Status",
    "description": "Real-time status of our production services",
    "visibility": "public",
    "hiddenMonitors": [{ "type": "http", "id": 42 }]
  }'
```

## Response

```json
{
  "statusPage": {
    "id": 1,
    "publicId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    "organizationId": 1,
    "customerId": 5,
    "name": "Production Status",
    "slug": "production-status",
    "description": "Real-time status of our production services",
    "visibility": "public",
    "isPublished": true,
    "showRecentIncidents": false,
    "showRecentMaintenance": false,
    "customDomainId": null,
    "createdAt": "2026-01-15T10:00:00.000Z",
    "updatedAt": "2026-01-15T10:00:00.000Z"
  },
  "dns": null
}
```

If `customDomainHostname` is provided, the response includes DNS verification instructions:

```json
{
  "dns": {
    "txtName": "_uptimeify-verify.status.deinkunde.com",
    "txtValue": "abc123-def456-ghi789"
  }
}
```

## Common errors

- `401 Unauthorized` when not authenticated
- `403 Forbidden` when not an admin
- `409 Conflict` when slug is already taken

