---
title: "Update Integration"
method: PATCH
path: "/parents/{parent_id}/integrations/{integration_id}"
tags: ["integrations"]
---

# Update Integration

`PATCH /parents/{parent_id}/integrations/{integration_id}`

## 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/parents/{parent_id}/integrations/{integration_id}`
- Auth: HTTP bearer

Edit the connection's ONE display field: the vendor console's org short
name. No provider call, no secret read or write, no status change.

It is a separate route rather than part of `credentials` because it cannot
touch the credential at all — see SiteIntegrationsService.update_integration
for why that separation is the point, and why a create-only field would have
been unreachable for every connection that already exists in production.

## Path parameters

- `parent_id` string, required
- `integration_id` string, required

## Request body

- UpdateIntegrationRequest: The ONE editable display field on a cloud-VMS connection. Deliberately a one-field model rather than a general edit body. This route exists because the short name has to be settable on connections that ALREADY EXIST in production, and the narrowest possible request is what keeps it from becoming a second way to change a credential: there is no `api_key` here (that is `PUT .../credentials`, which validates against the provider before overwriting the stored secret), no `org_id`, no `label`, and no `status` / `last_error` / `last_verified_at` — those three are written only by a real connection test and must never be settable by a client. UNKNOWN KEYS ARE REJECTED rather than ignored, which is what makes the narrowness above ENFORCED rather than incidental. An owner who sends `api_key` or `status` here has misunderstood which route they are on, and silently dropping the field would let them believe the value landed on a credential record. (Most request models in this repo ignore extras; this one is a deliberate exception, for the same reason the talk-down bodies are.) THE FIELD IS REQUIRED HERE (round-3 G1), unlike on create. It is the only field in the body, so an omitted one carried no information a client could have meant: `PATCH {}` cleared a short name the owner had set and answered 200. Clearing is still expressible — `null` and `""` both do it — but it now has to be asked for.
  - `command_short_name` string, nullable, required: The vendor console's organization short name (the subdomain in https://<short-name>.command.verkada.com/...). Owner-entered and never fetched from the provider. Lowercase letters, digits and hyphens only. Send null or an empty string to clear it. REQUIRED in this body: an omitted field is a 422, so an empty PATCH cannot silently clear a stored value.

## Response `200`

Successful Response

- SiteIntegrationResponse: One cloud-VMS connection. There is deliberately NO api_key field and NO secret_arn field. The key never leaves Secrets Manager, and the ARN is an internal handle with no client-facing use (the same omission as NvrResponse / the speaker responses). Because FastAPI serializes through this model, a field that somehow appeared in the service dict would be dropped here rather than reaching a client — a second layer under to_dict_complete's omission, and the property the router leak test pins.
  - `id` string, uuid, required: The integration record ID.
  - `parent_id` string, uuid, required: The client this connection belongs to. The credential is client-level; WHICH SITES it serves is `site_ids`.
  - `provider` 'verkada' | 'turing' | 'avertx', required
  - `label` string, required: Operator-facing name for this connection.
  - `external_org_id` string, nullable: Provider organization id (non-secret), for display.
  - `command_short_name` string, nullable: The vendor console's organization short name (the subdomain in https://<short-name>.command.verkada.com/...). Owner-entered, never fetched from the provider, and used only to build an operator's deep link. A Verkada concept: providers whose console has no such deep link leave it null.
  - `status` 'active' | 'error', required
  - `last_verified_at` string, date-time, nullable: When the connection last tested successfully.
  - `last_error` string, nullable: Most recent connection-test failure, sanitized and truncated. Never contains a credential.
  - `site_ids` string[]: The live sites this connection is assigned to, ordered by id. Empty means UNASSIGNED: the connection is listed and manageable but no site uses it yet. Absent from payloads of older servers (read as empty).
  - `created_at` string, date-time, required: When the connection was created.
  - `updated_at` string, date-time, nullable: When the connection was last modified.

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