Skip to main content

pain.001 — CustomerCreditTransferInitiation

Overview

pain.001 (Payment Initiation) is an ISO 20022 message sent by an Originator (Customer) to their Debtor Bank to instruct a credit transfer. It is the entry point of any outbound payment flow.

  • Full name: CustomerCreditTransferInitiationV09 (or later versions)
  • Namespace: urn:iso:std:iso:20022:tech:xsd:pain.001.001.09
  • Direction: Customer → Debtor Bank
  • Channel: Host-to-host file, API, banking portal

Message Structure

pain.001
├── GrpHdr (Group Header) ← 1..1
│ ├── MsgId Message ID (unique per file)
│ ├── CreDtTm Creation DateTime
│ ├── NbOfTxs Number of transactions
│ ├── CtrlSum Total amount of all transactions
│ └── InitgPty Initiating Party

└── PmtInf (Payment Information) ← 1..n (one per batch/debit account)
├── PmtInfId Payment Info ID
├── PmtMtd Payment Method (TRF = Credit Transfer)
├── ReqdExctnDt Requested Execution Date
├── Dbtr Debtor (name, address)
├── DbtrAcct Debtor Account (IBAN / account number)
├── DbtrAgt Debtor Agent (BIC of debtor bank)

└── CdtTrfTxInf ← 1..n (one per transaction)
├── PmtId
│ ├── InstrId Instruction ID
│ └── EndToEndId End-to-End ID (carried through whole chain)
├── Amt
│ └── InstdAmt Ccy="AUD" Instructed Amount + Currency
├── CdtrAgt Creditor Agent (BIC of creditor bank)
├── Cdtr Creditor (name)
├── CdtrAcct Creditor Account
└── RmtInf Remittance Information (payment reference)

Key Fields Explained

FieldDescriptionNotes
MsgIdUnique ID for the whole fileMust be unique per sender per day
EndToEndIdTracks payment from initiation to completionEchoed back in camt.054
InstrIdInstruction ID assigned by initiating partyUsed for internal tracking
InstdAmtAmount to be transferredCurrency must be explicit
ReqdExctnDtDate the debtor bank should executeFuture-dating supported
Dbtr / DbtrAcctPayer's name and accountMust match bank records
Cdtr / CdtrAcctPayee's name and accountIBAN or BBAN
RmtInfPayment description / invoice referenceStructured or Unstructured

Batching

pain.001 supports multiple PmtInf blocks, each grouping transactions per:

  • Debit account
  • Payment method
  • Execution date
  • Service level (e.g., URGP for urgent, NORM for normal)
1 pain.001 file
├── PmtInf[1] → Debit Account A, 3 transactions
├── PmtInf[2] → Debit Account A, 5 transactions (different date)
└── PmtInf[3] → Debit Account B, 2 transactions

Validation Rules

  1. NbOfTxs must equal total count of CdtTrfTxInf across all PmtInf
  2. CtrlSum must equal sum of all InstdAmt
  3. EndToEndId must be unique within a PmtInf
  4. CreDtTm must not be in the future
  5. Debtor account must exist and be active
  6. Currency must be supported by the debtor bank

Relationship to Other Messages

pain.001  ──(initiates)──►  pacs.008  (bank-to-bank transfer)
pain.001 ──(confirmed by)──► pain.002 (payment status report)
pain.001 ──(notified by)──► camt.054 (account notification on debit)

pain.001 vs pain.008

pain.001pain.008
TypeCredit Transfer InitiationDirect Debit Initiation
InitiatorPayer (Debtor)Payee (Creditor)
FlowPush paymentPull payment

Java / Spring Integration Notes

// Typical pain.001 processing pipeline in Spring
@Service
public class Pain001ProcessingService {

// 1. Unmarshal incoming XML
// 2. Validate schema (XSD)
// 3. Validate business rules (CtrlSum, NbOfTxs)
// 4. Enrich with internal account details
// 5. Run sanctions & fraud checks
// 6. Persist to payment table
// 7. Route to pacs.008 builder or on-us handler

public void process(CustomerCreditTransferInitiationV09 pain001) {
validateGroupHeader(pain001.getGrpHdr());
pain001.getPmtInf().forEach(pmtInf -> {
pmtInf.getCdtTrfTxInf().forEach(tx -> {
PaymentOrder order = mapper.toPaymentOrder(pmtInf, tx);
sanctionService.screen(order);
fraudService.evaluate(order);
paymentRepository.save(order);
routingService.route(order);
});
});
}
}

Common Error Codes (pain.002 response)

CodeReason
AC01Incorrect Account Number
AC04Closed Account Number
AC06Blocked Account
AM04Insufficient Funds
FF01Invalid File Format
NARRFree-text narrative reason