— Developer Tools

Free ISO 20022 Parser

Paste or open a pain, pacs or camt XML file to see its payments, parties, statuses and balances in plain lines.

— Samples
Message pain.001.001.09Values 24Problems 0Valid
Live

What is an ISO 20022 Parser?

ISO 20022 is the XML standard banks now use for payments: pain messages between customers and banks, pacs between banks, and camt for statements and investigations. The files are long and deeply nested. This parser pulls out what matters in a few readable lines.

It identifies the message from its namespace or root element, reads the business application header used by CBPR+, and summarises credit transfers, direct debits, returns, status reports and statements. NbOfTxs and CtrlSum are checked against the transactions, IBAN check digits are verified, and a paths view lists every element.

Key Features

Thirteen Message Types

pain.001, 002 and 008, pacs.002 to 009, and camt.052, 053, 054, 056 and 029 recognised.

Payments Summarised

Parties, accounts, agents, amounts, end-to-end IDs, UETRs and remittance text.

Totals Checked

NbOfTxs and CtrlSum compared with the transactions, using exact decimal sums.

Statuses Explained

pain.002 and pacs.002 statuses and reason codes such as AC04 in words.

Stays on Your Computer

The XML is parsed in your browser and never uploaded.

Perfect for everyone

  • Payments developers
  • Treasury and finance teams
  • Bank operations and anyone migrating from MT messages

How to Use the ISO 20022 Parser

Paste the XML or open the file.

1

Get the File

Export it from your ERP or bank portal, or copy it from a payment hub log.

2

Paste or Open

Whole documents, with or without an envelope and business header.

3

Read the Summary

Payments, statuses or balances in order, with checks flagged in place.

4

Map With Paths

Paths lists every element and attribute, which helps when mapping fields to a system.

Worked Examples

ISO 20022 Messages, Parsed

Each row is an ISO 20022 document as banks and ERPs exchange them, and each answer is this parser’s output in the mode on the chip. Parties and BICs are fictional; the IBANs are standard examples.

REF_001A pain.001 batch of two payments

“<?xml version="1.0" encoding="UTF-8"?> <Document xmlns="urn:iso:std:iso:20022:tech:xsd:pain.001.001.09"> <CstmrCdtTrfInitn> <GrpHdr><MsgId>BATCH-20261028-01</MsgId><CreDtTm>2026-10-28T09:15:00</CreDtTm><NbOfTxs>2</NbOfTxs><CtrlSum>1790.25</CtrlSum><InitgPty><Nm>ACME GmbH</Nm></InitgPty></GrpHdr> <PmtInf> <PmtInfId>PMT-01</PmtInfId><PmtMtd>TRF</PmtMtd><ReqdExctnDt><Dt>2026-10-29</Dt></ReqdExctnDt> <Dbtr><Nm>ACME GmbH</Nm></Dbtr><DbtrAcct><Id><IBAN>DE89370400440532013000</IBAN></Id></DbtrAcct><DbtrAgt><FinInstnId><BICFI>BANKDEFFXXX</BICFI></FinInstnId></DbtrAgt> <CdtTrfTxInf> <PmtId><EndToEndId>INV-2026-0042</EndToEndId></PmtId><Amt><InstdAmt Ccy="EUR">1250.00</InstdAmt></Amt> <CdtrAgt><FinInstnId><BICFI>BANKGB2LXXX</BICFI></FinInstnId></CdtrAgt><Cdtr><Nm>ACME UK Ltd</Nm></Cdtr><CdtrAcct><Id><IBAN>GB29NWBK60161331926819</IBAN></Id></CdtrAcct> <RmtInf><Ustrd>Invoice 2026-0042</Ustrd></RmtInf> </CdtTrfTxInf> <CdtTrfTxInf> <PmtId><EndToEndId>INV-2026-0057</EndToEndId></PmtId><Amt><InstdAmt Ccy="EUR">540.25</InstdAmt></Amt> <Cdtr><Nm>Muster Logistik AG</Nm></Cdtr><CdtrAcct><Id><IBAN>CH9300762011623852957</IBAN></Id></CdtrAcct> <RmtInf><Ustrd>Invoice 2026-0057</Ustrd></RmtInf> </CdtTrfTxInf> </PmtInf> </CstmrCdtTrfInitn> </Document>”

REF_002A pacs.008 with its business header

“<Envelope> <AppHdr xmlns="urn:iso:std:iso:20022:tech:xsd:head.001.001.02"> <Fr><FIId><FinInstnId><BICFI>BANKDEFFXXX</BICFI></FinInstnId></FIId></Fr><To><FIId><FinInstnId><BICFI>BANKGB2LXXX</BICFI></FinInstnId></FIId></To> <BizMsgIdr>B2B-881245</BizMsgIdr><MsgDefIdr>pacs.008.001.08</MsgDefIdr><CreDt>2026-10-29T08:01:12Z</CreDt> </AppHdr> <Document xmlns="urn:iso:std:iso:20022:tech:xsd:pacs.008.001.08"> <FIToFICstmrCdtTrf> <GrpHdr><MsgId>B2B-881245</MsgId><CreDtTm>2026-10-29T08:01:12Z</CreDtTm><NbOfTxs>1</NbOfTxs><SttlmInf><SttlmMtd>INDA</SttlmMtd></SttlmInf></GrpHdr> <CdtTrfTxInf> <PmtId><InstrId>B2B-881245</InstrId><EndToEndId>INV-2026-0042</EndToEndId><UETR>8e81b6f3-2c3a-4f7e-9a1d-3c5b7e2f9a10</UETR></PmtId> <IntrBkSttlmAmt Ccy="EUR">1250.00</IntrBkSttlmAmt><IntrBkSttlmDt>2026-10-29</IntrBkSttlmDt><ChrgBr>SHAR</ChrgBr> <Dbtr><Nm>ACME GmbH</Nm></Dbtr><DbtrAcct><Id><IBAN>DE89370400440532013000</IBAN></Id></DbtrAcct><DbtrAgt><FinInstnId><BICFI>BANKDEFFXXX</BICFI></FinInstnId></DbtrAgt> <CdtrAgt><FinInstnId><BICFI>BANKGB2LXXX</BICFI></FinInstnId></CdtrAgt><Cdtr><Nm>ACME UK Ltd</Nm></Cdtr><CdtrAcct><Id><IBAN>GB29NWBK60161331926819</IBAN></Id></CdtrAcct> <RmtInf><Ustrd>Invoice 2026-0042</Ustrd></RmtInf> </CdtTrfTxInf> </FIToFICstmrCdtTrf> </Document> </Envelope>”

REF_003A camt.053 statement

“<Document xmlns="urn:iso:std:iso:20022:tech:xsd:camt.053.001.08"> <BkToCstmrStmt> <GrpHdr><MsgId>STMT-20261029</MsgId><CreDtTm>2026-10-29T20:00:00</CreDtTm></GrpHdr> <Stmt> <Id>301</Id><Acct><Id><IBAN>DE89370400440532013000</IBAN></Id></Acct> <Bal><Tp><CdOrPrtry><Cd>OPBD</Cd></CdOrPrtry></Tp><Amt Ccy="EUR">10000.00</Amt><CdtDbtInd>CRDT</CdtDbtInd><Dt><Dt>2026-10-29</Dt></Dt></Bal> <Bal><Tp><CdOrPrtry><Cd>CLBD</Cd></CdOrPrtry></Tp><Amt Ccy="EUR">8209.75</Amt><CdtDbtInd>CRDT</CdtDbtInd><Dt><Dt>2026-10-29</Dt></Dt></Bal> <Ntry> <Amt Ccy="EUR">1790.25</Amt><CdtDbtInd>DBIT</CdtDbtInd><Sts><Cd>BOOK</Cd></Sts><BookgDt><Dt>2026-10-29</Dt></BookgDt><AcctSvcrRef>BK-77812</AcctSvcrRef> <NtryDtls><TxDtls><Refs><EndToEndId>BATCH-20261028-01</EndToEndId></Refs><RmtInf><Ustrd>Supplier batch</Ustrd></RmtInf></TxDtls></NtryDtls> </Ntry> </Stmt> </BkToCstmrStmt> </Document>”

REF_004A pain.002 rejecting one payment

“<Document xmlns="urn:iso:std:iso:20022:tech:xsd:pain.002.001.10"> <CstmrPmtStsRpt> <GrpHdr><MsgId>STS-5512</MsgId><CreDtTm>2026-10-28T09:16:40</CreDtTm></GrpHdr> <OrgnlGrpInfAndSts><OrgnlMsgId>BATCH-20261028-01</OrgnlMsgId><OrgnlMsgNmId>pain.001.001.09</OrgnlMsgNmId><GrpSts>PART</GrpSts></OrgnlGrpInfAndSts> <OrgnlPmtInfAndSts><OrgnlPmtInfId>PMT-01</OrgnlPmtInfId> <TxInfAndSts><OrgnlEndToEndId>INV-2026-0057</OrgnlEndToEndId><TxSts>RJCT</TxSts><StsRsnInf><Rsn><Cd>AC04</Cd></Rsn></StsRsnInf></TxInfAndSts> </OrgnlPmtInfAndSts> </CstmrPmtStsRpt> </Document>”

REF_005The same report as paths

“<Document xmlns="urn:iso:std:iso:20022:tech:xsd:pain.002.001.10"> <CstmrPmtStsRpt> <GrpHdr><MsgId>STS-5512</MsgId><CreDtTm>2026-10-28T09:16:40</CreDtTm></GrpHdr> <OrgnlGrpInfAndSts><OrgnlMsgId>BATCH-20261028-01</OrgnlMsgId><OrgnlMsgNmId>pain.001.001.09</OrgnlMsgNmId><GrpSts>PART</GrpSts></OrgnlGrpInfAndSts> <OrgnlPmtInfAndSts><OrgnlPmtInfId>PMT-01</OrgnlPmtInfId> <TxInfAndSts><OrgnlEndToEndId>INV-2026-0057</OrgnlEndToEndId><TxSts>RJCT</TxSts><StsRsnInf><Rsn><Cd>AC04</Cd></Rsn></StsRsnInf></TxInfAndSts> </OrgnlPmtInfAndSts> </CstmrPmtStsRpt> </Document>”

REF_006A batch whose control sum is off

“<?xml version="1.0" encoding="UTF-8"?> <Document xmlns="urn:iso:std:iso:20022:tech:xsd:pain.001.001.09"> <CstmrCdtTrfInitn> <GrpHdr><MsgId>BATCH-20261028-01</MsgId><CreDtTm>2026-10-28T09:15:00</CreDtTm><NbOfTxs>2</NbOfTxs><CtrlSum>1790.00</CtrlSum><InitgPty><Nm>ACME GmbH</Nm></InitgPty></GrpHdr> <PmtInf> <PmtInfId>PMT-01</PmtInfId><PmtMtd>TRF</PmtMtd><ReqdExctnDt><Dt>2026-10-29</Dt></ReqdExctnDt> <Dbtr><Nm>ACME GmbH</Nm></Dbtr><DbtrAcct><Id><IBAN>DE89370400440532013000</IBAN></Id></DbtrAcct><DbtrAgt><FinInstnId><BICFI>BANKDEFFXXX</BICFI></FinInstnId></DbtrAgt> <CdtTrfTxInf> <PmtId><EndToEndId>INV-2026-0042</EndToEndId></PmtId><Amt><InstdAmt Ccy="EUR">1250.00</InstdAmt></Amt> <CdtrAgt><FinInstnId><BICFI>BANKGB2LXXX</BICFI></FinInstnId></CdtrAgt><Cdtr><Nm>ACME UK Ltd</Nm></Cdtr><CdtrAcct><Id><IBAN>GB29NWBK60161331926819</IBAN></Id></CdtrAcct> <RmtInf><Ustrd>Invoice 2026-0042</Ustrd></RmtInf> </CdtTrfTxInf> <CdtTrfTxInf> <PmtId><EndToEndId>INV-2026-0057</EndToEndId></PmtId><Amt><InstdAmt Ccy="EUR">540.25</InstdAmt></Amt> <Cdtr><Nm>Muster Logistik AG</Nm></Cdtr><CdtrAcct><Id><IBAN>CH9300762011623852957</IBAN></Id></CdtrAcct> <RmtInf><Ustrd>Invoice 2026-0057</Ustrd></RmtInf> </CdtTrfTxInf> </PmtInf> </CstmrCdtTrfInitn> </Document>”

REF_007No namespace, found by its root

“<Document><FIToFICstmrCdtTrf><GrpHdr><MsgId>X-1</MsgId><NbOfTxs>1</NbOfTxs></GrpHdr><CdtTrfTxInf><PmtId><EndToEndId>E2E-1</EndToEndId></PmtId><IntrBkSttlmAmt Ccy="USD">99.50</IntrBkSttlmAmt><Cdtr><Nm>Jane Doe</Nm></Cdtr></CdtTrfTxInf></FIToFICstmrCdtTrf></Document>”

REF_008A message type with no summary

“<Document xmlns="urn:iso:std:iso:20022:tech:xsd:camt.056.001.08"><FIToFIPmtCxlReq><Assgnmt><Id>CXL-1</Id></Assgnmt></FIToFIPmtCxlReq></Document>”

REF_009An unclosed element

“<?xml version="1.0" encoding="UTF-8"?> <Document xmlns="urn:iso:std:iso:20022:tech:xsd:pain.001.001.09"> <CstmrCdtTrfInitn> <GrpHdr><MsgId>BATCH-20261028-01</MsgId><CreDtTm>2026-10-28T09:15:00</CreDtTm><NbOfTxs>2</NbOfTxs><CtrlSum>1790.25</CtrlSum><InitgPty><Nm>ACME GmbH</Nm></InitgPty></GrpHdr> <PmtInf> <PmtInfId>PMT-01</PmtInfId><PmtMtd>TRF</PmtMtd><ReqdExctnDt><Dt>2026-10-29</Dt></ReqdExctnDt> <Dbtr><Nm>ACME GmbH</Nm></Dbtr><DbtrAcct><Id><IBAN>DE89370400440532013000</IBAN></Id></DbtrAcct><DbtrAgt><FinInstnId><BICFI>BANKDEFFXXX</BICFI></FinInstnId></DbtrAgt> <CdtTrfTxInf> <PmtId><EndToEndId>INV-2026-0042</EndToEndId></PmtId><Amt><InstdAmt Ccy="EUR">1250.00</InstdAmt></Amt> <CdtrAgt><FinInstnId><BICFI>BANKGB2LXXX</BICFI></FinInstnId></CdtrAgt><Cdtr><Nm>ACME UK Ltd</Nm></Cdtr><CdtrAcct><Id><IBAN>GB29NWBK60161331926819</IBAN></Id></CdtrAcct> <RmtInf><Ustrd>Invoice 2026-0042</Ustrd></RmtInf> </CdtTrfTxInf> <CdtTrfTxInf> <PmtId><EndToEndId>INV-2026-0057</EndToEndId></PmtId><Amt><InstdAmt Ccy="EUR">540.25</InstdAmt></Amt> <Cdtr><Nm>Muster Logistik AG</Nm></Cdtr><CdtrAcct><Id><IBAN>CH9300762011623852957</IBAN></Id></CdtrAcct> <RmtInf><Ustrd>Invoice 2026-0057</Ustrd></RmtInf> </CdtTrfTxInf> </PmtInf> </Document>”

REF_010XML that isn’t ISO 20022

“<Invoice><Id>INV-1</Id></Invoice>”

Message Types

The Messages You Will Meet

ISO 20022 has hundreds of messages, but payments revolve around these ten.

01 / PAIN001

pain.001

A customer’s instruction to its bank to make one or more credit transfers.

“Who sends pain.001?”

02 / PAIN002

pain.002

The bank’s status report on a pain.001 or pain.008, accepting or rejecting payments.

“What does RJCT mean?”

03 / PAIN008

pain.008

A creditor’s instruction to collect direct debits under signed mandates.

“What must each debit have?”

04 / PACS008

pacs.008

A customer credit transfer between banks, the successor of MT103.

“Which MT does it replace?”

05 / PACS009

pacs.009

A transfer between financial institutions, the successor of MT202.

“Which MT does it replace?”

06 / PACS002

pacs.002

A status report between banks on a pacs message.

“Does it carry reason codes?”

07 / PACS004

pacs.004

A payment return, sending funds back with a reason.

“What does AC04 mean?”

08 / CAMT053

camt.053

The end-of-day bank statement, the successor of MT940.

“Which MT does it replace?”

09 / CAMT054

camt.054

A notification of individual debits and credits during the day.

“Is it a full statement?”

10 / CAMT056

camt.056

A request to cancel a payment already sent.

“What answers it?”

How a Message Is Structured

Every ISO 20022 payment message is built from the same blocks. Knowing where each piece sits makes a long file easy to navigate, in this parser’s paths view or in any XML editor.

Document and Namespace

The Document element’s namespace names the message and version, such as pain.001.001.09.

Business Application Header

head.001 in an envelope carries the sender, receiver and message ID, as CBPR+ requires.

Group Header

GrpHdr holds the message ID, creation time, and often NbOfTxs and CtrlSum.

Payment Information

In pain.001, PmtInf groups transfers from one debtor account on one date.

Transaction Information

Each CdtTrfTxInf is one payment with its amount, creditor and references.

References

EndToEndId travels from payer to payee; the UETR identifies the payment across every bank.

Checks Worth Running

Banks reject files for mistakes that are easy to catch before upload. These are the checks this parser runs, plus a few to do by eye.

Tip 01

NbOfTxs

The declared number of transactions must match the transactions in the file.

Tip 02

CtrlSum

The control sum must equal the exact sum of amounts. The parser adds them as decimals, not floats.

Tip 03

IBAN Check Digits

Every IBAN passes a mod-97 check, which catches most typos.

Tip 04

Currency Attribute

Every amount needs a Ccy attribute, and some schemes allow only one currency.

Tip 05

Execution Dates

A requested date in the past or on a bank holiday may be rejected or moved.

Tip 06

Character Set

SEPA files allow a restricted Latin character set, so accents may be refused.

When to Parse ISO 20022

Whenever payment XML needs reading quickly.

Before Uploading a Batch

Check counts, totals and IBANs in a pain.001 before your bank rejects it.

Reading a Rejection

See which payments a pain.002 rejected and why.

Reconciliation

Read camt.053 balances and entries against your ledger.

MT Migration

Compare ISO 20022 messages with the MT messages they replace.

Integration Work

Map elements to your system’s fields using the paths view.

ISO 20022 Pitfalls

Things that trip people up with payment XML.

Tip 01

Version Mismatches

pain.001.001.03 and .09 differ. Banks accept specific versions, so check which.

Tip 02

Namespaces

Elements are matched by namespace. A missing or wrong xmlns can make a valid file fail.

Tip 03

Market Practice

SEPA, CBPR+ and national schemes restrict the base standard differently.

Tip 04

Decimal Precision

Amounts allow up to five decimals in XML, but currencies limit what banks accept.

Tip 05

Structured Addresses

Newer rules require structured postal addresses instead of free text lines.

Tip 06

Large Files

Batches of thousands of payments are fine here, but keep pastes under 10 million characters.

Frequently Asked Questions