---
title: "Rearm Site"
method: POST
path: "/sites/{site_id}/rearm"
tags: ["sites"]
---

# Rearm Site

`POST /sites/{site_id}/rearm`

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

## Path parameters

- `site_id` string, required

## Response `200`

Successful Response

- DisarmStateResponse: The site's live disarm state after a console disarm or re-arm. The same three fields the site serializers carry, so the console can apply the response to its cached site without a refetch, plus what the request actually resolved to.
  - `site_id` string, uuid, required: The site whose cameras this concerns.
  - `disarm_until` string, date-time, nullable: When the cameras come back on by themselves. An early re-arm sets this to the moment it ended rather than nulling it, so the window that really happened stays readable historically — which means a non-null value does NOT mean 'disarmed'. Read `disarm_active` for that. Expiry is implicit; nothing sweeps this column.
  - `disarm_set_at` string, date-time, nullable: When the current disarm window began. The resolver's predicate is the window between this and disarm_until, so a historical read is not repainted by a disarm set later.
  - `disarm_by` string, nullable: Who turned the cameras off: 'operator:<uuid>' (console), 'sms:<E.164>' for a customer text, 'voice:<E.164>' for a customer call, or 'app:<uuid>' (the customer's mobile app). Retained after an early re-arm, alongside the closed window.
  - `disarm_active` boolean: Whether the cameras are off RIGHT NOW — the window predicate, resolved server-side. Always false on a re-arm response. Never derive this from disarm_until.
  - `minutes` integer, nullable: Minutes actually applied, after clamping; null on a re-arm.
  - `clamped` boolean: True when the request asked for longer than the site's cap.
  - `monitoring_now` string, nullable: Live View only (site flag or every live camera individually flagged) reads 'live_view_only' and overrides both arm and disarm windows. Otherwise: Whether this site's cameras are being monitored RIGHT NOW, resolved server-side: 'disarmed' (a live text/call/console disarm window - it beats every schedule), 'monitored' (at least one live camera resolves monitored or heightened now), 'off_schedule' (no camera is monitored now, but the schedule turns one on within 7 days - see monitoring_next_change_at), or 'unscheduled' (no monitored hours anywhere in the week). On a re-arm response this is what the SCHEDULE leaves behind, which is the whole point: re-arming an off-schedule site does not turn its cameras on.
  - `schedule_monitoring_now` string, nullable: The current schedule-only monitoring state, ignoring Live View only flags and the disarm window. Resolved at the same instant as monitoring_now. A successful disarm reports monitoring_now='disarmed'; this separate field lets the console explain when cameras were already off by schedule.
  - `monitoring_next_change_at` string, date-time, nullable: The next instant this site's monitored/off state flips BY SCHEDULE ALONE - the disarm window is deliberately ignored, because you already have disarm_until above. Null when nothing changes within 7 days and for an 'unscheduled' site. Aligned to a 15-minute boundary in the site's own timezone.

## 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)
