---
title: "Post Camera Health Recheck"
method: POST
path: "/analytics/camera-health/recheck"
tags: ["analytics"]
---

# Post Camera Health Recheck

`POST /analytics/camera-health/recheck`

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

The Camera Health tab's "Re-check cameras" button: ask every in-scope
motion_clip camera for a fresh health sample now instead of at the next
hourly tick.

Exactly the tab's own scope, by construction: the same filter checks as
the GET above (one shared helper), and the same TenantScope handed to the
service, which bounds the write with the very predicate list the read
uses. Whoever can see a camera on the tab can re-check it, and nobody can
re-check a camera they cannot see.

Who may press it is NARROWER than who may read the tab: the
require_camera_health_recheck role allowlist above (ops-view's canMutate)
refuses the end-customer logins and read_only, which the GET admits. What
an admitted caller may reach is NOT narrower: once past the role gate the
scope is the tab's own, so a site manager re-checks only its granted
sites. Not activity-logged: a re-check changes no configuration, it only
asks for one more sample, and the service's per-camera cooldown bounds
how many.

## Request body

- PostCameraHealthRecheckRequest: Which slice of the Camera Health tab to re-check. The same two filters GET /analytics/camera-health takes, with the same meaning and the same scope checks: both omitted means every camera the caller can see on the tab. UUID-typed so a malformed id is a 422 at the edge rather than a database error.
  - `parent_id` string, uuid, nullable: Re-check only this client's cameras. A client outside the caller's grants is a 403, never a silent no-op.
  - `site_id` string, uuid, nullable: Re-check only this site's cameras. A site outside a site-narrowed caller's grants is a 403.

## Response `200`

Successful Response

- PostCameraHealthRecheckResponse: What one "Re-check cameras" click did across the in-scope fleet. requested + already_pending + unsupported is every in-scope camera.
  - `requested_at` string, date-time, required: The server time stamped on every camera this call requested. Matches health_sample_requested_at on those rows in the next GET /analytics/camera-health.
  - `requested` integer, required: motion_clip cameras asked for a sample by this call. The ingestor picks the request up on its next config poll (about 30 s) and posts one on-demand sample.
  - `already_pending` integer, required: motion_clip cameras already asked within the last cooldown_seconds. Left as they were: one sample per camera per cooldown window, however many times anyone clicks.
  - `unsupported` integer, required: In-scope cameras that cannot take an on-demand sample because they are not motion_clip (continuous ingest has no health sampler).
  - `cooldown_seconds` integer, required: The cooldown window, in seconds. Same value as recheck_cooldown_seconds on GET /analytics/camera-health.

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