events

Draw a box around a person the AI missed

Saves one box, pinned to one frame time, with full provenance snapshotted from the event at save time. Staff-only and tenant-scoped, same gates as the list route. class_label is 'person' only in phase 1.

post/events/{event_id}/missed-person-boxes

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
  • Auth
    HTTP bearer

Path parameters

event_idstring required

Request body

frame_timestamp_msinteger required

Milliseconds into the clip, read from the browser's decoded playback clock at the moment of Save (prefer requestVideoFrameCallback's mediaTime; see frame_capture_method). Never a frame index -- camera fps is per-camera and some cameras are variable frame rate, so a timestamp is the only stable frame identity. Bounded to the storage column's INTEGER range (2^31-1) so an out-of-range value is a 422, not a 500 at commit. Strict: a JSON boolean or a numeric string is rejected, not coerced.

frame_capture_method'rvfc' | 'currentTime' required

Which browser signal produced frame_timestamp_ms: 'rvfc' (requestVideoFrameCallback's metadata.mediaTime, the presented frame) or 'currentTime' (the requestAnimationFrame fallback when rVFC is unavailable). Recorded for the export's drift-bound accounting, never used to gate the write.

x1number required

Left edge of the box, normalized 0-1 as a fraction of the frame's width (same convention as detections). Strict: a JSON boolean or a numeric string is rejected, not coerced.

y1number required

Top edge of the box, normalized 0-1 as a fraction of the frame's height. Strict: a JSON boolean or a numeric string is rejected, not coerced.

x2number 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.

y2number 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.

class_label'person'

Phase 1 supports 'person' only; the column itself is a plain string so a later phase can add more without a migration.

Example request

{
  "frame_timestamp_ms": 4123,
  "x1": 0.41,
  "y1": 0.55,
  "x2": 0.48,
  "y2": 0.71
}

Response

Successful Response

idstring uuid required

The box's own id.

event_metadata_idstring uuid required

The event this box was drawn on. See the class docstring.

camera_idstring uuid required

The camera the event's clip came from. See the class docstring.

site_idstring uuid required

Audit snapshot of the camera's site at draw time.

parent_idstring uuid required

Audit snapshot of the camera's client (parent) at draw time.

frame_timestamp_msinteger 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).

x1number required

Left edge of the box, normalized 0-1.

y1number required

Top edge of the box, normalized 0-1.

x2number required

Right edge of the box, normalized 0-1.

y2number required

Bottom edge of the box, normalized 0-1.

class_labelstring required

Always 'person' in phase 1.

label_sourcestring required

Always 'operator_miss' -- how this box was made.

operator_idstring uuid nullable

Who drew it. Null if that operator account was later deleted.

created_atstring date-time required

When the box was drawn.

updated_atstring date-time nullable

When the box was last moved or resized. Null if never edited.

Changes

No recorded changes to this operation across all 2 revisions of this API.