---
title: "Create Status Page Component"
description: "Adds a monitor, a third-party provider or a manually maintained component to a status page."
---

`POST /api/status-pages/{id}/components`

## Access

Organization `admin` and `editor`. A customer-scoped user or API token only reaches pages of a customer in its scope; a page without a customer (`customerId: null`) answers it with `403` (`forbidden`). A page of another organization answers `404` (`statusPageNotFound`). Path ids take the numeric id or the `publicId`. The change is written to the organization's audit log.

## Request Body

| Field | Type | Required | Default | Description |
|-------|------|----------|---------|-------------|
| `sourceKind` | string | Yes | - | `monitor` (state comes from a monitor), `dependency` (state comes from a third-party provider we monitor) or `manual` (you set the state). |
| `monitorType` | string | With `monitor` | - | `http`, `dns`, `icmp`, `smtp`, `ssh`, `tcp`, `ftp` or `imap_pop`. Not allowed with `manual`. |
| `monitorId` | number | With `monitor` | - | Numeric monitor id. Page with a customer: a monitor of that customer. Page without a customer: any monitor of your organization. Not allowed with `manual`. |
| `dependencySlug` | string | With `dependency` | - | Slug of an active provider from `GET /api/public/dependencies`. Not allowed with the other kinds. |
| `manualStatus` | string | No | `operational` | `manual` only: `operational`, `degraded`, `partial_outage`, `major_outage` or `maintenance`. |
| `name` | string | With `manual` | monitor or provider name | Display name (1-120 chars). |
| `description` | string\|null | No | `null` | Max 1000 chars. |
| `groupId` | number\|string\|null | No | `null` | Id or `publicId` of a group of this page. |
| `sort` | number | No | after the last component | Position, 0-100000. |
| `showUptime` | boolean | No | `true` | Show the availability bar of this component. |

A monitor can be a component of the same page only once. `hiddenMonitors` never hides an explicit component. When a monitor is deleted, its components disappear from every status page automatically.

A `dependency` component shows the overall status we publish for that provider on our public dependency monitoring: `operational`, `degraded`, `partial_outage`, `major_outage`, `maintenance`, or `unknown` while we cannot see the provider (shown as a warning, but not counted in the page's overall state). An open incident linked to the component raises its state. A provider can be a component of the same page only once; there is no availability bar. When the provider's status changes, subscribers of the page (or of this component) are notified like for a monitor incident. No monitor and no customer are needed.

## Example (cURL)

```bash
BASE_URL="https://uptimeify.io"
TOKEN="<your-api-token>"

curl -X POST "$BASE_URL/api/status-pages/1/components" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "sourceKind": "monitor",
    "monitorType": "http",
    "monitorId": 101,
    "groupId": 3
  }'
```

A manual component:

```bash
curl -X POST "$BASE_URL/api/status-pages/1/components" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "sourceKind": "manual",
    "name": "Payment provider",
    "description": "Card payments at checkout"
  }'
```

A third-party provider:

```bash
curl -X POST "$BASE_URL/api/status-pages/1/components" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "sourceKind": "dependency",
    "dependencySlug": "stripe"
  }'
```

## Response

`201 Created` with the new component:

```json
{
  "id": 7,
  "publicId": "0b6f3c1e-8d2a-4f5b-9c7e-1a2b3c4d5e6f",
  "statusPageId": 1,
  "groupId": 3,
  "sort": 0,
  "name": "Main Site",
  "description": null,
  "showUptime": true,
  "sourceKind": "monitor",
  "monitorType": "http",
  "monitorId": 101,
  "manualStatus": null,
  "dependencySlug": null,
  "createdAt": "2026-10-27T09:00:00.000Z",
  "updatedAt": "2026-10-27T09:00:00.000Z"
}
```

## Common errors

- `400 Bad Request` (`invalidRequestBody`) when a required field is missing or a field does not fit `sourceKind` (for example `manualStatus` on a monitor component); `data.issues` names the field
- `400 Bad Request` (`statusPageComponentMonitorCustomerMismatch`) when the monitor belongs to another customer than the status page
- `400 Bad Request` (`invalidIdentifier`) when an id in the path is neither a number nor a UUID
- `401 Unauthorized` when you are not logged in
- `403 Forbidden` (`forbidden`) when your role may not do this, or for a customer-scoped caller on a page without a customer or of another customer
- `403 Forbidden` (`statusPagesModuleDisabled`) when the status pages module is not activated
- `404 Not Found` (`statusPageNotFound`) when the status page does not exist or belongs to another organization
- `404 Not Found` (`monitorNotFound`) when the monitor does not exist or belongs to another organization
- `404 Not Found` (`providerNotFound`) when `dependencySlug` is not an active provider
- `404 Not Found` (`statusPageComponentGroupNotFound`) when `groupId` is not a group of this page
- `409 Conflict` (`statusPageComponentMonitorConflict`) when the monitor already is a component of this page
- `409 Conflict` (`statusPageComponentDependencyConflict`) when the provider already is a component of this page
- `409 Conflict` (`statusPageLimitReached`, with `data.max`) when the page already has 100 components
