<?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>DEV Community: ismail183</title>
    <description>The latest articles on DEV Community by ismail183 (@ismail183).</description>
    <link>https://dev.to/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>DEV Community: ismail183</title>
      <link>https://dev.to/ismail183</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ismail183"/>
    <language>en</language>
    <item>
      <title>XRechnung Validation Without Java: A Free Browser-Based Alternative</title>
      <dc:creator>ismail183</dc:creator>
      <pubDate>Thu, 23 Apr 2026 16:01:05 +0000</pubDate>
      <link>https://dev.to/ismail183/xrechnung-validation-without-java-a-free-browser-based-alternative-50i8</link>
      <guid>https://dev.to/ismail183/xrechnung-validation-without-java-a-free-browser-based-alternative-50i8</guid>
      <description>&lt;p&gt;If you've ever tried to validate an XRechnung file, you've probably ended up at the KoSIT validator - a Java command-line tool that requires a JDK, a specific configuration file, and about 45 minutes of setup before you can validate your first invoice.&lt;/p&gt;

&lt;p&gt;There's a faster way.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is XRechnung?
&lt;/h2&gt;

&lt;p&gt;XRechnung is Germany's national e-invoicing standard, based on UBL 2.1 and the European norm EN 16931. It has been mandatory for invoices submitted to German federal public authorities since November 2020, and is progressively being adopted across state and municipal levels.&lt;/p&gt;

&lt;p&gt;If you sell to German public sector clients, you need XRechnung. If you're building an ERP or accounting integration for the German market, you need to generate and validate it.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Official Validator: KoSIT
&lt;/h2&gt;

&lt;p&gt;The official validation tool is maintained by KoSIT (Koordinierungsstelle für IT-Standards). It's a Java application that runs XSD schema validation + Schematron business rules (the EN 16931 BR-* rules that go beyond what XSD can check).&lt;/p&gt;

&lt;h2&gt;
  
  
  Validate Without Java
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://xmlbridge.com/xrechnung" rel="noopener noreferrer"&gt;xmlbridge.com/xrechnung&lt;/a&gt; runs the official KoSIT validator server-side and returns the result in seconds. Upload your file, get a pass/fail with error details. No Java, no config files, no local setup.&lt;/p&gt;

&lt;p&gt;It also generates XRechnung files from a form if you need to create test invoices quickly.&lt;/p&gt;

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

&lt;p&gt;XRechnung validation is painful to set up locally. For quick checks, use the free browser validator. For CI/CD, use the API. For generating test invoices, the form-based generator covers most use cases.&lt;/p&gt;

&lt;p&gt;The KoSIT Java validator is still the gold standard for production systems — but you don't need it for development and testing.&lt;/p&gt;

&lt;p&gt;Try it at &lt;a href="https://xmlbridge.com/xrechnung" rel="noopener noreferrer"&gt;xmlbridge.com/xrechnung&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>xml</category>
      <category>germany</category>
      <category>einvoicing</category>
      <category>fintech</category>
    </item>
    <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://dev.to/ismail183/sepa-pain001-xml-in-5-minutes-generate-and-validate-for-free-3nfg</link>
      <guid>https://dev.to/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://dev.to/ismail183/generate-a-factur-x-pdf-invoice-in-python-free-no-library-needed-2n3o</link>
      <guid>https://dev.to/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://dev.to/ismail183/xmlbridge-free-online-xml-converter-html-pdf-excel-json-xslt-xsd-273</link>
      <guid>https://dev.to/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>
