---
title: "Open Identity Case"
method: POST
path: "/v1/admin/identity-cases"
tags: ["admin"]
---

# Open Identity Case

`POST /v1/admin/identity-cases`

## Request

- Base URL: `https://api.patricia.app` (the document declares no server; this is the origin it was published from)
- URL: `https://api.patricia.app/v1/admin/identity-cases`
- Auth: HTTP bearer

Open a support case for a named user and subject, with staff attribution.

## Request body

- SupportCaseIn: A staff-opened case names its candidate and exact subject.
  - `candidate_user_id` string, uuid, required
  - `target_tenant_id` string, uuid, required
  - `reason_code` 'subject_collision' | 'password_origin_collision' | 'invitation_collision' | 'identity_link' | 'revoked_reinstatement' | 'support_recovery' | 'cutover_carry', required: Why an ``identity_binding_cases`` row exists (``reason_code``).
  - `issuer` string, required
  - `subject` string, required
  - `subject_scope` string, required
  - `justification` string, required

## Response `201`

Successful Response

- CaseRow: One case in the operator queue: the identifiers, plus what a human needs to recognise them. The identifiers are the record and the label beside them is orientation. The candidate's name is optional and mutable — an account is deleted and its name goes with it — so it is served next to the stable id it describes rather than in place of it, and a missing label says so instead of rendering blank. **This row carries the captured address, and that reverses an earlier decision.** It used to serve only a boolean saying whether that address matched the candidate's, on the reasoning that this queue spans every workspace and an address is the one field identifying somebody outside our own identifier space. That reasoning is sound and it was overruled on 2026-08-24: without the address an operator cannot answer the question the screen exists to ask, so the queue served six opaque ids and no way to act on them. The disclosure carries its own cost instead — the list route sets ``no_store`` and commits a platform read-audit row before any address is returned.
  - `id` string, uuid, required
  - `status_code` string, required
  - `reason_code` string, required
  - `target_tenant_id` string, uuid, nullable, required
  - `candidate_user_id` string, uuid, nullable, required
  - `created_at` string, date-time, required
  - `expires_at` string, date-time, required
  - `has_approved_manifest` boolean, required: Whether this case carries a decision that commit would accept: both the stored document and its digest are present.
  - `issuer` string, nullable
  - `subject` string, nullable
  - `subject_scope` string, nullable
  - `platform_team_id` string, nullable
  - `platform_actor_id` string, nullable
  - `expected_credential_epoch` integer, nullable
  - `incoming_email` string, nullable
  - `candidate_display_name` string, nullable

## Other responses

- `422`: Validation Error

---

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