---
title: "Early Disarm Cameras"
method: POST
path: "/sites/{site_id}/early-disarm"
tags: ["sites"]
---

# Early Disarm Cameras

`POST /sites/{site_id}/early-disarm`

## 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}/early-disarm`
- Auth: HTTP bearer

Turn cameras off ahead of their scheduled disarm (owner ask 2026-10-17).

`review_label_alarms`, NOT `configure_schedules`: every operator who works
the queue may do this, and only this -- no more than 60 minutes ahead and
ending exactly at the schedule's own disarm, which the service enforces.
Widening `configure_schedules` instead would have handed operators every
schedule edit and a 120-minute disarm at any hour.

## Path parameters

- `site_id` string, required

## Request body

- EarlyDisarmRequest
  - `camera_ids` string[], required: Cameras at this site to turn off now. EVERY one must be within 60 minutes of its own scheduled disarm (camera override, camera group or site week, holidays applied); the request is all-or-nothing and 409s naming the first camera that is not.
  - `reason` 'staff_on_site' | 'customer_request' | 'vendor_delivery' | 'other', required: Why the operator is disarming early. 'other' requires a note.
  - `note` string, nullable: Free text kept on the camera and in the Activity Log.

## Response `200`

Successful Response

- SiteEarlyDisarmResponse: `GET /sites/{id}/early-disarm` and the result of a disarm or re-arm.
  - `site_id` string, uuid, required: The site.
  - `timezone` string, required: The site's IANA zone.
  - `window_minutes` integer, required: How far ahead of a scheduled disarm one may disarm early.
  - `horizon_minutes` integer, required: How far ahead scheduled_off_at is looked for.
  - `as_of` string, date-time, required: The server instant everything here was resolved at.
  - `site_disarm_active` boolean, required: A whole-site disarm (text, call, app or console) is live, so nothing is eligible.
  - `site_arm_active` boolean: A test arm is live at the site, so nothing is eligible.
  - `cameras` EarlyDisarmCameraModel[], 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.
    - `schedule_state` 'monitored' | 'heightened' | 'off', required: What the camera's SCHEDULE says right now (camera override, groups or site week, holidays applied), ignoring any disarm or test arm.
    - `scheduled_off_at` string, date-time, nullable: The next instant its schedule turns it off, within horizon_minutes. Null when the schedule already has it off, or nothing turns it off soon (a 24/7 camera, or a holiday).
    - `opens_at` string, date-time, nullable: scheduled_off_at minus 60 minutes: when early disarm becomes available.
    - `eligible` boolean, required: Whether it can be disarmed early right now.
    - `ineligible_reason` 'live_view_only' | 'early_disarmed' | 'site_disarmed' | 'site_armed' | 'already_off' | 'no_scheduled_disarm' | 'too_early', nullable: Why not, when eligible is false. 'site_armed': a live test arm would turn the camera back on when the window ended, so it is refused. 'live_view_only': the camera (or its site) is Live View only and raises no alarms, so there is nothing to disarm.
    - `early_disarm` EarlyDisarmWindowModel: A camera's live early disarm.
      - `set_at` string, date-time, required: When the operator turned the camera off.
      - `until` string, date-time, required: Its scheduled disarm: the schedule takes over here with no gap.
      - `by_name` string, nullable: The operator who did it (snapshot). Null for customer-side logins.
      - `reason` string, nullable: One of the four request reasons.
      - `note` string, nullable: The operator's note, if any. Null for customer-side logins.
  - `changed_camera_ids` string[]: On a disarm or re-arm: the cameras this request actually changed.

## 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/a19366be50a3?raw)
