---
title: "List Identity Cases"
method: GET
path: "/v1/admin/identity-cases"
tags: ["admin"]
---

# List Identity Cases

`GET /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

The collision queue: cases waiting on a human decision, oldest first.

``status`` and ``reason_code`` are ENUMS, so a value outside them is a 422 rather than an empty
page. Typed as a free string, ``status`` answered a misspelling with "no cases", which on a
queue reads as "the queue is clear" — the one wrong answer an operator has no reason to question.

``reason_code`` narrows in SQL, before the limit applies: filtering a mixed page client-side
would hide one kind of case behind whatever else happened to fill the limit.

**This is the route that discloses the captured address, so it is the route that pays for it.**
``no_store`` keeps a cross-tenant page of addresses out of every shared cache, and one platform
read-audit row is COMMITTED before any content is returned — the writer propagates its failures,
so a queue this process could not record is a queue it does not serve. The row is written on
every request, including the empty page: a recorder that fired only when an address came back
would leave "nobody looked" and "the reader looked and the queue was clear" as the same silence.

## Query parameters

- `status` 'proof_pending' | 'approval_pending' | 'ready' | 'completed' | 'denied' | 'expired': Lifecycle of an ``identity_binding_cases`` row (``status_code``). Legal transitions are pinned by the case repository's CAS transition graph.
- `reason_code` 'subject_collision' | 'password_origin_collision' | 'invitation_collision' | 'identity_link' | 'revoked_reinstatement' | 'support_recovery' | 'cutover_carry': Why an ``identity_binding_cases`` row exists (``reason_code``).
- `limit` integer

## Response `200`

Successful Response

- CaseRow[]
  - `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/864787a3fcf0?raw)
