Case Management API Reference
On this page
Case management: referrals, investigations, cases, case plans, contacts, and court orders — the system of record for casework.
Endpoints
Case Plans
List case plans
GET /v1/cases/cases/{id}/plans
| Name | In | Required | Description |
|---|---|---|---|
id |
path |
Yes |
Case ID |
-
200: Case plans
-
401: Unauthorized
-
403: Forbidden
-
503: Service Unavailable (RFC 9457 problem document, ADR-068): database pool exhaustion (carries Retry-After: 5), db-connection-lost, db-outcome-unknown, or a synchronous upstream dependency refusal.
-
504: Gateway Timeout (RFC 9457 problem document, ADR-068): the route-class request ceiling elapsed (request-timeout) or the database canceled the statement (db-timeout) — the server yields first.
Create a case plan
POST /v1/cases/cases/{id}/plans
| Name | In | Required | Description |
|---|---|---|---|
id |
path |
Yes |
Case ID |
| Field | Type | Required | Description |
|---|---|---|---|
client_request_id |
UUID |
Yes |
Client-minted idempotency id (ADR-062 §B, #1256) — REQUIRED.
Same id + identical intent (including the case path id) replays
the original plan; a different intent under the same id is a
409 |
needs |
string (optional) |
No |
Free-form description of the family’s needs. |
permanency_goal |
enum (reunification, adoption, guardianship, long_term_foster_care, emancipation, relative_placement, not_yet_established) |
Yes |
Permanency goal — AFCARS element #36. |
review_due_at |
datetime (optional) |
No |
Date by which the plan must be next reviewed. |
strengths |
string (optional) |
No |
Free-form description of the family’s strengths. |
-
200: Case plan created (or replayed — same client_request_id + intent)
-
401: Unauthorized
-
403: Forbidden
-
404: Case not found
-
409: client_request_id claimed by a different operation, or replayed entity gone (ADR-062)
-
422: Validation failure (including a missing client_request_id)
-
503: Service Unavailable (RFC 9457 problem document, ADR-068): database pool exhaustion (carries Retry-After: 5), db-connection-lost, db-outcome-unknown, or a synchronous upstream dependency refusal.
-
504: Gateway Timeout (RFC 9457 problem document, ADR-068): the route-class request ceiling elapsed (request-timeout) or the database canceled the statement (db-timeout) — the server yields first.
Update a case plan
PUT /v1/cases/plans/{id}
| Name | In | Required | Description |
|---|---|---|---|
id |
path |
Yes |
Case plan ID |
| Field | Type | Required | Description |
|---|---|---|---|
needs |
string (optional) |
No |
New needs description. |
permanency_goal |
PermanencyGoal (optional) |
No |
Permanency goal |
review_due_at |
datetime (optional) |
No |
New review-due date. |
status |
string (optional) |
No |
New status ( |
strengths |
string (optional) |
No |
New strengths description. |
-
200: Case plan updated
-
400: Invalid status transition
-
401: Unauthorized
-
403: Forbidden
-
404: Case plan not found
-
409: Concurrent modification — re-read and retry
-
503: Service Unavailable (RFC 9457 problem document, ADR-068): database pool exhaustion (carries Retry-After: 5), db-connection-lost, db-outcome-unknown, or a synchronous upstream dependency refusal.
-
504: Gateway Timeout (RFC 9457 problem document, ADR-068): the route-class request ceiling elapsed (request-timeout) or the database canceled the statement (db-timeout) — the server yields first.
Approve (countersign) a case plan
PUT /v1/cases/plans/{id}/approve
Supervisor approval — sets plan to active and supersedes any other active plan on the case.
| Name | In | Required | Description |
|---|---|---|---|
id |
path |
Yes |
Case plan ID |
-
200: Case plan approved
-
401: Unauthorized
-
403: Forbidden — supervisor role required
-
404: Case plan not found or not in draft status
-
503: Service Unavailable (RFC 9457 problem document, ADR-068): database pool exhaustion (carries Retry-After: 5), db-connection-lost, db-outcome-unknown, or a synchronous upstream dependency refusal.
-
504: Gateway Timeout (RFC 9457 problem document, ADR-068): the route-class request ceiling elapsed (request-timeout) or the database canceled the statement (db-timeout) — the server yields first.
List tasks for a case plan
GET /v1/cases/plans/{id}/tasks
| Name | In | Required | Description |
|---|---|---|---|
id |
path |
Yes |
Case plan ID |
-
200: Tasks
-
401: Unauthorized
-
403: Forbidden
-
404: Case plan not found
-
503: Service Unavailable (RFC 9457 problem document, ADR-068): database pool exhaustion (carries Retry-After: 5), db-connection-lost, db-outcome-unknown, or a synchronous upstream dependency refusal.
-
504: Gateway Timeout (RFC 9457 problem document, ADR-068): the route-class request ceiling elapsed (request-timeout) or the database canceled the statement (db-timeout) — the server yields first.
Add a task to a case plan
POST /v1/cases/plans/{id}/tasks
| Name | In | Required | Description |
|---|---|---|---|
id |
path |
Yes |
Case plan ID |
| Field | Type | Required | Description |
|---|---|---|---|
client_request_id |
UUID |
Yes |
Client-minted idempotency id (ADR-062 §B, #1256) — REQUIRED.
Same id + identical intent (including the plan path id) replays
the original task; a different intent under the same id is a
409 |
description |
string |
Yes |
Free-form task description. |
due_at |
datetime (optional) |
No |
Task due date. |
responsible |
enum (parent, agency, provider, other) |
Yes |
Who is responsible for a case plan task. |
-
200: Task created (or replayed — same client_request_id + intent)
-
401: Unauthorized
-
403: Forbidden
-
404: Case plan not found
-
409: client_request_id claimed by a different operation, or replayed entity gone (ADR-062)
-
422: Validation failure (including a missing client_request_id)
-
503: Service Unavailable (RFC 9457 problem document, ADR-068): database pool exhaustion (carries Retry-After: 5), db-connection-lost, db-outcome-unknown, or a synchronous upstream dependency refusal.
-
504: Gateway Timeout (RFC 9457 problem document, ADR-068): the route-class request ceiling elapsed (request-timeout) or the database canceled the statement (db-timeout) — the server yields first.
Get a task by ID
GET /v1/cases/tasks/{id}
| Name | In | Required | Description |
|---|---|---|---|
id |
path |
Yes |
Task ID |
-
200: Task
-
401: Unauthorized
-
403: Forbidden
-
404: Not found
-
503: Service Unavailable (RFC 9457 problem document, ADR-068): database pool exhaustion (carries Retry-After: 5), db-connection-lost, db-outcome-unknown, or a synchronous upstream dependency refusal.
-
504: Gateway Timeout (RFC 9457 problem document, ADR-068): the route-class request ceiling elapsed (request-timeout) or the database canceled the statement (db-timeout) — the server yields first.
Update a task
PUT /v1/cases/tasks/{id}
| Name | In | Required | Description |
|---|---|---|---|
id |
path |
Yes |
Task ID |
| Field | Type | Required | Description |
|---|---|---|---|
completed_at |
datetime (optional) |
No |
Timestamp the task was completed. |
status |
string (optional) |
No |
New status ( |
-
200: Task updated
-
400: Invalid status transition
-
401: Unauthorized
-
403: Forbidden
-
404: Task not found
-
409: Concurrent modification — re-read and retry
-
503: Service Unavailable (RFC 9457 problem document, ADR-068): database pool exhaustion (carries Retry-After: 5), db-connection-lost, db-outcome-unknown, or a synchronous upstream dependency refusal.
-
504: Gateway Timeout (RFC 9457 problem document, ADR-068): the route-class request ceiling elapsed (request-timeout) or the database canceled the statement (db-timeout) — the server yields first.
Delete a task
DELETE /v1/cases/tasks/{id}
| Name | In | Required | Description |
|---|---|---|---|
id |
path |
Yes |
Task ID |
-
204: Task deleted
-
401: Unauthorized
-
403: Forbidden
-
404: Not found
-
503: Service Unavailable (RFC 9457 problem document, ADR-068): database pool exhaustion (carries Retry-After: 5), db-connection-lost, db-outcome-unknown, or a synchronous upstream dependency refusal.
-
504: Gateway Timeout (RFC 9457 problem document, ADR-068): the route-class request ceiling elapsed (request-timeout) or the database canceled the statement (db-timeout) — the server yields first.
Cases
Batch-lookup case numbers and person names by IDs
POST /v1/cases/batch-lookup
| Field | Type | Required | Description |
|---|---|---|---|
case_ids |
array of UUID |
No |
Case UUIDs to resolve names for. |
person_ids |
array of UUID |
No |
Person UUIDs to resolve names for. |
-
200: Resolved names
-
400: Too many IDs
-
401: Unauthorized
-
403: Forbidden
-
503: Service Unavailable (RFC 9457 problem document, ADR-068): database pool exhaustion (carries Retry-After: 5), db-connection-lost, db-outcome-unknown, or a synchronous upstream dependency refusal.
-
504: Gateway Timeout (RFC 9457 problem document, ADR-068): the route-class request ceiling elapsed (request-timeout) or the database canceled the statement (db-timeout) — the server yields first.
List cases
GET /v1/cases/cases
| Name | In | Required | Description |
|---|---|---|---|
page |
query |
No |
1-indexed page number (default |
per_page |
query |
No |
Page size (default |
worker |
query |
No |
Filter by assigned worker ( |
status |
query |
No |
Filter by status: open, closed, transferred. |
admin_unit |
query |
No |
Filter by administrative unit. |
search |
query |
No |
Substring search across |
person_id |
query |
No |
Filter to cases whose |
sort_by |
query |
No |
Sort column: case_number, status, admin_unit, assigned_worker, opened_at. |
sort_dir |
query |
No |
Sort direction: asc or desc (default: desc). |
-
200: Paginated cases
-
401: Unauthorized
-
403: Forbidden
-
503: Service Unavailable (RFC 9457 problem document, ADR-068): database pool exhaustion (carries Retry-After: 5), db-connection-lost, db-outcome-unknown, or a synchronous upstream dependency refusal.
-
504: Gateway Timeout (RFC 9457 problem document, ADR-068): the route-class request ceiling elapsed (request-timeout) or the database canceled the statement (db-timeout) — the server yields first.
Open a case
POST /v1/cases/cases
| Field | Type | Required | Description |
|---|---|---|---|
admin_unit |
string |
Yes |
Administrative unit (county / region) owning the case. |
assigned_worker |
UUID |
Yes |
Worker |
client_request_id |
UUID |
Yes |
Client-minted idempotency id (ADR-062 §B, #1256) — REQUIRED.
Same id + identical intent replays the original case (the
case number is generated ONLY on the first execution); a
different intent under the same id is a 409
|
icwa_flag |
boolean |
No |
|
investigation_id |
UUID (optional) |
No |
Investigation that substantiated the case (optional for direct filing). |
supervisor |
UUID (optional) |
No |
Supervisor |
-
200: Case created (or replayed — same client_request_id + intent; the case number is generated only on the first execution)
-
401: Unauthorized
-
403: Forbidden
-
409: client_request_id claimed by a different operation, replayed entity gone, or case-number retries exhausted (ADR-062)
-
422: Validation failure (including a missing client_request_id)
-
503: Service Unavailable (RFC 9457 problem document, ADR-068): database pool exhaustion (carries Retry-After: 5), db-connection-lost, db-outcome-unknown, or a synchronous upstream dependency refusal.
-
504: Gateway Timeout (RFC 9457 problem document, ADR-068): the route-class request ceiling elapsed (request-timeout) or the database canceled the statement (db-timeout) — the server yields first.
Get a case by ID
GET /v1/cases/cases/{id}
| Name | In | Required | Description |
|---|---|---|---|
id |
path |
Yes |
Case ID |
-
200: Case found
-
401: Unauthorized
-
404: Case not found
-
503: Service Unavailable (RFC 9457 problem document, ADR-068): database pool exhaustion (carries Retry-After: 5), db-connection-lost, db-outcome-unknown, or a synchronous upstream dependency refusal.
-
504: Gateway Timeout (RFC 9457 problem document, ADR-068): the route-class request ceiling elapsed (request-timeout) or the database canceled the statement (db-timeout) — the server yields first.
Update a case
PUT /v1/cases/cases/{id}
| Name | In | Required | Description |
|---|---|---|---|
id |
path |
Yes |
Case ID |
| Field | Type | Required | Description |
|---|---|---|---|
assigned_worker |
UUID (optional) |
No |
New assigned-worker UUID (transfers a case to another caseworker). |
closure_reason |
ClosureReason (optional) |
No |
Closure reason |
icwa_flag |
boolean (optional) |
No |
New ICWA flag value. |
stage |
string (optional) |
No |
New case stage ( |
status |
string (optional) |
No |
New status ( |
supervisor |
UUID (optional) |
No |
New supervisor UUID — reassign-only (#1368): absent keeps the
current supervisor, a value reassigns, and an explicit JSON
|
-
200: Case updated
-
400: Invalid status transition
-
401: Unauthorized
-
403: Forbidden
-
404: Case not found
-
409: Concurrent modification — re-read and retry
-
422: Validation failure (including an explicit-null supervisor — reassign-only, no NULL-clear path, #1368)
-
503: Service Unavailable (RFC 9457 problem document, ADR-068): database pool exhaustion (carries Retry-After: 5), db-connection-lost, db-outcome-unknown, or a synchronous upstream dependency refusal.
-
504: Gateway Timeout (RFC 9457 problem document, ADR-068): the route-class request ceiling elapsed (request-timeout) or the database canceled the statement (db-timeout) — the server yields first.
List household members for a case
GET /v1/cases/cases/{id}/household
| Name | In | Required | Description |
|---|---|---|---|
id |
path |
Yes |
Case ID |
-
200: Household members
-
401: Unauthorized
-
403: Forbidden
-
503: Service Unavailable (RFC 9457 problem document, ADR-068): database pool exhaustion (carries Retry-After: 5), db-connection-lost, db-outcome-unknown, or a synchronous upstream dependency refusal.
-
504: Gateway Timeout (RFC 9457 problem document, ADR-068): the route-class request ceiling elapsed (request-timeout) or the database canceled the statement (db-timeout) — the server yields first.
Add a household member to a case
POST /v1/cases/cases/{id}/household
| Name | In | Required | Description |
|---|---|---|---|
id |
path |
Yes |
Case ID |
| Field | Type | Required | Description |
|---|---|---|---|
client_request_id |
UUID |
Yes |
Client-minted idempotency id (ADR-062 §B, #1256) — REQUIRED.
Same id + identical intent (including the case path id) replays
the original membership row; a different intent under the same
id is a 409 |
person_id |
UUID |
Yes |
UUID of the |
primary_caregiver |
boolean |
No |
|
role |
enum (child, parent, caregiver, sibling, other) |
Yes |
Role of a person in a case household. |
-
200: Household member added (or replayed — same client_request_id + intent)
-
401: Unauthorized
-
403: Forbidden
-
404: Case not found
-
409: client_request_id claimed by a different operation, or replayed entity gone (ADR-062)
-
422: Missing client_request_id
-
503: Service Unavailable (RFC 9457 problem document, ADR-068): database pool exhaustion (carries Retry-After: 5), db-connection-lost, db-outcome-unknown, or a synchronous upstream dependency refusal.
-
504: Gateway Timeout (RFC 9457 problem document, ADR-068): the route-class request ceiling elapsed (request-timeout) or the database canceled the statement (db-timeout) — the server yields first.
CURRENT benefit facts for the case household (#1549, D4)
GET /v1/cases/cases/{id}/ssa-benefit-facts
| Name | In | Required | Description |
|---|---|---|---|
id |
path |
Yes |
Case ID |
person_id |
query |
No |
Narrow to one household member. |
-
200: Chain heads for the active household (bounded by household size × benefit kinds — unpaginated by construction)
-
401: Unauthorized
-
403: Forbidden
-
404: Case not found
-
503: Service Unavailable (RFC 9457 problem document, ADR-068): database pool exhaustion (carries Retry-After: 5), db-connection-lost, db-outcome-unknown, or a synchronous upstream dependency refusal.
-
504: Gateway Timeout (RFC 9457 problem document, ADR-068): the route-class request ceiling elapsed (request-timeout) or the database canceled the statement (db-timeout) — the server yields first.
Request an SSA screening run for the case household (#1464, ADR-066 §D5)
POST /v1/cases/cases/{id}/ssa-screening
| Name | In | Required | Description |
|---|---|---|---|
id |
path |
Yes |
Case ID |
| Field | Type | Required | Description |
|---|---|---|---|
client_request_id |
UUID |
Yes |
The client-held operation id (H4): minted per render by the BFF (E1), forwarded UNCHANGED by cases, claimed by exchange. |
-
202: Screening run staged at exchange (or an idempotent replay of the stored run)
-
401: Unauthorized
-
403: Forbidden (incl. pure service callers, unassigned caseworkers, or the exchange-side FEATURE_DISABLED knob relayed verbatim)
-
404: Case not found
-
409: No active household members, members without an SSN on file (MISSING_SSN), or an exchange-side refusal relayed verbatim (SCREENING_RUN_ACTIVE / SCREENING_COHORT_STALE / DSA_NOT_ACTIVE)
-
503: Exchange unreachable, or its partner-configuration 503s relayed verbatim
-
504: Gateway Timeout (RFC 9457 problem document, ADR-068): the route-class request ceiling elapsed (request-timeout) or the database canceled the statement (db-timeout) — the server yields first.
Screening-outcome history for the case household (#1549, D4)
GET /v1/cases/cases/{id}/ssa-screening/outcomes
| Name | In | Required | Description |
|---|---|---|---|
id |
path |
Yes |
Case ID |
person_id |
query |
No |
Narrow to one household member (never combined with |
run_id |
query |
No |
Narrow to one screening run (never combined with |
page |
query |
No |
1-indexed page number (default |
per_page |
query |
No |
Page size (default |
-
200: Outcome page (household-scoped)
-
400: person_id and run_id combined (H12), or page depth exceeded
-
401: Unauthorized
-
403: Forbidden
-
404: Case not found
-
503: Service Unavailable (RFC 9457 problem document, ADR-068): database pool exhaustion (carries Retry-After: 5), db-connection-lost, db-outcome-unknown, or a synchronous upstream dependency refusal.
-
504: Gateway Timeout (RFC 9457 problem document, ADR-068): the route-class request ceiling elapsed (request-timeout) or the database canceled the statement (db-timeout) — the server yields first.
The case’s latest screening-run status, relayed from exchange (#1549, D4)
GET /v1/cases/cases/{id}/ssa-screening/run
| Name | In | Required | Description |
|---|---|---|---|
id |
path |
Yes |
Case ID |
-
200: The latest run’s status view
-
401: Unauthorized
-
403: Forbidden
-
404: Case not found, or the case has never staged a screening run (relayed verbatim)
-
503: Exchange unreachable
-
504: Gateway Timeout (RFC 9457 problem document, ADR-068): the route-class request ceiling elapsed (request-timeout) or the database canceled the statement (db-timeout) — the server yields first.
Operator cancel of a screening run (#1466, fork 1)
POST /v1/cases/cases/{id}/ssa-screening/runs/{run_id}/cancel
| Name | In | Required | Description |
|---|---|---|---|
id |
path |
Yes |
Case ID |
run_id |
path |
Yes |
Screening run ID |
-
200: Invalidated (or the deterministic already-invalidated replay)
-
401: Unauthorized
-
403: Forbidden (service tokens denied; BOLA)
-
404: Case not found, or no such run for this case
-
409: Quiesced run (fork-2 no-op), relayed verbatim
-
503: Exchange unavailable
-
504: Gateway Timeout (RFC 9457 problem document, ADR-068): the route-class request ceiling elapsed (request-timeout) or the database canceled the statement (db-timeout) — the server yields first.
The composed SSA section’s one-fetch composite (#1552, E4)
GET /v1/cases/cases/{id}/ssa-screening/summary
Everything the composed case-section renders in one call: the latest run status (relay 404 folds to null — never-screened is a 200 shape, not an error), the CURRENT household benefit facts, and the newest outcome rows. Exchange unreachability is a 503 (the fragment renders its error state).
| Name | In | Required | Description |
|---|---|---|---|
id |
path |
Yes |
Case ID |
-
200: The composite
-
401: Unauthorized
-
403: Forbidden
-
404: Case not found
-
500: The relay refused non-404 (an exchange auth/config fault)
-
503: Exchange unreachable
-
504: Gateway Timeout (RFC 9457 problem document, ADR-068): the route-class request ceiling elapsed (request-timeout) or the database canceled the statement (db-timeout) — the server yields first.
Contact Attachments
List contact attachments
GET /v1/cases/cases/{case_id}/contacts/{contact_id}/attachments
| Name | In | Required | Description |
|---|---|---|---|
case_id |
path |
Yes |
Case ID |
contact_id |
path |
Yes |
Contact ID |
-
200: Attachments list
-
401: Unauthorized
-
403: Forbidden
-
404: Not found
-
503: Service Unavailable (RFC 9457 problem document, ADR-068): database pool exhaustion (carries Retry-After: 5), db-connection-lost, db-outcome-unknown, or a synchronous upstream dependency refusal.
-
504: Gateway Timeout (RFC 9457 problem document, ADR-068): the route-class request ceiling elapsed (request-timeout) or the database canceled the statement (db-timeout) — the server yields first.
Upload a contact attachment
POST /v1/cases/cases/{case_id}/contacts/{contact_id}/attachments
| Name | In | Required | Description |
|---|---|---|---|
case_id |
path |
Yes |
Case ID |
contact_id |
path |
Yes |
Contact ID |
-
200: Attachment uploaded (a byte- and metadata-identical retry under the same client_request_id replays the SAME attachment)
-
400: Validation error (including a missing client_request_id / file_sha256 text field or a digest that does not match the bytes)
-
401: Unauthorized
-
403: Forbidden (including a foreign actor replaying another’s client_request_id)
-
404: Not found
-
409: Concurrent retries kept finalizing this upload; retry the request
-
422: client_request_id reused with a different upload (ADR-062 §U)
-
503: Service Unavailable (RFC 9457 problem document, ADR-068): database pool exhaustion (carries Retry-After: 5), db-connection-lost, db-outcome-unknown, or a synchronous upstream dependency refusal.
-
504: Gateway Timeout (RFC 9457 problem document, ADR-068): the route-class request ceiling elapsed (request-timeout) or the database canceled the statement (db-timeout) — the server yields first.
Download a contact attachment
GET /v1/cases/cases/{case_id}/contacts/{contact_id}/attachments/{att_id}
| Name | In | Required | Description |
|---|---|---|---|
case_id |
path |
Yes |
Case ID |
contact_id |
path |
Yes |
Contact ID |
att_id |
path |
Yes |
Attachment ID |
-
200: Attachment file
-
401: Unauthorized
-
403: Forbidden
-
404: Not found
-
503: Service Unavailable (RFC 9457 problem document, ADR-068): database pool exhaustion (carries Retry-After: 5), db-connection-lost, db-outcome-unknown, or a synchronous upstream dependency refusal.
-
504: Gateway Timeout (RFC 9457 problem document, ADR-068): the route-class request ceiling elapsed (request-timeout) or the database canceled the statement (db-timeout) — the server yields first.
Delete a contact attachment
DELETE /v1/cases/cases/{case_id}/contacts/{contact_id}/attachments/{att_id}
| Name | In | Required | Description |
|---|---|---|---|
case_id |
path |
Yes |
Case ID |
contact_id |
path |
Yes |
Contact ID |
att_id |
path |
Yes |
Attachment ID |
-
204: Attachment deleted
-
401: Unauthorized
-
403: Forbidden
-
404: Not found
-
503: Service Unavailable (RFC 9457 problem document, ADR-068): database pool exhaustion (carries Retry-After: 5), db-connection-lost, db-outcome-unknown, or a synchronous upstream dependency refusal.
-
504: Gateway Timeout (RFC 9457 problem document, ADR-068): the route-class request ceiling elapsed (request-timeout) or the database canceled the statement (db-timeout) — the server yields first.
Contacts
List contacts for a case
GET /v1/cases/cases/{id}/contacts
| Name | In | Required | Description |
|---|---|---|---|
id |
path |
Yes |
Case ID |
page |
query |
No |
1-indexed page number (default |
per_page |
query |
No |
Page size (default |
-
200: Paginated contacts
-
401: Unauthorized
-
403: Forbidden
-
503: Service Unavailable (RFC 9457 problem document, ADR-068): database pool exhaustion (carries Retry-After: 5), db-connection-lost, db-outcome-unknown, or a synchronous upstream dependency refusal.
-
504: Gateway Timeout (RFC 9457 problem document, ADR-068): the route-class request ceiling elapsed (request-timeout) or the database canceled the statement (db-timeout) — the server yields first.
Record a contact / visitation
POST /v1/cases/cases/{id}/contacts
| Name | In | Required | Description |
|---|---|---|---|
id |
path |
Yes |
Case ID |
| Field | Type | Required | Description |
|---|---|---|---|
client_request_id |
UUID |
Yes |
Client-minted idempotency id (ADR-062 §B, #1256) — REQUIRED.
Same id + identical intent (including the case path id) replays
the original contact; a different intent under the same id is a
409 |
contact_type |
enum (home_visit, office_visit, phone_call, video_call, school_visit, collateral) |
Yes |
Type of case contact. |
contact_with |
string |
Yes |
Who was contacted (person name or role). |
duration_minutes |
integer (optional) |
No |
Duration of the contact in minutes. |
narrative |
string (optional) |
No |
Free-form contact narrative. |
occurred_at |
datetime |
Yes |
When the contact occurred (timezone-aware). |
-
200: Contact recorded (or replayed — same client_request_id + intent)
-
401: Unauthorized
-
403: Forbidden
-
404: Case not found
-
409: client_request_id claimed by a different operation, or replayed entity gone (ADR-062)
-
422: Validation failure (including a missing client_request_id)
-
503: Service Unavailable (RFC 9457 problem document, ADR-068): database pool exhaustion (carries Retry-After: 5), db-connection-lost, db-outcome-unknown, or a synchronous upstream dependency refusal.
-
504: Gateway Timeout (RFC 9457 problem document, ADR-068): the route-class request ceiling elapsed (request-timeout) or the database canceled the statement (db-timeout) — the server yields first.
Get a contact by ID
GET /v1/cases/contacts/{id}
| Name | In | Required | Description |
|---|---|---|---|
id |
path |
Yes |
Contact ID |
-
200: Contact
-
401: Unauthorized
-
403: Forbidden
-
404: Not found
-
503: Service Unavailable (RFC 9457 problem document, ADR-068): database pool exhaustion (carries Retry-After: 5), db-connection-lost, db-outcome-unknown, or a synchronous upstream dependency refusal.
-
504: Gateway Timeout (RFC 9457 problem document, ADR-068): the route-class request ceiling elapsed (request-timeout) or the database canceled the statement (db-timeout) — the server yields first.
Update a contact (requires If-Match)
PUT /v1/cases/contacts/{id}
| Name | In | Required | Description |
|---|---|---|---|
id |
path |
Yes |
Contact ID |
If-Match |
header |
Yes |
REQUIRED (#1266): the contact’s |
| Field | Type | Required | Description |
|---|---|---|---|
contact_type |
ContactType (optional) |
No |
Contact type |
contact_with |
string (optional) |
No |
New |
duration_minutes |
integer (optional) |
No |
New duration in minutes. |
narrative |
string (optional) |
No |
New narrative. |
occurred_at |
datetime (optional) |
No |
New |
-
200: Contact updated
-
400: Missing or malformed If-Match
-
401: Unauthorized
-
403: Forbidden
-
404: Not found (including soft-deleted)
-
409: Version moved — concurrent modification; re-read and retry
-
503: Service Unavailable (RFC 9457 problem document, ADR-068): database pool exhaustion (carries Retry-After: 5), db-connection-lost, db-outcome-unknown, or a synchronous upstream dependency refusal.
-
504: Gateway Timeout (RFC 9457 problem document, ADR-068): the route-class request ceiling elapsed (request-timeout) or the database canceled the statement (db-timeout) — the server yields first.
Delete a contact
DELETE /v1/cases/contacts/{id}
| Name | In | Required | Description |
|---|---|---|---|
id |
path |
Yes |
Contact ID |
-
204: Contact deleted
-
401: Unauthorized
-
403: Forbidden
-
404: Not found
-
503: Service Unavailable (RFC 9457 problem document, ADR-068): database pool exhaustion (carries Retry-After: 5), db-connection-lost, db-outcome-unknown, or a synchronous upstream dependency refusal.
-
504: Gateway Timeout (RFC 9457 problem document, ADR-068): the route-class request ceiling elapsed (request-timeout) or the database canceled the statement (db-timeout) — the server yields first.
Court Orders
Download a court order document
GET /v1/cases/cases/{case_id}/court-orders/{order_id}/document
| Name | In | Required | Description |
|---|---|---|---|
case_id |
path |
Yes |
Case ID |
order_id |
path |
Yes |
Court order ID |
-
200: Document file
-
401: Unauthorized
-
403: Forbidden
-
404: Not found
-
503: Service Unavailable (RFC 9457 problem document, ADR-068): database pool exhaustion (carries Retry-After: 5), db-connection-lost, db-outcome-unknown, or a synchronous upstream dependency refusal.
-
504: Gateway Timeout (RFC 9457 problem document, ADR-068): the route-class request ceiling elapsed (request-timeout) or the database canceled the statement (db-timeout) — the server yields first.
Upload a court order document
POST /v1/cases/cases/{case_id}/court-orders/{order_id}/document
| Name | In | Required | Description |
|---|---|---|---|
case_id |
path |
Yes |
Case ID |
order_id |
path |
Yes |
Court order ID |
-
200: Document uploaded (a byte-identical retry under the same client_request_id replays; a superseded attempt answers with the CURRENT document — the pointer never regresses)
-
400: Validation error (including a missing client_request_id / file_sha256 text field or a digest that does not match the bytes)
-
401: Unauthorized
-
403: Forbidden (including a foreign actor replaying another’s client_request_id)
-
404: Not found
-
409: Concurrent retries kept finalizing this upload; retry the request
-
422: client_request_id reused with a different upload (ADR-062 §U)
-
503: Service Unavailable (RFC 9457 problem document, ADR-068): database pool exhaustion (carries Retry-After: 5), db-connection-lost, db-outcome-unknown, or a synchronous upstream dependency refusal.
-
504: Gateway Timeout (RFC 9457 problem document, ADR-068): the route-class request ceiling elapsed (request-timeout) or the database canceled the statement (db-timeout) — the server yields first.
List court orders for a case
GET /v1/cases/cases/{id}/court-orders
| Name | In | Required | Description |
|---|---|---|---|
id |
path |
Yes |
Case ID |
-
200: Court orders
-
401: Unauthorized
-
403: Forbidden
-
503: Service Unavailable (RFC 9457 problem document, ADR-068): database pool exhaustion (carries Retry-After: 5), db-connection-lost, db-outcome-unknown, or a synchronous upstream dependency refusal.
-
504: Gateway Timeout (RFC 9457 problem document, ADR-068): the route-class request ceiling elapsed (request-timeout) or the database canceled the statement (db-timeout) — the server yields first.
Record a court order
POST /v1/cases/cases/{id}/court-orders
| Name | In | Required | Description |
|---|---|---|---|
id |
path |
Yes |
Case ID |
| Field | Type | Required | Description |
|---|---|---|---|
client_request_id |
UUID |
Yes |
Client-minted idempotency id (ADR-062 §B, #1256) — REQUIRED.
Same id + identical intent (including the case path id) replays
the original order; a different intent under the same id is a
409 |
court_name |
string (optional) |
No |
Name of the issuing court. |
effective_date |
date (optional) |
No |
Date the order takes effect (defaults to |
findings |
object |
No |
Judicial findings (e.g. contrary-to-welfare, reasonable-efforts). |
judge |
string (optional) |
No |
Presiding judge’s name. |
next_hearing_date |
date (optional) |
No |
Date of the next scheduled hearing. |
order_date |
date |
Yes |
Date the order was issued. |
order_type |
enum (removal, shelter_care, adjudication, disposition, review_hearing, permanency_hearing, termination_of_parental_rights) |
Yes |
Type of court order. |
-
200: Court order recorded (or replayed — same client_request_id + intent)
-
401: Unauthorized
-
403: Forbidden
-
404: Case not found
-
409: client_request_id claimed by a different operation, or replayed entity gone (ADR-062)
-
422: Validation failure (including a missing client_request_id)
-
503: Service Unavailable (RFC 9457 problem document, ADR-068): database pool exhaustion (carries Retry-After: 5), db-connection-lost, db-outcome-unknown, or a synchronous upstream dependency refusal.
-
504: Gateway Timeout (RFC 9457 problem document, ADR-068): the route-class request ceiling elapsed (request-timeout) or the database canceled the statement (db-timeout) — the server yields first.
Get a court order by ID
GET /v1/cases/court-orders/{id}
| Name | In | Required | Description |
|---|---|---|---|
id |
path |
Yes |
Court order ID |
-
200: Court order
-
401: Unauthorized
-
403: Forbidden
-
404: Not found
-
503: Service Unavailable (RFC 9457 problem document, ADR-068): database pool exhaustion (carries Retry-After: 5), db-connection-lost, db-outcome-unknown, or a synchronous upstream dependency refusal.
-
504: Gateway Timeout (RFC 9457 problem document, ADR-068): the route-class request ceiling elapsed (request-timeout) or the database canceled the statement (db-timeout) — the server yields first.
Update a court order (requires If-Match)
PUT /v1/cases/court-orders/{id}
| Name | In | Required | Description |
|---|---|---|---|
id |
path |
Yes |
Court order ID |
If-Match |
header |
Yes |
REQUIRED (#1266): the order’s |
| Field | Type | Required | Description |
|---|---|---|---|
court_name |
string (optional) |
No |
New court name. |
effective_date |
date (optional) |
No |
New effective date. |
findings |
object |
No |
New findings JSON. |
judge |
string (optional) |
No |
New presiding judge. |
next_hearing_date |
date (optional) |
No |
New next-hearing date. |
order_date |
date (optional) |
No |
New |
order_type |
CourtOrderType (optional) |
No |
Order type |
-
200: Court order updated
-
400: Missing or malformed If-Match
-
401: Unauthorized
-
403: Forbidden
-
404: Not found (including soft-deleted)
-
409: Version moved — concurrent modification; re-read and retry
-
503: Service Unavailable (RFC 9457 problem document, ADR-068): database pool exhaustion (carries Retry-After: 5), db-connection-lost, db-outcome-unknown, or a synchronous upstream dependency refusal.
-
504: Gateway Timeout (RFC 9457 problem document, ADR-068): the route-class request ceiling elapsed (request-timeout) or the database canceled the statement (db-timeout) — the server yields first.
Delete a court order
DELETE /v1/cases/court-orders/{id}
| Name | In | Required | Description |
|---|---|---|---|
id |
path |
Yes |
Court order ID |
-
204: Court order deleted
-
401: Unauthorized
-
403: Forbidden
-
404: Not found
-
503: Service Unavailable (RFC 9457 problem document, ADR-068): database pool exhaustion (carries Retry-After: 5), db-connection-lost, db-outcome-unknown, or a synchronous upstream dependency refusal.
-
504: Gateway Timeout (RFC 9457 problem document, ADR-068): the route-class request ceiling elapsed (request-timeout) or the database canceled the statement (db-timeout) — the server yields first.
IV-E Determination
The case’s latest IV-E determination of record (#1557)
GET /v1/cases/cases/{id}/ive-determination
| Name | In | Required | Description |
|---|---|---|---|
id |
path |
Yes |
Case ID |
-
200: The latest determination
-
401: Unauthorized
-
403: Forbidden
-
404: Case not found, or no determination exists
-
503: Service Unavailable (RFC 9457 problem document, ADR-068): database pool exhaustion (carries Retry-After: 5), db-connection-lost, db-outcome-unknown, or a synchronous upstream dependency refusal.
-
504: Gateway Timeout (RFC 9457 problem document, ADR-068): the route-class request ceiling elapsed (request-timeout) or the database canceled the statement (db-timeout) — the server yields first.
Assemble + persist an IV-E eligibility determination (UD1, #1557)
POST /v1/cases/cases/{id}/ive-determination
The authoritative assembly: verifies the screening witness (completed, un-invalidated, H1-fresh, cohort byte-current), derives the SSA evidence token server-side from CURRENT benefit facts (callers cannot supply it — any ssa_-prefixed input key is refused), evaluates the jurisdiction IV-E ruleset, and persists the determination of record in one claimed transaction that re-validates the witness under the case lock. No money path consumes the record (the #1054 fence; #1313 stays open).
| Name | In | Required | Description |
|---|---|---|---|
id |
path |
Yes |
Case ID |
| Field | Type | Required | Description |
|---|---|---|---|
attested_inputs |
object |
Yes |
The worker-entered documented inputs (deprivation type, income,
judicial facts, …) — provenance: worker self-attestation,
recorded verbatim on the determination row. The SSA witness key
(and any |
client_request_id |
UUID |
Yes |
Client-minted idempotency id (ADR-062 §B) — REQUIRED. |
-
200: The determination of record (a replay returns the original)
-
400: Malformed body
-
401: Unauthorized
-
403: Forbidden (pure service callers, unassigned caseworkers)
-
404: Case not found
-
409: ive-witness-not-current (categorical token in detail: screening-missing | run-pending | run-invalidated | run-stale | cohort-drift | facts-changed), MISSING_SSN / empty-household from the cohort recompute, or an ADR-062 idempotency conflict
-
422: Validation failure — including an
ssa_-prefixed input key (SSA evidence is server-derived; ADR-066 §D7) or a missing client_request_id -
500: Internal error (including a ruleset output missing a decision key)
-
503: Rules evaluation timed out, or exchange unreachable
-
504: Gateway Timeout (RFC 9457 problem document, ADR-068): the route-class request ceiling elapsed (request-timeout) or the database canceled the statement (db-timeout) — the server yields first.
Open screening-review worklist items (UD5, #1557)
GET /v1/cases/screening-reviews
Post-determination SSA-signal notifications, scoped by the parent case’s assignment: caseworkers see their own cases' items, supervisors their supervised cases', admins all. One open item per case; occurrences count coalesced triggers.
| Name | In | Required | Description |
|---|---|---|---|
page |
query |
No |
Page number (1-based). |
per_page |
query |
No |
Items per page. |
-
200: The scoped open items, newest event first
-
400: Page depth past the cap
-
401: Unauthorized
-
403: Forbidden
-
500: Internal error
-
503: Service Unavailable (RFC 9457 problem document, ADR-068): database pool exhaustion (carries Retry-After: 5), db-connection-lost, db-outcome-unknown, or a synchronous upstream dependency refusal.
-
504: Gateway Timeout (RFC 9457 problem document, ADR-068): the route-class request ceiling elapsed (request-timeout) or the database canceled the statement (db-timeout) — the server yields first.
Claim a screening-review item for triage (#1557)
POST /v1/cases/screening-reviews/{id}/assign
Assigns the OPEN item to the acting worker (self-claim; single triage slot — the deliberate v1 asymmetry with dismissal is recorded in the ADR). Naturally idempotent: re-assigning overwrites the slot.
| Name | In | Required | Description |
|---|---|---|---|
id |
path |
Yes |
Worklist item ID |
-
200: The item, assigned
-
401: Unauthorized
-
403: Forbidden
-
404: Item (or its case) not found, or already dismissed
-
503: Service Unavailable (RFC 9457 problem document, ADR-068): database pool exhaustion (carries Retry-After: 5), db-connection-lost, db-outcome-unknown, or a synchronous upstream dependency refusal.
-
504: Gateway Timeout (RFC 9457 problem document, ADR-068): the route-class request ceiling elapsed (request-timeout) or the database canceled the statement (db-timeout) — the server yields first.
Dismiss a screening-review item, with the audited reason (#1557)
POST /v1/cases/screening-reviews/{id}/dismiss
The human decision that new SSA data does not warrant re-determination: who/when/why land on the row AND on the case.screening_review_dismissed audit event, staged in the same transaction. A dismissed case re-notifies as a NEW item on the next trigger.
| Name | In | Required | Description |
|---|---|---|---|
id |
path |
Yes |
Worklist item ID |
| Field | Type | Required | Description |
|---|---|---|---|
reason |
string |
Yes |
Why the new SSA signal does not warrant re-determination — mandatory, recorded in-row AND on the audit event. |
-
200: The item, dismissed
-
401: Unauthorized
-
403: Forbidden
-
404: Item (or its case) not found, or already dismissed
-
422: Missing/empty reason
-
503: Service Unavailable (RFC 9457 problem document, ADR-068): database pool exhaustion (carries Retry-After: 5), db-connection-lost, db-outcome-unknown, or a synchronous upstream dependency refusal.
-
504: Gateway Timeout (RFC 9457 problem document, ADR-068): the route-class request ceiling elapsed (request-timeout) or the database canceled the statement (db-timeout) — the server yields first.
Investigations
List investigations
GET /v1/cases/investigations
| Name | In | Required | Description |
|---|---|---|---|
page |
query |
No |
1-indexed page number (default |
per_page |
query |
No |
Page size (default |
worker |
query |
No |
Filter by assigned worker ( |
status |
query |
No |
Filter by status: open, pending_review, closed. |
search |
query |
No |
Full-text search across assignment_area (worker is UUID-typed; substring search disabled). |
person_id |
query |
No |
Filter to investigations whose referral has any allegation involving this person (victim or perpetrator). |
sort_by |
query |
No |
Sort column: status, response_due_at, assigned_worker, assignment_area. |
sort_dir |
query |
No |
Sort direction: asc or desc (default: desc). |
-
200: Paginated investigations
-
401: Unauthorized
-
403: Forbidden
-
503: Service Unavailable (RFC 9457 problem document, ADR-068): database pool exhaustion (carries Retry-After: 5), db-connection-lost, db-outcome-unknown, or a synchronous upstream dependency refusal.
-
504: Gateway Timeout (RFC 9457 problem document, ADR-068): the route-class request ceiling elapsed (request-timeout) or the database canceled the statement (db-timeout) — the server yields first.
Open an investigation from a referral
POST /v1/cases/investigations
| Field | Type | Required | Description |
|---|---|---|---|
assigned_worker |
UUID |
Yes |
Worker |
assignment_area |
string |
Yes |
Geographic or organizational area assignment. |
client_request_id |
UUID |
Yes |
Client-minted idempotency id (ADR-062 §B, #1255) — REQUIRED.
Same id + identical intent replays the original investigation; a
different intent under the same id is a 409 |
referral_id |
UUID |
Yes |
Referral the investigation is opened from. |
response_due_at |
datetime |
Yes |
Deadline by which first contact must occur. |
-
200: Investigation created (or replayed — same client_request_id + intent)
-
401: Unauthorized
-
403: Forbidden
-
404: Referral not found
-
409: client_request_id claimed by a different operation, or replayed entity gone (ADR-062)
-
422: Validation failure (including a missing client_request_id)
-
503: Service Unavailable (RFC 9457 problem document, ADR-068): database pool exhaustion (carries Retry-After: 5), db-connection-lost, db-outcome-unknown, or a synchronous upstream dependency refusal.
-
504: Gateway Timeout (RFC 9457 problem document, ADR-068): the route-class request ceiling elapsed (request-timeout) or the database canceled the statement (db-timeout) — the server yields first.
Get an investigation by ID
GET /v1/cases/investigations/{id}
| Name | In | Required | Description |
|---|---|---|---|
id |
path |
Yes |
Investigation ID |
-
200: Investigation found
-
401: Unauthorized
-
404: Investigation not found
-
503: Service Unavailable (RFC 9457 problem document, ADR-068): database pool exhaustion (carries Retry-After: 5), db-connection-lost, db-outcome-unknown, or a synchronous upstream dependency refusal.
-
504: Gateway Timeout (RFC 9457 problem document, ADR-068): the route-class request ceiling elapsed (request-timeout) or the database canceled the statement (db-timeout) — the server yields first.
Update an investigation
PUT /v1/cases/investigations/{id}
| Name | In | Required | Description |
|---|---|---|---|
id |
path |
Yes |
Investigation ID |
| Field | Type | Required | Description |
|---|---|---|---|
disposition |
Disposition (optional) |
No |
Disposition |
first_contact_at |
datetime (optional) |
No |
Timestamp the investigator first made contact. |
status |
string (optional) |
No |
New status: |
-
200: Investigation updated
-
400: Invalid status transition
-
401: Unauthorized
-
403: Forbidden
-
404: Investigation not found
-
409: Concurrent modification — re-read and retry
-
503: Service Unavailable (RFC 9457 problem document, ADR-068): database pool exhaustion (carries Retry-After: 5), db-connection-lost, db-outcome-unknown, or a synchronous upstream dependency refusal.
-
504: Gateway Timeout (RFC 9457 problem document, ADR-068): the route-class request ceiling elapsed (request-timeout) or the database canceled the statement (db-timeout) — the server yields first.
Submit a safety assessment (calls Rules Engine)
POST /v1/cases/investigations/{id}/safety-assessment
| Name | In | Required | Description |
|---|---|---|---|
id |
path |
Yes |
Investigation ID |
| Field | Type | Required | Description |
|---|---|---|---|
client_request_id |
UUID |
Yes |
Client-minted idempotency id (ADR-062 §B, #1255) — REQUIRED.
Same id + identical intent (including the investigation path id)
replays the original assessment — the Rules Engine is NOT
re-consulted on a replay; a different intent under the same id is
a 409 |
protective_capacities |
object |
Yes |
JSON array of protective capacities (jurisdiction-specific shape). |
threats |
object |
Yes |
JSON array of identified safety threats (jurisdiction-specific shape). |
worker_override |
SafetyDecision (optional) |
No |
Worker override |
worker_override_reason |
string (optional) |
No |
Free-form reason for the override. |
-
200: Safety assessment recorded (or replayed — same client_request_id + intent; the Rules Engine is not re-consulted on a replay)
-
401: Unauthorized
-
403: Forbidden
-
404: Investigation not found
-
409: client_request_id claimed by a different operation, or replayed entity gone (ADR-062)
-
422: Validation failure (including a missing client_request_id)
-
503: Service Unavailable (RFC 9457 problem document, ADR-068): database pool exhaustion (carries Retry-After: 5), db-connection-lost, db-outcome-unknown, or a synchronous upstream dependency refusal.
-
504: Gateway Timeout (RFC 9457 problem document, ADR-068): the route-class request ceiling elapsed (request-timeout) or the database canceled the statement (db-timeout) — the server yields first.
NCANDS Export
Service-to-service: collect NCANDS Child File rows for a Federal Fiscal Year (#651)
GET /v1/cases/ncands-export
| Name | In | Required | Description |
|---|---|---|---|
ffy |
query |
Yes |
Federal Fiscal Year (the year the FFY ends in) |
-
200: Collected rows for the FFY
-
400: FFY out of range
-
403: Caller is not the craig-reporting service identity
-
503: Service Unavailable (RFC 9457 problem document, ADR-068): database pool exhaustion (carries Retry-After: 5), db-connection-lost, db-outcome-unknown, or a synchronous upstream dependency refusal.
-
504: Gateway Timeout (RFC 9457 problem document, ADR-068): the route-class request ceiling elapsed (request-timeout) or the database canceled the statement (db-timeout) — the server yields first.
Persons
Search persons
GET /v1/cases/persons
| Name | In | Required | Description |
|---|---|---|---|
page |
query |
No |
1-indexed page number (default |
per_page |
query |
No |
Page size (default |
name |
query |
No |
Search by name (case-insensitive partial match over the full
|
date_of_birth |
query |
No |
Filter by exact date of birth. |
ssn_last_four |
query |
No |
Filter by last four digits of SSN (exactly four ASCII digits — the blind index hashes raw bytes, so a non-canonical filter could only ever match nothing; #1023 rejects it up front). |
-
200: Search results
-
401: Unauthorized
-
403: Forbidden
-
503: Service Unavailable (RFC 9457 problem document, ADR-068): database pool exhaustion (carries Retry-After: 5), db-connection-lost, db-outcome-unknown, or a synchronous upstream dependency refusal.
-
504: Gateway Timeout (RFC 9457 problem document, ADR-068): the route-class request ceiling elapsed (request-timeout) or the database canceled the statement (db-timeout) — the server yields first.
Create a person record
POST /v1/cases/persons
| Field | Type | Required | Description |
|---|---|---|---|
client_request_id |
UUID |
Yes |
Client-minted idempotency id (ADR-062 §B, #1255) — REQUIRED.
Retrying with the same id + identical intent replays the original
outcome instead of creating a second person; the same id with a
DIFFERENT intent (or another caller’s id) is a 409
|
date_of_birth |
date (optional) |
No |
Date of birth, calendar-date precision. |
ethnicity |
Ethnicity (optional) |
No |
Ethnicity |
first_name |
string |
Yes |
First name. |
gender |
Gender (optional) |
No |
Gender |
icwa_eligible |
boolean |
No |
|
last_name |
string |
Yes |
Last name. |
race |
Race (optional) |
No |
Race |
ssn |
string (optional) |
No |
Full SSN (#1064 / ADR-051) — WRITE-ONLY: never returned by any read
surface. Accepts digits with optional space/dash separators; the
service canonicalizes, range-validates, derives |
ssn_last_four |
string (optional) |
No |
Last 4 digits of SSN (server stores hashed; exactly four ASCII
digits, #1023 — non-canonical bytes would poison the blind
index). Rejected with |
tribal_affiliation |
string (optional) |
No |
Tribe affiliation (free-form, paired with [ |
-
200: Person created (or replayed — same client_request_id + intent)
-
401: Unauthorized
-
403: Forbidden
-
409: client_request_id claimed by a different operation, or replayed entity gone (ADR-062)
-
422: Validation failure (including a missing client_request_id)
-
503: Service Unavailable (RFC 9457 problem document, ADR-068): database pool exhaustion (carries Retry-After: 5), db-connection-lost, db-outcome-unknown, or a synchronous upstream dependency refusal.
-
504: Gateway Timeout (RFC 9457 problem document, ADR-068): the route-class request ceiling elapsed (request-timeout) or the database canceled the statement (db-timeout) — the server yields first.
Service-to-service: person demographics + SSN state for federal reporting (#1064, ADR-051)
POST /v1/cases/persons/federal-export
| Field | Type | Required | Description |
|---|---|---|---|
include_full_ssn |
boolean |
No |
When |
person_ids |
array of UUID |
Yes |
Persons to export (≤ [ |
-
200: Export rows (unknown ids absent); Cache-Control: no-store
-
400: Over the id cap (BATCH_TOO_LARGE)
-
403: Caller is not the craig-reporting service identity
-
503: Service Unavailable (RFC 9457 problem document, ADR-068): database pool exhaustion (carries Retry-After: 5), db-connection-lost, db-outcome-unknown, or a synchronous upstream dependency refusal.
-
504: Gateway Timeout (RFC 9457 problem document, ADR-068): the route-class request ceiling elapsed (request-timeout) or the database canceled the statement (db-timeout) — the server yields first.
Get a person by ID
GET /v1/cases/persons/{id}
| Name | In | Required | Description |
|---|---|---|---|
id |
path |
Yes |
Person ID |
-
200: Person found
-
401: Unauthorized
-
404: Person not found
-
503: Service Unavailable (RFC 9457 problem document, ADR-068): database pool exhaustion (carries Retry-After: 5), db-connection-lost, db-outcome-unknown, or a synchronous upstream dependency refusal.
-
504: Gateway Timeout (RFC 9457 problem document, ADR-068): the route-class request ceiling elapsed (request-timeout) or the database canceled the statement (db-timeout) — the server yields first.
Update a person record
PUT /v1/cases/persons/{id}
| Name | In | Required | Description |
|---|---|---|---|
id |
path |
Yes |
Person ID |
| Field | Type | Required | Description |
|---|---|---|---|
date_of_birth |
date (optional) |
No |
New date of birth. |
ethnicity |
Ethnicity (optional) |
No |
Ethnicity |
first_name |
string (optional) |
No |
New first name. |
gender |
Gender (optional) |
No |
Gender |
icwa_eligible |
boolean (optional) |
No |
New ICWA eligibility flag. |
last_name |
string (optional) |
No |
New last name. |
race |
Race (optional) |
No |
Race |
ssn |
string (optional) |
No |
New full SSN (#1064 / ADR-051) — write-only; every write resets the
verification state (same-value included, deliberately). Absent = keep;
non-clearable here (the audited |
ssn_last_four |
string (optional) |
No |
New |
tribal_affiliation |
string (optional) |
No |
New tribal affiliation. |
-
200: Person updated
-
401: Unauthorized
-
403: Forbidden
-
404: Person not found
-
503: Service Unavailable (RFC 9457 problem document, ADR-068): database pool exhaustion (carries Retry-After: 5), db-connection-lost, db-outcome-unknown, or a synchronous upstream dependency refusal.
-
504: Gateway Timeout (RFC 9457 problem document, ADR-068): the route-class request ceiling elapsed (request-timeout) or the database canceled the statement (db-timeout) — the server yields first.
Audited SSN clear — removes all four SSN columns (#1064, ADR-051)
DELETE /v1/cases/persons/{id}/ssn
| Name | In | Required | Description |
|---|---|---|---|
id |
path |
Yes |
Person ID |
| Field | Type | Required | Description |
|---|---|---|---|
reason |
string |
Yes |
Why the SSN is being removed. |
-
200: Cleared — idempotent: a replayed clear on an already-clear row is a no-op and stages no duplicate audit event (#1266)
-
401: Unauthorized
-
403: Forbidden (non-admin, incl. pure service callers)
-
404: Person not found
-
503: Service Unavailable (RFC 9457 problem document, ADR-068): database pool exhaustion (carries Retry-After: 5), db-connection-lost, db-outcome-unknown, or a synchronous upstream dependency refusal.
-
504: Gateway Timeout (RFC 9457 problem document, ADR-068): the route-class request ceiling elapsed (request-timeout) or the database canceled the statement (db-timeout) — the server yields first.
Service-to-service: value-bound SSN custody release for SSA screening (#1463, ADR-065 §D2)
POST /v1/cases/persons/{id}/ssn-release
| Name | In | Required | Description |
|---|---|---|---|
id |
path |
Yes |
Person ID |
| Field | Type | Required | Description |
|---|---|---|---|
expected_digest |
string |
Yes |
The staged screening digest in |
purpose |
enum (ssa_solq_screening) |
Yes |
The closed purpose vocabulary for the value-bound custody release (#1463 / ADR-065 §D2). Serde refuses unknown tokens (400), so a new purpose is a code change with its own allowlist review — never a free string. |
requested_by |
UUID |
Yes |
The caseworker who requested the screening run (the run’s
|
screening_member_id |
UUID |
Yes |
The screening member this release feeds
( |
screening_run_id |
UUID |
Yes |
The requesting screening run ( |
-
200: Digest matched — plaintext released (unverified emission permitted for this purpose); Cache-Control: no-store
-
401: Unauthorized
-
403: Caller is not the craig-exchange service identity
-
404: Person not found
-
409: No SSN on file (MISSING_SSN), staged digest under a rotated-away version (SSN_DIGEST_VERSION_ROTATED), or digest bytes no longer match (SSN_DIGEST_MISMATCH) — each audited, none releasing plaintext
-
503: Service Unavailable (RFC 9457 problem document, ADR-068): database pool exhaustion (carries Retry-After: 5), db-connection-lost, db-outcome-unknown, or a synchronous upstream dependency refusal.
-
504: Gateway Timeout (RFC 9457 problem document, ADR-068): the route-class request ceiling elapsed (request-timeout) or the database canceled the statement (db-timeout) — the server yields first.
SSN verification status + attestation digest (#1064, ADR-051)
GET /v1/cases/persons/{id}/ssn-verification
| Name | In | Required | Description |
|---|---|---|---|
id |
path |
Yes |
Person ID |
-
200: Verification status
-
401: Unauthorized
-
403: Forbidden (incl. pure service callers)
-
404: Person not found
-
503: Service Unavailable (RFC 9457 problem document, ADR-068): database pool exhaustion (carries Retry-After: 5), db-connection-lost, db-outcome-unknown, or a synchronous upstream dependency refusal.
-
504: Gateway Timeout (RFC 9457 problem document, ADR-068): the route-class request ceiling elapsed (request-timeout) or the database canceled the statement (db-timeout) — the server yields first.
Attest the stored SSN (value-bound; #1064, ADR-051)
POST /v1/cases/persons/{id}/ssn-verification
| Name | In | Required | Description |
|---|---|---|---|
id |
path |
Yes |
Person ID |
| Field | Type | Required | Description |
|---|---|---|---|
digest |
string |
Yes |
The digest the attester reviewed (from the digest GET), in
[ |
method |
string |
Yes |
Evidence source (e.g. |
-
200: Attested — or a replayed same-digest attestation, which is a no-op: the original record stands, nothing is re-stamped (#1266)
-
401: Unauthorized
-
403: Forbidden (incl. pure service callers)
-
404: Person not found
-
409: No SSN on file (MISSING_SSN), digest stamped under a rotated-away blind-index version (SSN_DIGEST_VERSION_ROTATED — re-fetch, #1435), digest mismatch (STALE_ATTESTATION), or verification state moved concurrently (CONCURRENT_MODIFICATION)
-
503: Service Unavailable (RFC 9457 problem document, ADR-068): database pool exhaustion (carries Retry-After: 5), db-connection-lost, db-outcome-unknown, or a synchronous upstream dependency refusal.
-
504: Gateway Timeout (RFC 9457 problem document, ADR-068): the route-class request ceiling elapsed (request-timeout) or the database canceled the statement (db-timeout) — the server yields first.
Revoke SSN verification (#1064, ADR-051)
DELETE /v1/cases/persons/{id}/ssn-verification
| Name | In | Required | Description |
|---|---|---|---|
id |
path |
Yes |
Person ID |
| Field | Type | Required | Description |
|---|---|---|---|
reason |
string |
Yes |
Why the verification is being revoked. |
-
200: Revoked — idempotent: a replayed revoke on an already-unverified row is a no-op and stages no duplicate audit event (#1266)
-
401: Unauthorized
-
403: Forbidden (incl. pure service callers)
-
404: Person not found
-
503: Service Unavailable (RFC 9457 problem document, ADR-068): database pool exhaustion (carries Retry-After: 5), db-connection-lost, db-outcome-unknown, or a synchronous upstream dependency refusal.
-
504: Gateway Timeout (RFC 9457 problem document, ADR-068): the route-class request ceiling elapsed (request-timeout) or the database canceled the statement (db-timeout) — the server yields first.
Service-to-service: record one SSA screening member outcome atomically (#1466, ADR-066 §OT)
POST /v1/cases/ssa-screening-outcomes
| Field | Type | Required | Description |
|---|---|---|---|
authority |
enum (gateway, non_authoritative_stub) |
Yes |
The caller-asserted send-authority discriminator (see the module doc: defense-in-depth, not a lock). |
echo_matched |
boolean |
Yes |
See the module doc — the transient echo assertion. |
expected_digest |
string |
Yes |
The digest the run bound — the value-binding the CAS enforces in its own WHERE (a moved digest means facts may still commit but verification never fires). |
outcome |
object |
Yes |
The member’s categorical outcome. |
person_id |
UUID |
Yes |
The person screened. |
requested_by |
UUID |
Yes |
Stage-time actor attribution (the run creator’s sub). |
run_id |
UUID |
Yes |
The screening run (provenance pointer; validity re-checked exchange-side under the claim fence, carried here for the projection row). |
screening_member_id |
UUID |
Yes |
The screening member this outcome resolves. |
transaction_id |
UUID |
Yes |
The member’s transaction id — the claim key (see module doc). |
-
200: Idempotent replay — the ORIGINAL outcome re-derived from the projection row
-
201: Outcome recorded (facts + optional ssn_verified CAS + projection row, one transaction)
-
401: Unauthorized
-
403: Caller is not the craig-exchange service identity
-
404: Person not found
-
409: Digest-class refusal (MISSING_SSN / SSN_DIGEST_VERSION_ROTATED / SSN_DIGEST_MISMATCH — zero writes), or a non-Gateway authority (NON_AUTHORITATIVE_SOURCE)
-
503: Service Unavailable (RFC 9457 problem document, ADR-068): database pool exhaustion (carries Retry-After: 5), db-connection-lost, db-outcome-unknown, or a synchronous upstream dependency refusal.
-
504: Gateway Timeout (RFC 9457 problem document, ADR-068): the route-class request ceiling elapsed (request-timeout) or the database canceled the statement (db-timeout) — the server yields first.
Referrals
List referrals
GET /v1/cases/referrals
| Name | In | Required | Description |
|---|---|---|---|
page |
query |
No |
1-indexed page number (default |
per_page |
query |
No |
Page size (default |
worker |
query |
No |
Filter by creating worker. |
admin_unit |
query |
No |
Filter by administrative unit. |
search |
query |
No |
Substring search across the plaintext |
person_id |
query |
No |
Filter to referrals where this person appears as victim or perpetrator on any allegation. |
sort_by |
query |
No |
Sort column: received_at, priority, reporter_type, admin_unit. |
sort_dir |
query |
No |
Sort direction: asc or desc (default: desc). |
-
200: Paginated list of referrals
-
401: Unauthorized
-
403: Forbidden
-
503: Service Unavailable (RFC 9457 problem document, ADR-068): database pool exhaustion (carries Retry-After: 5), db-connection-lost, db-outcome-unknown, or a synchronous upstream dependency refusal.
-
504: Gateway Timeout (RFC 9457 problem document, ADR-068): the route-class request ceiling elapsed (request-timeout) or the database canceled the statement (db-timeout) — the server yields first.
Create a hotline referral
POST /v1/cases/referrals
| Field | Type | Required | Description |
|---|---|---|---|
admin_unit |
string |
Yes |
Administrative unit (county / region) that owns the referral. |
client_request_id |
UUID |
Yes |
Client-minted idempotency id (ADR-062 §B, #1255) — REQUIRED.
Same id + identical intent replays the original referral; a
different intent under the same id is a 409 |
icwa_flag |
boolean |
No |
|
priority |
enum (immediate, 24_hour, 72_hour) |
Yes |
Referral/investigation priority level. |
reporter_first_name |
string (optional) |
No |
Reporter’s first name (omitted for anonymous referrals). |
reporter_last_name |
string (optional) |
No |
Reporter’s last name (omitted for anonymous referrals). |
reporter_phone |
string (optional) |
No |
Reporter’s contact phone. |
reporter_relation |
RelationshipToChild (optional) |
No |
Reporter relation |
reporter_type |
enum (mandated, professional, anonymous, self_report, law_enforcement, concerned_citizen) |
Yes |
Who reported the allegation — NCANDS reporter source. |
screen_out_reason |
string (optional) |
No |
Reason given when |
screened_in |
boolean |
No |
|
-
200: Referral created (or replayed — same client_request_id + intent)
-
401: Unauthorized
-
403: Forbidden
-
409: client_request_id claimed by a different operation, or replayed entity gone (ADR-062)
-
422: Validation failure (including a missing client_request_id)
-
503: Service Unavailable (RFC 9457 problem document, ADR-068): database pool exhaustion (carries Retry-After: 5), db-connection-lost, db-outcome-unknown, or a synchronous upstream dependency refusal.
-
504: Gateway Timeout (RFC 9457 problem document, ADR-068): the route-class request ceiling elapsed (request-timeout) or the database canceled the statement (db-timeout) — the server yields first.
Get a referral with its allegations
GET /v1/cases/referrals/{id}
| Name | In | Required | Description |
|---|---|---|---|
id |
path |
Yes |
Referral ID |
-
200: Referral found
-
401: Unauthorized
-
404: Referral not found
-
503: Service Unavailable (RFC 9457 problem document, ADR-068): database pool exhaustion (carries Retry-After: 5), db-connection-lost, db-outcome-unknown, or a synchronous upstream dependency refusal.
-
504: Gateway Timeout (RFC 9457 problem document, ADR-068): the route-class request ceiling elapsed (request-timeout) or the database canceled the statement (db-timeout) — the server yields first.
Add an allegation to a referral
POST /v1/cases/referrals/{id}/allegations
| Name | In | Required | Description |
|---|---|---|---|
id |
path |
Yes |
Referral ID |
| Field | Type | Required | Description |
|---|---|---|---|
abuse_type |
enum (physical_abuse, sexual_abuse, neglect, emotional_abuse, medical_neglect) |
Yes |
Type of maltreatment — the NCANDS maltreatment-type category. Maps to a CRAIG-internal NCANDS short code via [ |
child_fatality |
boolean |
No |
Whether this maltreatment allegation was fatal to the child — the NCANDS
Child File #34 (Maltreatment Death) source. Defaults to |
client_request_id |
UUID |
Yes |
Client-minted idempotency id (ADR-062 §B, #1255) — REQUIRED.
Same id + identical intent (including the referral path id)
replays the original allegation; a different intent under the
same id is a 409 |
description |
string (optional) |
No |
Free-form narrative description of the allegation. |
disposition |
Disposition (optional) |
No |
Disposition |
perpetrator_id |
UUID (optional) |
No |
Person ID of the alleged perpetrator (optional). |
victim_id |
UUID |
Yes |
Person ID of the child victim. |
-
200: Allegation created (or replayed — same client_request_id + intent)
-
401: Unauthorized
-
403: Forbidden
-
404: Referral not found
-
409: client_request_id claimed by a different operation, or replayed entity gone (ADR-062)
-
422: Validation failure (including a missing client_request_id)
-
503: Service Unavailable (RFC 9457 problem document, ADR-068): database pool exhaustion (carries Retry-After: 5), db-connection-lost, db-outcome-unknown, or a synchronous upstream dependency refusal.
-
504: Gateway Timeout (RFC 9457 problem document, ADR-068): the route-class request ceiling elapsed (request-timeout) or the database canceled the statement (db-timeout) — the server yields first.
Update an allegation’s maltreatment disposition
PUT /v1/cases/referrals/{id}/allegations/{allegation_id}
| Name | In | Required | Description |
|---|---|---|---|
id |
path |
Yes |
Referral ID |
allegation_id |
path |
Yes |
Allegation ID |
| Field | Type | Required | Description |
|---|---|---|---|
child_fatality |
boolean (optional) |
No |
Updated child-fatality indicator (NCANDS #34); |
disposition |
Disposition (optional) |
No |
Disposition |
version |
integer |
Yes |
The allegation |
-
200: Allegation updated
-
401: Unauthorized
-
403: Forbidden
-
404: Referral or allegation not found
-
409: Version moved — concurrent modification; re-read and retry (#1266)
-
503: Service Unavailable (RFC 9457 problem document, ADR-068): database pool exhaustion (carries Retry-After: 5), db-connection-lost, db-outcome-unknown, or a synchronous upstream dependency refusal.
-
504: Gateway Timeout (RFC 9457 problem document, ADR-068): the route-class request ceiling elapsed (request-timeout) or the database canceled the statement (db-timeout) — the server yields first.
Report Attachments
List attachments for a report
GET /v1/cases/reports/{id}/attachments
| Name | In | Required | Description |
|---|---|---|---|
id |
path |
Yes |
Report ID |
-
200: Attachments
-
404: Report not found
-
503: Service Unavailable (RFC 9457 problem document, ADR-068): database pool exhaustion (carries Retry-After: 5), db-connection-lost, db-outcome-unknown, or a synchronous upstream dependency refusal.
-
504: Gateway Timeout (RFC 9457 problem document, ADR-068): the route-class request ceiling elapsed (request-timeout) or the database canceled the statement (db-timeout) — the server yields first.
Upload an attachment to a report (ADR-018)
POST /v1/cases/reports/{id}/attachments
| Name | In | Required | Description |
|---|---|---|---|
id |
path |
Yes |
Report ID |
-
200: Attachment uploaded (a byte- and metadata-identical retry under the same client_request_id replays the SAME attachment)
-
400: Validation error (too large, disallowed MIME, missing file, missing client_request_id / file_sha256, or a digest that does not match the bytes)
-
401: Unauthorized
-
403: Forbidden (including a foreign actor replaying another’s client_request_id)
-
404: Report not found
-
409: Concurrent retries kept finalizing this upload; retry the request
-
422: client_request_id reused with a different upload (ADR-062 §U)
-
503: Service Unavailable (RFC 9457 problem document, ADR-068): database pool exhaustion (carries Retry-After: 5), db-connection-lost, db-outcome-unknown, or a synchronous upstream dependency refusal.
-
504: Gateway Timeout (RFC 9457 problem document, ADR-068): the route-class request ceiling elapsed (request-timeout) or the database canceled the statement (db-timeout) — the server yields first.
Delete a report attachment (soft-delete + object-store blob removed)
DELETE /v1/cases/reports/{id}/attachments/{att_id}
| Name | In | Required | Description |
|---|---|---|---|
id |
path |
Yes |
Report ID |
att_id |
path |
Yes |
Attachment ID |
-
204: Deleted
-
404: Not found
-
503: Service Unavailable (RFC 9457 problem document, ADR-068): database pool exhaustion (carries Retry-After: 5), db-connection-lost, db-outcome-unknown, or a synchronous upstream dependency refusal.
-
504: Gateway Timeout (RFC 9457 problem document, ADR-068): the route-class request ceiling elapsed (request-timeout) or the database canceled the statement (db-timeout) — the server yields first.
Download an attachment blob
GET /v1/cases/reports/{id}/attachments/{att_id}/download
| Name | In | Required | Description |
|---|---|---|---|
id |
path |
Yes |
Report ID |
att_id |
path |
Yes |
Attachment ID |
-
200: Attachment file
-
404: Not found
-
503: Service Unavailable (RFC 9457 problem document, ADR-068): database pool exhaustion (carries Retry-After: 5), db-connection-lost, db-outcome-unknown, or a synchronous upstream dependency refusal.
-
504: Gateway Timeout (RFC 9457 problem document, ADR-068): the route-class request ceiling elapsed (request-timeout) or the database canceled the statement (db-timeout) — the server yields first.
Report Persons
Confirm a person link for a report entry (ADR-019)
POST /v1/cases/reports/{id}/person-links
| Name | In | Required | Description |
|---|---|---|---|
id |
path |
Yes |
Report ID |
| Field | Type | Required | Description |
|---|---|---|---|
client_request_id |
UUID |
Yes |
ADR-062 §B (#1257): client-minted idempotency key. REQUIRED —
an own-retry with the same key + identical intent replays the
stored link (200) instead of tripping the natural-key 409; the
|
jsonb_index |
integer (optional) |
No |
Index into the report’s |
person_id |
UUID |
Yes |
UUID of the |
role |
string |
Yes |
|
ruleset_name |
string (optional) |
No |
|
ruleset_version |
string (optional) |
No |
Companion to [ |
-
200: Link created (or replayed — same client_request_id + intent)
-
400: Bogus role or jsonb_index
-
401: Unauthorized
-
403: Forbidden
-
404: Report or person not found
-
409: Natural-key duplicate under a DIFFERENT client_request_id, a client_request_id claimed by a different operation, or a replayed entity gone (ADR-062)
-
422: Validation failure (including a missing client_request_id)
-
503: Service Unavailable (RFC 9457 problem document, ADR-068): database pool exhaustion (carries Retry-After: 5), db-connection-lost, db-outcome-unknown, or a synchronous upstream dependency refusal.
-
504: Gateway Timeout (RFC 9457 problem document, ADR-068): the route-class request ceiling elapsed (request-timeout) or the database canceled the statement (db-timeout) — the server yields first.
Unlink a person from a report entry (ADR-019)
DELETE /v1/cases/reports/{id}/person-links/{link_id}
| Name | In | Required | Description |
|---|---|---|---|
id |
path |
Yes |
Report ID |
link_id |
path |
Yes |
report_persons row ID |
-
200: Link removed
-
401: Unauthorized
-
403: Forbidden
-
404: Link not found
-
503: Service Unavailable (RFC 9457 problem document, ADR-068): database pool exhaustion (carries Retry-After: 5), db-connection-lost, db-outcome-unknown, or a synchronous upstream dependency refusal.
-
504: Gateway Timeout (RFC 9457 problem document, ADR-068): the route-class request ceiling elapsed (request-timeout) or the database canceled the statement (db-timeout) — the server yields first.
Rank candidate persons per child/adult JSONB entry (ADR-019)
GET /v1/cases/reports/{id}/person-suggestions
| Name | In | Required | Description |
|---|---|---|---|
id |
path |
Yes |
Report ID |
seed_case_id |
query |
No |
Optional case id whose |
-
200: Ranked candidates per entry
-
401: Unauthorized
-
403: Forbidden
-
404: Report not found
-
503: Service Unavailable (RFC 9457 problem document, ADR-068): database pool exhaustion (carries Retry-After: 5), db-connection-lost, db-outcome-unknown, or a synchronous upstream dependency refusal.
-
504: Gateway Timeout (RFC 9457 problem document, ADR-068): the route-class request ceiling elapsed (request-timeout) or the database canceled the statement (db-timeout) — the server yields first.
Reports
List reports (summary projection)
GET /v1/cases/reports
| Name | In | Required | Description |
|---|---|---|---|
page |
query |
No |
1-indexed page number (default |
per_page |
query |
No |
Page size (default |
partner_id |
query |
No |
Filter by submitting partner UUID. |
admin_unit |
query |
No |
Filter by administrative unit (county / region). |
person_id |
query |
No |
Filter to reports that have at least one |
search |
query |
No |
Substring search over the plaintext |
sort_by |
query |
No |
Sort column: received_at, admin_unit, reporter_type. |
sort_dir |
query |
No |
Sort direction: asc or desc (default: desc). |
-
200: Paginated report summaries (#1158): six keys per item — id, received_at, reporter_type, reporter_relation, admin_unit, narrative_preview (first 160 chars + U+2026 iff truncated). The full report shape is detail-GET / create-echo only.
-
503: Service Unavailable (RFC 9457 problem document, ADR-068): database pool exhaustion (carries Retry-After: 5), db-connection-lost, db-outcome-unknown, or a synchronous upstream dependency refusal.
-
504: Gateway Timeout (RFC 9457 problem document, ADR-068): the route-class request ceiling elapsed (request-timeout) or the database canceled the statement (db-timeout) — the server yields first.
Submit a report (service-to-service; called by craig-intake after partner auth)
POST /v1/cases/reports
| Field | Type | Required | Description |
|---|---|---|---|
admin_unit |
string |
Yes |
Administrative unit owning the report. |
adults |
object |
No |
JSONB array of |
children |
object |
No |
JSONB array of |
narrative |
string |
Yes |
Free-text narrative (PII; server stores encrypted). |
partner_context |
object |
Yes |
Tagged-enum form: Cases-side handler maps |
raw_submission |
object |
Yes |
Verbatim partner payload for audit/replay. |
received_ip_hash |
string (optional) |
No |
HMAC-SHA256 hash of the originating IP (Plan B F-003). |
received_request_id |
UUID |
Yes |
Idempotency key surfaced from the intake edge. UNIQUE per submission. |
reporter_first_name |
string (optional) |
No |
Reporter’s first name (PII; server stores encrypted per Plan B F-001). |
reporter_last_name |
string (optional) |
No |
Reporter’s last name (PII; server stores encrypted). |
reporter_phone |
string (optional) |
No |
Reporter’s phone (PII; server stores encrypted). |
reporter_relation |
RelationshipToChild (optional) |
No |
Reporter relation |
reporter_type |
enum (mandated, professional, anonymous, self_report, law_enforcement, concerned_citizen) |
Yes |
Who reported the allegation — NCANDS reporter source. |
-
200: Report submitted (or replayed — duplicate received_request_id with a matching intent digest, or a grandfathered pre-#1257 row)
-
409: Duplicate received_request_id with a DIFFERENT intent digest (ADR-062 LIFETIME class)
-
503: Service Unavailable (RFC 9457 problem document, ADR-068): database pool exhaustion (carries Retry-After: 5), db-connection-lost, db-outcome-unknown, or a synchronous upstream dependency refusal.
-
504: Gateway Timeout (RFC 9457 problem document, ADR-068): the route-class request ceiling elapsed (request-timeout) or the database canceled the statement (db-timeout) — the server yields first.
Get a report with its effective disposition and follow-ups
GET /v1/cases/reports/{id}
| Name | In | Required | Description |
|---|---|---|---|
id |
path |
Yes |
Report ID |
-
200: Report found
-
404: Not found
-
503: Service Unavailable (RFC 9457 problem document, ADR-068): database pool exhaustion (carries Retry-After: 5), db-connection-lost, db-outcome-unknown, or a synchronous upstream dependency refusal.
-
504: Gateway Timeout (RFC 9457 problem document, ADR-068): the route-class request ceiling elapsed (request-timeout) or the database canceled the statement (db-timeout) — the server yields first.
Convert a screened-in report into a referral (internal cases-side transition)
POST /v1/cases/reports/{id}/convert
| Name | In | Required | Description |
|---|---|---|---|
id |
path |
Yes |
Report ID |
| Field | Type | Required | Description |
|---|---|---|---|
icwa_flag |
boolean |
No |
|
priority |
enum (immediate, 24_hour, 72_hour) |
Yes |
Referral/investigation priority level. |
seed_case_id |
UUID (optional) |
No |
Optional case id whose household persons join the auto-link candidate seed set. |
-
200: Referral created (idempotent: returns the existing referral if already converted). Person auto-link runs ASYNC via the case.report_converted consumer (ADR-062 §G4) — 200 means the referral committed; links land shortly after.
-
400: Invalid priority or report not in a convertible disposition
-
404: Report not found
-
503: Service Unavailable (RFC 9457 problem document, ADR-068): database pool exhaustion (carries Retry-After: 5), db-connection-lost, db-outcome-unknown, or a synchronous upstream dependency refusal.
-
504: Gateway Timeout (RFC 9457 problem document, ADR-068): the route-class request ceiling elapsed (request-timeout) or the database canceled the statement (db-timeout) — the server yields first.
List the full decision chain for a report, newest first
GET /v1/cases/reports/{id}/decisions
| Name | In | Required | Description |
|---|---|---|---|
id |
path |
Yes |
Report ID |
-
200: Decision chain
-
404: Not found
-
503: Service Unavailable (RFC 9457 problem document, ADR-068): database pool exhaustion (carries Retry-After: 5), db-connection-lost, db-outcome-unknown, or a synchronous upstream dependency refusal.
-
504: Gateway Timeout (RFC 9457 problem document, ADR-068): the route-class request ceiling elapsed (request-timeout) or the database canceled the statement (db-timeout) — the server yields first.
Record a screening decision (initial or override)
POST /v1/cases/reports/{id}/screening-decisions
| Name | In | Required | Description |
|---|---|---|---|
id |
path |
Yes |
Report ID |
| Field | Type | Required | Description |
|---|---|---|---|
actor_role |
string |
Yes |
Role of the worker recording the decision ( |
client_request_id |
UUID |
Yes |
ADR-062 §B (#1257): client-minted idempotency key. REQUIRED — a retry with the same key + identical intent replays the first execution’s decision instead of appending to the chain. |
disposition_kind |
string |
Yes |
Decision outcome ( |
rationale |
string (optional) |
No |
Free-form rationale text. |
supersedes_id |
UUID (optional) |
No |
If overriding a prior decision, the decision_id being superseded. |
-
200: Decision recorded (or replayed — same client_request_id + intent)
-
400: Invalid role/kind or unauthorized override
-
404: Report not found
-
409: client_request_id claimed by a different operation, or replayed entity gone (ADR-062)
-
422: Validation failure (including a missing client_request_id)
-
503: Service Unavailable (RFC 9457 problem document, ADR-068): database pool exhaustion (carries Retry-After: 5), db-connection-lost, db-outcome-unknown, or a synchronous upstream dependency refusal.
-
504: Gateway Timeout (RFC 9457 problem document, ADR-068): the route-class request ceiling elapsed (request-timeout) or the database canceled the statement (db-timeout) — the server yields first.
List follow-up actions attached to a specific decision
GET /v1/cases/reports/{id}/screening-decisions/{decision_id}/follow-ups
| Name | In | Required | Description |
|---|---|---|---|
id |
path |
Yes |
Report ID |
decision_id |
path |
Yes |
Screening decision ID |
-
200: Follow-ups for decision
-
404: Decision not found
-
503: Service Unavailable (RFC 9457 problem document, ADR-068): database pool exhaustion (carries Retry-After: 5), db-connection-lost, db-outcome-unknown, or a synchronous upstream dependency refusal.
-
504: Gateway Timeout (RFC 9457 problem document, ADR-068): the route-class request ceiling elapsed (request-timeout) or the database canceled the statement (db-timeout) — the server yields first.
Attach a follow-up action (external referral, LE assist, info packet) to a decision
POST /v1/cases/reports/{id}/screening-decisions/{decision_id}/follow-ups
| Name | In | Required | Description |
|---|---|---|---|
id |
path |
Yes |
Report ID |
decision_id |
path |
Yes |
Screening decision ID |
| Field | Type | Required | Description |
|---|---|---|---|
action_kind |
string |
Yes |
Action kind ( |
client_request_id |
UUID |
Yes |
ADR-062 §B (#1257): client-minted idempotency key. REQUIRED — a retry with the same key + identical intent replays the first execution’s follow-up instead of recording it twice. |
notes |
string (optional) |
No |
Free-form notes. |
target |
string (optional) |
No |
Optional target entity (person UUID, agency, etc.). |
-
200: Follow-up recorded (or replayed — same client_request_id + intent)
-
400: Invalid action_kind
-
404: Decision not found
-
409: client_request_id claimed by a different operation, or replayed entity gone (ADR-062)
-
422: Validation failure (including a missing client_request_id)
-
503: Service Unavailable (RFC 9457 problem document, ADR-068): database pool exhaustion (carries Retry-After: 5), db-connection-lost, db-outcome-unknown, or a synchronous upstream dependency refusal.
-
504: Gateway Timeout (RFC 9457 problem document, ADR-068): the route-class request ceiling elapsed (request-timeout) or the database canceled the statement (db-timeout) — the server yields first.
Search Capabilities
Advertise per-entity, per-field search capabilities
GET /v1/cases/_meta/search-capabilities
-
200: Advertised capabilities for every entity: effective-scheme capability intersected with the entity descriptor’s declared operations
-
401: Unauthorized
-
503: Service Unavailable (RFC 9457 problem document, ADR-068): database pool exhaustion (carries Retry-After: 5), db-connection-lost, db-outcome-unknown, or a synchronous upstream dependency refusal.
-
504: Gateway Timeout (RFC 9457 problem document, ADR-068): the route-class request ceiling elapsed (request-timeout) or the database canceled the statement (db-timeout) — the server yields first.