pain.001.001.02 vs pain.001.001.09: which SEPA XML version should you use?
If you upload SEPA Credit Transfer files to a bank, you have probably seen
references to pain.001.001.02 and pain.001.001.09. Both are versions of
the same ISO 20022 message — the Customer Credit Transfer Initiation
message, commonly called pain.001 — but they are not interchangeable. Your
bank or upload channel usually expects one specific version.
This guide explains the practical differences and how to decide which version to generate.
What pain.001 is
pain.001 is the ISO 20022 XML message a customer sends to their bank to initiate credit transfers. In the SEPA area it is the standard format for submitting one or many euro credit transfers in a single file: debtor account, execution date, and a list of transactions with creditor name, IBAN, amount, and remittance information.
The number at the end of the identifier is the message version:
pain.001.001.02 is an early version that many banks adopted when SEPA was
introduced, while pain.001.001.09 is the 2019 revision of the message that
the European Payments Council adopted for the SEPA schemes in its 2023
rulebook cycle.
Key differences at a glance
| Aspect | pain.001.001.02 | pain.001.001.09 |
|---|---|---|
| XML namespace | urn:iso:std:iso:20022:tech:xsd:pain.001.001.02 | urn:iso:std:iso:20022:tech:xsd:pain.001.001.09 |
| Generation | Long-established; still accepted by many banks and legacy channels | Current version used by SEPA schemes since the 2023/2024 migration |
| Postal addresses | Mostly unstructured address lines | Full structured address elements (street, building number, postcode, town, country) |
| Schema detail | Fewer, looser elements | More precise element definitions and additional optional data |
| Typical use today | Legacy bank channels, older ERP exports | Modern bank channels, new integrations, address-quality requirements |
Structured addresses: the biggest practical change
The most visible difference is postal address handling. In
pain.001.001.02, addresses are usually provided as free-text address lines.
pain.001.001.09 defines structured elements — street name, building number,
postcode, town, and country — as separate fields.
This matters because banks and payment schemes are progressively moving toward structured address data. If your creditor records already store street, postcode, and town separately, generating pain.001.001.09 with structured addresses prepares your files for these requirements instead of concatenating everything into address lines.
SEPA Generator supports optional structured postal addresses when generating pain.001.001.09.
Which version does your bank want?
There is no universal answer — it depends on your bank, the upload channel (web portal, EBICS, host-to-host), and sometimes the account configuration:
- Ask your bank first. Most banks document the pain.001 versions they accept per channel. Some accept several versions; others accept exactly one.
- Legacy channels frequently still expect
pain.001.001.02(or.03), because that is what existing customer integrations produce. - Newer channels and integrations increasingly expect
pain.001.001.09, in line with the SEPA schemes’ migration to the 2019 ISO 20022 message versions. - Test before production. Whichever version you choose, upload a test file through your banking portal before sending real payments. Bank acceptance can depend on bank-specific rules beyond the schema version.
Do you need to migrate from .02 to .09?
If your bank still accepts pain.001.001.02 files, they remain valid to use.
There is no customer-side obligation to change formats until your bank
requires it. That said, moving to pain.001.001.09 is worth planning when:
- your bank announces an end date for older versions on your channel;
- you need structured addresses for cross-border or compliance reasons;
- you are building a new integration and want to avoid a later migration.
Because the two versions structure some elements differently, migrating is mainly a matter of regenerating files in the new version and re-testing with your bank — not of editing XML by hand.
Generating both versions from the same spreadsheet
SEPA Generator is a free, local desktop application that generates both
pain.001.001.02 and pain.001.001.09 from the same CSV, XLS, or XLSX
input. You choose the pain.001 version at generation time, so you can produce a
.02 file for a legacy channel today and a .09 file when your bank is
ready — without changing your source data. All processing happens locally on
your computer; payment files are never uploaded to a server.
SEPA Generator is a free local desktop app that generates pain.001.001.02 and pain.001.001.09 SEPA Credit Transfer XML from CSV, XLS, and XLSX files — your payment data stays on your computer.