---
title: "Update Status Page Maintenance"
description: "Changes, reschedules or extends a maintenance."
---

`PATCH /api/status-pages/maintenances/{id}`

Changes only the fields you send. Moving the start of an upcoming maintenance announces it again (with `notifyOnSchedule`); messages for the old times are not sent any more. Extend a running maintenance by moving `scheduledUntil`; to end it now use [Complete Maintenance](/api/status-pages/complete-status-page-maintenance).

## Access

Organization `admin` and `editor`. A customer-scoped user or API token only reaches maintenance whose status pages all belong to a customer in its scope; a page without a customer (`customerId: null`) is for organization-wide roles only. Maintenance of another organization answers `404` (`statusPageMaintenanceNotFound`). 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 |
|-------|------|----------|---------|-------------|
| `title` | string | No | - | Shown on the page and in every message (1-200 chars). |
| `description` | string\|null | No | - | What happens and what visitors notice (max 5000 chars). |
| `scheduledFor` | string | No | - | Start, ISO 8601 with offset (`Z` or `+01:00`); stored and returned in UTC. |
| `scheduledUntil` | string | No | - | End, after `scheduledFor`. |
| `statusPageIds` | array | No | - | Status pages (id or `publicId`, 1-10) that show the maintenance. |
| `componentIds` | array | No | - | Affected components (id or `publicId`, up to 100) of any source: manual, monitor or third-party. Each must belong to one of `statusPageIds`. A page without a listed component shows the maintenance page-wide. |
| `notifyOnSchedule` | boolean | No | - | Announce to subscribers when saved, and again when an upcoming start is moved. |
| `reminderMinutesBefore` | number\|null | No | - | Remind subscribers this many minutes (5-10080) before the start; `null` sends no reminder. |
| `notifyOnStart` | boolean | No | - | Notify subscribers when the maintenance starts. |
| `notifyOnComplete` | boolean | No | - | Notify subscribers when it ends. |

`statusPageIds` replaces the pages; without `componentIds` they become page-wide. `componentIds` alone replaces the components on the current pages. At least one field is required; unknown fields are rejected.

## Example (cURL)

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

curl -X PATCH "$BASE_URL/api/status-pages/maintenances/12" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"scheduledUntil": "2026-11-04T00:30:00+01:00"}'
```

## Response

`200 OK` with the whole maintenance, as in [Get Status Page Maintenance](/api/status-pages/get-status-page-maintenance).

## Common errors

- `400 Bad Request` (`invalidRequestBody`) when a field is missing, has the wrong type or is unknown; `data.issues` names the field
- `400 Bad Request` (`invalidDateRange`) when `scheduledUntil` is not after `scheduledFor`
- `400 Bad Request` (`invalidIdentifier`) when an id is neither a number nor a UUID
- `400 Bad Request` (`statusPageComponentNotOnPage`) when a component does not belong to one of `statusPageIds`
- `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` (`statusPageMaintenanceNotFound`) when the maintenance does not exist or belongs to another organization
- `404 Not Found` (`statusPageNotFound`) when a status page does not exist or belongs to another organization
- `404 Not Found` (`statusPageComponentNotFound`) when a component does not exist
- `409 Conflict` (`statusPageMaintenanceClosed`) when the maintenance was cancelled
