Pain001 Pain001

If you are connecting a system to a bank, writing a parser, or testing a mapping, you need sample ISO 20022 files that are correct for your country and your rail. The ones passed around are usually old, hand-edited, or from somewhere else. This page gives you files built from the public rulebooks, with a record of where each one comes from.

What you get

  • 42 realistic payments across 17 countries: a UK CHAPS property purchase, a Swiss QR-bill, a Swedish Bankgiro run, a US ACH payroll, a SEPA direct debit, and more, each rendered in the message editions you are likely to meet.
  • 131 schema coverage files across 13 editions: deliberately exhaustive files that exercise the elements and choices of one schema edition, for testing a parser or a mapping against the whole schema rather than the usual happy path.
  • A provenance record beside every payment file saying where its content comes from, how far to trust it, and how the library checked it.

How to use it

  1. Download the complete bundle below, or pick single files from the tables.
  2. Open the .xml next to your own file and diff them; open the .provenance.yaml to see what the differences mean.
  3. Get your bank's usage guideline (see below) and apply it on top: these files follow the public scheme rules, not any one bank's profile.

Identifiers are synthetic: IBANs, BICs, LEIs and account numbers pass their check digits but belong to nobody, and names and addresses are invented. Do not send these files to a bank.

Download#

Bundle Contents Size
Complete corpus 84 payment files with their provenance records, and 131 schema coverage files across 13 editions 313 KB
Coverage files per edition one zip each, listed on the coverage page 9 to 12 KB

Everything here is generated from pain001 0.0.70's own corpus, which also ships inside the Python package (pain001.corpus) and in the repository.

One scenario, end to end#

Take gb.chaps.property-purchase: CHAPS same-day property completion with the BoE HLST purpose code.

It ships as these files:

The provenance record answers the questions you would otherwise have to ask us:

  • Where does the content come from? Bank of England: ISO 20022 purpose codes for CHAPS property transactions.
  • How much can I trust it? Confidence derived: built from the public rulebook or implementation guide; no published sample was available to compare.
  • How was it checked? By the library, against the schema, the ISO rules and the uk-chaps, purpose-mandate-gb profiles; the record lists every finding, including warnings.
  • Is it exactly this file? Its SHA-256 is in the record.

What the record does not tell you is what your bank requires. That is the subject of the next section.

Your bank's guideline#

Every bank and clearing house publishes its own message usage guideline: which ISO 20022 elements it requires, which it ignores, and the values it accepts. Two banks on the same scheme can differ. Those guidelines are the bank's documentation, so they are not reproduced here: download them from your bank or financial organisation, typically from its client portal or from its collection on Swift MyStandards, and treat them as the final word.

The library is built for that step. Its overlay grammar expresses a guideline as a short list of rules (an element that must be present, one that must be absent, a value that must be one of a set), scripts/derive_overlay.py reads a guideline's schema and drafts those rules for you, and the corpus builder can then render any scenario on this page the way your bank wants it, privately, in your own environment. The corpus guide walks through it.

How the library checked these files#

Step What it checks
Schema well-formed and valid against the edition's official ISO 20022 XSD
ISO rules the cross-element rules of the ISO message definition report, such as a cheque never carrying a creditor account
Scheme profile the public rulebook of the rail: service levels, national identifiers, reference formats, amount limits
Public overlay what a scheme body or regulator requires on top, where one has published it

These checks are the library's own; they are not a certification, and passing them does not mean a bank will accept the file. Channel rules, onboarding profiles, cut-off times and the bank's guideline sit on top.

Reading the evidence column. verified means checked against a sample the scheme itself published. derived means built from the public rulebook or implementation guide; no published sample was available to compare. assumed means one detail rests on an assumption the record names; treat that detail with care.

Payment files by country#

AE (AE)

Scenario What it shows Checked against Editions Evidence
ae.uaefts.single UAE domestic AED transfer through UAEFTS with the CBUAE regulatory reporting code. ae-uaefts, purpose-mandate-ae pain.001.001.03, pain.001.001.09 assumed

Belgium (BE)

Scenario What it shows Checked against Editions Evidence
be.sepa.sct-supplier SEPA credit transfer with a Belgian structured communication (BBA). sepa-sct pain.001.001.03, pain.001.001.09 derived
be.sepa.sdd-core SEPA Core direct debit, recurring, Belgian creditor identifier. sepa-sdd pain.008.001.02, pain.008.001.08 derived

Switzerland (CH)

Scenario What it shows Checked against Editions Evidence
ch.international.usd Cross-border USD payment from Switzerland (SPS payment type X). cbpr-cross-border pain.001.001.03, pain.001.001.09 derived
ch.sps.qr-bill Swiss domestic credit transfer settling a QR-bill (QRR reference). ch-domestic pain.001.001.03, pain.001.001.09 derived
ch.sps.scor Swiss domestic credit transfer with an ISO 11649 creditor reference (SCOR). ch-domestic pain.001.001.03, pain.001.001.09 derived
ch.sepa.sct SEPA credit transfer from Switzerland (SPS payment type S). ch-sepa pain.001.001.03, pain.001.001.09 derived

CZ (CZ)

Scenario What it shows Checked against Editions Evidence
cz.certis.domestic Czech domestic CZK transfer through CERTIS with VS/KS/SS payment symbols. base rules only pain.001.001.03, pain.001.001.09 derived
cz.sepa.sct SEPA credit transfer from a Czech EUR account to a German supplier. sepa-sct pain.001.001.03, pain.001.001.09 derived

Germany (DE)

Scenario What it shows Checked against Editions Evidence
de.axz.foreign Foreign payment in USD from a German account, DK order type AXZ. de-axz pain.001.001.03, pain.001.001.09 assumed
de.sepa.sct-salary SEPA SCT salary batch with structured and unstructured remittance. sepa-sct pain.001.001.03, pain.001.001.09, pain.001.001.13 derived
de.sepa.sdd-b2b SEPA B2B direct debit, first collection. sepa-b2b pain.008.001.02, pain.008.001.08 derived
de.sepa.sct-inst SEPA Instant credit transfer, single, INST at PmtInf. sepa-inst pain.001.001.09 derived
de.ccu.urgent Urgent euro payment (TARGET) from a German account, DK order type CCU. de-ccu pain.001.001.03, pain.001.001.09 derived

Spain (ES)

Scenario What it shows Checked against Editions Evidence
es.sepa.sct-single SEPA credit transfer, single, initiating party identified by NIF. sepa-sct pain.001.001.03, pain.001.001.09 derived
es.sepa.sdd-core SEPA Core direct debit, recurring, Spanish creditor identifier. sepa-sdd pain.008.001.02, pain.008.001.08 derived

France (FR)

Scenario What it shows Checked against Editions Evidence
fr.sepa.sct-supplier SEPA credit transfer, supplier invoice with an RF creditor reference. sepa-sct pain.001.001.03, pain.001.001.09 derived
fr.sepa.sdd-core SEPA Core direct debit, recurring collection on an amended mandate. sepa-sdd pain.008.001.02, pain.008.001.08 derived

United Kingdom (GB)

Scenario What it shows Checked against Editions Evidence
gb.bacs.supplier-run Bacs Direct Credit supplier run, two payments, SUN in the debtor id. uk-bacs pain.001.001.03, pain.001.001.09 derived
gb.bacs-dd.collection Bacs Direct Debit collection, first and recurring, SUN as creditor id. uk-bacs-dd pain.008.001.02, pain.008.001.08 derived
gb.fps.single Faster Payments single supplier payment, sort code and account. uk-fps pain.001.001.03, pain.001.001.09 derived
gb.chaps.property-purchase CHAPS same-day property completion with the BoE HLST purpose code. uk-chaps, purpose-mandate-gb pain.001.001.03, pain.001.001.09 derived
gb.international.usd USD cross-border payment from a UK account to a US supplier. cbpr-cross-border pain.001.001.03, pain.001.001.09 derived

HK (HK)

Scenario What it shows Checked against Editions Evidence
hk.fps.single Hong Kong FPS credit in HKD, clearing codes and account numbers. hk-fps, purpose-mandate-hk pain.001.001.03, pain.001.001.09 assumed

Italy (IT)

Scenario What it shows Checked against Editions Evidence
it.sepa.sct-single SEPA credit transfer, single supplier payment. sepa-sct pain.001.001.03, pain.001.001.09 derived

Luxembourg (LU)

Scenario What it shows Checked against Editions Evidence
lu.sepa.sct-single SEPA credit transfer, single supplier payment. sepa-sct pain.001.001.03, pain.001.001.09 derived

MY (MY)

Scenario What it shows Checked against Editions Evidence
my.duitnow.single Malaysia DuitNow credit in MYR with a BNM purpose code. my-duitnow, purpose-mandate-my pain.001.001.03, pain.001.001.09 assumed

Netherlands (NL)

Scenario What it shows Checked against Editions Evidence
nl.sepa.sct-supplier SEPA credit transfer with a Dutch payment reference (CUR). sepa-sct pain.001.001.03, pain.001.001.09 derived
nl.sepa.sdd-core SEPA Core direct debit, recurring collections under mandates. sepa-sdd pain.008.001.02, pain.008.001.08 derived

QA (QA)

Scenario What it shows Checked against Editions Evidence
qa.qatch.single Qatar QATCH credit in QAR with the QCB purpose of payment. qa-qatch, purpose-mandate-qa pain.001.001.03, pain.001.001.09 assumed

Sweden (SE)

Scenario What it shows Checked against Editions Evidence
se.bankgiro.supplier Swedish Bankgiro supplier payment with an OCR reference. se-bankgiro pain.001.001.03, pain.001.001.09 derived
se.plusgiro.supplier Swedish Plusgiro supplier payment with an invoice message. se-bankgiro pain.001.001.03, pain.001.001.09 derived
se.rix.urgent Swedish domestic high-value SEK payment through RIX, urgent, intra-group. base rules only pain.001.001.03, pain.001.001.09 derived
se.bankgiro.salary Swedish salary batch (Bankgirot Löner), SALA, one debit. se-bankgiro pain.001.001.03, pain.001.001.09 derived

SG (SG)

Scenario What it shows Checked against Editions Evidence
sg.fast.single Singapore FAST credit in SGD, bank and branch codes, addresses on both parties. sg-fast pain.001.001.03, pain.001.001.09 assumed

United States (US)

Scenario What it shows Checked against Editions Evidence
us.ach.ccd-supplier ACH CCD credit to a supplier with an addenda remittance line. us-ach pain.001.001.03, pain.001.001.09 derived
us.ach.ppd-payroll ACH PPD payroll run, two employees. us-ach pain.001.001.03, pain.001.001.09 derived
us.eftps.tax IRS EFTPS federal tax deposit, CCD with the TXP addenda string. us-ach pain.001.001.03, pain.001.001.09 derived
us.ach.debit ACH debit collection (CCD) with routing numbers. us-ach pain.008.001.02, pain.008.001.08 derived
us.check.vendor Bank-issued cheque to a vendor, mailed to the creditor. base rules only pain.001.001.03, pain.001.001.09 assumed
us.rtp.single RTP real-time payment, single. us-rtp pain.001.001.03, pain.001.001.09 derived
us.wire.domestic Fedwire domestic funds transfer, urgent. us-wire pain.001.001.03, pain.001.001.09 derived

Schema coverage files#

Each edition has a small set of files built so that the elements and choice branches its schema declares each appear in at least one file. The first file is the baseline that carries every element once; each later file is named after the blocks it adds, so you can pick the one that exercises what you are testing. The coverage page lists every file with what it adds and a zip per edition.

Notes#

  • The site publishes the generic files and their public sources. Bank-specific material stays with the banks.
  • The corpus is English only and grows with every release; it is generated data, not a translated page.
  • The corpus guide explains the scenario format, the overlay grammar and how to add a country or a rail. Corrections and new scenarios are welcome there.
  • Regenerate this page and its downloads with poetry run python3 scripts/generate_corpus_page.py from the pain001 checkout after a corpus change.