pain.001
ISO 20022 pain.001 Validator & Explainer
Validate and explain pain.001 payment files before bank submission.
Supported
- ISO 20022 pain.001.001.03
- ISO 20022 pain.001.001.09 — Sepa, Swiss CH.03, Swiss UBS
- ISO 20022 pain.001.001.11 — Sepa
Validation scope
Banks
Drag and drop your XML file here
or click to browse
XML only · 1 MB max · 20 transactions
Guided demo samples
Use these only to preview the diagnostics experience. Your own XML remains the main workflow.
Prefer downloads? valid XML or invalid XML
Files are processed in memory only — nothing is stored or transmitted to third parties.
Document structure
90 fields · 87 rules · 10 tables//*[local-name()='Document']grpHdr.msgIdMessage IDgrpHdr.creDtTmCreation DateTimegrpHdr.authstn.cdAuthorisation CodegrpHdr.authstn.prtryAuthorisation (Proprietary)grpHdr.nbOfTxsNumber of TransactionsgrpHdr.ctrlSumControl SumgrpHdr.initgPty.nmInitiating Party NamegrpHdr.initgPty.ctryOfResInitiating Party Country of ResidencegrpHdr.initgPty.pstlAdr.ctryInitiating Party Postal Address CountrygrpHdr.initgPty.pstlAdr.adrLineInitiating Party Address LinegrpHdr.fwdgAgt.bicfiForwarding Agent BIC//*[local-name()='PmtInf']pmtInf.pmtInfIdPayment Info IDpmtInf.pmtMtdPayment MethodpmtInf.btchBookgBatch BookingpmtInf.nbOfTxsNb of Txs (per PmtInf)pmtInf.ctrlSumControl Sum (per PmtInf)pmtInf.pmtTpInf.instrPrtyInstruction PrioritypmtInf.pmtTpInf.svcLvlService LevelpmtInf.pmtTpInf.lclInstrmLocal InstrumentpmtInf.pmtTpInf.ctgyPurpCategory PurposepmtInf.reqdExctnDt.dtRequested Execution DatepmtInf.reqdExctnDt.dtTmRequested Execution DateTimepmtInf.poolgAdjstmntDtPooling Adjustment DatepmtInf.chrgBrCharge BearerpmtInf.dbtr.nmDebtor NamepmtInf.dbtr.ctryOfResDebtor Country of ResidencepmtInf.dbtr.pstlAdr.ctryDebtor Postal Address CountrypmtInf.dbtr.pstlAdr.adrLineDebtor Address LinepmtInf.dbtrAcct.ibanDebtor IBANpmtInf.dbtrAgt.bicfiDebtor Agent BICpmtInf.dbtrAgt.leiDebtor Agent LEIpmtInf.dbtrAgtAcct.ibanDebtor Agent Account IBANpmtInf.ultmtDbtr.nmUltimate Debtor NamepmtInf.chrgsAcct.ibanCharges Account IBANpmtInf.chrgsAcctAgt.bicfiCharges Account Agent BIC//*[local-name()='CdtTrfTxInf']cdtTrfTxInf.endToEndIdEnd-to-End IDcdtTrfTxInf.instrIdInstruction IDcdtTrfTxInf.uetrUETRcdtTrfTxInf.pmtTpInf.instrPrtyInstruction Priority (tx)cdtTrfTxInf.pmtTpInf.svcLvlService Level (tx)cdtTrfTxInf.pmtTpInf.lclInstrmLocal Instrument (tx)cdtTrfTxInf.pmtTpInf.ctgyPurpCategory Purpose (tx)cdtTrfTxInf.instdAmtInstructed AmountcdtTrfTxInf.instdAmt.ccyCurrencycdtTrfTxInf.eqvtAmt.amtEquivalent AmountcdtTrfTxInf.eqvtAmt.ccyOfTrfEquivalent Amount CcyOfTrfcdtTrfTxInf.xchgRateInf.unitCcyExchange Rate Unit CurrencycdtTrfTxInf.xchgRateInf.xchgRateExchange RatecdtTrfTxInf.xchgRateInf.rateTpExchange Rate TypecdtTrfTxInf.xchgRateInf.ctrctIdExchange Rate Contract IDcdtTrfTxInf.chrgBrCharge Bearer (tx level)cdtTrfTxInf.ultmtDbtr.nmUltimate Debtor Name (tx)cdtTrfTxInf.intrmyAgt1.bicfiIntermediary Agent 1 BICcdtTrfTxInf.intrmyAgt1.leiIntermediary Agent 1 LEIcdtTrfTxInf.intrmyAgt1Acct.ibanIntermediary Agent 1 Account IBANcdtTrfTxInf.intrmyAgt2.bicfiIntermediary Agent 2 BICcdtTrfTxInf.intrmyAgt2.leiIntermediary Agent 2 LEIcdtTrfTxInf.intrmyAgt2Acct.ibanIntermediary Agent 2 Account IBANcdtTrfTxInf.intrmyAgt3.bicfiIntermediary Agent 3 BICcdtTrfTxInf.intrmyAgt3.leiIntermediary Agent 3 LEIcdtTrfTxInf.intrmyAgt3Acct.ibanIntermediary Agent 3 Account IBANcdtTrfTxInf.cdtrAgt.bicfiCreditor Agent BICcdtTrfTxInf.cdtrAgt.leiCreditor Agent LEIcdtTrfTxInf.cdtrAgtAcct.ibanCreditor Agent Account IBANcdtTrfTxInf.cdtr.nmCreditor NamecdtTrfTxInf.cdtr.ctryOfResCreditor Country of ResidencecdtTrfTxInf.cdtr.pstlAdr.ctryCreditor Postal Address CountrycdtTrfTxInf.cdtr.pstlAdr.adrLineCreditor Address LinecdtTrfTxInf.cdtrAcct.ibanCreditor IBANcdtTrfTxInf.ultmtCdtr.nmUltimate Creditor NamecdtTrfTxInf.purp.cdPurpose CodecdtTrfTxInf.purp.prtryPurpose (Proprietary)cdtTrfTxInf.instrForCdtrAgt.instrInfInstruction for Creditor AgentcdtTrfTxInf.instrForDbtrAgtInstruction for Debtor AgentcdtTrfTxInf.rmtInf.ustrdRemittance Info (unstructured)//*[local-name()='Strd']cdtTrfTxInf.rmtInf.strd.cdtrRefInf.refCreditor ReferencecdtTrfTxInf.rmtInf.strd.cdtrRefInf.tp.cdCreditor Reference Type CodecdtTrfTxInf.rmtInf.strd.cdtrRefInf.tp.prtryCreditor Reference Type (Proprietary)cdtTrfTxInf.rmtInf.strd.cdtrRefInf.tp.issrCreditor Reference IssuercdtTrfTxInf.rmtInf.strd.rfrdDocAmt.duePyblAmtDue Payable AmountcdtTrfTxInf.rmtInf.strd.rfrdDocAmt.dscntApldAmtDiscount Applied AmountcdtTrfTxInf.rmtInf.strd.rfrdDocAmt.cdtNoteAmtCredit Note AmountcdtTrfTxInf.rmtInf.strd.rfrdDocAmt.rmtdAmtRemitted AmountcdtTrfTxInf.rmtInf.strd.addtlRmtInfAdditional Remittance Info//*[local-name()='RfrdDocInf']cdtTrfTxInf.rmtInf.strd.rfrdDocInf.tp.cdDocument Type CodecdtTrfTxInf.rmtInf.strd.rfrdDocInf.tp.prtryDocument Type (Proprietary)cdtTrfTxInf.rmtInf.strd.rfrdDocInf.tp.issrDocument Type IssuercdtTrfTxInf.rmtInf.strd.rfrdDocInf.nbDocument NumbercdtTrfTxInf.rmtInf.strd.rfrdDocInf.rltdDtDocument Related DatecdtTrfTxInf.rmtInf.strd.rfrdDocInf.lineDtls.id.nbLine Details ID NumberFields
90 defined| Identifier | Label | Type | Required |
|---|---|---|---|
grpHdr.msgId | Message ID | ID | ✓ |
grpHdr.creDtTm | Creation DateTime | ISO_DATETIME | ✓ |
grpHdr.authstn.cd | Authorisation Code | CODE | — |
grpHdr.authstn.prtry | Authorisation (Proprietary) | TEXT | — |
grpHdr.nbOfTxs | Number of Transactions | NB_OF_TXS | ✓ |
grpHdr.ctrlSum | Control Sum | AMOUNT_TOTAL | — |
grpHdr.initgPty.nm | Initiating Party Name | TEXT | — |
grpHdr.initgPty.ctryOfRes | Initiating Party Country of Residence | COUNTRY_CODE | — |
grpHdr.initgPty.pstlAdr.ctry | Initiating Party Postal Address Country | COUNTRY_CODE | — |
grpHdr.initgPty.pstlAdr.adrLine | Initiating Party Address Line | TEXT | — |
grpHdr.fwdgAgt.bicfi | Forwarding Agent BIC | BIC | — |
pmtInf.pmtInfId | Payment Info ID | ID | ✓ |
pmtInf.pmtMtd | Payment Method | CODE | ✓ |
pmtInf.btchBookg | Batch Booking | BOOLEAN | — |
pmtInf.nbOfTxs | Nb of Txs (per PmtInf) | NB_OF_TXS | — |
pmtInf.ctrlSum | Control Sum (per PmtInf) | AMOUNT_TOTAL | — |
pmtInf.pmtTpInf.instrPrty | Instruction Priority | CODE | — |
pmtInf.pmtTpInf.svcLvl | Service Level | CODE | — |
pmtInf.pmtTpInf.lclInstrm | Local Instrument | CODE | — |
pmtInf.pmtTpInf.ctgyPurp | Category Purpose | CODE | — |
pmtInf.reqdExctnDt.dt | Requested Execution Date | ISO_DATE | — |
pmtInf.reqdExctnDt.dtTm | Requested Execution DateTime | ISO_DATETIME | — |
pmtInf.poolgAdjstmntDt | Pooling Adjustment Date | ISO_DATE | — |
pmtInf.chrgBr | Charge Bearer | CODE | — |
pmtInf.dbtr.nm | Debtor Name | TEXT | — |
pmtInf.dbtr.ctryOfRes | Debtor Country of Residence | COUNTRY_CODE | — |
pmtInf.dbtr.pstlAdr.ctry | Debtor Postal Address Country | COUNTRY_CODE | — |
pmtInf.dbtr.pstlAdr.adrLine | Debtor Address Line | TEXT | — |
pmtInf.dbtrAcct.iban | Debtor IBAN | IBAN | — |
pmtInf.dbtrAgt.bicfi | Debtor Agent BIC | BIC | — |
pmtInf.dbtrAgt.lei | Debtor Agent LEI | LEI | — |
pmtInf.dbtrAgtAcct.iban | Debtor Agent Account IBAN | IBAN | — |
pmtInf.ultmtDbtr.nm | Ultimate Debtor Name | TEXT | — |
pmtInf.chrgsAcct.iban | Charges Account IBAN | IBAN | — |
pmtInf.chrgsAcctAgt.bicfi | Charges Account Agent BIC | BIC | — |
cdtTrfTxInf.endToEndId | End-to-End ID | ID | ✓ |
cdtTrfTxInf.instrId | Instruction ID | ID | — |
cdtTrfTxInf.uetr | UETR | UETR | — |
cdtTrfTxInf.pmtTpInf.instrPrty | Instruction Priority (tx) | CODE | — |
cdtTrfTxInf.pmtTpInf.svcLvl | Service Level (tx) | CODE | — |
cdtTrfTxInf.pmtTpInf.lclInstrm | Local Instrument (tx) | CODE | — |
cdtTrfTxInf.pmtTpInf.ctgyPurp | Category Purpose (tx) | CODE | — |
cdtTrfTxInf.instdAmt | Instructed Amount | AMOUNT | — |
cdtTrfTxInf.instdAmt.ccy | Currency | CCY | — |
cdtTrfTxInf.eqvtAmt.amt | Equivalent Amount | AMOUNT | — |
cdtTrfTxInf.eqvtAmt.ccyOfTrf | Equivalent Amount CcyOfTrf | CCY | — |
cdtTrfTxInf.xchgRateInf.unitCcy | Exchange Rate Unit Currency | CCY | — |
cdtTrfTxInf.xchgRateInf.xchgRate | Exchange Rate | RATE | — |
cdtTrfTxInf.xchgRateInf.rateTp | Exchange Rate Type | CODE | — |
cdtTrfTxInf.xchgRateInf.ctrctId | Exchange Rate Contract ID | ID | — |
cdtTrfTxInf.chrgBr | Charge Bearer (tx level) | CODE | — |
cdtTrfTxInf.ultmtDbtr.nm | Ultimate Debtor Name (tx) | TEXT | — |
cdtTrfTxInf.intrmyAgt1.bicfi | Intermediary Agent 1 BIC | BIC | — |
cdtTrfTxInf.intrmyAgt1.lei | Intermediary Agent 1 LEI | LEI | — |
cdtTrfTxInf.intrmyAgt1Acct.iban | Intermediary Agent 1 Account IBAN | IBAN | — |
cdtTrfTxInf.intrmyAgt2.bicfi | Intermediary Agent 2 BIC | BIC | — |
cdtTrfTxInf.intrmyAgt2.lei | Intermediary Agent 2 LEI | LEI | — |
cdtTrfTxInf.intrmyAgt2Acct.iban | Intermediary Agent 2 Account IBAN | IBAN | — |
cdtTrfTxInf.intrmyAgt3.bicfi | Intermediary Agent 3 BIC | BIC | — |
cdtTrfTxInf.intrmyAgt3.lei | Intermediary Agent 3 LEI | LEI | — |
cdtTrfTxInf.intrmyAgt3Acct.iban | Intermediary Agent 3 Account IBAN | IBAN | — |
cdtTrfTxInf.cdtrAgt.bicfi | Creditor Agent BIC | BIC | — |
cdtTrfTxInf.cdtrAgt.lei | Creditor Agent LEI | LEI | — |
cdtTrfTxInf.cdtrAgtAcct.iban | Creditor Agent Account IBAN | IBAN | — |
cdtTrfTxInf.cdtr.nm | Creditor Name | TEXT | — |
cdtTrfTxInf.cdtr.ctryOfRes | Creditor Country of Residence | COUNTRY_CODE | — |
cdtTrfTxInf.cdtr.pstlAdr.ctry | Creditor Postal Address Country | COUNTRY_CODE | — |
cdtTrfTxInf.cdtr.pstlAdr.adrLine | Creditor Address Line | TEXT | — |
cdtTrfTxInf.cdtrAcct.iban | Creditor IBAN | IBAN | — |
cdtTrfTxInf.ultmtCdtr.nm | Ultimate Creditor Name | TEXT | — |
cdtTrfTxInf.purp.cd | Purpose Code | CODE | — |
cdtTrfTxInf.purp.prtry | Purpose (Proprietary) | TEXT | — |
cdtTrfTxInf.instrForCdtrAgt.instrInf | Instruction for Creditor Agent | TEXT | — |
cdtTrfTxInf.instrForDbtrAgt | Instruction for Debtor Agent | TEXT | — |
cdtTrfTxInf.rmtInf.ustrd | Remittance Info (unstructured) | TEXT | — |
cdtTrfTxInf.rmtInf.strd.cdtrRefInf.ref | Creditor Reference | ID | — |
cdtTrfTxInf.rmtInf.strd.cdtrRefInf.tp.cd | Creditor Reference Type Code | CODE | — |
cdtTrfTxInf.rmtInf.strd.cdtrRefInf.tp.prtry | Creditor Reference Type (Proprietary) | TEXT | — |
cdtTrfTxInf.rmtInf.strd.cdtrRefInf.tp.issr | Creditor Reference Issuer | TEXT | — |
cdtTrfTxInf.rmtInf.strd.rfrdDocAmt.duePyblAmt | Due Payable Amount | AMOUNT | — |
cdtTrfTxInf.rmtInf.strd.rfrdDocAmt.dscntApldAmt | Discount Applied Amount | AMOUNT | — |
cdtTrfTxInf.rmtInf.strd.rfrdDocAmt.cdtNoteAmt | Credit Note Amount | AMOUNT | — |
cdtTrfTxInf.rmtInf.strd.rfrdDocAmt.rmtdAmt | Remitted Amount | AMOUNT | — |
cdtTrfTxInf.rmtInf.strd.addtlRmtInf | Additional Remittance Info | TEXT | — |
cdtTrfTxInf.rmtInf.strd.rfrdDocInf.tp.cd | Document Type Code | CODE | — |
cdtTrfTxInf.rmtInf.strd.rfrdDocInf.tp.prtry | Document Type (Proprietary) | TEXT | — |
cdtTrfTxInf.rmtInf.strd.rfrdDocInf.tp.issr | Document Type Issuer | TEXT | — |
cdtTrfTxInf.rmtInf.strd.rfrdDocInf.nb | Document Number | ID | — |
cdtTrfTxInf.rmtInf.strd.rfrdDocInf.rltdDt | Document Related Date | ISO_DATE | — |
cdtTrfTxInf.rmtInf.strd.rfrdDocInf.lineDtls.id.nb | Line Details ID Number | ID | — |
Validation rules
87 rulesPAIN00109-GEN-001ERRORGrpHdr/NbOfTxs must be equal to the total number of CdtTrfTxInf transactions in the file.
Custom rule: pain00109-check
PAIN00109-GEN-002ERRORGrpHdr/CtrlSum, if present, must be equal to the sum of all transaction InstdAmt amounts.
Control Sum is present
Custom rule: pain00109-check
PAIN00109-GEN-003ERRORPmtInf/NbOfTxs, if present, must be equal to the number of CdtTrfTxInf transactions in this PmtInf block.
Nb of Txs (per PmtInf) is present
Custom rule: pain00109-check
PAIN00109-GEN-004ERRORPmtInf/CtrlSum, if present, must be equal to the sum of InstdAmt amounts within the corresponding PmtInf block.
Control Sum (per PmtInf) is present
Custom rule: pain00109-check
PAIN00109-GEN-005ERRORInstdAmt must be strictly positive (> 0). The XSD allows 0, but it is commercially invalid.
Instructed Amount > 0
PAIN00109-GEN-006ERRORPmtInf/Dbtr is mandatory in each PmtInf block (XSD-required).
Custom rule: pain00109-check
PAIN00109-GEN-007ERROREndToEndId is mandatory for each CdtTrfTxInf transaction (XSD-required).
Custom rule: pain00109-check
PAIN00109-GEN-008ERRORPmtInf/PmtInfId is mandatory in each PmtInf block.
Custom rule: pain00109-check
PAIN00109-GEN-009ERRORPmtInf/PmtMtd is mandatory in each PmtInf block.
Custom rule: pain00109-check
PAIN00109-GEN-010ERRORThe IBAN (debtor or creditor), if present, must pass the MOD97 checksum validation.
Custom rule: pain00109-check
PAIN00109-GEN-011ERRORPmtInf/ReqdExctnDt is mandatory in each PmtInf block: provide either Dt (date) or DtTm (datetime).
Custom rule: pain00109-check
PAIN00109-QUAL-001WARNINGEndToEndId values should be unique within the file. Duplicates may cause reconciliation issues on the bank side.
cdtTrfTxInf.endToEndId is unique within cdtTrfTxInf.endToEndId
PAIN00109-MVP-001ERROROnly the TRF (credit transfer) payment method is supported by this validator. CHK (cheque) and TRA are not supported.
Payment Method ∈ {TRF}
PAIN00109-MVP-002ERRORInstdAmt is mandatory. EqvtAmt (equivalent amount) is not supported by this validator.
Instructed Amount is required
PAIN00109-MVP-003ERRORThe creditor name (Cdtr/Nm) is mandatory.
Creditor Name is required
PAIN00109-MVP-004ERRORThe creditor account IBAN (CdtrAcct/Id/IBAN) is mandatory. Non-IBAN accounts (Othr) are not supported by this validator.
Creditor IBAN is required
PAIN00109-MVP-005ERROREqvtAmt (equivalent amount with currency conversion) is not supported. Use InstdAmt with the desired currency instead.
{"op":"rejected","field":"cdtTrfTxInf.eqvtAmt.ccyOfTrf"}
PAIN00109-AGT-001ERRORIntermediary agents must be declared sequentially: IntrmyAgt2 requires IntrmyAgt1 to be present; IntrmyAgt3 requires IntrmyAgt2 to be present.
Custom rule: pain00109-check
PAIN00109-AGT-002ERROREach declared IntrmyAgt[n]/FinInstnId must contain at least one recognized identifier: BICFI, LEI, ClrSysMmbId/MmbId, or Othr/Id.
Custom rule: pain00109-check
PAIN00109-REM-001ERRORCdtrRefInf/Tp/CdOrPrtry/Cd must be a valid creditor reference type code (DocumentType3Code: RADM, RPIN, FXDR, DISP, PUOR or SCOR).
Creditor Reference Type Code ∈ Creditor reference type codes (DocumentType3Code): {RADM, RPIN, FXDR, DISP, PUOR, SCOR}
PAIN00109-REM-002ERRORRfrdDocInf/Tp/CdOrPrtry/Cd must be a valid document type code (DocumentType6Code).
Document Type Code ∈ Document type codes (DocumentType6Code): {MSIN, CNFA, DNFA, CINV, CREN, DEBN ... (16 values)}
PAIN00109-REM-003ERRORReferred document amounts (DuePyblAmt, DscntApldAmt, CdtNoteAmt, RmtdAmt) must be strictly positive (> 0) when present.
Custom rule: pain00109-check
PAIN00109-REM-004ERRORCdOrPrtry must contain either Cd or Prtry, but not both simultaneously.
Custom rule: pain00109-check
PAIN00109-REM-005ERRORAddtlRmtInf may appear at most 3 times within a single Strd block (ISO 20022 max occurrences).
Custom rule: pain00109-check
SE-B-001ERRORSEPA Credit TransferSEPA: Service Level must be 'SEPA' (Rulebook AT-40).
Custom rule: pain00109-sepa-check
SE-GEN-CHAR-001WARNINGSEPA Credit TransferSEPA: Text fields must use the SEPA Latin character set.
Custom rule: pain00109-sepa-check
SE-GEN-REF-001ERRORSEPA Credit TransferSEPA: Reference fields must not start/end with '/' or contain '//' (EPC230-15).
Custom rule: pain00109-sepa-check
SE-GEN-AMT-001WARNINGSEPA Credit TransferSEPA: Amounts must not have more than 2 decimal digits.
Custom rule: pain00109-sepa-check
SE-A-001WARNINGSEPA Credit TransferSEPA: Initiating Party name must not exceed 70 characters (AT-02).
Custom rule: pain00109-sepa-check
SE-B-002WARNINGSEPA Credit TransferSEPA: Local Instrument is not part of the SEPA core service.
Custom rule: pain00109-sepa-check
SE-B-003ERRORSEPA Credit TransferSEPA: Charge Bearer must be 'SLEV' (Rulebook AT-07).
Custom rule: pain00109-sepa-check
EPC-CT-05ERRORSEPA Credit TransferSEPA: InstrId must be unique within each PmtInf block.
Custom rule: pain00109-sepa-check
EPC-CT-08WARNINGSEPA Credit TransferSEPA: Batch booking on a multi-transaction block may not be supported by all banks.
Custom rule: pain00109-sepa-check
SE-C-002ERRORSEPA Credit TransferSEPA: Instructed Amount currency must be EUR (Rulebook AT-09).
Custom rule: pain00109-sepa-check
SE-C-003WARNINGSEPA Credit TransferSEPA: Creditor Agent BIC must be a valid BIC8 or BIC11 (ISO 9362).
Custom rule: pain00109-sepa-check
SE-C-004ERRORSEPA Credit TransferSEPA: Creditor name is mandatory and must not exceed 70 characters (AT-21).
Custom rule: pain00109-sepa-check
SE-C-005WARNINGSEPA Credit TransferSEPA: Creditor postal address line will be rejected from 22 November 2026 (EPC153-22).
Custom rule: pain00109-sepa-check
EPC-CT-10ERRORSEPA Credit TransferSEPA: Unstructured remittance information (Ustrd) must not exceed 140 characters.
Custom rule: pain00109-sepa-check
CH-GEN-XML-002ERRORSwiss Payments CH.03SPS does not allow empty or whitespace-only leaf elements.
Custom rule: pain00109-ch03-check
CH-GEN-XML-003ERRORSwiss Payments CH.03SPS does not allow empty group elements.
Custom rule: pain00109-ch03-check
CH-GEN-CHAR-001ERRORSwiss Payments CH.03SPS allows only printable Basic Latin, Latin-1 Supplement, Latin Extended-A, Ș/ș/Ț/ț and € in text values.
Custom rule: pain00109-ch03-check
CH-GEN-REF-001ERRORSwiss Payments CH.03SPS reference fields must use the restricted reference character set and slash rules.
Custom rule: pain00109-ch03-check
CH-GEN-AMT-001WARNINGSwiss Payments CH.03SPS amount representation should avoid padding and must use a dot as decimal separator.
Custom rule: pain00109-ch03-check
CH-GEN-AMT-003ERRORSwiss Payments CH.03SPS amount fraction digits must be consistent with the currency.
Custom rule: pain00109-ch03-check
CH-A-007INFOSwiss Payments CH.03SPS recommends software information in GrpHdr/InitgPty/CtctDtls/Othr (NAME, PRVD, VRSN, SPSV).
Custom rule: pain00109-ch03-check
CH-B-003INFOSwiss Payments CH.03CHK (cheque) is a valid SPS CH.03 payment method but is not in scope for this validator. Only TRF is currently implemented.
Custom rule: pain00109-ch03-check
CH-B-007WARNINGSwiss Payments CH.03SPS expects ReqdExctnDt/Dt; DateTime can be unsupported by profiles.
Custom rule: pain00109-ch03-check
CH-S-001ERRORSwiss Payments CH.03SPS SEPA payments require EUR currency and charge bearer SLEV.
Custom rule: pain00109-ch03-check
CH-X-001WARNINGSwiss Payments CH.03Cross-border payment detected; bank-specific requirements may apply.
Custom rule: pain00109-ch03-check
CH-INST-001ERRORSwiss Payments CH.03SPS instant payments (INST/ITP) are CHF only.
Custom rule: pain00109-ch03-check
CH-QR-001ERRORSwiss Payments CH.03SPS QR reference must be 27 numeric digits and requires a QR-IBAN creditor account.
Custom rule: pain00109-ch03-check
CH-RF-001ERRORSwiss Payments CH.03SPS ISO creditor reference SCOR must be a valid ISO 11649 RF reference.
Custom rule: pain00109-ch03-check
CH-ADDR-001ERRORSwiss Payments CH.03SPS structured postal addresses require TwnNm and Ctry; AdrTp is not allowed.
Custom rule: pain00109-ch03-check
CH-ADDR-002WARNINGSwiss Payments CH.03SPS does not allow mixing AdrLine with structured address fields in the same postal address.
Custom rule: pain00109-ch03-check
CH-ADDR-003WARNINGSwiss Payments CH.03AdrLine in debtor/creditor postal addresses will be rejected by Swiss banks from November 2026 (SPS 2026).
Custom rule: pain00109-ch03-check
CH-ID-001ERRORSwiss Payments CH.03SPS (DU05): InstrId must be unique within each PmtInf block (B-Level). Duplicate values cause B-Level rejection.
Custom rule: pain00109-ch03-check
CH-ID-002ERRORSwiss Payments CH.03SPS (DU02): PmtInfId must be unique across all PmtInf blocks within the message. A duplicate causes full message rejection. Source: SIX Swiss Payment Standards — Business Rules 2025, rule DU02.
Custom rule: pain00109-ch03-check
UBS-A-001ERRORUBS SwitzerlandUBS/CS: GrpHdr/Authstn, GrpHdr/InitgPty/PstlAdr and GrpHdr/InitgPty/CtryOfRes are not allowed.
Custom rule: pain00109-ubs-check
UBS-A-002WARNINGUBS SwitzerlandUBS/CS: CtctDtls only accepts Othr; Nm, PhneNb, MobNb, FaxNb, EmailAdr and similar sub-elements are not allowed. Maximum 4 Othr instances (NAME, PRVD, VRSN, SPSV) recommended.
Custom rule: pain00109-ubs-check
UBS-B-001ERRORUBS SwitzerlandUBS/CS: BtchBookg must be one of 0, 1, true, false (case-sensitive xs:boolean).
Custom rule: pain00109-ubs-check
UBS-B-002ERRORUBS SwitzerlandUBS/CS: one PmtInf per transferred currency — multiple currencies in a single B-level are not allowed.
Custom rule: pain00109-ubs-check
UBS-B-003ERRORUBS SwitzerlandUBS/CS: ReqdExctnDt/Dt is mandatory; DtTm is not allowed; valid date range is −40/+60 calendar days from submission.
Custom rule: pain00109-ubs-check
UBS-B-004ERRORUBS SwitzerlandUBS/CS: debtor IBAN must not be a QR-IBAN; DbtrAcct/Nm, Othr/SchmeNm and Othr/Issr are not allowed.
Custom rule: pain00109-ubs-check
UBS-B-005ERRORUBS SwitzerlandUBS/CS: the same PmtTpInf sub-element must not appear at both B-level and C-level with conflicting values (CH07).
Custom rule: pain00109-ubs-check
UBS-B-006ERRORUBS SwitzerlandUBS/CS: Dbtr/PstlAdr/AdrTp, Dbtr/CtryOfRes and Dbtr/CtctDtls are not allowed.
Custom rule: pain00109-ubs-check
UBS-B-007ERRORUBS SwitzerlandUBS/CS: DbtrAgt ClrSysMmbId/ClrSysId/Cd must be CHBCC; FinInstnId/Nm, FinInstnId/Othr, BrnchId and DbtrAgtAcct are not allowed.
Custom rule: pain00109-ubs-check
UBS-B-008WARNINGUBS SwitzerlandUBS/CS: FwdgAgt normally requires a special bilateral agreement; the bank reserves the right to reject.
Custom rule: pain00109-ubs-check
UBS-B-009WARNINGUBS SwitzerlandUBS/CS: InstrForDbtrAgt at a single level may lead to non-STP processing; at both B and C levels it is not allowed.
Custom rule: pain00109-ubs-check
UBS-B-010ERRORUBS SwitzerlandUBS/CS: UltmtDbtr and ChrgBr must not appear at both B-level and C-level simultaneously (CH07).
Custom rule: pain00109-ubs-check
UBS-N-001ERRORUBS SwitzerlandUBS/CS: SplmtryData is not allowed at transaction or document level.
Custom rule: pain00109-ubs-check
UBS-C-001ERRORUBS SwitzerlandUBS/CS: for domestic CH/LI payments, AddtlRmtInf is limited to one occurrence per Strd element.
Custom rule: pain00109-ubs-check
UBS-B-011ERRORUBS SwitzerlandUBS/CS: PmtTpInf/LclInstrm is not allowed for domestic CH/LI payments or INST payments and will be rejected.
Custom rule: pain00109-ubs-check
UBS-B-013ERRORUBS SwitzerlandUBS/CS: AdrLine in UltmtDbtr is not allowed. Rejected immediately for type X; rejected for all types since November 2025.
Custom rule: pain00109-ubs-check
UBS-C-007ERRORUBS SwitzerlandUBS/CS: AdrLine in Cdtr postal address is not allowed and will be rejected. Unstructured addresses rejected since November 2025.
Custom rule: pain00109-ubs-check
UBS-C-010ERRORUBS SwitzerlandUBS/CS: AdrLine in UltmtCdtr is not allowed for any payment type and will be rejected.
Custom rule: pain00109-ubs-check
UBS-C-003ERRORUBS SwitzerlandUBS/CS: IntrmyAgt2, IntrmyAgt2Acct, IntrmyAgt3 and IntrmyAgt3Acct are not allowed and will be rejected.
Custom rule: pain00109-ubs-check
UBS-C-004ERRORUBS SwitzerlandUBS/CS: CdtrAgt ClrSysId/Cd value CHSIC is not allowed. Source: Credit Suisse MIG v3.2, row 133.
Custom rule: pain00109-ubs-check
UBS-B-012ERRORUBS SwitzerlandUBS/CS: PoolgAdjstmntDt is not allowed and will be rejected.
Custom rule: pain00109-ubs-check
UBS-B-014ERRORUBS SwitzerlandUBS/CS: UltmtDbtr/CtryOfRes and UltmtDbtr/CtctDtls are not allowed at B-level or C-level.
Custom rule: pain00109-ubs-check
UBS-C-002ERRORUBS SwitzerlandUBS/CS: IntrmyAgt1 should only be used for cross-border (type X) payments. BrnchId and IntrmyAgt1Acct sub-elements (Tp, Ccy, Nm, Prxy) are not allowed.
Custom rule: pain00109-ubs-check
UBS-C-005ERRORUBS SwitzerlandUBS/CS: CdtrAgt/FinInstnId/Othr and CdtrAgt/BrnchId are not allowed and will be rejected.
Custom rule: pain00109-ubs-check
UBS-C-006ERRORUBS SwitzerlandUBS/CS: CdtrAgtAcct/Tp, Ccy, Nm and Prxy are not allowed and will be rejected.
Custom rule: pain00109-ubs-check
UBS-C-008ERRORUBS SwitzerlandUBS/CS: Cdtr/CtryOfRes and Cdtr/CtctDtls are not allowed and will be rejected.
Custom rule: pain00109-ubs-check
UBS-C-009ERRORUBS SwitzerlandUBS/CS: CdtrAcct/Tp, Ccy and Nm are not allowed and will be rejected.
Custom rule: pain00109-ubs-check
UBS-C-011ERRORUBS SwitzerlandUBS/CS: UltmtCdtr/CtryOfRes and UltmtCdtr/CtctDtls are not allowed and will be rejected.
Custom rule: pain00109-ubs-check
UBS-B-015ERRORUBS SwitzerlandUBS/CS: ChrgsAcct/Tp, ChrgsAcct/Nm and ChrgsAcctAgt are not allowed and will be rejected.
Custom rule: pain00109-ubs-check
UBS-C-012ERRORUBS SwitzerlandUBS/CS: Tax node is not allowed and will be rejected.
Custom rule: pain00109-ubs-check
Reference tables
10 listsISO 4217 — Active currency codes
iso4217-currenciesPayment methods (PaymentMethod3Code)
pmt-methodsCharge bearer types (ChargeBearerType1Code)
charge-bearerAddress types (AddressType2Code)
address-typeInstruction priority (Priority2Code)
priority-codeExchange rate type (ExchangeRateType1Code)
exchange-rate-typeAuthorisation type (Authorisation1Code)
authorisation-codeRegulatory Reporting Type (RegulatoryReportingType1Code)
rgltry-rptg-indCreditor reference type codes (DocumentType3Code)
creditor-reference-type-codeDocument type codes (DocumentType6Code)
document-type-codeSupports official ISO 20022 XSD schemas: pain.001.001.03.xsd (urn:iso:std:iso:20022:tech:xsd:pain.001.001.03), pain.001.001.09.xsd (urn:iso:std:iso:20022:tech:xsd:pain.001.001.09), and the Swiss Payment Standards CH.03 overlay pain.001.001.09.ch.03.xsd. Compatible with Swiss QR-bill, SEPA Credit Transfer (SCT), and SIX Payment Standards. Validates IBAN checksum (MOD97), BIC format, CtrlSum, NbOfTxs, EqvtAmt restrictions, and structured remittance information. Explains ISO 20022 payment file rejection causes: bank rejection, payment rejected, pain001 error, XML validation error, SEPA CT pain.001 invalid, Swiss payment file error.
Validate and explain pain.001 payment files before bank submission — Official XSD validation, profile-specific checks, and readable diagnostics for pain.001.001.03, pain.001.001.09, and Swiss CH.03.
Official ISO 20022 XSD
Swiss CH.03 support
Readable diagnostics
No account required
Not just XML validation
XSD catches structure. Ifriqa explains rejection causes.
XSD validation is necessary, but banks reject pain.001 files for profile, consistency and business-rule reasons too. The platform combines schema checks, ISO 20022 diagnostics, profile overlays and readable reports.
| Layer | What it catches |
|---|---|
| Official XSD | XML structure, required elements, schema constraints |
| ISO 20022 rules | IBAN, BIC, CtrlSum, NbOfTxs, amount consistency |
| Profile rules | Swiss CH.03 and future bank-specific restrictions |
| Explanation layer | Human-readable diagnostics and machine-readable JSON |
Supported profiles
Swiss-ready validation
Validate pain.001.001.09 files against the Swiss CH.03 profile before sending them to Swiss financial institutions.
Bank-specific profiles are progressively added.
Human-readable diagnostics
| Error | Explanation |
|---|---|
| Invalid IBAN checksum | MOD97 check failed before the file reaches the bank. |
| CtrlSum mismatch | Declared total differs from the actual transaction sum. |
| Forbidden EqvtAmt | The selected profile does not allow equivalent amount here. |
Built for
- ERP and accounting software vendors
- Finance teams preparing SEPA/SCT files
- Swiss companies using pain.001.001.09 CH.03
- Developers integrating ISO 20022 exports
- Consultants debugging bank rejections
| Feature | Free | Paid |
|---|---|---|
| Single XML validation | Yes | Yes |
| XSD + basic diagnostics | Yes | Yes |
| Full business explanation | Partial | Yes |
| JSON/API report | Preview | Yes |
| Batch / ZIP | No | Yes |
| Bank/profile-specific reports | Limited | Yes |
| History / saved reports | No | Yes |
| API access | No | Yes |
Guides & Reference
Need batch validation or API access?
API access, ZIP/batch processing, saved reports and bank-specific profile diagnostics are planned for paid usage.