---
title: "Get Agent Agreement"
method: GET
path: "/analytics/agent-agreement"
tags: ["analytics"]
---

# Get Agent Agreement

`GET /analytics/agent-agreement`

## 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/analytics/agent-agreement`
- Auth: HTTP bearer

AI-vs-operator agreement: precision/recall of the agent's recommended
action (and of the actual auto-dismiss gate) against human dispositions as
ground truth. Same tenant scoping as /analytics/summary.

403 for a curated role rather than curated: there is no customer-
meaningful reading of "AI vs operator agreement precision" — it is a
staff accuracy-monitoring metric, and every input to it (gate-stops,
auto-dismissals, what the agent recommended doing) is exactly the internal
pipeline detail this feature hides. Unlike the incident-counts/events
endpoints, curating this one down to only customer_visible rows would
not produce a meaningful "agreement rate" — it would produce a rate over
a handful of already-escalated events, which is not what this metric
means.

## Query parameters

- `start` string, date-time, nullable
- `end` string, date-time, nullable
- `parent_id` string[], nullable
- `site_id` string[], nullable
- `camera_id` string, nullable

## Response `200`

Successful Response

- GetAgentAgreementResponse
  - `range_start` string, date-time, required: Start of the analyzed range (UTC).
  - `range_end` string, date-time, required: End of the analyzed range (UTC).
  - `totals` AgreementTotals, required
    - `reviewed` integer, required: Human dispositions in range (actor='operator', non-demo).
    - `with_recommendation` integer, required: Of those, evals that carried a recommended_action (prompt v2+; failsafe sentinels excluded).
    - `agreement` integer, required: Exact 4-class matches between recommendation and human disposition.
    - `agreement_rate` number, nullable: agreement / with_recommendation as a percentage; null when no covered reviews.
  - `confusion` ConfusionCell[], required: Sparse confusion matrix, recommendation × human disposition (recommended=null bucket included).
    - `recommended` string, nullable: AI recommended_action; null = eval carried no recommendation.
    - `disposition` string, required: Human disposition mapped to the same 4-class space.
    - `count` integer, required: Reviews in this cell.
  - `classes` ClassScore[], required: Per-class precision/recall over covered reviews.
    - `action` string, required: One of the four recommendation classes.
    - `precision` number, nullable: Of reviews where the AI recommended this class, % the human agreed; null when never recommended.
    - `recall` number, nullable: Of reviews the human classified this way, % the AI also recommended it; null when the human never chose it.
    - `predicted` integer, required: Reviews where the AI recommended this class.
    - `support` integer, required: Reviews the human classified this way.
  - `dismiss_screen` DismissScreen, required: Binary safety view: dismiss-class (false_alarm + non_threatening) vs escalate-class (voice_down + dispatch).
    - `precision` number, nullable: Of AI dismiss-class recommendations, % the human also dismissed.
    - `recall` number, nullable: Of human dismissals, % the AI also recommended dismissing.
    - `false_dismissals` integer, required: AI recommended dismiss-class but the human ESCALATED — the dangerous cell.
  - `gate_simulation` GateSimulation, required: What the agent engine WOULD have auto-dismissed, using the engine's own gate (HIGH confidence, global incident-type allowlist, the camera's classifier selection, no ambiguity) — agent precision/recall against human ground truth. The thread gate is not simulated.
    - `would_auto_dismiss` integer, required: Reviews that would have passed the auto-dismiss gate.
    - `correct` integer, required: Of those, the human also dismissed (agent true positives).
    - `wrong` integer, required: Of those, the human escalated — clips agent mode would have wrongly dismissed. Should be ~0 before arming a camera.
    - `precision` number, nullable: correct / would_auto_dismiss as a percentage.
    - `coverage` number, nullable: would_auto_dismiss / reviewed as a percentage — the workload agent mode would remove.
    - `wrong_event_ids` string[]: Up to 20 event UUIDs the gate would have wrongly dismissed, newest first, for drill-down review.
    - `blocked_by_camera_types` integer: Reviews the global gate would dismiss but the camera's classifier selection blocks — the coverage cost of narrowing a camera's types.
  - `cameras` CameraAgreementRow[], required: Per-camera rows (most-reviewed first) for arming decisions.
    - `camera_id` string, required: Camera row UUID.
    - `camera_label` string, nullable: Camera label.
    - `site_name` string, nullable: Site display name.
    - `agent_mode` boolean, required: Whether the camera is currently armed.
    - `reviewed` integer, required: Human dispositions for this camera in range.
    - `with_recommendation` integer, required: Reviews covered by a recommendation.
    - `agreement_rate` number, nullable: 4-class agreement percentage; null when uncovered.
    - `gate_would_dismiss` integer, required: Reviews the gate would have auto-dismissed.
    - `gate_wrong` integer, required: Would-have-dismissed reviews the human escalated.
    - `gate_precision` number, nullable: Gate precision for this camera; null when the gate never fired.
    - `agent_incident_types_count` integer: How many incident types the agent may process on this camera (of the full taxonomy).
    - `gate_blocked_by_camera_types` integer: Reviews the global gate would dismiss but this camera's classifier selection blocks.

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