---
title: "Open a review case for an existing retained screening"
method: POST
path: "/cases"
tags: ["Review evidence"]
---

# Open a review case for an existing retained screening

`POST /cases`

## Request

- Base URL: `https://www.sanctionskit.com/api/v1`
- URL: `https://www.sanctionskit.com/api/v1/cases`
- Auth: HTTP bearer
- TypeScript: <https://skmtc.dev/sanctionskit/apis/sanctionskit-api/docs/cases/post.ts> (a function with typed inputs; its response is checked against the schema)

Required API key scope: cases:write.

Creates an open case for standard-retention evidence when a case was not already created automatically. Send decision=open; completed decisions require the human investigation workflow and return investigation_review_required. No Idempotency-Key contract applies to this endpoint. Before retrying an uncertain response, query GET /cases?screeningId=...; duplicate creation returns case_exists with error.details.caseId.

## Request body

- CaseRequest: Open a case for retained evidence. decision must be open; the API cannot complete the human investigation or independent approval workflow.
  - `decision` 'open', required: Must be open when creating a case. Completed decisions require the human investigation workflow and return investigation_review_required here.
  - `notes` string, required: Nonempty opening rationale, trimmed before validation. Retained under the case policy.
  - `screeningId` string, uuid, required: UUID of a retained standard screening in this organization and environment. An existing case returns case_exists; minimal or expired evidence cannot be used.
  - `expectedUpdatedAt` string, date-time: Legacy optional timestamp accepted and echoed by creation. It is not a concurrency guard for a new case; omit it.

## Response `201`

Successful response. JSON object with the required data key. All properties marked required are present, including keys whose value may be null. Unmarked properties can be omitted; clients should tolerate additional response properties.

- object
  - `data` CaseCreated, required
    - `id` string, uuid, required
    - `screeningId` string, uuid, required
    - `decision` 'open', required
    - `notes` string, required
    - `expectedUpdatedAt` string, date-time

## Other responses

- `400`: **invalid_request** — Correct the request fields, resource identifiers, JSON body or query parameters before retrying.
- `401`: **authentication_required** — Send Authorization: Bearer with a valid API key. An omitted header can produce authentication_required; invalid supplied credentials produce invalid_api_key. **invalid_api_key** — Use an active key for the intended environment.
- `403`: **permission_denied** — Ask an organization owner to grant the required role or API-key scope. **insufficient_scope** — Use a key with the scope stated in this operation.
- `404`: **not_found** — Check the identifier and selected environment. The resource must belong to your organization and remain available.
- `405`: **method_not_allowed** — Use a method in the Allow response header. OPTIONS lists supported methods; HEAD follows GET authorization and returns no body.
- `408`: **invalid_request** — Reconnect and retry using the same idempotency key and identical input where supported.
- `409`: **investigation_review_required** — Use the investigation match-review, submit and approval endpoints before recording a conclusion. **case_exists** — Open the existing case and append your review there.
- `410`: **result_expired** — Run a new screening and review its retained evidence. Expired evidence is not reconstructed.
- `413`: **response_too_large** — Reduce the requested page size or use the documented segmented case archive. No evidence is silently truncated. **invalid_request** — Reduce the JSON request size to the documented limit.
- `415`: **invalid_request** — Use Content-Type: application/json and an uncompressed UTF-8 body.
- `422`: **retained_screening_required** — Create a standard-retention screening before opening a case.
- `429`: **rate_limited** — Wait for the request window to reset and retry with backoff.
- `500`: **internal_error** — Retry with backoff. For writes reuse the same idempotency key and identical input; include requestId when contacting support.
- `503`: **temporarily_unavailable** — Honor Retry-After when present and retry with bounded backoff. Follow this endpoint’s retry contract; preserve the same key and input for idempotent writes. Contact support with requestId if the failure persists.

---

[API](https://skmtc.dev/sanctionskit/apis/sanctionskit-api.md) - [All operations](https://skmtc.dev/sanctionskit/apis/sanctionskit-api/llms.txt) - [OpenAPI document](https://skmtc.dev/sanctionskit/apis/sanctionskit-api/revisions/ee35d211051a?raw)
