<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: ismail183</title>
    <description>The latest articles on Forem by ismail183 (@ismail183).</description>
    <link>https://forem.com/ismail183</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3846082%2Fdaf2acf3-4422-4b0c-9f1a-aec75f521d6f.png</url>
      <title>Forem: ismail183</title>
      <link>https://forem.com/ismail183</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/ismail183"/>
    <language>en</language>
    <item>
      <title>SEPA pain.001 XML in 5 Minutes: Generate and Validate for Free</title>
      <dc:creator>ismail183</dc:creator>
      <pubDate>Wed, 22 Apr 2026 14:29:23 +0000</pubDate>
      <link>https://forem.com/ismail183/sepa-pain001-xml-in-5-minutes-generate-and-validate-for-free-3nfg</link>
      <guid>https://forem.com/ismail183/sepa-pain001-xml-in-5-minutes-generate-and-validate-for-free-3nfg</guid>
      <description>&lt;p&gt;If you're building a payment system for European banks, at some point you'll need to generate a SEPA credit transfer file in the &lt;code&gt;pain.001&lt;/code&gt; format. The spec is 200+ pages. The XSD validation errors are cryptic. And most tools that handle this cost money.&lt;/p&gt;

&lt;p&gt;Here's a practical guide to generating and validating &lt;code&gt;pain.001&lt;/code&gt; files - with a free tool and no backend required.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is SEPA pain.001?
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;pain.001&lt;/code&gt; (Payment Initiation) is the ISO 20022 XML message format used to initiate SEPA credit transfers. It's what your ERP or treasury system sends to your bank to trigger batch payments.&lt;/p&gt;

&lt;p&gt;Two versions are in active use:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;pain.001.001.03&lt;/strong&gt; - the legacy version, still widely supported&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;pain.001.001.09&lt;/strong&gt; - the current version, required by most European banks since 2023&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The key structural difference between them: v09 uses &lt;code&gt;&amp;lt;BICFI&amp;gt;&lt;/code&gt; instead of &lt;code&gt;&amp;lt;BIC&amp;gt;&lt;/code&gt;, and drops &lt;code&gt;&amp;lt;MsgDefIdr&amp;gt;&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Minimal pain.001.001.09 File
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;Document&lt;/span&gt; &lt;span class="na"&gt;xmlns=&lt;/span&gt;&lt;span class="s"&gt;"urn:iso:std:iso:20022:tech:xsd:pain.001.001.09"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;CstmrCdtTrfInitn&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;GrpHdr&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;MsgId&amp;gt;&lt;/span&gt;MSG-2026-04-19-001&lt;span class="nt"&gt;&amp;lt;/MsgId&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;CreDtTm&amp;gt;&lt;/span&gt;2026-04-19T10:00:00&lt;span class="nt"&gt;&amp;lt;/CreDtTm&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;NbOfTxs&amp;gt;&lt;/span&gt;1&lt;span class="nt"&gt;&amp;lt;/NbOfTxs&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;CtrlSum&amp;gt;&lt;/span&gt;1500.00&lt;span class="nt"&gt;&amp;lt;/CtrlSum&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;InitgPty&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Nm&amp;gt;&lt;/span&gt;Acme Corp&lt;span class="nt"&gt;&amp;lt;/Nm&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/InitgPty&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/GrpHdr&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;PmtInf&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;PmtInfId&amp;gt;&lt;/span&gt;PMT-001&lt;span class="nt"&gt;&amp;lt;/PmtInfId&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;PmtMtd&amp;gt;&lt;/span&gt;TRF&lt;span class="nt"&gt;&amp;lt;/PmtMtd&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;NbOfTxs&amp;gt;&lt;/span&gt;1&lt;span class="nt"&gt;&amp;lt;/NbOfTxs&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;CtrlSum&amp;gt;&lt;/span&gt;1500.00&lt;span class="nt"&gt;&amp;lt;/CtrlSum&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;PmtTpInf&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;SvcLvl&amp;gt;&amp;lt;Cd&amp;gt;&lt;/span&gt;SEPA&lt;span class="nt"&gt;&amp;lt;/Cd&amp;gt;&amp;lt;/SvcLvl&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/PmtTpInf&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;ReqdExctnDt&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Dt&amp;gt;&lt;/span&gt;2026-04-22&lt;span class="nt"&gt;&amp;lt;/Dt&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/ReqdExctnDt&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;Dbtr&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Nm&amp;gt;&lt;/span&gt;Acme Corp&lt;span class="nt"&gt;&amp;lt;/Nm&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/Dbtr&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;DbtrAcct&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Id&amp;gt;&amp;lt;IBAN&amp;gt;&lt;/span&gt;FR7630006000011234567890189&lt;span class="nt"&gt;&amp;lt;/IBAN&amp;gt;&amp;lt;/Id&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/DbtrAcct&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;DbtrAgt&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;FinInstnId&amp;gt;&amp;lt;BICFI&amp;gt;&lt;/span&gt;BNPAFRPP&lt;span class="nt"&gt;&amp;lt;/BICFI&amp;gt;&amp;lt;/FinInstnId&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/DbtrAgt&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;CdtTrfTxInf&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;PmtId&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;EndToEndId&amp;gt;&lt;/span&gt;E2E-001&lt;span class="nt"&gt;&amp;lt;/EndToEndId&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/PmtId&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Amt&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;InstdAmt&lt;/span&gt; &lt;span class="na"&gt;Ccy=&lt;/span&gt;&lt;span class="s"&gt;"EUR"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;1500.00&lt;span class="nt"&gt;&amp;lt;/InstdAmt&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/Amt&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;CdtrAgt&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;FinInstnId&amp;gt;&amp;lt;BICFI&amp;gt;&lt;/span&gt;DEUTDEDB&lt;span class="nt"&gt;&amp;lt;/BICFI&amp;gt;&amp;lt;/FinInstnId&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/CdtrAgt&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Cdtr&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;Nm&amp;gt;&lt;/span&gt;Supplier GmbH&lt;span class="nt"&gt;&amp;lt;/Nm&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/Cdtr&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;CdtrAcct&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;Id&amp;gt;&amp;lt;IBAN&amp;gt;&lt;/span&gt;DE89370400440532013000&lt;span class="nt"&gt;&amp;lt;/IBAN&amp;gt;&amp;lt;/Id&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/CdtrAcct&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;RmtInf&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;Ustrd&amp;gt;&lt;/span&gt;Invoice INV-2026-001&lt;span class="nt"&gt;&amp;lt;/Ustrd&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/RmtInf&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/CdtTrfTxInf&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/PmtInf&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/CstmrCdtTrfInitn&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/Document&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Most Common Validation Errors
&lt;/h2&gt;

&lt;p&gt;After processing thousands of pain.001 files, these are the errors that come up most often:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Wrong namespace&lt;/strong&gt;&lt;br&gt;
v03: &lt;code&gt;urn:iso:std:iso:20022:tech:xsd:pain.001.001.03&lt;/code&gt;&lt;br&gt;
v09: &lt;code&gt;urn:iso:std:iso:20022:tech:xsd:pain.001.001.09&lt;/code&gt;&lt;br&gt;
Mixing them causes immediate rejection.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. &lt;code&gt;&amp;lt;BIC&amp;gt;&lt;/code&gt; vs &lt;code&gt;&amp;lt;BICFI&amp;gt;&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
In v03, the BIC element is &lt;code&gt;&amp;lt;BIC&amp;gt;&lt;/code&gt;. In v09, it's &lt;code&gt;&amp;lt;BICFI&amp;gt;&lt;/code&gt;. Banks that have migrated to v09 will reject files with &lt;code&gt;&amp;lt;BIC&amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. &lt;code&gt;&amp;lt;MsgDefIdr&amp;gt;&lt;/code&gt; in v09&lt;/strong&gt;&lt;br&gt;
This element existed in v03 but was removed in v09. If your template still includes it, v09 XSD validation will fail.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. &lt;code&gt;&amp;lt;CtrlSum&amp;gt;&lt;/code&gt; mismatch&lt;/strong&gt;&lt;br&gt;
The control sum must exactly match the sum of all &lt;code&gt;&amp;lt;InstdAmt&amp;gt;&lt;/code&gt; values. Off by one cent = rejection.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Execution date in the past&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;&amp;lt;ReqdExctnDt&amp;gt;&lt;/code&gt; must be today or a future business day. Banks won't process past dates.&lt;/p&gt;


&lt;h2&gt;
  
  
  Validate Against the Official XSD
&lt;/h2&gt;

&lt;p&gt;You can validate your file directly in the browser at &lt;a href="https://xmlbridge.com/sepa" rel="noopener noreferrer"&gt;xmlbridge.com/sepa&lt;/a&gt; - paste or upload your XML, select the version (v03 or v09), and click Validate XSD. The validator runs the official ISO 20022 XSD client-side using a WASM XML parser.&lt;/p&gt;

&lt;p&gt;For CI/CD pipelines, validate with Python:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;lxml&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;etree&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;validate_pain001&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;xml_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;09&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;xsd_url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://xmlbridge.com/schemas/pain/pain.001.001.&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;.xsd&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="n"&gt;xsd_content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;xsd_url&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;
    &lt;span class="n"&gt;schema&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;etree&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;XMLSchema&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;etree&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fromstring&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;xsd_content&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;xml_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rb&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;doc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;etree&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fromstring&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;schema&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;validate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Valid pain.001 file&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;schema&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;error_log&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Line &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;validate_pain001&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;payment.xml&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;09&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Generate pain.001 Files Without Coding
&lt;/h2&gt;

&lt;p&gt;If you need to generate a one-off payment file or test a bank integration, &lt;a href="https://xmlbridge.com/sepa" rel="noopener noreferrer"&gt;xmlbridge.com/sepa&lt;/a&gt; lets you fill in a form and download a valid pain.001 XML in seconds - no backend, no signup.&lt;/p&gt;

&lt;p&gt;It supports:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Both v03 and v09&lt;/li&gt;
&lt;li&gt;Single and multi-transaction files&lt;/li&gt;
&lt;li&gt;SEPA EPC QR code generation&lt;/li&gt;
&lt;li&gt;XSD validation in-browser&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Key Differences: v03 vs v09
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Element&lt;/th&gt;
&lt;th&gt;v03&lt;/th&gt;
&lt;th&gt;v09&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;BIC field&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;BIC&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;BICFI&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Message definition&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;&amp;lt;MsgDefIdr&amp;gt;&lt;/code&gt; present&lt;/td&gt;
&lt;td&gt;removed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Namespace&lt;/td&gt;
&lt;td&gt;&lt;code&gt;pain.001.001.03&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;pain.001.001.09&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bank support&lt;/td&gt;
&lt;td&gt;Legacy, still common&lt;/td&gt;
&lt;td&gt;Required by most EU banks&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;SEPA &lt;code&gt;pain.001&lt;/code&gt; is well-standardized but the version migration from v03 to v09 catches a lot of teams off guard. The three elements to watch: namespace, &lt;code&gt;&amp;lt;BIC&amp;gt;&lt;/code&gt; vs &lt;code&gt;&amp;lt;BICFI&amp;gt;&lt;/code&gt;, and &lt;code&gt;&amp;lt;MsgDefIdr&amp;gt;&lt;/code&gt; removal.&lt;/p&gt;

&lt;p&gt;Validate early, validate often - most banks only tell you a file was rejected, not why.&lt;/p&gt;

&lt;p&gt;Try the free generator and validator at &lt;a href="https://xmlbridge.com/sepa" rel="noopener noreferrer"&gt;xmlbridge.com/sepa&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Building a payment integration? Drop your questions in the comments.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>fintech</category>
      <category>xml</category>
      <category>banking</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Generate a Factur-X PDF Invoice in Python (Free, No Library Needed)</title>
      <dc:creator>ismail183</dc:creator>
      <pubDate>Mon, 20 Apr 2026 12:41:24 +0000</pubDate>
      <link>https://forem.com/ismail183/generate-a-factur-x-pdf-invoice-in-python-free-no-library-needed-2n3o</link>
      <guid>https://forem.com/ismail183/generate-a-factur-x-pdf-invoice-in-python-free-no-library-needed-2n3o</guid>
      <description>&lt;p&gt;If you've ever tried to generate a Factur-X invoice programmatically, you know the pain. The official libraries are heavy, the documentation is scattered across three different standards bodies, and getting a valid PDF/A-3 with embedded XML is anything but straightforward.&lt;/p&gt;

&lt;p&gt;This article shows you how to generate a fully compliant Factur-X invoice in Python in under 20 lines of code - using a free API, no local dependencies, no Java runtime.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is Factur-X?
&lt;/h2&gt;

&lt;p&gt;Factur-X is a hybrid e-invoice format: a human-readable PDF/A-3 with an embedded CII XML file. It's the standard for electronic invoicing in France and Germany (where it's called ZUGFeRD), and it's becoming mandatory across the EU.&lt;/p&gt;

&lt;p&gt;The embedded XML allows accounting software to extract invoice data automatically - no manual data entry, no OCR errors.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem With Existing Solutions
&lt;/h2&gt;

&lt;p&gt;The most common approaches involve:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;factur-x Python library&lt;/strong&gt; - requires &lt;code&gt;ghostscript&lt;/code&gt;, &lt;code&gt;pdfrw&lt;/code&gt;, and a working LaTeX or WeasyPrint setup&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mustang Java library&lt;/strong&gt; - requires a JVM, complex Maven setup&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Commercial APIs&lt;/strong&gt; - €99/month minimum&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a quick integration or a small volume use case, none of these are great.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Solution: XMLBridge API
&lt;/h2&gt;

&lt;p&gt;XMLBridge.com exposes a free REST API that generates valid Factur-X PDF/A-3 files. No API key, no signup, no rate limit for reasonable usage.&lt;/p&gt;

&lt;p&gt;Endpoint: &lt;code&gt;POST https://api.xmlbridge.com/generate-facturx&lt;/code&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Verify the Output
&lt;/h2&gt;

&lt;p&gt;To confirm the embedded XML is valid, open the PDF in Adobe Acrobat and check the attachments panel - you should see &lt;code&gt;factur-x.xml&lt;/code&gt;. You can also drag the PDF into &lt;a href="https://xmlbridge.com/facturx" rel="noopener noreferrer"&gt;xmlbridge.com/facturx&lt;/a&gt; to extract and inspect the embedded XML directly in the browser.&lt;/p&gt;




&lt;h2&gt;
  
  
  What the API Returns
&lt;/h2&gt;

&lt;p&gt;The API returns a raw PDF binary (&lt;code&gt;application/pdf&lt;/code&gt;). The PDF:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is PDF/A-3b compliant&lt;/li&gt;
&lt;li&gt;Contains an embedded &lt;code&gt;factur-x.xml&lt;/code&gt; (CII format)&lt;/li&gt;
&lt;li&gt;Passes EN 16931 schematron rules&lt;/li&gt;
&lt;li&gt;Is compatible with Chorus Pro (French public procurement platform)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Generating a valid Factur-X invoice doesn't have to involve a 200MB Java dependency or a paid SaaS subscription. For most use cases - freelancers, small businesses, internal tools - a simple HTTP call is all you need.&lt;/p&gt;

&lt;p&gt;Try it live at &lt;a href="https://xmlbridge.com/facturx" rel="noopener noreferrer"&gt;xmlbridge.com/facturx&lt;/a&gt; or hit the API directly.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Questions or issues? Drop a comment below.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>fintech</category>
      <category>xml</category>
      <category>invoice</category>
    </item>
    <item>
      <title>XMLBridge - Free online XML converter (HTML, PDF, Excel, JSON, XSLT, XSD, validations, SEPA payments generator (pain.001 ISO 20022)</title>
      <dc:creator>ismail183</dc:creator>
      <pubDate>Fri, 27 Mar 2026 10:58:29 +0000</pubDate>
      <link>https://forem.com/ismail183/xmlbridge-free-online-xml-converter-html-pdf-excel-json-xslt-xsd-273</link>
      <guid>https://forem.com/ismail183/xmlbridge-free-online-xml-converter-html-pdf-excel-json-xslt-xsd-273</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fif22i7j7u7ohqqkw8snt.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fif22i7j7u7ohqqkw8snt.jpg" alt=" " width="800" height="466"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hey everyone,&lt;/p&gt;

&lt;p&gt;I recently launched a free browser-based XML tool called XMLBridge — thought it might be useful to some of you.&lt;/p&gt;

&lt;p&gt;What it does:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Convert XML to HTML, PDF, Excel or JSON&lt;/li&gt;
&lt;li&gt;Apply XSLT transformations&lt;/li&gt;
&lt;li&gt;Validate XML against an XSD schema&lt;/li&gt;
&lt;li&gt;Generate XML from an XSD schema&lt;/li&gt;
&lt;li&gt;Generate SEPA payments XML&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everything runs 100% client-side - no files are ever uploaded to a server, which makes it safe for sensitive data.&lt;/p&gt;

&lt;p&gt;It's available in English, French and German.&lt;/p&gt;

&lt;p&gt;Would love to get some feedback from the community!&lt;/p&gt;

&lt;p&gt;Link: &lt;a href="https://xmlbridge.com" rel="noopener noreferrer"&gt;https://xmlbridge.com&lt;/a&gt;&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>sideprojects</category>
      <category>tooling</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
