---
title: "Move or resize an operator-drawn missed-person box"
method: PATCH
path: "/events/{event_id}/missed-person-boxes/{box_id}"
tags: ["events"]
---

# Move or resize an operator-drawn missed-person box

`PATCH /events/{event_id}/missed-person-boxes/{box_id}`

## 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/events/{event_id}/missed-person-boxes/{box_id}`
- Auth: HTTP bearer

Bbox only -- the frame a box is pinned to is not editable; delete and redraw for a different frame. Only the box's own author, or an ops lead (owner/monitoring_manager), may edit it.

## Path parameters

- `event_id` string, required
- `box_id` string, required

## Request body

- UpdateOperatorMissBoxRequest: Move/resize an existing box. Phase 1 scope: bbox only -- the frame it's pinned to is not editable here (delete and redraw for a different frame). EVERY FIELD IS `strict=True` (PR #276 review, Greptile P2) -- see `CreateOperatorMissBoxRequest`'s docstring for why: without it a JSON boolean or numeric string is silently coerced into a different annotation than the one submitted.
  - `x1` number, required: Left edge of the box, normalized 0-1. Strict: a JSON boolean or a numeric string is rejected, not coerced.
  - `y1` number, required: Top edge of the box, normalized 0-1. Strict: a JSON boolean or a numeric string is rejected, not coerced.
  - `x2` number, required: Right edge of the box, normalized 0-1. Must be greater than x1 (checked below). Strict: a JSON boolean or a numeric string is rejected, not coerced.
  - `y2` number, required: Bottom edge of the box, normalized 0-1. Must be greater than y1 (checked below). Strict: a JSON boolean or a numeric string is rejected, not coerced.

## Response `200`

Successful Response

- OperatorMissBoxModel: The per-event API's shape. `event_metadata_id`/`camera_id` stay REQUIRED here even though the underlying column is nullable (`ON DELETE SET NULL`, PR #276 review) -- every box this model ever serializes was found by filtering `OperatorMissBoxes.event_metadata_id == event.id` against a live, loaded event, so a null value here can never actually reach this model. The PERMANENT provenance (`source_event_id`/`source_camera_id`, which survive a hard delete) is not exposed on this live per-event surface -- it exists for the offline export, not this API.
  - `id` string, uuid, required: The box's own id.
  - `event_metadata_id` string, uuid, required: The event this box was drawn on. See the class docstring.
  - `camera_id` string, uuid, required: The camera the event's clip came from. See the class docstring.
  - `site_id` string, uuid, required: Audit snapshot of the camera's site at draw time.
  - `parent_id` string, uuid, required: Audit snapshot of the camera's client (parent) at draw time.
  - `frame_timestamp_ms` integer, required: Milliseconds into the clip
  - `frame_capture_method` 'rvfc' | 'currentTime', required: Which browser signal produced frame_timestamp_ms: 'rvfc' (requestVideoFrameCallback's metadata.mediaTime) or 'currentTime' (the requestAnimationFrame fallback).
  - `x1` number, required: Left edge of the box, normalized 0-1.
  - `y1` number, required: Top edge of the box, normalized 0-1.
  - `x2` number, required: Right edge of the box, normalized 0-1.
  - `y2` number, required: Bottom edge of the box, normalized 0-1.
  - `class_label` string, required: Always 'person' in phase 1.
  - `label_source` string, required: Always 'operator_miss' -- how this box was made.
  - `operator_id` string, uuid, nullable: Who drew it. Null if that operator account was later deleted.
  - `created_at` string, date-time, required: When the box was drawn.
  - `updated_at` string, date-time, nullable: When the box was last moved or resized. Null if never edited.

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