Financial & Claims API Reference
On this page
Foster care payments, kinship and guardianship subsidies, payment adjustments, rate schedules, and Title IV-E fiscal claiming under the Social Security Act.
Endpoints
Adjustments
List payment adjustments
GET /v1/financial/adjustments
| Name | In | Required | Description |
|---|---|---|---|
page |
query |
No |
Page |
per_page |
query |
No |
Per page |
search |
query |
No |
Full-text search across reason, status, requested_by. |
sort_by |
query |
No |
Sort column: status, reason, amount (default: created_at). |
sort_dir |
query |
No |
Sort direction: asc or desc (default: desc). |
-
200: Page of adjustments
-
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.
Get a payment adjustment
GET /v1/financial/adjustments/{id}
| Name | In | Required | Description |
|---|---|---|---|
id |
path |
Yes |
Adjustment ID |
-
200: Payment adjustment
-
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 pending payment adjustment
DELETE /v1/financial/adjustments/{id}
| Name | In | Required | Description |
|---|---|---|---|
id |
path |
Yes |
Adjustment ID |
-
204: Adjustment deleted
-
401: Unauthorized
-
403: Forbidden
-
404: Not found
-
409: Adjustment is not pending
-
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 a payment adjustment
PUT /v1/financial/adjustments/{id}/approve
| Name | In | Required | Description |
|---|---|---|---|
id |
path |
Yes |
Adjustment ID |
-
200: Adjustment approved
-
400: Invalid state transition
-
401: Unauthorized
-
403: Forbidden
-
404: Not found
-
409: Status moved concurrently since your read (ADR-062 §G3), or the parent payment is aggregated by a submitted/accepted claim —
claimed-payment-frozen(#1357) -
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.
Deny a payment adjustment
PUT /v1/financial/adjustments/{id}/deny
| Name | In | Required | Description |
|---|---|---|---|
id |
path |
Yes |
Adjustment ID |
-
200: Adjustment denied (terminal — the resolver is recorded in the approved_by/approved_at columns, which record the RESOLVER for both outcomes)
-
400: Invalid state transition
-
401: Unauthorized
-
403: Forbidden
-
404: Not found
-
409: Status moved concurrently since your read — re-read and retry (ADR-062 §G3)
-
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 payment adjustment
POST /v1/financial/payments/{id}/adjustments
| Name | In | Required | Description |
|---|---|---|---|
id |
path |
Yes |
Payment ID |
| Field | Type | Required | Description |
|---|---|---|---|
amount |
string |
Yes |
Signed adjustment amount (negative for a clawback; rides the wire as a
string via |
client_request_id |
UUID |
Yes |
Client-minted idempotency id (ADR-062 §B, #1263) — REQUIRED. Same id + identical intent replays the original adjustment; a different intent under the same id is a 409 idempotency-conflict. |
reason |
string |
Yes |
Free-text justification for the adjustment. |
-
200: Adjustment created (or replayed — same client_request_id + intent)
-
401: Unauthorized
-
403: Forbidden
-
404: Payment 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.
Claims
List claiming records
GET /v1/financial/claims
| Name | In | Required | Description |
|---|---|---|---|
page |
query |
No |
Page |
per_page |
query |
No |
Per page |
claiming_period |
query |
No |
Claiming period |
payment_type |
query |
No |
Payment type |
status |
query |
No |
Status |
search |
query |
No |
Full-text search across claiming_period, payment_type. |
sort_by |
query |
No |
Sort column: claiming_period, status, payment_type (default: created_at). |
sort_dir |
query |
No |
Sort direction: asc or desc (default: desc). |
-
200: Page of claiming records
-
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.
Generate a claiming record from disbursed (issued or cleared) payments
POST /v1/financial/claims/generate
| Field | Type | Required | Description |
|---|---|---|---|
ccwis_operations_cost |
string |
No |
CCWIS operations cost rolled into the claim (defaults to zero; rides the
wire as a string via |
claiming_period |
string |
Yes |
Claiming-period label (e.g. |
client_request_id |
UUID |
Yes |
Client-minted idempotency id (ADR-062 §B, #1263) — REQUIRED. Same id + identical intent replays the ORIGINAL claiming record (its aggregated money as of the first execution — never recomputed); a different intent under the same id is a 409 idempotency-conflict. |
payment_type |
string |
Yes |
Payment type the claim covers. |
period_end |
date |
Yes |
Last day of the claiming period (inclusive). |
period_start |
date |
Yes |
First day of the claiming period (inclusive). |
-
200: Claiming record generated (a replay returns the ORIGINAL record — same client_request_id + intent; the money is never recomputed)
-
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 claiming record by ID
GET /v1/financial/claims/{id}
| Name | In | Required | Description |
|---|---|---|---|
id |
path |
Yes |
Claiming record ID |
-
200: Claiming record details
-
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.
Record federal acceptance of a submitted claiming record
PUT /v1/financial/claims/{id}/accept
| Name | In | Required | Description |
|---|---|---|---|
id |
path |
Yes |
Claiming record ID |
-
200: Federal acceptance recorded (actor + timestamp frozen onto the record)
-
400: Invalid state transition
-
401: Unauthorized
-
403: Forbidden
-
404: Not found
-
409: Status moved concurrently since your read — re-read and retry (ADR-062 §G3)
-
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 draft claiming record
PUT /v1/financial/claims/{id}/submit
| Name | In | Required | Description |
|---|---|---|---|
id |
path |
Yes |
Claiming record ID |
-
200: Claiming record submitted
-
400: Invalid state transition
-
401: Unauthorized
-
403: Forbidden
-
404: Not found
-
409: Status moved concurrently since your read (ADR-062 §G3), or the draft’s totals are stale / its window unrecorded —
claim-totals-stale: regenerate before submitting (#1357) -
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.
Payments
List payments
GET /v1/financial/payments
| Name | In | Required | Description |
|---|---|---|---|
page |
query |
No |
Page |
per_page |
query |
No |
Per page |
case_id |
query |
No |
Case id |
foster_home_id |
query |
No |
Foster home id |
agreement_id |
query |
No |
#1068: narrow to one subsidy agreement’s payment stream. |
child_id |
query |
No |
#1068: narrow to one child (spans both origins). |
status |
query |
No |
Status |
period_start |
query |
No |
Period start |
period_end |
query |
No |
Period end |
ive_eligible |
query |
No |
Ive eligible |
search |
query |
No |
Full-text search across status, payment_type, created_by. |
sort_by |
query |
No |
Sort column: status, period_start, payment_type (default: created_at). |
sort_dir |
query |
No |
Sort direction: asc or desc (default: desc). |
-
200: Page of payments
-
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.
Calculate a payment preview
POST /v1/financial/payments/calculate
Looks up the applicable rate and calculates a payment preview without persisting.
| Field | Type | Required | Description |
|---|---|---|---|
case_id |
UUID |
Yes |
Case the payment belongs to. |
child_age |
integer |
Yes |
Child’s age, used to select the matching rate band (#775: 0..=21 — the extended-IV-E ceiling; out-of-band ages refuse typed instead of silently matching no rate). |
child_id |
UUID |
Yes |
Child the payment is for. |
foster_home_id |
UUID |
Yes |
Foster home receiving the payment. |
jurisdiction |
string |
Yes |
Jurisdiction whose rate table applies. |
payment_type |
string |
Yes |
Payment type (e.g. |
period_end |
date |
Yes |
Last day of the payment period (inclusive). |
period_start |
date |
Yes |
First day of the payment period (inclusive). |
placement_id |
UUID |
Yes |
Placement the payment derives from. |
-
200: Payment preview
-
401: Unauthorized
-
403: Forbidden
-
404: No applicable rate 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.
Get payment by ID
GET /v1/financial/payments/{id}
| Name | In | Required | Description |
|---|---|---|---|
id |
path |
Yes |
Payment ID |
-
200: Payment details
-
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.
Approve a pending payment
PUT /v1/financial/payments/{id}/approve
Advances pending → approved atomically and stages financial.payment_approved in the same transaction.
| Name | In | Required | Description |
|---|---|---|---|
id |
path |
Yes |
Payment ID |
-
200: Payment approved
-
400: Invalid state transition
-
401: Unauthorized
-
403: Forbidden
-
404: Not found
-
409: 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.
Clear an issued payment
PUT /v1/financial/payments/{id}/clear
Records reconciliation clearance: advances issued → cleared atomically and stages financial.payment_cleared in the same transaction.
| Name | In | Required | Description |
|---|---|---|---|
id |
path |
Yes |
Payment ID |
-
200: Payment cleared
-
400: Invalid state transition
-
401: Unauthorized
-
403: Forbidden
-
404: Not found
-
409: 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.
Issue an approved payment
PUT /v1/financial/payments/{id}/issue
Records disbursement: advances approved → issued atomically and stages financial.payment_issued in the same transaction. Issued payments enter Title IV-E claim aggregation.
| Name | In | Required | Description |
|---|---|---|---|
id |
path |
Yes |
Payment ID |
-
200: Payment issued
-
400: Invalid state transition
-
401: Unauthorized
-
403: Forbidden
-
404: Not found
-
409: 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.
Void an undisbursed payment (deliberate manual void)
PUT /v1/financial/payments/{id}/void
Voids a single pending/approved payment atomically, stamping who/when/why on the row and staging financial.payment_voided in the same transaction. issued/cleared payments are refused (typed 400 disbursed-payment-void): disbursed IV-E funds are corrected via payment adjustments, never clawed back — the same policy boundary as the system bulk voids (#776). The reason stays on the row; it never rides the event.
| Name | In | Required | Description |
|---|---|---|---|
id |
path |
Yes |
Payment ID |
| Field | Type | Required | Description |
|---|---|---|---|
reason |
string |
Yes |
Why this payment is being voided (data-entry error, duplicate, …). Must contain at least one non-whitespace character. |
-
200: Payment voided
-
400: Already voided (invalid-state-transition), disbursed (disbursed-payment-void), or validation failure
-
401: Unauthorized
-
403: Forbidden
-
404: Not found
-
409: Defensive arm: a still-voidable row after a zero-row CAS miss — unreachable today (no writer reverses payment status)
-
422: Validation failure (blank/oversized 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.
Run subsidy payment generation for one month
POST /v1/financial/subsidy-payments/generate
Reconcile-then-generate the monthly subsidy payment stream (ADR-053). Bounded to the last 12 months; one run at a time (409 when the lease is held); Georgia-only policy (400 elsewhere). Partial success: per-child failures increment errors and the run still returns 200.
| Field | Type | Required | Description |
|---|---|---|---|
month |
string (optional) |
No |
Target month as a canonical |
-
200: Run report
-
400: Out-of-range month or unsupported jurisdiction
-
401: Unauthorized
-
403: Forbidden
-
409: A generation run is already in progress
-
422: Malformed month token
-
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.
Rates
List payment rate tables
GET /v1/financial/rates
| Name | In | Required | Description |
|---|---|---|---|
page |
query |
No |
Page |
per_page |
query |
No |
Per page |
jurisdiction |
query |
No |
Jurisdiction |
payment_type |
query |
No |
Payment type |
search |
query |
No |
Full-text search across jurisdiction, payment_type. |
sort_by |
query |
No |
Sort column: jurisdiction, payment_type, effective_date (default: created_at). |
sort_dir |
query |
No |
Sort direction: asc or desc (default: desc). |
-
200: Page of rate tables
-
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 payment rate table entry
POST /v1/financial/rates
| Field | Type | Required | Description |
|---|---|---|---|
age_max |
integer |
Yes |
Inclusive upper bound of the child-age band the rate applies to (#775: 0..=21). |
age_min |
integer |
Yes |
Inclusive lower bound of the child-age band the rate applies to (#775: 0..=21 — the extended-IV-E ceiling; band ordering is the handler’s cross-field check). |
client_request_id |
UUID |
Yes |
Client-minted idempotency id (ADR-062 §B, #1263) — REQUIRED. Same id + identical intent replays the original rate row; a different intent under the same id is a 409 idempotency-conflict. |
daily_rate |
string |
Yes |
Daily maintenance rate (rides the wire as a string via |
effective_date |
date |
Yes |
Date the rate becomes effective (window ordering vs |
end_date |
date (optional) |
No |
Optional date the rate stops applying (open-ended when absent). |
jurisdiction |
string |
Yes |
Jurisdiction the rate applies to (e.g. |
payment_type |
string |
Yes |
Payment type the rate covers (e.g. |
-
200: Rate 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 rate table entry
GET /v1/financial/rates/{id}
| Name | In | Required | Description |
|---|---|---|---|
id |
path |
Yes |
Rate ID |
-
200: Rate table entry
-
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 rate table entry
PUT /v1/financial/rates/{id}
| Name | In | Required | Description |
|---|---|---|---|
id |
path |
Yes |
Rate ID |
If-Match |
header |
Yes |
REQUIRED row version from your last read (ADR-062 §G3), e.g. |
| Field | Type | Required | Description |
|---|---|---|---|
age_max |
integer (optional) |
No |
New age-band upper bound, or unchanged when absent (#775: 0..=21). |
age_min |
integer (optional) |
No |
New age-band lower bound, or unchanged when absent (#775: 0..=21). |
daily_rate |
string (optional) |
No |
New daily rate, or unchanged when absent (#773/#775: positive,
≤ 2 dp, bounded — same rules as create; |
effective_date |
date (optional) |
No |
New effective date, or unchanged when absent. |
end_date |
date (optional) |
No |
|
jurisdiction |
string (optional) |
No |
New jurisdiction, or unchanged when absent. |
payment_type |
string (optional) |
No |
New payment type, or unchanged when absent. |
-
200: Rate updated
-
400: Missing or malformed If-Match
-
401: Unauthorized
-
403: Forbidden
-
404: Not found (including a tombstoned rate — previously still mutable)
-
409: Version moved since your read (stale If-Match) — 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 rate table entry
DELETE /v1/financial/rates/{id}
| Name | In | Required | Description |
|---|---|---|---|
id |
path |
Yes |
Rate ID |
-
204: Rate 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.
Subsidy Agreements
List subsidy agreements
GET /v1/financial/subsidy-agreements
Pages agreement summaries (identity + current term). Enum filter tokens are validated up front (unknown → 400); a caller whose list scope resolves to denied receives an explicit 403, never an empty page.
| Name | In | Required | Description |
|---|---|---|---|
page |
query |
No |
Page |
per_page |
query |
No |
Per page |
child_id |
query |
No |
Filter by the subsidized child. |
case_id |
query |
No |
Filter by owning case. |
program |
query |
No |
Program token (snake_case; e.g. |
current_status |
query |
No |
Projection-status token (e.g. |
-
200: Page of subsidy-agreement summaries
-
400: Unrecognized program / status filter token
-
401: Unauthorized
-
403: Forbidden — including a denied list scope
-
422: Query validation failed
-
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.
Native subsidy enrollment, program-tagged (#1069 ERR / #1070 guardianship)
POST /v1/financial/subsidy-agreements
-
200: The created agreement’s full detail (also the exact-replay response)
-
400: Wire validation / placement eligibility / date-rule / per-diem-conflict failure
-
401: Missing or invalid token
-
403: Authorization denied, or the ERR feature gate is OFF (the detail names the knob)
-
409: Same client_request_id with a different payload, or an open episode already exists
-
503: craig-placement unreachable — the anchoring placement cannot be verified
-
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 subsidy agreement by ID
GET /v1/financial/subsidy-agreements/{id}
Full agreement detail: identity + provenance, signatory parties, and the complete term-revision and status-interval ledgers (each ordered (effective_from, id)).
| Name | In | Required | Description |
|---|---|---|---|
id |
path |
Yes |
Subsidy agreement ID |
-
200: Subsidy agreement detail
-
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.
Witnessed guardianship activation (#1070, U4-gated)
POST /v1/financial/subsidy-agreements/{id}/activate
| Name | In | Required | Description |
|---|---|---|---|
id |
path |
Yes |
Agreement id |
| Field | Type | Required | Description |
|---|---|---|---|
court_order_evidence_key |
string |
Yes |
UNVERIFIED evidence reference: the permanent-guardianship court order (required non-blank, F7). |
expected_head_interval_id |
UUID |
Yes |
CAS: the open pending head interval the caller decided on. |
legal_reference |
string (optional) |
No |
Court order / docket reference — NULL→value records it; a value DIFFERENT from the recorded one is a typed conflict. |
tanf_terminated_on |
date (optional) |
No |
Operator ATTESTATION (unverified, past-dated): the date TANF for the child terminated, when the caregiver received it — shifts the money boundary later (F2). TANF still active ⇒ activate after it ends (runbook). |
-
200: The activated agreement’s detail (also the recognized-replay response)
-
400: Witness failure: placement still active / wrong end reason / child mismatch / reunification goal / signing, residence-floor or date-window refusal
-
401: Missing or invalid token
-
403: Authorization denied, or the SG feature gate is OFF (the detail names the knob)
-
404: Agreement not found
-
409: Stale head (CAS — incl. a mismatched retry after success), a differing legal reference, or an open sibling agreement
-
503: craig-placement unreachable — the transfer cannot be verified
-
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.
POST /financial/subsidy-agreements/{id}/reviews — schedule the
type’s open slot (#1095). Replay with the open slot’s due → 200 with the existing row (no event); a different due → 409 naming it.
POST /v1/financial/subsidy-agreements/{id}/reviews
| Name | In | Required | Description |
|---|---|---|---|
id |
path |
Yes |
Agreement id |
| Field | Type | Required | Description |
|---|---|---|---|
due_on |
date |
Yes |
Statutory due date for the slot. |
review_type |
string |
Yes |
Review type token: |
-
200: The open slot (created or replayed)
-
400: Validation / window-authority failure
-
401: Missing or invalid token
-
403: Authorization denied
-
404: Agreement not found
-
409: An open slot exists with a different due
-
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.
POST /financial/subsidy-agreements/{id}/reviews/{review_id}/completion
— complete a review with its linkage orchestrated in ONE transaction
(#1095): a continued/amended RENEWAL re-signs (term append, kind
Renewal) and links resulting_term_id; suspended/terminated outcomes
perform the CAS transition and link resulting_interval_id. An
identical replay returns the prior record (200); a differing one is a
409 — the fingerprint check runs BEFORE any append/transition, so a
replay can never duplicate a revision.
POST /v1/financial/subsidy-agreements/{id}/reviews/{review_id}/completion
| Name | In | Required | Description |
|---|---|---|---|
id |
path |
Yes |
Agreement id |
review_id |
path |
Yes |
The open slot being completed |
| Field | Type | Required | Description |
|---|---|---|---|
completed_on |
date |
Yes |
Business date the review was completed (never in the future). |
evidence_document_key |
string (optional) |
No |
Object-store key of supporting verification evidence (untrusted reference; namespace-shape validated at the API). |
outcome |
string |
Yes |
Outcome token: |
|
|
|
terms |
ReviewTermsPayload (optional) |
No |
Terms |
transition |
-
200: The completed review record
-
400: Shape / authority / validation failure
-
401: Missing or invalid token
-
403: Authorization denied
-
404: Agreement or review not found
-
409: Differing replay, superseded slot, or stale CAS head
-
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.
POST /financial/subsidy-agreements/{id}/reviews/{review_id}/reschedule
— audited supersession + same-cycle successor (#1095). Idempotent on
(slot, new_due_on); the successor’s due obeys the natural window.
POST /v1/financial/subsidy-agreements/{id}/reviews/{review_id}/reschedule
| Name | In | Required | Description |
|---|---|---|---|
id |
path |
Yes |
Agreement id |
review_id |
path |
Yes |
The slot being superseded |
| Field | Type | Required | Description |
|---|---|---|---|
new_due_on |
date |
Yes |
The successor slot’s due date (same cycle — cycle is the identity; due dates are data). |
reason |
string |
Yes |
Why the due date moved — retained forever on the superseded row’s audit triple. |
-
200: The live successor slot
-
400: Validation / window-authority failure
-
401: Missing or invalid token
-
403: Authorization denied
-
404: Agreement or review not found
-
409: Slot completed, or superseded with a different due
-
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.
POST /financial/subsidy-agreements/{id}/terms — CAS terms
amendment (#1095). The request carries NO anchor fields: the store
derives renewal_review_due/paper_review_due (ADR-054 anchor
preservation) — the head’s values below are placeholders it
overwrites.
POST /v1/financial/subsidy-agreements/{id}/terms
| Name | In | Required | Description |
|---|---|---|---|
id |
path |
Yes |
Agreement id |
| Field | Type | Required | Description |
|---|---|---|---|
amount_basis |
string |
Yes |
Rate-schedule citation backing the amount. |
education_basis |
string (optional) |
No |
Extension basis (school/GED enrollment description), when the flag is set. |
education_expires_on |
date (optional) |
No |
Date the education verification lapses, when the flag is set. |
education_extension |
boolean |
Yes |
Age-19 school/GED extension flag (22.8). |
education_verified_by |
string (optional) |
No |
Worker who verified the education basis, when the flag is set. |
effective_from |
date |
Yes |
Business-effective start of the appended revision (closes the current revision at the same date — half-open windows). |
expected_head_term_id |
UUID |
Yes |
The open term revision the caller last read — the
optimistic-concurrency token the store compares-and-swaps on
(stale → typed 409; retry-after-success → 409, see
[ |
monthly_amount |
string |
Yes |
New monthly subsidy amount (Decimal wire string, e.g. |
-
200: The new term revision
-
400: Validation / supervisor-session / office-authority failure, or unsupported jurisdiction (writes are Georgia-defined, ADR-054)
-
401: Missing or invalid token
-
403: Authorization denied
-
404: Agreement not found
-
409: Stale head term (CAS) — 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.
POST /financial/subsidy-agreements/{id}/transitions — CAS status
transition (#1095). Rejects pending → active outright: activation
requires eligibility evidence and ships with the #1069/#1070 flows.
POST /v1/financial/subsidy-agreements/{id}/transitions
| Name | In | Required | Description |
|---|---|---|---|
id |
path |
Yes |
Agreement id |
| Field | Type | Required | Description |
|---|---|---|---|
business_date |
date |
Yes |
Business-effective start of the new interval (strictly after the open head’s start, never in the future — ADR-052). |
expected_head_interval_id |
UUID |
Yes |
The open status interval the caller last read — the optimistic-concurrency token the store compares-and-swaps on. |
note |
string (optional) |
No |
Free-text protected note carried on the interval (never traced — #1064 doctrine). |
reason_code |
string (optional) |
No |
Controlled-vocabulary cause — required for reason statuses (suspended/terminated/withdrawn/declined), forbidden otherwise; membership is validated server-side. |
to_status |
string |
Yes |
Target status token ( |
-
200: The new head interval
-
400: Validation / vocabulary / office-authority failure, or unsupported jurisdiction (writes are Georgia-defined, ADR-054)
-
401: Missing or invalid token
-
403: Authorization denied
-
404: Agreement not found
-
409: Stale head (CAS) — 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.
POST /financial/subsidy-reviews/sweep/preview — pin the current
actionable sets into a previewed run and mint the single-use
execute token (#1096). #1263: the run row commits atomically with
its ADR-062 claim — a lost response can never strand an unclaimed
previewed row. A verified replay returns the SAME run (original
pinned sets + as-of) with a freshly ROTATED token (the row stores
only a digest, so the lost original is unrecoverable by design);
a run that has moved on answers a typed 409.
POST /v1/financial/subsidy-reviews/sweep/preview
| Field | Type | Required | Description |
|---|---|---|---|
client_request_id |
UUID |
Yes |
Client-minted idempotency id (ADR-062 §B, #1263) — REQUIRED. Replaying it returns the SAME still-previewed run (original pinned sets and as-of) with a freshly ROTATED single-use execute token — the prior token is invalidated, never re-exposed (the row stores only a digest). A run that has moved on (executed / expired) answers a typed 409: preview again under a fresh id. |
-
200: The pinned candidate sets + the one-time execute token (a replay of a still-previewed run rotates the token; the original pinned sets and as-of return unchanged)
-
400: Unsupported jurisdiction (the sweep is Georgia-defined, ADR-054)
-
401: Missing or invalid token
-
403: Authorization denied
-
409: client_request_id claimed by a different operation (ADR-062), or the replayed run has moved on (executed / expired) — preview again under a fresh id
-
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 /financial/subsidy-reviews/sweep/runs — recent run records,
newest first (#1096; the U5 operator surface).
GET /v1/financial/subsidy-reviews/sweep/runs
| Name | In | Required | Description |
|---|---|---|---|
limit |
query |
No |
Max rows (default 50, clamped 1..=200). |
-
200: Recent sweep runs
-
401: Missing or invalid token
-
403: Authorization denied
-
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 /financial/subsidy-reviews/sweep/runs/{run_id} — one run
record (#1096).
GET /v1/financial/subsidy-reviews/sweep/runs/{run_id}
| Name | In | Required | Description |
|---|---|---|---|
run_id |
path |
Yes |
Run id |
-
200: The run record
-
401: Missing or invalid token
-
403: Authorization denied
-
404: Run 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.
POST /financial/subsidy-reviews/sweep/{run_id}/execute — redeem a
preview: regional office + the one-time token + the CAS (#1096).
POST /v1/financial/subsidy-reviews/sweep/{run_id}/execute
| Name | In | Required | Description |
|---|---|---|---|
run_id |
path |
Yes |
The previewed run |
| Field | Type | Required | Description |
|---|---|---|---|
acknowledged_handoff |
integer |
No |
Leg-3 handoff candidates the caller rendered. |
acknowledged_suspend |
integer |
No |
Leg-1 candidates the caller rendered (must equal the pinned suspend set’s size). |
acknowledged_terminate |
integer |
No |
Leg-2 candidates the caller rendered. |
execute_token |
string |
Yes |
The preview’s single-use token (server-validated by digest). |
-
200: The finished run’s report (partial success carries nonzero errors)
-
400: Bad token / office authority / jurisdiction failure
-
401: Missing or invalid token
-
403: Authorization denied
-
404: Run not found
-
409: Run not previewable (replayed/concurrent/expired), acknowledged counts stale (#1069 M3), or a sweep already running
-
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.
Subsidy Imports
Create a conversion batch (#1071 ADR-057; knob-gated, admin-only)
POST /v1/financial/subsidy-imports
| Field | Type | Required | Description |
|---|---|---|---|
client_request_id |
UUID |
Yes |
Client-minted idempotency id (ADR-062 §B, #1263) — REQUIRED.
Same id + identical intent replays the original batch (its
detail view with CURRENT record counts); a different intent
under the same id is a 409 idempotency-conflict. The xtask
import tool pins it via |
cutover_month |
date |
Yes |
The inter-system money boundary (month-start; > |
expected_count |
integer |
Yes |
The manifest’s record count (1..=50000 — DDL-checked). |
manifest_checksum |
string |
Yes |
sha256 hex over the sorted |
snapshot_date |
date |
Yes |
The named conversion baseline (G7): CRAIG’s review chain starts here; SHINES stays authoritative for earlier history. |
source_system |
string |
Yes |
Conversion source vocabulary token ( |
-
200: The created batch (a replay returns its detail view with CURRENT record counts — same client_request_id + intent)
-
400: Wire validation failure (vocabulary, month shape, checksum shape)
-
401: Missing or invalid token
-
403: Authorization denied, or the import gate is OFF (the detail names the knob)
-
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.
Batch detail + live per-status counts (readable knob-off for audit)
GET /v1/financial/subsidy-imports/{id}
| Name | In | Required | Description |
|---|---|---|---|
id |
path |
Yes |
Batch ID |
-
200: Batch detail
-
401: Missing or invalid token
-
403: Authorization denied
-
404: Batch 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.
Abort a staging batch (frees every live claim; replay-honest)
POST /v1/financial/subsidy-imports/{id}/abort
| Name | In | Required | Description |
|---|---|---|---|
id |
path |
Yes |
Batch ID |
-
200: The aborted batch (also the already-aborted replay)
-
401: Missing or invalid token
-
403: Authorization denied, or the import gate is OFF
-
404: Batch not found
-
409: Abort is forbidden once finalize started (typed batch-state)
-
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.
Finalize (or resume finalizing) — the single money-consent act (#1071 D12)
POST /v1/financial/subsidy-imports/{id}/finalize
| Name | In | Required | Description |
|---|---|---|---|
id |
path |
Yes |
Batch ID |
-
200: The pass report (also the deterministic replay once finalized)
-
400: The session lacks state-office authority (the office refusal names it)
-
401: Missing or invalid token
-
403: Authorization denied, or the import gate is OFF
-
404: Batch not found
-
409: Manifest mismatch (the four numbers), batch state, or another finalize holds the lease
-
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 records ledger — the reconciliation export (readable knob-off)
GET /v1/financial/subsidy-imports/{id}/records
| Name | In | Required | Description |
|---|---|---|---|
id |
path |
Yes |
Batch ID |
page |
query |
No |
Page |
per_page |
query |
No |
Per page |
-
200: One page of records (staging order) + total
-
401: Missing or invalid token
-
403: Authorization denied
-
404: Batch 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.
Stage one source record (full validation now; replay-honest, #1071 D4)
POST /v1/financial/subsidy-imports/{id}/records
| Name | In | Required | Description |
|---|---|---|---|
id |
path |
Yes |
Batch ID |
| Field | Type | Required | Description |
|---|---|---|---|
agreement_document_key |
string (optional) |
No |
Object-store key of the scanned artifact, when available. |
approving_county |
string |
Yes |
Approving county. |
case_id |
UUID (optional) |
No |
Owning case, when known. |
child_id |
UUID |
Yes |
The subsidized child (S2S-verified at the service). |
external_reference |
string |
Yes |
The source system’s record identifier (the replay key — one LIVE
claim across all batches). NUL / newline are refused: they are
the manifest checksum’s pair-framing bytes
([ |
form_number |
string |
Yes |
Signed form identity (may be a legacy placeholder token). |
form_version |
string |
Yes |
Signed form version. |
intervals |
array of ImportIntervalRecord |
Yes |
Full historical interval chain (1..=200, contiguous, last open). |
legal_county |
string (optional) |
No |
Legal county, when distinct. |
legal_reference |
string (optional) |
No |
Court order / docket reference. |
parties |
array of ImportPartyRecord |
Yes |
Signatories (≥1 caregiver on non-terminal heads; ≤16). |
predecessor_external_reference |
string (optional) |
No |
Predecessor EXTERNAL reference (same source system) — resolved to the materialized predecessor’s agreement id at validation (same child, same family, terminal, closed before this chain). |
program |
enum (rcs, ercs, ersg, enrsg) |
Yes |
The four GA 22.8 closed cohorts — the ONLY programs a conversion import can carry (ADR-057 D2). Open-program conversion is a recorded non-goal (native re-enrollment). |
signed_at |
date |
Yes |
Signature date. |
terms |
array of ImportTermsRecord |
Yes |
Full term-revision chain (1..=200, ordered, last open). |
-
200: Replay outcome (already_staged / restaged / already_imported) with the ORIGINAL facts
-
201: Fresh row staged (or rejected with typed blockers — a successful reconciliation outcome)
-
400: Wire validation failure
-
401: Missing or invalid token
-
403: Authorization denied, or the import gate is OFF
-
404: Batch not found
-
409: Batch state / batch conflict / post-finalize content conflict (typed)
-
503: craig-cases unreachable — record references cannot be verified (fail-closed)
-
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.