---
title: "After-voice-down recordings on this alarm"
method: GET
path: "/events/{event_id}/captures"
tags: ["events"]
---

# After-voice-down recordings on this alarm

`GET /events/{event_id}/captures`

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

Every 30 s recording of the camera started when a voice down played on this alarm (AI announcement, Live Talk, Verkada talk-down, clip talk-down), with its status and, when unavailable, the reason. `clip_url` is presigned for 1h and present only while the object exists (`available`); an object past the `clips/` lifecycle answers `available:false, reason:'expired'`. A starred alarm plays from its retained copy. Tenant scope and visibility exactly like `clip-url`; the ingestor's diagnostics are never returned.

## Path parameters

- `event_id` string, required

## Response `200`

Successful Response

- GetEventCapturesResponse
  - `captures` EventCaptureResponse[], required: Every after-voice-down capture on this alarm, oldest first.
    - `id` string, uuid, required: Capture id.
    - `trigger_kind` string, required: Which voice down this follows: ai_announcement, operator_ai_announcement, live_talk, external_talkdown or clip_talkdown.
    - `status` string, required: pending, claimed, captured, unavailable or failed.
    - `reason` string, nullable: Why a capture is unavailable/failed (stable code; the UI owns the wording).
    - `window_start` string, date-time, required: The moment the voice down played; the recording starts here.
    - `window_end` string, date-time, required: window_start plus the requested duration.
    - `duration_seconds` integer, required: Requested length (30 in v1).
    - `captured_seconds` number, nullable: Footage actually inside the window (null when not measured, e.g. continuous cameras).
    - `start_offset_seconds` number, nullable: Seconds after window_start where the footage begins (null when not measured).
    - `partial` boolean, nullable: True when less than the full window was captured. Null unless captured with measured length.
    - `available` boolean, required: True when a playable clip exists right now (captured and the object is still in storage).
    - `clip_url` string, nullable: Presigned URL (1 h) when available.
    - `expires_in` integer, nullable: Seconds until clip_url expires.
    - `display_rotation` integer, nullable: Display rotation (degrees CCW: 0, 90, 180 or 270) already applied by this capture's own container tag, from the object's S3 `display-rotation` metadata. 0 = untagged; null = unknown (not available, or the HEAD failed). A player must not turn a clip again that is tagged non-zero.

## 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/00252d8227c1?raw)
