---
title: "Update Slow Triage Target"
method: PUT
path: "/settings/slow-triage-target"
tags: ["settings"]
---

# Update Slow Triage Target

`PUT /settings/slow-triage-target`

## 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/settings/slow-triage-target`
- Auth: HTTP bearer

Dedicated, field-specific write (P1-2, 2026-09-02 owner
change-request) — and now the SOLE write path for
slow_triage_target_seconds. The ops-view threshold control calls this
instead of the whole-record PUT /settings/ above, so a concurrent
monitoring_center_timezone change on another connection can never be
lost — this endpoint doesn't read or write that column at all, closing
the lost-update window a client-side fresh-GET-then-whole-record-PUT
mitigation could only narrow. Originally additive alongside the
whole-record PUT (which also accepted the target, omit-means-unchanged);
that turned out to be the SAME hazard in the mirror direction — a stale
timezone-editor payload carrying the target could revert a target set
concurrently via this endpoint — so UpdateOrgSettingsRequest dropped the
field entirely (Copilot re-review on PR #175) rather than being hardened
further. The timezone editor keeps using the now-timezone-only PUT
/settings/.

Literal path, no catch-all conflict with the `/` routes above.

## Request body

- UpdateSlowTriageTargetRequest: Body for PUT /settings/slow-triage-target — the SOLE write path for slow_triage_target_seconds (UpdateOrgSettingsRequest, the whole-record PUT /settings/'s body, no longer declares this field at all — see that model's docstring for why). The field here is REQUIRED: this endpoint exists for exactly one purpose, setting a concrete triage target, so there is no "leave unchanged" case to support — the caller either sets a value or doesn't call this endpoint at all.
  - `slow_triage_target_seconds` integer, required: Operator Performance 'slow triage' target in seconds (event-created -> disposition) to set. Writes ONLY this column — never touches monitoring_center_timezone, so a concurrent timezone change made by another client is structurally impossible to lose here (unlike the whole-record PUT /settings/, which re-sends whatever timezone value the caller last read and can revert a concurrent change).

## Response `200`

Successful Response

- GetOrgSettingsResponse
  - `monitoring_center_timezone` string, nullable: IANA timezone the monitoring center's operators work in; null when unset (frontend shows site-local time only).
  - `slow_triage_target_seconds` integer, nullable: Operator Performance 'slow triage' target in seconds (event-created -> disposition); null when unset (frontend falls back to a 90s default).
  - `ai_feedback_capture_enabled` boolean: Dark-by-default gate for the operator AI-feedback panel. Written ONLY through PUT /settings/ai-feedback-capture-enabled (owner-only) — never this resource's own PUT, which is timezone-only. False until an owner turns it on; there is no meaningful 'unset' distinct from off.
  - `deepalert_default_confidence_threshold` number, required: The FLEET default DeepAlert confidence floor (0-100, lower = more sensitive) an ii_gated camera with no valid per-camera override uses. 20 until an owner changes it through PUT /settings/deepalert-default-confidence-threshold. Read-only here. Does not govern cameras on the legacy / II-off ingestion path.
  - `deepalert_default_confidence_revision` integer, required: Revision of that fleet value: 0 at the default, +1 on every owner change. Send it back as expected_revision on the owner PUT.

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