---
title: "Get Escalation"
method: GET
path: "/analytics/escalations/{event_id}"
tags: ["analytics"]
---

# Get Escalation

`GET /analytics/escalations/{event_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/analytics/escalations/{event_id}`
- Auth: HTTP bearer

One escalation by alarm id, for deep links (Site Summary cards, Incident
Data rows) that may point outside the current window or filters. Same scope
and visibility as the list: 403 out of scope, 404 unknown, hidden or not an
escalation.

## Path parameters

- `event_id` string, uuid, required

## Response `200`

Successful Response

- EscalationRow
  - `event_id` string, uuid, required: The alarm.
  - `site` EscalationSite, required
    - `id` string, uuid, required: Site id.
    - `name` string, required: Site name.
    - `timezone` string, nullable: IANA zone the UI renders this row's clock in.
  - `parent` EscalationParent, required
    - `id` string, uuid, required: Client (parent) id.
    - `name` string, required: Client name.
  - `camera` EscalationCamera, required
    - `id` string, uuid, required: Camera id.
    - `label` string, required: Camera label (an identifier, never scrubbed).
  - `incident_type` string, nullable: AI incident class, when known.
  - `kind` 'voice_down' | 'dispatch', required: Escalate - Voice Down or Escalate - Dispatch.
  - `escalated_by` 'agent' | 'operator', required: Who owns the escalation (the operator's when both acted).
  - `agent_voice_down` boolean, required: The AI agent also played a deterrent on this alarm.
  - `operator` string, nullable: The escalating operator, projected like actor_name; null for agent-only rows.
  - `t0` string, date-time, required: When the alarm entered the operator queue (shared queue clock); event creation is the fallback when queue visibility is unknown.
  - `state` 'open' | 'closed' | 'expired', required: Open, closed out, or expired without a close-out.
  - `outcome` EscalationOutcome
    - `code` string, required: Close-out outcome word, or agent_cleared / closed / expired.
    - `tone` 'good' | 'warn' | 'bad' | 'neutral', required: Colour hint.
  - `timings` EscalationTimings, required
    - `escalate_seconds` integer, nullable: Alarm to the first escalating action.
    - `voice_down_seconds` integer, nullable: Alarm to the first voice down transmitted or played.
    - `dispatcher_answered_seconds` integer, nullable: Alarm to the dispatcher answering (derived instant).
    - `contact_reached_seconds` integer, nullable: Alarm to the first contact call answered or first SMS delivered.
    - `closed_seconds` integer, nullable: Alarm to close-out.
  - `poster_url` string, nullable: Blind presign of the alert snapshot; the image may 404.
  - `clip` EscalationClip, required
    - `available_hint` boolean, required: The alarm has a clip key and is inside the storage window (or retained). A hint, never a HEAD.
    - `retained` boolean, required: A starred copy exists.
  - `captures` EscalationCaptureSummary[], required: After-voice-down recordings for this alarm.
    - `id` string, uuid, required: Capture id; fetch playback from GET /events/{id}/captures.
    - `trigger_kind` string, required: Which action it follows: a voice-down kind (ai_announcement, operator_ai_announcement, live_talk, external_talkdown, clip_talkdown), or operator_alarm, which is the operator-raised alarm's OWN clip (30 s before it was raised to 15 s after), not an after-voice-down recording.
    - `status` string, required: pending, claimed, captured, unavailable or failed.
    - `reason` string, nullable: Why it is unavailable/failed.
    - `offset_seconds` integer, required: Seconds from the alarm to the start of the recording.
    - `captured_seconds` number, nullable: Footage recorded inside the window (null when not measured).
    - `start_offset_seconds` number, nullable: Where the footage begins inside the window.
    - `partial` boolean, nullable: True when less than the full window was recorded.
  - `steps` EscalationStep[], required: Timeline steps ordered by timestamp.
    - `kind` string, required: alarm, raised (an operator raised it from Live View), ai_assessment, opened, escalated, announcement, announcement_failed, ai_call_ended, live_talk, live_talk_end, external_talkdown, external_talkdown_end, owner_call, owner_sms, owner_email, contact_reply, dispatch_call, dispatch_connected, dispatch_ended, closed, expired.
    - `actor` 'system' | 'agent' | 'operator', required: Who acted: the system, the AI agent, or an operator.
    - `actor_name` string, nullable: Operator display name for ops-lead callers; the literal 'Operator' for everyone else; null for system/agent steps.
    - `at` string, date-time, required: Absolute UTC instant of the step.
    - `offset_seconds` integer, required: Seconds since the alarm landed in the queue (t0), never negative.
    - `since_previous_seconds` integer, nullable: Seconds since the previous step; null on the first.
    - `label` string, required: Short English label.
    - `detail` object, nullable: Structured facts for the step. Customer-side callers receive only an allow-listed subset of keys.
    - `result` EscalationResult
      - `code` string, required: Stable machine word (answered, delivered, no_answer, played, subject_left, ...).
      - `tone` 'good' | 'warn' | 'bad' | 'neutral', required: good | warn | bad | neutral - the UI colour, decided server-side.
    - `capture_id` string, uuid, nullable: The after-voice-down capture that follows this step (voice steps only).
    - `derived` boolean: True when the instant is derived, not recorded (the 'escalated' step is the first escalating action).

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