Errors
Every error is an RFC 9457 problem document. The HTTP status says what class of thing went wrong; the code says exactly what, and never changes.
The problem document
codestringAlwaysThe stable identifier to branch on. Codes shared by every route are bare (not_found); a service's own are prefixed (ledger.insufficient_available).
retryablebooleanAlwaysWhether sending the same request again can succeed. With an idempotency key, retrying is always safe.
statusintegerAlwaysThe HTTP status, repeated in the body.
titlestringAlwaysA sentence for a person. Do not parse it.
typestring · uriAlwaysThe problem type, as RFC 9457 defines it.
detailstringSometimesWhat was wrong with this request in particular.
errorsarray of objectsSometimesOn a validation failure, each field and the reason it was refused.
instancestringSometimesThe request id. Quote it when asking about a failed request.
Every code
This list is read from the catalogue in the code, so it is complete.
Shared by every route
| Code | Status | Meaning | Retry |
|---|---|---|---|
validation_failed | 400 | The request is invalid | No |
malformed_request | 400 | The request body could not be parsed | No |
unauthenticated | 401 | Authentication is required | No |
forbidden | 403 | The caller may not perform this action | No |
not_found | 404 | The resource does not exist | No |
conflict | 409 | The request conflicts with the current state | No |
idempotency_key_reused | 422 | Idempotency key was used with a different request | No |
idempotency_in_progress | 409 | A request with this idempotency key is still being processed | Yes |
step_up_required | 403 | A fresh authentication is required for this action | No |
rate_limited | 429 | Too many requests | Yes |
request_too_large | 413 | Request body too large | No |
precondition_failed | 412 | Resource version changed | No |
internal | 500 | An internal error occurred | Yes |
unavailable | 503 | The service is temporarily unavailable | Yes |
dependency_failed | 424 | A dependency of this request failed | Yes |
Ledger
| Code | Status | Meaning | Retry |
|---|---|---|---|
ledger.journal_unbalanced | 422 | Journal debits do not equal credits | No |
ledger.currency_mismatch | 422 | Entries are not all in the account's currency | No |
ledger.account_closed | 422 | The ledger account is closed | No |
ledger.account_unknown | 422 | The ledger account does not exist | No |
ledger.insufficient_available | 422 | Available balance is insufficient | No |
ledger.business_date_closed | 422 | The business date is closed | No |
ledger.hold_not_active | 422 | The hold is not active | No |
ledger.journal_already_reversed | 422 | The journal has already been reversed | No |
ledger.maker_checker_required | 422 | A manual posting needs a maker and a distinct checker | No |
ledger.serialization_retry_exhausted | 409 | The posting could not be serialized; retry | Yes |
ledger.balance_definition_unknown | 422 | The balance definition does not exist | No |
ledger.period_not_ready | 422 | Every banking day of the period must be closed first | No |
ledger.period_closed | 422 | The accounting period is closed | No |
ledger.account_not_empty | 422 | The ledger account still has a balance or active holds | No |
ledger.currency_unsupported | 422 | The currency is not one the ledger is configured to hold | No |
ledger.cross_currency_requires_fx_position | 422 | A movement between currencies must pass through the FX position accounts with a recorded rate and USD equivalent | No |
ledger.fx_rate_unavailable | 409 | No independently approved rate covers this currency now | No |
ledger.fx_quote_expired | 409 | The FX quote is no longer valid | No |
ledger.fx_limit_exceeded | 422 | The conversion exceeds an approved FX limit | No |
ledger.reconciliation_required | 409 | Earlier ledger state must be reconciled before this can proceed | No |
ledger.backdate_reason_required | 422 | A backdated journal needs a reason | No |
ledger.backdate_too_old | 422 | The effective date is further back than backdating allows | No |
ledger.vostro_unsupported | 422 | The bank keeps no correspondent accounts for other banks | No |
ledger.correspondent_route_unavailable | 409 | No reviewed, open nostro account settles the currency | No |
ledger.statement_refused | 422 | The cash management message cannot be accepted | No |
Accounts
| Code | Status | Meaning | Retry |
|---|---|---|---|
accounts.reconciliation_required | 409 | Earlier account state must be reconciled before this can proceed | No |
accounts.export_not_configured | 409 | The filing export is not configured for this environment | No |
accounts.account_not_empty | 422 | The account still has a balance or pending activity | No |
accounts.cycle_not_ready | 422 | The statement cycle cannot run yet | No |
accounts.product_not_live | 422 | The product version is not live | No |
accounts.account_not_open | 422 | The account is not open | No |
accounts.currency_unsupported | 422 | This workflow does not support the account's currency | No |
accounts.fx_quote_expired | 409 | The exchange rate quoted is no longer valid | No |
accounts.debit_blocked | 422 | An active bank restriction prevents new debits | No |
accounts.withdrawal_restricted | 422 | The account does not permit this withdrawal | No |
accounts.customer_not_eligible | 422 | The customer is not eligible for this product | No |
accounts.deposit_screening_declined | 422 | Deposit-account screening declined or referred the consumer | No |
accounts.not_escheatable | 422 | The account does not meet the state's abandonment period or the notice requirement | No |
accounts.garnishment_not_open | 422 | The garnishment is not open | No |
accounts.certificate_locked | 422 | The certificate is inside its term; withdraw early through the accounts service and pay the penalty | No |
accounts.transfer_limit_reached | 422 | The account has used the product's convenient transfers for the statement cycle | No |
accounts.not_a_certificate | 422 | The account is not a certificate | No |
accounts.rule_set_incomplete | 422 | The product has an event without an accounting rule | No |
Payments
| Code | Status | Meaning | Retry |
|---|---|---|---|
payments.reconciliation_required | 409 | Earlier payment state must be reconciled before this can proceed | No |
payments.duplicate_item | 409 | The same item was already deposited and has not been returned | No |
payments.limit_exceeded | 422 | The payment exceeds a limit | No |
payments.originator_limit_exceeded | 422 | The originator's exposure limit would be exceeded | No |
payments.screening_hit | 422 | The payment is held for screening review | No |
payments.cutoff_passed | 422 | The requested window has closed | No |
payments.invalid_routing_number | 422 | The routing number is invalid | No |
payments.rail_unavailable | 503 | The payment rail is unavailable | Yes |
payments.duplicate_trace | 409 | An entry with this trace number already exists | No |
payments.no_pending_transfers | 422 | There are no pending transfers to send | No |
payments.file_not_sent | 422 | The file has not been sent to the rail | No |
payments.transfer_not_settled | 422 | Only a settled transfer can be returned | No |
payments.unsupported_sec_code | 422 | The SEC code is not supported | No |
payments.exposure_limit_exceeded | 422 | The originator's exposure limit would be exceeded | No |
payments.originator_suspended | 422 | The originator is suspended | No |
payments.prenote_required | 422 | The counterparty account has not been verified by a prenotification | No |
payments.check_not_returnable | 422 | The item cannot be returned in its state | No |
payments.stop_payment_matched | 422 | A stop payment order covers the check | No |
payments.not_reviewable | 422 | The payment is not waiting for review | No |
payments.unsupported_country | 422 | The bank does not send an international entry to that destination | No |
payments.not_cancellable | 422 | The transfer has left for its file window and cannot be cancelled | No |
payments.already_cancelled | 409 | The transfer was already cancelled | No |
payments.same_account | 422 | A transfer needs two different accounts | No |
payments.wire_not_returnable | 422 | Only a settled or unapplied wire can be returned | No |
payments.imad_exhausted | 422 | The rail's message identifiers for the cycle date are spent | Yes |
payments.return_window_closed | 422 | The entry settled too long ago to be returned | No |
payments.wire_not_applicable | 422 | Only an unapplied wire can be applied to an account | No |
payments.return_request_not_open | 422 | The return request is not waiting for a decision | No |
payments.payment_not_returnable | 422 | Only a received payment can be returned | No |
payments.request_not_open | 422 | The payment request is not waiting for that | No |
payments.unknown_gl_code | 422 | The GL code is not in the chart of accounts | No |
payments.approval_required | 422 | The account's policy requires approval before this payment leaves | No |
payments.approval_not_pending | 422 | The approval request is not waiting for a decision | No |
payments.self_approval | 422 | The approver may not decide this request | No |
payments.schedule_not_active | 422 | The schedule is not in a state that allows this | No |
payments.counterparty_deleted | 422 | The counterparty was deleted | No |
payments.same_customer | 422 | Both accounts belong to the same customer | No |
payments.not_in_group | 422 | The entities do not share an active multi-entity group | No |
payments.group_policy | 422 | The group's transfer policy does not let this entity move the money | No |
payments.screening_review_required | 409 | A party screened as a potential match; the instrument is not issued until sanctions review clears it | No |
payments.fraud_review_open | 409 | The payment is held by an open fraud review; only that review releases or rejects it | No |
payments.callback_required | 409 | A verified call-back to the number on the customer record is required before release | No |
payments.unsupported_deposit_channel | 422 | The bank does not take deposits through that channel | No |
payments.control_approval_required | 409 | Loosening a payment control is recorded as a change and applied only when a second operator approves it | No |
payments.swift_unroutable | 422 | The bank has no SWIFT route for the payment's currency or creditor agent | No |
payments.swift_originator_incomplete | 422 | The originator's name, structured address or account is missing for a SWIFT transfer | No |
payments.swift_possible_duplicate | 409 | A payment with the same account, creditor and amount was sent recently; confirm the duplicate to send it | No |
payments.swift_not_cancellable | 422 | The SWIFT payment is not in a state that can be cancelled or recalled | No |
payments.swift_repair_not_open | 422 | The SWIFT repair is not waiting for a proposal | No |
payments.swift_repair_not_proposed | 422 | The SWIFT repair has no proposal waiting for a decision | No |
payments.destination_not_supported | 422 | The bank does not send international wires to that country | No |
payments.destination_currency_not_supported | 422 | The bank does not send that currency to that country | No |
payments.fx_quotes_unavailable | 422 | The bank cannot book a foreign exchange quote on an international wire | No |
payments.retirement_receipt_claimed | 409 | A retirement command in the accounts service holds or has applied this receipt | No |
payments.retirement_receipt_applied | 409 | The receipt was applied to a protected retirement account and is returned only through a reviewed retirement command | No |
payments.retirement_receipt_not_claimable | 422 | The receipt is not parked on transit for a protected retirement account | No |
Lending
| Code | Status | Meaning | Retry |
|---|---|---|---|
lending.reconciliation_required | 409 | Earlier lending state must be reconciled before this can proceed | No |
lending.not_current | 422 | The loan has past-due instalments | No |
lending.not_nonaccrual | 422 | The loan is not on nonaccrual | No |
Operations
| Code | Status | Meaning | Retry |
|---|---|---|---|
operations.reconciliation_required | 409 | Earlier operation state must be reconciled before this can proceed | No |
operations.close_blocked | 409 | Bank close has unresolved prerequisites | No |
operations.same_person | 422 | The checker must be a different person from the maker | No |
operations.not_pending | 422 | The request has already been decided | No |
Customers
| Code | Status | Meaning | Retry |
|---|---|---|---|
customers.not_a_business | 422 | Only businesses belong to a multi-entity group | No |
customers.already_in_group | 409 | The customer belongs to a group already | No |
customers.group_parent | 422 | The parent stays in its group | No |
customers.group_closed | 422 | The group or the customer is closed | No |
Reporting
| Code | Status | Meaning | Retry |
|---|---|---|---|
reporting.time_deposit_evidence_required | 409 | Deposit participation evidence is required | No |
reporting.statement_missing | 422 | No statement is held for the source and date | No |
Cards
| Code | Status | Meaning | Retry |
|---|---|---|---|
cards.card_not_active | 422 | The card is not active | No |
cards.control_declined | 422 | A card control declined the authorization | No |
cards.hsm_refused | 422 | The hardware security module refused the command with the keys and inputs given | No |
cards.dual_control | 422 | The key ceremony step would break dual control or split knowledge | No |
cards.pin_tries_exceeded | 422 | The card's PIN tries are used up; the PIN is locked until an unlock is approved | No |
cards.pin_incorrect | 422 | The current PIN did not verify | No |
cards.hsm_not_configured | 409 | No HSM adapter is configured for card security | No |
Identity
| Code | Status | Meaning | Retry |
|---|---|---|---|
identity.credential_invalid | 401 | The credential is invalid | No |
identity.device_not_enrolled | 403 | The device is not enrolled | No |
identity.token_expired | 401 | The token has expired | No |
identity.account_locked | 401 | The account is locked after too many failed attempts | No |
identity.passkey_invalid | 401 | The passkey assertion did not verify | No |