---
title: "Get Pool Cameras"
method: GET
path: "/ingestor/pool/cameras"
tags: ["ingestor pool"]
---

# Get Pool Cameras

`GET /ingestor/pool/cameras`

## 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/ingestor/pool/cameras`
- Auth: API key in header `X-API-Key`

## Response `200`

Successful Response

- GetParentCamerasIngestorResponse[]
  - `id` string, uuid, required: Camera UUID
  - `kvs_stream_name` string, nullable: Kinesis Video Streams stream name for this camera
  - `rtsp_arn` string, nullable: AWS Secrets Manager ARN storing the RTSP URL
  - `adapter` 'generic_onvif' | 'hanwha_onvif'
  - `brand` 'hanwha' | 'dahua'
  - `model` 'ANV-L7012R'
  - `metadata_format` 'onvif'
  - `ingest_mode` 'continuous' | 'motion_clip'
  - `motion_config` object, nullable: Extensible motion settings with bounded known keys (timings, thresholds, detector geometry/rate and RTSP buffer mode); see app/services/motion_config_validation.py. Unknown keys are preserved.
  - `analytics_provider` 'none' | 'deepalert'
  - `analytics_config` object, nullable: Opaque per-vendor analytics settings interpreted by the ingestor
  - `ii_enabled` boolean: Incident intelligence on/off: when false motion events still record and alert in the UI, but clips are not sent to the AI pipeline for classification
  - `fire_watch` boolean: Per-camera fire-screen gate; when false the ingestor must not call /screen/fire for this camera
  - `detection_mode` string, nullable: 'legacy' | 'ii_gated' | null (null means legacy). Only meaningful when analytics_provider == 'deepalert'.
  - `live_view_until` string, nullable: ISO-8601 deadline: push to KVS for live view while now() < this (motion_clip cameras)
  - `health_sample_requested_at` string, nullable: ISO-8601 time an operator last asked for an on-demand health sample (Analytics -> Camera Health -> Re-check). A value the ingestor has not answered yet means: take one health sample now and post it with on_demand=true. Null when never requested. Not configuration: must not restart the runner.
  - `monitoring_active` boolean: Schedule gate, resolved server-side at request time in the site's timezone (camera override, else site schedule, else always-on). False = off-schedule: the ingestor must not run this camera except to serve an active live-view intent.
  - `display_rotation` integer: Degrees counter-clockwise the RECORDED frame must be turned to look upright (0 or 180 today; 90/270 reserved). When non-zero the ingestor stamps each clip's display-matrix tag inside its stream-copy remux (no re-encode) and inverse-rotates ignore_zones for its raw, untagged detector frames, because ignore_zones are stored in the ROTATED (upright) space. An ingestor that predates this field ignores the key and keeps producing untagged clips; a newer one reads a missing key as 0.
  - `ignore_zones` IngestorIgnoreZone[]: Frame regions the ingestor should mask out of motion detection. Only zones with ignore=true are sent (annotation-only zones are withheld); [] when none. This endpoint only exposes the configuration — enforcement lives in ingestion-server, which masks its frame-diff so motion occurring solely inside these polygons produces no clip, no DeepAlert call, and no event. Ingestor versions without mask support ignore the field.
    - `points` object[]: Polygon vertices as [{"x": 0-100, "y": 0-100}, ...], percentages of the frame (both the FE editor and the detect branch are stretch-normalized, so percentages map linearly).

---

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