SEPA pain.002 reject reason codes.
When a bank rejects a payment, it returns a pain.002 (CstmrPmtStsRpt) carrying one or more ISO 20022 reason codes. The hard question is not what the code means — it is whether you can correct and re-emit automatically, or whether a human must look first. This is the exact classification the iso-compliant rejection classifier applies.
The decision
Three buckets. One default-safe rule.
Each reason code is bucketed so the engine knows whether it can re-emit corrected XML under a fresh MsgId (auto-retry-safe) or must enqueue an operator review (HITL). When a single transaction carries multiple reason codes, HITL wins ties — an HITL signal anywhere in the mix demotes the whole verdict to HITL. Any unknown code defaults to HITL: silently blind-retrying on an ambiguous response is the single most expensive runtime mistake — the double-wire.
The engine corrects the XML and re-emits under a fresh MsgId automatically — no human in the loop.
Routed to a human-in-the-loop queue. A person must review before any re-emission — the bank may already have processed the original.
A success status fed in through the same surface. Not a rejection; no retry.
Any code not in the table defaults to human review. Silently blind-retrying on an ambiguous response is the single most expensive runtime mistake (double-wire risk).
Reference table
Every code, classified.
The concrete exact-match codes the classifier ships today, drawn from the ISO 20022 External Code Sets and the codes called out in our implementation notes. Plus the prefix and status rules below the table.
| Code | Meaning | Classification | Action |
|---|---|---|---|
| AC01 | Incorrect account number | Auto-retry safe | Correct + resubmit, same EndToEndId |
| AC03 | Invalid creditor account number | Auto-retry safe | Correct + resubmit |
| AC04 | Closed account number | HITL (human review) | Bank cannot process; operator must update creditor record |
| AC06 | Blocked account | HITL (human review) | Sanctions / freeze; legal review required |
| AC13 | Debtor account type missing or invalid | Auto-retry safe | Validator fix on debtor account type |
| AG01 | Transaction forbidden on this type of account | HITL (human review) | Bank-side policy; require human review |
| AG02 | Invalid bank operation code | Auto-retry safe | Re-emit with the correct service-level code |
| AM05 | Duplication | HITL (human review) | Stop. Bank may have processed original — never blind-retry. |
| BE05 | Unrecognised initiating party | Auto-retry safe | Header fix (InitgPty / Dbtr identification) |
| BE06 | Unknown end customer | HITL (human review) | Identity mismatch at the bank; operator must reconcile |
| CUST | Customer-requested cancellation | HITL (human review) | Customer cancelled upstream; do not auto-retry |
| FF01 | Invalid file format | Auto-retry safe | Validator fix; re-submit corrected XML |
| MS03 | Reason not specified | HITL (human review) | No actionable info — require human review |
| RR01 | Missing debtor account or identification | Auto-retry safe | Populate the missing field and resubmit |
| RR02 | Missing debtor name or address | Auto-retry safe | Populate the missing field and resubmit |
| RR03 | Missing creditor name or address | Auto-retry safe | Populate the missing field and resubmit |
| RR04 | Regulatory reason | HITL (human review) | Regulatory / compliance escalation |
| TM01 | Cut-off time / timeout | HITL (human review) | Bank may have processed; require human verification |
Prefix and status rules
| Code / pattern | Meaning | Classification | Action |
|---|---|---|---|
| XT* | Bank-proprietary extended reason (any code starting with XT) | HITL (human review) | Queue for offline rule extraction + human approval |
| ACSP / ACSC / ACCC | Accepted by the bank (success status, not a rejection) | Accepted | No retry required |
| any unknown code | Not in the table — default-safe handling | Unknown → HITL | Queue for human review (default-safe) |
The table is hand-curated against the ISO 20022 External Code Sets (canonical list at iso20022.org/payments_external_code.html). The classifier is the source of truth — see retry-codes.ts and pain002-classifier.ts.
Classify your pain.002 automatically
POST a pain.002 to the parser and get per-transaction classification + the safe action back — 100 documents/month free, no card.