---
title: "Create Status Page Template"
description: "Creates an incident or update template."
---

`POST /api/status-pages/templates`

A template pre-fills the form for a new public incident (`kind: incident`) or for an update on a running one (`kind: update`). It publishes nothing by itself; incidents are still created with [Create Manual Incident](/api/monitoring/create-manual-incident).

## Access

Organization `admin` and `editor` with an unrestricted scope: a customer-scoped user or API token gets `403` (`customerScopedTokenForbidden`), because a template belongs to the whole organization. A template of another organization answers `404` (`statusPageTemplateNotFound`). 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 |
|-------|------|----------|---------|-------------|
| `kind` | string | Yes | - | `incident` (a new incident) or `update` (an update on a running one). Cannot be changed later. |
| `name` | string | Yes | - | Shown in the template picker, 1-120 characters. |
| `title` | string or null | No | `null` | Incident templates only: the incident title, up to 200 characters. |
| `body` | string | Yes | - | The update text, 1-5,000 characters. |
| `updateStatus` | string | No | `investigating` | Phase the update starts with: `investigating`, `identified`, `monitoring` or `resolved`. |
| `severity` | string or null | No | `null` | Incident templates only: `minor`, `major`, `critical` or `maintenance`. |
| `impact` | string or null | No | `null` | Incident templates only: `degraded`, `partial_outage`, `major_outage` or `maintenance`. |
| `statusPageIds` | array or null | No | `null` | Incident templates only: status pages (id or publicId) preselected in the form, at most 10. Each must belong to your organization. |
| `componentIds` | array or null | No | `null` | Incident templates only: components (id or publicId), at most 100; each must belong to one of `statusPageIds`. |

An update template (`kind: update`) takes only `name`, `body` and `updateStatus`; the incident-only fields stay `null`.

## Example (cURL)

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

curl -X POST "$BASE_URL/api/status-pages/templates" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "kind": "incident", "name": "Payment provider down", "title": "Card payments failing", "body": "We are looking into failed card payments.", "severity": "major", "statusPageIds": [2], "componentIds": [8] }'
```

## Response

`201 Created` with the new template:

```json
{
  "id": 4,
  "publicId": "3f6c2a1b-8d4e-4b7a-9c1d-2e3f4a5b6c7d",
  "kind": "incident",
  "name": "Payment provider down",
  "title": "Card payments failing",
  "body": "We are looking into failed card payments.",
  "updateStatus": "investigating",
  "severity": "major",
  "impact": "partial_outage",
  "statusPageIds": [2],
  "componentIds": [8],
  "createdAt": "2026-10-27T09:00:00.000Z",
  "updatedAt": "2026-10-27T09:00:00.000Z"
}
```

## Common errors

- `400 Bad Request` (`invalidRequestBody`) when a field is invalid, or an update template gets an incident-only field
- `400 Bad Request` (`statusPageIdsRequired`) when `componentIds` is sent without `statusPageIds`
- `400 Bad Request` (`statusPageComponentNotOnPage`) when a component belongs to a page that is not in `statusPageIds`
- `404 Not Found` (`statusPageNotFound`, `statusPageComponentNotFound`) when a page or component does not exist in your organization
- `409 Conflict` (`statusPageLimitReached`, with `data.max`) when the organization already has 200 templates
- `401 Unauthorized` when you are not logged in
- `403 Forbidden` (`statusPagesModuleDisabled`) when the status pages module is not activated
- `403 Forbidden` (`forbidden`) when your role may not write
- `403 Forbidden` (`customerScopedTokenForbidden`) for a customer-scoped user or token
