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.

Auto-retry safe

The engine corrects the XML and re-emits under a fresh MsgId automatically — no human in the loop.

HITL (human review)

Routed to a human-in-the-loop queue. A person must review before any re-emission — the bank may already have processed the original.

Accepted

A success status fed in through the same surface. Not a rejection; no retry.

Unknown → HITL

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.

CodeMeaningClassificationAction
AC01Incorrect account numberAuto-retry safeCorrect + resubmit, same EndToEndId
AC03Invalid creditor account numberAuto-retry safeCorrect + resubmit
AC04Closed account numberHITL (human review)Bank cannot process; operator must update creditor record
AC06Blocked accountHITL (human review)Sanctions / freeze; legal review required
AC13Debtor account type missing or invalidAuto-retry safeValidator fix on debtor account type
AG01Transaction forbidden on this type of accountHITL (human review)Bank-side policy; require human review
AG02Invalid bank operation codeAuto-retry safeRe-emit with the correct service-level code
AM05DuplicationHITL (human review)Stop. Bank may have processed original — never blind-retry.
BE05Unrecognised initiating partyAuto-retry safeHeader fix (InitgPty / Dbtr identification)
BE06Unknown end customerHITL (human review)Identity mismatch at the bank; operator must reconcile
CUSTCustomer-requested cancellationHITL (human review)Customer cancelled upstream; do not auto-retry
FF01Invalid file formatAuto-retry safeValidator fix; re-submit corrected XML
MS03Reason not specifiedHITL (human review)No actionable info — require human review
RR01Missing debtor account or identificationAuto-retry safePopulate the missing field and resubmit
RR02Missing debtor name or addressAuto-retry safePopulate the missing field and resubmit
RR03Missing creditor name or addressAuto-retry safePopulate the missing field and resubmit
RR04Regulatory reasonHITL (human review)Regulatory / compliance escalation
TM01Cut-off time / timeoutHITL (human review)Bank may have processed; require human verification

Prefix and status rules

Code / patternMeaningClassificationAction
XT*Bank-proprietary extended reason (any code starting with XT)HITL (human review)Queue for offline rule extraction + human approval
ACSP / ACSC / ACCCAccepted by the bank (success status, not a rejection)AcceptedNo retry required
any unknown codeNot in the table — default-safe handlingUnknown → HITLQueue 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.

Get an API key