Free · SEPA credit transfer · pain.001.001.09
SEPA XML generator: pain.001 files built in your browser.
Turn a list of payments into a SEPA credit transfer XML file (pain.001) your bank can import: every IBAN, amount and reference checked against the EPC rules, the file read back by a validator, and nothing uploaded.
- EPC rules applied
- CSV and spreadsheet import
- Free, no sign-up
- 1Enter the paymentsType them, paste cells from Excel or Google Sheets, or import a CSV and match its columns.
- 2Build and checkThe EPC rules are applied field by field; the file is then read back by the pain.001 validator.
- 3Download and uploadSave the .xml and upload it to your bank’s online banking, EBICS or host-to-host channel.
Ordering partyThe account the payments come from
File settings
The day your account is debited.
References and characters
Unique per file; a bank refuses a repeat.
Payments0 payments · 0.00 EUR
- Payment 1
0 payments, 0.00 EUR. Checked against the EPC rules, then read back by the validator, all on this device.
Private by design.
Your payment details never leave this device.
Built on your device
Names, IBANs and amounts stay in this tab. The file is created in your browser, not on a server.
No account, no cost
Free to use, with no sign-up and no limit on the number of payments in the browser.
Checked twice
Each value against the EPC rules, then the whole file by the same validator as the Payment File Viewer.
What it does
From a list of payments to a file your bank imports.
One payment information block per file: one ordering account, one execution date, any number of payees.
No. 01
Three ways in
Type the payments, paste cells copied from Excel, Numbers or Google Sheets, or import a CSV and match its columns. Amounts may use a decimal comma.
No. 02
Every field checked
IBAN check digits, BIC format, amounts and their range, RF creditor references, lengths, unique end-to-end ids and the SEPA character set, each problem shown on its field.
No. 03
A file that adds up
NbOfTxs and CtrlSum computed with exact decimals, ids generated, then the whole file read back by the Payment File Viewer’s validator before you download it.
No. 04
Scripts and agents
The same builder as a keyless REST endpoint (up to 100 payments a call) and the build_sepa_credit_transfer MCP tool (up to 50).
What it checks
The EPC rules, field by field.
The European Payments Council’s SEPA Credit Transfer customer-to-bank guidelines (2025 version, for the rulebook in force since October 2025) define what a pain.001 for SEPA may contain. The generator applies them before it writes a line.
| Rule | What the generator does | Source |
|---|---|---|
| Euro only | Every amount is written as InstdAmt Ccy="EUR". | EPC guidelines: only EUR is allowed |
| Amounts | 0.01 to 999,999,999.99 per payment, at most two decimals. Typed amounts may use “.” or “,” for the decimals; ambiguous ones such as 1.234 are refused, not guessed. | EPC guidelines |
| Control totals | NbOfTxs and CtrlSum are computed, in the group header and in the payment block. | ISO 20022; EPC: CtrlSum mandatory, two decimals |
| Service level and charges | PmtMtd TRF, SvcLvl SEPA, ChrgBr SLEV. | EPC guidelines: only these values |
| IBANs | Format, length for the country and the mod-97 check digits, for the ordering account and every payee. A country outside SEPA gets a warning. | ISO 13616; EPC: only IBAN |
| BICs | Optional. Checked when given (8 or 11 characters). Without one the debtor agent is NOTPROVIDED and the creditor agent is left out. | ISO 9362; EPC guidelines |
| Names and remittance | Names 70 characters, remittance text 140, and either one text line or one structured reference per payment. | EPC guidelines |
| RF creditor references | Check digits verified, then sent as Strd/CdtrRefInf with type SCOR and issuer ISO. | ISO 11649; EPC guidelines |
| Character set | a–z A–Z 0–9 / - ? : ( ) . , ' + and space. Other letters are transliterated (é → e, ß → ss, & → +) and listed; anything else is reported with its field. | EPC guidelines §1.4 |
| References and ids | MsgId, PmtInfId and end-to-end ids: 35 characters, the Latin set, no leading, trailing or double slash. End-to-end ids are unique in the file; empty ones are generated. | EPC guidelines; EPC230-15 on slashes |
| Execution date | Today or later. A weekend or TARGET holiday gets a warning with the next business day. | ECB TARGET calendar |
| Addresses | Optional; town and country required when given. In pain.001.001.09, structured (street, number, post code, town, country) or hybrid (town and country plus up to two lines), never address lines alone. pain.001.001.03 has only the country and two lines, an unstructured address: a warning. A warning too when a bank outside the EU/EEA is involved and the payer’s address is missing. | EPC guidelines, address guidance (EPC153-22), SCT rulebook AT-P005 |
The file it writes
A SEPA pain.001, annotated.
The example below is what the generator writes for two payments, one with remittance text and one with an RF creditor reference. Load the example in the form above to build it yourself.
<?xml version="1.0" encoding="UTF-8"?>
<Document xmlns="urn:iso:std:iso:20022:tech:xsd:pain.001.001.09">
<CstmrCdtTrfInitn>
<GrpHdr>
<MsgId>NWT-SCT-20261030-01</MsgId>
<CreDtTm>2026-10-30T09:00:00+00:00</CreDtTm>
<NbOfTxs>2</NbOfTxs>
<CtrlSum>4370.45</CtrlSum>
<InitgPty>
<Nm>Northwind Handels GmbH</Nm>
</InitgPty>
</GrpHdr>
<PmtInf>
<PmtInfId>NWT-SCT-20261030-01-B1</PmtInfId>
<PmtMtd>TRF</PmtMtd>
<BtchBookg>true</BtchBookg>
<NbOfTxs>2</NbOfTxs>
<CtrlSum>4370.45</CtrlSum>
<PmtTpInf>
<SvcLvl>
<Cd>SEPA</Cd>
</SvcLvl>
</PmtTpInf>
<ReqdExctnDt>
<Dt>2035-01-04</Dt>
</ReqdExctnDt>
<Dbtr>
<Nm>Northwind Handels GmbH</Nm>
</Dbtr>
<DbtrAcct>
<Id>
<IBAN>DE89370400440532013000</IBAN>
</Id>
</DbtrAcct>
<DbtrAgt>
<FinInstnId>
<BICFI>COBADEFFXXX</BICFI>
</FinInstnId>
</DbtrAgt>
<ChrgBr>SLEV</ChrgBr>
<CdtTrfTxInf>
<PmtId>
<EndToEndId>NW-2026-311</EndToEndId>
</PmtId>
<Amt>
<InstdAmt Ccy="EUR">2500.00</InstdAmt>
</Amt>
<CdtrAgt>
<FinInstnId>
<BICFI>BNPAFRPPXXX</BICFI>
</FinInstnId>
</CdtrAgt>
<Cdtr>
<Nm>Proseware SARL</Nm>
</Cdtr>
<CdtrAcct>
<Id>
<IBAN>FR1420041010050500013M02606</IBAN>
</Id>
</CdtrAcct>
<RmtInf>
<Ustrd>Invoice 2026-311</Ustrd>
</RmtInf>
</CdtTrfTxInf>
<CdtTrfTxInf>
<PmtId>
<EndToEndId>NW-2026-312</EndToEndId>
</PmtId>
<Amt>
<InstdAmt Ccy="EUR">1870.45</InstdAmt>
</Amt>
<Cdtr>
<Nm>Adventure Works GmbH</Nm>
</Cdtr>
<CdtrAcct>
<Id>
<IBAN>DE75512108001245126199</IBAN>
</Id>
</CdtrAcct>
<RmtInf>
<Strd>
<CdtrRefInf>
<Tp>
<CdOrPrtry>
<Cd>SCOR</Cd>
</CdOrPrtry>
<Issr>ISO</Issr>
</Tp>
<Ref>RF18539007547034</Ref>
</CdtrRefInf>
</Strd>
</RmtInf>
</CdtTrfTxInf>
</PmtInf>
</CstmrCdtTrfInitn>
</Document>
| In the file | What it says |
|---|---|
<NbOfTxs>2 / <CtrlSum>4370.45 | The number of payments and their sum, in the group header and again in the payment block. Computed for you. |
<BtchBookg>true | One debit for the whole batch on your statement (false: one per payment; left out: the bank decides). |
<SvcLvl><Cd>SEPA | Marks the block as a SEPA credit transfer: euro, IBANs, the SEPA character set. |
<ReqdExctnDt><Dt>2035-01-04 | The day your account is debited. In pain.001.001.03 the date stands on its own. |
<ChrgBr>SLEV | Charges follow the SEPA scheme: each side pays its own bank. |
<EndToEndId>NW-2026-311 | Your reference: it reaches the payee and comes back on status reports and statements. |
<CdtrAgt> … <BICFI> | The payee’s bank, only when you give a BIC; within SEPA the IBAN is enough. |
<Strd><CdtrRefInf> … SCOR, ISO, RF18… | An RF creditor reference, sent structured so the payee can match it automatically. |
Import
From a spreadsheet, column by column.
Export your payment list as CSV (comma or semicolon) or copy the cells, and the generator suggests which column is what; change any guess before the rows are added. These are the template’s columns.
| Column | Required | Example | Note |
|---|---|---|---|
| creditor_name | Yes | Proseware SARL | 70 characters |
| creditor_iban | Yes | FR1420041010050500013M02606 | Spaces allowed |
| creditor_bic | No | BNPAFRPPXXX | Optional |
| amount | Yes | 2500.00 | “2500,00”, “2.500,00” and “2,500.00” work too |
| remittance_information | No | Invoice 2026-311 | 140 characters |
| creditor_reference | No | RF18539007547034 | Instead of remittance text |
| end_to_end_id | No | INV-2026-311 | Generated when empty |
| creditor_street … creditor_country | No | Hauptstrasse, 12, 80331, Muenchen, DE | Optional address; town and country if any |
Headers in other languages are recognized too (Betrag, Verwendungszweck, montant, bedrag, importe …), and a column of IBANs or amounts is found by its values even without a header. Files saved by Excel in Windows-1252 read correctly.
For developers and AI agents
The same builder, as an API.
POST the payments as JSON and get the pain.001 back with its totals, warnings and validation: keyless, up to 100 payments a call, nothing stored. AI agents get the build_sepa_credit_transfer tool on the MCP server, up to 50 payments a call.
payments.json
{
"debtor": {
"name": "Northwind Handels GmbH",
"iban": "DE89370400440532013000",
"bic": "COBADEFFXXX"
},
"requestedExecutionDate": "2035-01-04",
"batchBooking": true,
"messageId": "NWT-SCT-20261030-01",
"paymentInfoId": "NWT-SCT-20261030-01-B1",
"payments": [
{
"creditorName": "Proseware SARL",
"creditorIban": "FR1420041010050500013M02606",
"creditorBic": "BNPAFRPPXXX",
"amount": "2500.00",
"remittanceInformation": "Invoice 2026-311",
"endToEndId": "NW-2026-311"
},
{
"creditorName": "Adventure Works GmbH",
"creditorIban": "DE75512108001245126199",
"amount": "1870.45",
"creditorReference": "RF18 5390 0754 7034",
"endToEndId": "NW-2026-312"
}
]
}REST
curl -s https://iso20022-navigator.com/api/v1/sepa/pain001 \
-H 'Content-Type: application/json' \
--data-binary @payments.jsoncurl -s https://iso20022-navigator.com/api/v1/sepa/pain001 \
-H 'Content-Type: application/json' -H 'Accept: application/xml' \
--data-binary @payments.json -o pain001.xmlResponse (excerpt)
{
"messageType": "pain.001.001.09",
"messageId": "NWT-SCT-20261030-01",
"numberOfTransactions": 2,
"controlSum": "4370.45",
"currency": "EUR",
"fileName": "NWT-SCT-20261030-01.xml",
"endToEndIds": [
"NW-2026-311",
"NW-2026-312"
],
"xml": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Document …",
"warnings": [],
"changes": [],
"validation": {
"valid": true,
"counts": {
"error": 0,
"warning": 0,
"info": 0
},
"issues": []
}
}MCP
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "build_sepa_credit_transfer",
"arguments": {
"debtor": {
"name": "Northwind Handels GmbH",
"iban": "DE89370400440532013000",
"bic": "COBADEFFXXX"
},
"requestedExecutionDate": "2035-01-04",
"batchBooking": true,
"messageId": "NWT-SCT-20261030-01",
"paymentInfoId": "NWT-SCT-20261030-01-B1",
"payments": [
{
"creditorName": "Proseware SARL",
"creditorIban": "FR1420041010050500013M02606",
"creditorBic": "BNPAFRPPXXX",
"amount": "2500.00",
"remittanceInformation": "Invoice 2026-311",
"endToEndId": "NW-2026-311"
}
]
}
}
}A payment that breaks a rule comes back as a 422 (an MCP result with isError) listing every problem with its field, such as payments[1].creditorIban. Details on the API and MCP page, with the steps to add the MCP server to your AI client.
Versions and changes
pain.001.001.09, .03 and addresses.
The EPC’s SEPA guidelines moved from pain.001.001.03 (2009) to pain.001.001.09 (the 2019 ISO 20022 version) in March 2024, after postponing the planned November 2023 date; the current 2025 guidelines use .09 too. In .09 the execution date sits in ReqdExctnDt/Dt and a bank is a BICFI; in .03 they are a bare date and BIC. Many banks still accept .03 under their own agreements, so the generator writes it on request. In .03 an address is written as the country and two address lines, as the older guidelines had it: an unstructured address in the EPC’s terms, so the generator warns when a .03 file carries one.
Addresses are changing. The EPC planned to stop accepting unstructured addresses (address lines only) in November 2026; in September 2026 it postponed that date, with the new one still to be announced as of October 2026, and it recommends moving straight to fully structured addresses. In pain.001.001.09 the generator writes only structured or hybrid addresses (town and country always as their own elements), which are valid before and after the change; for addresses that must outlast it, use .09.
Banks add their own requirements on top of the EPC guidelines: some want the BIC, a specific version, a batch booking setting or a file size limit. Test a file with your bank before using it in production.
Questions
Frequently asked questions.
Which pain.001 version should I use for SEPA credit transfers?
pain.001.001.09, the 2019 ISO 20022 version that the EPC SEPA Credit Transfer customer-to-bank guidelines have been based on since March 2024. Some banks still ask for pain.001.001.03 from 2009; the generator writes either, so check your bank’s specification.
Is a BIC still required for SEPA payments?
No. Within SEPA the IBAN is enough. Without a BIC the generator writes the debtor bank as NOTPROVIDED and leaves the creditor bank out, as the EPC guidelines describe. Add a BIC if your bank asks for one.
Which characters can a SEPA file contain?
Every bank must accept the Latin set: a–z, A–Z, 0–9, space and / - ? : ( ) . , ' +. Letters with accents are turned into plain ones (é → e, ß → ss) and each change is listed; characters with no equivalent, such as @ or #, are reported with the field they are in.
What is an RF creditor reference?
A structured payment reference under ISO 11649: RF, two check digits and up to 21 letters or digits, such as RF18 5390 0754 7034. Type it in the remittance column and the generator checks the digits and sends it as a structured reference instead of free text.
Do I still need to give addresses?
Within the EU and EEA addresses are optional. When the payer’s or the payee’s bank is in a SEPA country outside it, such as Switzerland or the United Kingdom, the SCT rulebook makes the payer’s address mandatory, and the generator warns when it is missing. In pain.001.001.09 it writes structured or hybrid addresses, the formats the EPC is moving every payment to; pain.001.001.03 can only carry the country and address lines, an unstructured address, so the generator warns when a .03 file has one.
Are my payment details uploaded?
No. The file is built and checked by JavaScript in your browser; names, IBANs and amounts never reach a server, and the download is created on your device. Only an anonymous counter records that a file was generated.
Will my bank accept the file?
The file follows the EPC guidelines and passes this site’s pain.001 validator, but banks publish their own variants: required fields, accepted versions, file size limits and upload channels. Test a file with your bank before using it in production.
Learn the format
Before and after the upload.
The message you send, the status report your bank answers with, and the codes in it.
- pain.001 formatGroup header, payment blocks and transactions explained
- Payment File ViewerOpen and check any pain.001, pain.008 or pain.002
- pain.002 formatHow the bank answers your file
- Reason codesAC01, AM04, RR04: why a payment was rejected
- AC01 explainedAn incorrect account number
- RJCT explainedWhat a rejected status means and what to do
- PMNT/ICDT/ESCTHow your SEPA payments show on camt.053
- API & MCP docsThe other endpoints and tools
Related tools
More free tools for payment files.
Check the file you built, read the statements it ends up on, and convert MT940 to camt.053.
camt.053 · camt.052 · camt.054
camt Statement Viewer
Bank statements and intraday reports per account: balances with their codes explained, every entry and its references, and the roll-forward checked.
.xml · .camt · .053
pain.001 · pain.008 · pain.002
Payment File Viewer
Credit transfer and direct debit files checked before they go to the bank: control totals, IBANs, BICs, decimals and SEPA rules. Status reports with every reason code explained.
.xml
- Converter
SWIFT MT940 · MT942
MT940 Viewer
Every :61: statement line decoded, structured :86: details read, balances rolled forward — and the whole file converted to camt.053.001.08.
.sta · .940 · .mt940 · .txt