---
title: "Pause Site Cameras"
method: POST
path: "/sites/{site_id}/camera-pauses"
tags: ["sites"]
---

# Pause Site Cameras

`POST /sites/{site_id}/camera-pauses`

## Request

- Base URL: `https://api.verdun.ai` (the document declares no server; this is the origin it was published from)
- URL: `https://api.verdun.ai/sites/{site_id}/camera-pauses`
- Auth: HTTP bearer

Hold back NEW alarms on cameras for 5, 10 or 15 minutes (operator ask 2026-10-28).

`review_label_alarms` AND the site in the caller's scope (the service checks
it), the same keys as the early disarm: every operator who works the queue
and a Parent Manager, not a customer account or location manager nor a
read-only login. The limits, the whole-site rule and the pre-registration
block are enforced in the service under the site lock; going over them
needs an ops lead with `limit_override` and a note.

## Path parameters

- `site_id` string, required

## Request body

- CameraPauseRequest
  - `camera_ids` string[], required: Cameras at this site to pause now. All-or-nothing: one camera that cannot be paused refuses the whole request and names it.
  - `minutes` 5 | 10 | 15, required: How long to pause: 5, 10 or 15 minutes. It ends by itself; there is no extend.
  - `reason` 'delivery' | 'maintenance' | 'cleaning' | 'other', required: Why the operator is pausing. 'other' requires a note.
  - `note` string, nullable: Free text kept on the pause and in the Activity Log. Staff only; never shown to customers.
  - `request_id` string, uuid, required: Client-generated idempotency key for this press. A retry with the same id returns the rows the first attempt wrote and uses up no limit.
  - `limit_override` boolean: An ops lead only: pause past the per-site and per-camera limits, or past the rule that stops every monitored camera at a site being paused. Requires a note. The pause is still capped at 15 minutes.

## Response `200`

Successful Response

- SiteCameraPausesResponse: `GET /sites/{id}/camera-pauses` and the result of a pause or resume.
  - `site_id` string, uuid, required: The site.
  - `timezone` string, required: The site's IANA zone.
  - `as_of` string, date-time, required: The server instant everything here was resolved at.
  - `limits` CameraPauseLimitsModel, required
    - `allowed_minutes` integer[], required: The preset lengths.
    - `batches_last_hour` integer, required: Pause presses at this site in the last rolling hour.
    - `max_batches_per_hour` integer, required: Presses the site may take per rolling hour.
    - `max_camera_minutes_per_hour` integer, required: Paused minutes one camera may take per rolling hour.
    - `can_override` boolean, required: The caller is an ops lead and may pause past the limits with a reason.
  - `cameras` CameraPauseCameraModel[], required: Every live camera at the site, in label order.
    - `camera_id` string, uuid, required: The camera row id.
    - `camera_label` string, required: The camera's display name.
    - `monitoring_state` 'monitored' | 'heightened' | 'off', required: What the camera is doing right now (schedule, disarm and test arm applied). A pause does not change it: a paused camera stays Monitored or Heightened.
    - `pausable` boolean, required: Whether it can be paused right now.
    - `unavailable_reason` 'live_view_only' | 'off' | 'already_paused' | 'blocked', nullable: Why not, when pausable is false. 'blocked': ops has blocked pausing this camera while an experiment runs on it.
    - `paused` CameraPauseWindowModel: A camera's pause that is live right now.
      - `starts_at` string, date-time, required: When the pause began.
      - `ends_at` string, date-time, required: When new alarms start reaching the queue again (the pause ends by itself here).
      - `minutes` integer, required: The length chosen: 5, 10 or 15.
      - `reason` string, nullable: One of the four request reasons.
      - `by_name` string, nullable: The operator who paused (snapshot). Null for customer-side logins.
      - `note` string, nullable: The operator's note. Null for customer-side logins.
    - `minutes_paused_last_hour` integer: Minutes this camera was paused in the last rolling hour (a live pause counts so far).
  - `changed_camera_ids` string[]: On a pause or resume: the cameras this request actually changed.
  - `resumed` CameraResumedModel[]: On a resume: what each resumed camera is doing now.
    - `camera_id` string, uuid, required: The camera.
    - `monitoring_state` 'monitored' | 'heightened' | 'off', required: What the camera is doing now that the pause is gone. 'off' means its schedule (or a disarm) has it off: the console must not say monitoring resumed.
  - `deduplicated` boolean: True when this was a retry of an earlier pause and nothing new was written.

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/verdun/apis/verdun-api.md) - [All operations](https://skmtc.dev/verdun/apis/verdun-api/llms.txt) - [OpenAPI document](https://skmtc.dev/verdun/apis/verdun-api/revisions/35a2a6ebedda?raw)
