---
title: "Get Analytics Summary"
method: GET
path: "/analytics/summary"
tags: ["analytics"]
---

# Get Analytics Summary

`GET /analytics/summary`

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

## Query parameters

- `start` string, date-time, nullable: Report start; window must be positive and at most 366 days.
- `end` string, date-time, nullable: Report end; exclusive for hourly alarm volume.
- `parent_id` string[], nullable
- `site_id` string[], nullable
- `camera_id` string, nullable
- `operator_id` string[], nullable
- `include_agent` boolean: Include agent-mode evaluations (actor='agent') in every figure. Default false: the dashboard measures operator decisions only, and metrics.agent_evaluations reports how many agent rows were left out.
- `tz` string, nullable: IANA time zone for the hour-of-day chart (e.g. America/Los_Angeles). Defaults to UTC.
- `slow_threshold_seconds` integer
- `stale_after_seconds` integer, nullable: When set, dispositions of alarms that were already older than this many seconds (event-created -> disposition) when cleared are excluded from every metric in the response. Omit to include everything (the default).

## Response `200`

Successful Response

- GetAnalyticsSummaryResponse
  - `range_start` string, date-time, required: Start of the reported range (UTC).
  - `range_end` string, date-time, required: End of the reported range (UTC).
  - `metrics` AnalyticsMetrics, required
    - `resolved` integer, required: Operator dispositions logged in the range.
    - `auto_archived` integer, required: Events the AI suggested dismissing that no operator reviewed (0 when filtering by operator).
    - `avg_response_seconds` number, nullable: Average seconds from event creation to operator disposition; null when no dispositions.
    - `median_response_seconds` number, nullable: Median event-to-disposition seconds over the same set as avg_response_seconds; null when none.
    - `p90_response_seconds` number, nullable: 90th-percentile event-to-disposition seconds; null when none.
    - `agent_evaluations` integer, nullable: Agent-mode evaluations (actor='agent') in the same window and parent/site/camera scope. When include_agent is false they are EXCLUDED from every other figure and this is how many were left out.
  - `breakdown` AnalyticsBreakdownRow[], required: Disposition counts, largest first.
    - `disposition` string, required: OperatorDisposition value.
    - `count` integer, required: Dispositions of this kind in the range.
  - `operators` AnalyticsOperatorRow[], required: Per-operator performance, most active first (includes operators with zero activity). Monitoring-center staff only (owner/operator roles): site_manager, account_manager, location_manager and read_only logins are never listed, though their dispositions still count in metrics/breakdown.
    - `id` string, required: Operator UUID.
    - `first_name` string, required: Operator first name.
    - `last_name` string, required: Operator last name.
    - `last_seen_at` string, date-time, nullable: Operator's last heartbeat (drives the online dot).
    - `reviewed` integer, required: Dispositions this operator logged in the range.
    - `avg_response_seconds` number, nullable: Average event-to-disposition seconds; null when none.
    - `median_response_seconds` number, nullable: Median event-to-disposition seconds; null when none.
    - `p90_response_seconds` number, nullable: 90th-percentile event-to-disposition seconds; null when none.
    - `false_alarm_pct` number, nullable: Share of this operator's dispositions marked false alarm; null when none.
    - `escalation_pct` number, nullable: Share of this operator's dispositions escalated (dispatch or voice down); null when none.
  - `recent` AnalyticsRecentRow[], required: Most recent dispositions in the range (max 50).
    - `evaluation_id` string, required: Operator evaluation UUID.
    - `event_id` string, nullable: Event UUID.
    - `event_created_at` string, date-time, nullable: When the event was created.
    - `evaluated_at` string, date-time, nullable: When the operator logged the disposition.
    - `response_seconds` number, nullable: Seconds from event creation to disposition.
    - `disposition` string, required: OperatorDisposition value.
    - `notes` string, nullable: Operator notes on the disposition.
    - `operator` AnalyticsRecentRef, required
      - `id` string, nullable: Referenced record UUID.
      - `name` string, nullable: Display name of the referenced record.
    - `camera` AnalyticsRecentCamera, required
      - `id` string, nullable: Camera row UUID.
      - `label` string, nullable: Camera label.
      - `camera_id` string, nullable: Hardware camera id.
    - `site` AnalyticsRecentRef, required
      - `id` string, nullable: Referenced record UUID.
      - `name` string, nullable: Display name of the referenced record.
    - `parent` AnalyticsRecentRef, required
      - `id` string, nullable: Referenced record UUID.
      - `name` string, nullable: Display name of the referenced record.
  - `slow` AnalyticsRecentRow[], required: Dispositions in the range whose event-created→disposition time exceeded slow_threshold_seconds, exact over the full range (not limited to the 50-row `recent` cap; capped defensively at 200).
    - `evaluation_id` string, required: Operator evaluation UUID.
    - `event_id` string, nullable: Event UUID.
    - `event_created_at` string, date-time, nullable: When the event was created.
    - `evaluated_at` string, date-time, nullable: When the operator logged the disposition.
    - `response_seconds` number, nullable: Seconds from event creation to disposition.
    - `disposition` string, required: OperatorDisposition value.
    - `notes` string, nullable: Operator notes on the disposition.
    - `operator` AnalyticsRecentRef, required
      - `id` string, nullable: Referenced record UUID.
      - `name` string, nullable: Display name of the referenced record.
    - `camera` AnalyticsRecentCamera, required
      - `id` string, nullable: Camera row UUID.
      - `label` string, nullable: Camera label.
      - `camera_id` string, nullable: Hardware camera id.
    - `site` AnalyticsRecentRef, required
      - `id` string, nullable: Referenced record UUID.
      - `name` string, nullable: Display name of the referenced record.
    - `parent` AnalyticsRecentRef, required
      - `id` string, nullable: Referenced record UUID.
      - `name` string, nullable: Display name of the referenced record.
  - `include_agent` boolean: Whether agent-mode evaluations are included in this response's figures (default false: operator decisions only).
  - `distribution` AnalyticsTriageDistribution
    - `bin_edges_seconds` number[], required: Log-spaced bin edges in seconds (0.4 s .. 1 h); values outside clamp into the first/last bin.
    - `team_median_seconds` number, nullable: Exact median triage seconds for the whole team in scope (ignores the operator filter); null when none.
    - `team_p90_seconds` number, nullable: Exact 90th-percentile triage seconds for the whole team in scope; null when none.
    - `team` integer[], required: Operator dispositions per bin across the whole parent/site/camera scope, ignoring the operator filter - the team reference curve.
    - `agent` integer[], nullable: Agent-mode dispositions per bin; null unless include_agent.
    - `by_operator` AnalyticsOperatorHistogram[], required: Per-operator counts (same scope as `team`), so a client can draw one curve per selected operator or sum any selection.
      - `operator_id` string, required: Operator UUID.
      - `counts` integer[], required: Dispositions per bin (len = len(bin_edges_seconds) - 1).
  - `hourly` AnalyticsHourlyVolume
    - `timezone` string, required: IANA zone the hours are bucketed in.
    - `days` number[], required: 24 entries: elapsed hours of exposure per local hour in [range_start, range_end), including fractional hours and DST. Divide counts by this for alarms per hour.
    - `operator_counts` integer[], required: 24 entries: operator dispositions of alarms fired in [range_start, range_end), grouped by local firing hour, operator filter applied. Closure may be after the window.
    - `agent_counts` integer[], nullable: 24 entries: agent-mode dispositions by hour; null unless include_agent (always zero under an operator filter).
    - `median_seconds` number[], required: 24 entries: median operator triage seconds for alarms fired in that hour; null for empty hours.
  - `slow_total` integer, required: Exact count of over-threshold dispositions in the window; `slow` is capped at 200 for response size, so this is the count to display (e.g. an 'Over target' metric card) — it stays exact even when `slow` is truncated.

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