---
title: "Acknowledge (\"Got it\") changed operator instructions on this event"
method: POST
path: "/events/{event_id}/operator-instructions/ack"
tags: ["events"]
---

# Acknowledge ("Got it") changed operator instructions on this event

`POST /events/{event_id}/operator-instructions/ack`

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

Acks each level at the `updated_at` the GET returned. An item that is not the level's CURRENT id and version (the text changed again) is ignored silently. Returns the GET's payload; same gate and 404 collapse as the GET.

## Path parameters

- `event_id` string, required

## Request body

- AckOperatorInstructionsRequest
  - `versions` OperatorInstructionVersion[], required: Versions read.
    - `level` 'account' | 'site' | 'camera', required: Which level of the stack.
    - `id` string, uuid, required: Id of the account, site or camera, as the GET returned it.
    - `updated_at` string, date-time, required: The level's `updated_at` exactly as the GET returned it.

## Response `200`

Successful Response

- EventOperatorInstructionsResponse: Every operator instruction that applies to one event, resolved server-side. THE READ THE REVIEW PANEL MAKES. Resolving camera -> site -> account here rather than in the client is what keeps the instruction text OFF the queue bundle and off both SSE broadcasts: those payloads are built for every event an operator can see and are held open all shift, while this is one scoped fetch for the one event actually being reviewed. Same shape as the `ai-eval` and `clip-url` per-event reads, and guarded the same way. THREE LEVELS, ALL THREE POSSIBLY EMPTY. `account` is null for a site that sits directly under the client with no account, and also for a site whose account has been retired — a retired account grants nothing and its text must not be served. `site` and `camera` are always present for a real event. DEMO EVENTS ANSWER 404 (Round-0 ruling Q7), not a null camera: they are camera-less by construction and the review panel never shows one, so a fourth shape would be dead code the client still had to handle. Out-of-scope and unknown event ids are indistinguishable — both 404 — so this route is not an event-id oracle.
  - `account` OperatorInstructionsLevel: One resolved level of the instruction stack, with its label for the UI.
    - `id` string, uuid, required: Id of the account, site or camera.
    - `name` string, required: Display name of the level: the account name, the site name, or the camera label. Carried so the review panel can label each row without a second fetch.
    - `operator_instructions` string, nullable: Instructions set at this level. Null means none set here.
    - `headline` string, nullable: One-line headline shown under the alarm video (site and camera only; always null for the account).
    - `updated_at` string, date-time, nullable: When this text or headline last changed (null: unchanged since tracking began). Echo it to `.../ack`.
    - `acknowledged` boolean: Caller has read the current text and headline: true when both are empty, `updated_at` is null, or they acked this version.
  - `site` OperatorInstructionsLevel, required: One resolved level of the instruction stack, with its label for the UI.
    - `id` string, uuid, required: Id of the account, site or camera.
    - `name` string, required: Display name of the level: the account name, the site name, or the camera label. Carried so the review panel can label each row without a second fetch.
    - `operator_instructions` string, nullable: Instructions set at this level. Null means none set here.
    - `headline` string, nullable: One-line headline shown under the alarm video (site and camera only; always null for the account).
    - `updated_at` string, date-time, nullable: When this text or headline last changed (null: unchanged since tracking began). Echo it to `.../ack`.
    - `acknowledged` boolean: Caller has read the current text and headline: true when both are empty, `updated_at` is null, or they acked this version.
  - `camera` OperatorInstructionsLevel, required: One resolved level of the instruction stack, with its label for the UI.
    - `id` string, uuid, required: Id of the account, site or camera.
    - `name` string, required: Display name of the level: the account name, the site name, or the camera label. Carried so the review panel can label each row without a second fetch.
    - `operator_instructions` string, nullable: Instructions set at this level. Null means none set here.
    - `headline` string, nullable: One-line headline shown under the alarm video (site and camera only; always null for the account).
    - `updated_at` string, date-time, nullable: When this text or headline last changed (null: unchanged since tracking began). Echo it to `.../ack`.
    - `acknowledged` boolean: Caller has read the current text and headline: true when both are empty, `updated_at` is null, or they acked this version.

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