---
title: "Update cameras"
method: PATCH
path: "/v1/cameras"
tags: ["cameras"]
---

# Update cameras

`PATCH /v1/cameras`

Update one or more cameras.

Update configuration, credentials, feature flags, and group assignments
for one or more cameras. Each camera is updated independently - if one
camera's update fails, others can still succeed. Within each camera's
update, all changes are atomic.

**Group Assignment:**
- Provide `group_ids` to assign the camera to specific groups
- An empty list `[]` resets the camera to the default group
- Omit `group_ids` (null) to leave group assignments unchanged

**IP Address:**
- Provide `ip` to change the address the NVR connects to; it takes effect
  within a few minutes without any action on the NVR
- The change applies to every head of a multi-head camera
- On NVRs with automatic network scan enabled, discovery overrides the
  value if it does not match the IP the camera is actually reachable at

## Request body

- UpdateCameraPayload[]
  - `mac_address` string, required — Camera MAC address
  - `name` string — New display name
  - `ip` string — New camera IP address. Applied to every head of a multi-head camera. On NVRs with automatic network scan enabled, discovery overrides this value if it does not match the IP the camera is actually reachable at.
  - `credentials` Credentials — Authentication credentials for camera access.
    - `username` string, required — Camera login username
    - `password` string, required — Camera login password
  - `enforced_rtsp_url` string — Custom RTSP URL to override auto-discovery. Provide the path component beginning with '/' (e.g. '/Streaming/Channels/101'); it is combined with the camera's IP, port and credentials at connection time. A full 'rtsp://host:port/path' URL is also accepted and reduced to its path.
  - `feature_flags` CameraFeatureFlag — Feature flags to update on a camera.
    - `is_audio_enabled` boolean — Whether audio recording is enabled
    - `is_license_plate_detection_enabled` boolean — Whether license plate detection is enabled
    - `auto_tracking` boolean — Whether PTZ auto-tracking is enabled
  - `group_ids` integer[] — List of group IDs to assign (empty list resets to default group)

## Response `200`

Successful Response

- UpdateCameraResponse — Response model for bulk camera update.
  - `status` 'success'
  - `summary` Summary, required — Summary of operation.
    - `total` integer, required — Total number of operations in request
    - `success_count` integer, required — Number of successful operations
    - `failure_count` integer, required — Number of failed operations
  - `results` union[] — List of camera update results
    - union
      - UpdateCameraSuccessResult — Success result for camera update.
        - `status` 'success'
        - `data` UpdateCameraSuccessData, required — Data returned for a successfully updated camera.
          - `mac_address` string, required — Camera MAC address
          - `name` string — Camera display name
          - `ip` string — Updated camera IP address
          - `credentials` Credentials — Authentication credentials for camera access.
            - `username` string, required — Camera login username
            - `password` string, required — Camera login password
          - `enforced_rtsp_url` string — Custom RTSP URL
          - `feature_flags` CameraFeatureFlag — Feature flags to update on a camera.
            - `is_audio_enabled` boolean — Whether audio recording is enabled
            - `is_license_plate_detection_enabled` boolean — Whether license plate detection is enabled
            - `auto_tracking` boolean — Whether PTZ auto-tracking is enabled
          - `group_ids` integer[] — Updated group IDs
      - UpdateCameraErrorResult — Error result for camera update.
        - `status` 'error'
        - `error` ErrorDetails, required — Error message
          - `code` 'VALIDATION_ERROR' | 'BATCH_SIZE_EXCEEDED' | 'NO_CAMERAS_PROVIDED' | 'PARTIAL_OPERATIONS_NOT_SUPPORTED' | 'CAMERA_ALREADY_EXISTS' | 'CAMERA_NOT_FOUND' | 'NO_LICENSES_AVAILABLE' | 'INVALID_MAC_ADDRESS' | 'INVALID_IP_ADDRESS' | 'DUPLICATE_MAC_ADDRESSES' | 'NVR_CAPACITY_EXCEEDED' | 'NVR_NOT_FOUND' | 'INVALID_NVR_NAME' | 'LOCATION_NOT_FOUND' | 'NVR_REGISTRATION_FAILED' | 'NVR_ALREADY_REGISTERED' | 'PING_REQUEST_TIMEOUT' | 'PING_REQUEST_FAILED' | 'SPEEDTEST_REQUEST_TIMEOUT' | 'SPEEDTEST_REQUEST_FAILED' | 'NO_NVRS_PROVIDED' | 'DUPLICATE_NVR_NAMES' | 'LOCATION_ACCESS_DENIED' | 'LOCATION_NAME_ALREADY_EXISTS' | 'LOCATION_CREATION_FAILED' | 'NO_LOCATIONS_PROVIDED' | 'DUPLICATE_LOCATION_NAMES' | 'ALERT_EVENT_NOT_FOUND' | 'ALERT_NO_VIDEO_AVAILABLE' | 'ALERT_CAMERA_NOT_FOUND' | 'ALERT_CLIP_GENERATION_FAILED' | 'ALERT_NOT_FIREARM' | 'FIREARM_ALERT_NOT_FOUND' | 'INVALID_RECIPIENT_EMAILS' | 'PREMIUM_ALERT_CAMERA_LIMIT_EXCEEDED' | 'CAMERA_ALREADY_IN_USE' | 'ACCESS_EVENT_NOT_FOUND' | 'ACCESS_EVENT_NO_VIDEO_AVAILABLE' | 'ACCESS_EVENT_CLIP_GENERATION_FAILED' | 'CAMERA_GROUP_NOT_FOUND' | 'CAMERA_GROUP_NAME_ALREADY_EXISTS' | 'CAMERA_GROUP_CREATION_FAILED' | 'NO_GROUPS_PROVIDED' | 'DUPLICATE_GROUP_NAMES' | 'INVALID_GROUP_ID' | 'DUPLICATE_GROUP_IDS', required — Centralized error codes for Developer API endpoints.
          - `message` string, required — Error message
          - `field` string — Error field
          - `docs` string — Error docs

## Other responses

- `422` — Validation error

---

[API](https://skmtc.dev/coram/apis/coram-api.md) · [All operations](https://skmtc.dev/coram/apis/coram-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/coram/coram-api/revisions/2842f226f93b/schema)
