---
title: "Create Dismissed Risk Label"
method: POST
path: "/internal/risk-labeling/labels/{risk_id}"
tags: ["internal"]
---

# Create Dismissed Risk Label

`POST /internal/risk-labeling/labels/{risk_id}`

Label one dismissed risk. 409 when it was already labeled.

The conflict comes from the UNIQUE constraint, not a preceding SELECT: two
labelers submitting the same row would both pass a pre-check and one would
silently overwrite the other.

## Path parameters

- `risk_id` string, uuid, required

## Request body

- DismissedRiskLabelRequest — A labeler's root-cause verdict on one dismissed marketing risk. ``explanation`` is stripped before the length check, so a field holding only spaces is refused rather than stored — a blank explanation is the one thing that makes a labeled row useless.
  - `category` 'ocr_or_av_processing' | 'missing_file_context' | 'bad_guideline' | 'user_preference' | 'compliance_officer_wrong' | 'other', required — Root cause a labeler assigned to a dismissed marketing risk. Two axes in one list, which is the point. The first three say Kobalt got something wrong. ``USER_PREFERENCE`` and ``COMPLIANCE_OFFICER_WRONG`` say it did not: the risk was real and correctly raised, and the dismissal is explained by the reviewer either declining it deliberately or getting it wrong. Without those two, both land in ``OTHER`` and an eval set reads every one of them as an unexplained false positive. Stored as a plain VARCHAR (see the model), so adding a member here is a code change and needs no migration.
  - `explanation` string, required

## Response `201`

Successful Response

- StatusResponse
  - `status` string

## Other responses

- `422` — Validation Error

---

[API](https://skmtc.dev/kobaltlabs/apis/fastapi.md) · [All operations](https://skmtc.dev/kobaltlabs/apis/fastapi/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/kobaltlabs/fastapi/revisions/425d5b8a3c17/schema)
