---
title: "Bulk Onboard Cameras"
method: POST
path: "/nvrs/{nvr_id}/cameras/bulk"
tags: ["nvrs"]
---

# Bulk Onboard Cameras

`POST /nvrs/{nvr_id}/cameras/bulk`

## 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/nvrs/{nvr_id}/cameras/bulk`
- Auth: HTTP bearer

## Path parameters

- `nvr_id` string, required

## Request body

- BulkOnboardRequest
  - `devices` BulkOnboardDevice[], required: NVR devices to onboard.
    - `device_id` string, required: Vendor device id exactly as returned by GET /nvrs/{id}/devices (Nx device UUID, ONVIF profile token, or Hikvision channel number).
    - `camera_label` string, nullable: Display label; defaults to the NVR-reported device name.
    - `camera_id` string, nullable: Verdun camera_id; defaults to a slug of the label, uniquified per site.
    - `transcode_h264` boolean: Ask the NVR to re-encode this camera's stream to H.264 (appends codec=h264 to the Nx relay URL). For H.265 cameras, which the ingest pipeline cannot decode. Costs NVR CPU per stream. Ignored for non-Nx NVRs (Hikvision: switch the sub stream to H.264 on the NVR).
  - `defaults` BulkOnboardDefaults
    - `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.

## Response `200`

Successful Response

- BulkOnboardResponse
  - `results` BulkOnboardResult[], required: Per-device outcome, in request order.
    - `device_id` string, required: Vendor device id this result is for (Nx device UUID, ONVIF profile token, or Hikvision channel number).
    - `status` 'created' | 'failed' | 'skipped_already_onboarded', required: What happened to this device.
    - `camera_id` string, nullable: The created camera's camera_id (slug), when created.
    - `camera_uuid` string, uuid, nullable: The created camera's UUID, when created.
    - `kvs_stream_name` string, nullable: The created camera's KVS stream name, when created.
    - `error` string, nullable: Failure detail, when failed.
  - `created` integer, required: Number of cameras created.
  - `failed` integer, required: Number of devices that failed.
  - `skipped` integer, required: Number of devices skipped because they were already onboarded.

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