analytics

Get Camera Health Analytics

Per-camera connectivity, image quality and stream health for the whole in-scope fleet — the Analytics -> Camera Health tab.

Scoped exactly like /summary above: an explicit parent_id outside the operator's grants is rejected rather than silently emptied, the per-site gap check closes ?site_id= for a narrowed manager, and the per-site TenantScope goes to the service, where it becomes the ONLY tenant filter on the fleet query (every other statement keys off the ids it returns).

get/analytics/camera-health

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
  • Auth
    HTTP bearer

Query parameters

parent_idstring nullable
site_idstring nullable

Response

Successful Response

generated_atstring date-time required

Single server instant the whole response was computed at; every expires_in is relative to it.

recheck_cooldown_secondsinteger required

A camera re-checked within this many seconds is not re-checked again (POST /analytics/camera-health/recheck counts it as already_pending). Published so the UI shows the window the server enforces.

Example response

{
  "thresholds": {
    "sharpness_min": 0.5,
    "occlusion_pct_max": 25,
    "shift_pct_max": 30,
    "frozen_identical_run": 3,
    "luminance_min": 0.2,
    "luminance_max": 0.9,
    "reconnects_max": 5,
    "bitrate_spike_ratio": 2,
    "camera_down_stale_seconds": 90,
    "view_obstructed_coverage_min": 25,
    "view_check_confirm_hours": 3,
    "view_flag_quiet_days": 7,
    "view_flag_worse_by_pct": 15
  },
  "recheck_cooldown_seconds": 120,
  "cameras": [
    {
      "camera_label": "Loading dock",
      "camera_id": "cam01",
      "kvs_stream_name": "dev-home-cam01",
      "integration": "Axis",
      "ingest_mode": "motion_clip",
      "parent_name": "Sentinel Integrations",
      "site_name": "Harbor Yard",
      "connectivity": "online",
      "connectivity_reason": "heartbeat_stale",
      "pipeline_status": "healthy",
      "detection_mode": "ii_gated",
      "ii_deepalert_state": "ok",
      "snapshot_unavailable_reason": "continuous_ingest",
      "latest_sample": {
        "snapshot_expires_in": 3600,
        "sharpness": 0.82,
        "luminance": 0.47,
        "occlusion_pct": 3.1,
        "shift_pct": 1.5,
        "identical_run": 1,
        "width": 1920,
        "height": 1080,
        "fps": 15,
        "bitrate_kbps": 2048
      },
      "reference": {
        "expires_in": 3600
      },
      "samples_24h": [
        {
          "bitrate_kbps": 2048,
          "sharpness": 0.82,
          "luminance": 0.47,
          "occlusion_pct": 3.1,
          "shift_pct": 1.5,
          "identical_run": 1
        }
      ],
      "reconnects_24h": 6,
      "history_24h": [
        {
          "state": "online"
        }
      ],
      "uptime_24h_pct": 95.8,
      "view_check": {
        "obstructed": true,
        "kind": "web_or_insect",
        "coverage_pct": 40,
        "reason": "A spider web and water droplets cover the upper half of the lens."
      },
      "issues": [
        {
          "key": "blur",
          "category": "image",
          "severity": "warn",
          "label": "Blurred image",
          "detail": "Sharpness 0.31 is below 0.50 — the lens may be out of focus or dirty."
        }
      ]
    }
  ]
}

Changes

No recorded changes to this operation across all 2 revisions of this API.