---
title: "Get Camera Health Speakers"
method: GET
path: "/camera-health/speakers"
tags: ["speakers", "camera-health"]
---

# Get Camera Health Speakers

`GET /camera-health/speakers`

## 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/camera-health/speakers`
- Auth: HTTP bearer

The Camera health tab's Speakers section: in-scope speakers whose last
health check failed (longest down first), plus counts of healthy / failed /
never-checked speakers.

Staff only, the same gate as `GET /camera-health/flags` (owner, monitoring
manager, operator, support). The caller's per-site TenantScope is the only
tenant filter. Retired and disabled speakers are excluded; a never-checked
speaker is unknown, counted but not listed. Read-only, not activity-logged.

## Response `200`

Successful Response

- GetCameraHealthSpeakersResponse
  - `generated_at` string, date-time, required: When this answer was built.
  - `summary` CameraHealthSpeakersSummary, required
    - `total` integer, required: Enabled, live speakers in the caller's scope (retired and disabled are never counted).
    - `healthy` integer, required: Of those, how many passed their last check.
    - `unhealthy` integer, required: Of those, how many failed their last check (the rows below).
    - `unknown` integer, required: Of those, how many have never been checked. Not down, and not listed; counted so an empty list is never read as 'all answered'.
    - `last_checked_at` string, date-time, nullable: The newest check time across those speakers, so a stalled poll does not read as all clear. Null when none was ever checked.
  - `speakers` CameraHealthSpeakerRow[], required: Speakers whose last check failed, longest down first (unknown onsets lead), then client, site, label.
    - `speaker_id` string, uuid, required: The speaker.
    - `label` string, required: Display name, as registered.
    - `map_location_label` string, nullable: Operator-facing prose for where the speaker physically is.
    - `site_id` string, uuid, required: The site the speaker is at.
    - `site_name` string, required: That site's name.
    - `parent_id` string, uuid, required: The client the site belongs to.
    - `parent_name` string, required: That client's company name.
    - `health_error` string, nullable: Why the last check failed: unreachable, auth_rejected, not_a_speaker, clip_missing or error. Null on a row last checked before reasons were recorded; clients should read a null or an unknown code as a generic failure.
    - `last_healthcheck_at` string, date-time, required: When the speaker was last checked.
    - `unhealthy_since` string, date-time, nullable: The time of the first recorded failed check in this episode; the device may have failed earlier. Null means it was already failing before this was tracked.

## Changes

- **2026-11-03** `00252d8227c1`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/verdun/apis/verdun-api/changes/camera-health/speakers/get.md)

---

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