Skip to content

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
  1. 1Enter the paymentsType them, paste cells from Excel or Google Sheets, or import a CSV and match its columns.
  2. 2Build and checkThe EPC rules are applied field by field; the file is then read back by the pain.001 validator.
  3. 3Download and uploadSave the .xml and upload it to your bank’s online banking, EBICS or host-to-host channel.
Start from

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

  1. 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.

0 bytes of your payments are sent: the only request is an anonymous counter when a file is built. Check it in your browser’s developer tools (Network tab).

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.

  1. 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.

  2. 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.

  3. 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.

  4. 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.

Rules the generator enforces
RuleWhat the generator doesSource
Euro onlyEvery amount is written as InstdAmt Ccy="EUR".EPC guidelines: only EUR is allowed
Amounts0.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 totalsNbOfTxs and CtrlSum are computed, in the group header and in the payment block.ISO 20022; EPC: CtrlSum mandatory, two decimals
Service level and chargesPmtMtd TRF, SvcLvl SEPA, ChrgBr SLEV.EPC guidelines: only these values
IBANsFormat, 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
BICsOptional. 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 remittanceNames 70 characters, remittance text 140, and either one text line or one structured reference per payment.EPC guidelines
RF creditor referencesCheck digits verified, then sent as Strd/CdtrRefInf with type SCOR and issuer ISO.ISO 11649; EPC guidelines
Character seta–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 idsMsgId, 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 dateToday or later. A weekend or TARGET holiday gets a warning with the next business day.ECB TARGET calendar
AddressesOptional; 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.

NWT-SCT-20261030-01.xml
<?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>
The example file, explained
In the fileWhat it says
<NbOfTxs>2 / <CtrlSum>4370.45The number of payments and their sum, in the group header and again in the payment block. Computed for you.
<BtchBookg>trueOne debit for the whole batch on your statement (false: one per payment; left out: the bank decides).
<SvcLvl><Cd>SEPAMarks the block as a SEPA credit transfer: euro, IBANs, the SEPA character set.
<ReqdExctnDt><Dt>2035-01-04The day your account is debited. In pain.001.001.03 the date stands on its own.
<ChrgBr>SLEVCharges follow the SEPA scheme: each side pays its own bank.
<EndToEndId>NW-2026-311Your 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.

CSV columns
ColumnRequiredExampleNote
creditor_nameYesProseware SARL70 characters
creditor_ibanYesFR1420041010050500013M02606Spaces allowed
creditor_bicNoBNPAFRPPXXXOptional
amountYes2500.00“2500,00”, “2.500,00” and “2,500.00” work too
remittance_informationNoInvoice 2026-311140 characters
creditor_referenceNoRF18539007547034Instead of remittance text
end_to_end_idNoINV-2026-311Generated when empty
creditor_street … creditor_countryNoHauptstrasse, 12, 80331, Muenchen, DEOptional 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

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

JSON response
curl -s https://iso20022-navigator.com/api/v1/sepa/pain001 \
  -H 'Content-Type: application/json' \
  --data-binary @payments.json
The XML file itself
curl -s https://iso20022-navigator.com/api/v1/sepa/pain001 \
  -H 'Content-Type: application/json' -H 'Accept: application/xml' \
  --data-binary @payments.json -o pain001.xml

Response (excerpt)

200 · application/json
{
  "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

tools/call
{
  "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.

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

    Read the ISO 20022 reference

  • 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

    Or call it from the API and MCP server