<?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: Alice Klein</title>
    <description>The latest articles on DEV Community by Alice Klein (@aliceklein).</description>
    <link>https://dev.to/aliceklein</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4225472%2Fd0bc8983-c69e-4682-9629-bcefc7a9649f.jpg</url>
      <title>DEV Community: Alice Klein</title>
      <link>https://dev.to/aliceklein</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/aliceklein"/>
    <language>en</language>
    <item>
      <title>webdev, api, fintech, programming</title>
      <dc:creator>Alice Klein</dc:creator>
      <pubDate>Wed, 04 Nov 2026 06:52:25 +0000</pubDate>
      <link>https://dev.to/aliceklein/webdev-api-fintech-programming-51cm</link>
      <guid>https://dev.to/aliceklein/webdev-api-fintech-programming-51cm</guid>
      <description>&lt;p&gt;Weryfikacja europejskich numerów identyfikacji podatkowej (VAT-UE) w systemie &lt;strong&gt;VIES (VAT Information Exchange System)&lt;/strong&gt; to kluczowy element każdego systemu e-commerce, platformy SaaS oraz oprogramowania finansowo-księgowego obsługującego transakcje transgraniczne (B2B) w Unii Europejskiej.&lt;/p&gt;

&lt;p&gt;Zastosowanie preferencyjnej stawki 0% VAT przy Wewnątrzwspólnotowej Dostawie Towarów (WDT) lub procedury odwrotnego obciążenia (reverse charge) przy świadczeniu usług wymaga bezwzględnego potwierdzenia, że kontrahent posiada aktywny numer w rejestrze VIES.&lt;/p&gt;

&lt;p&gt;Przed wysłaniem zapytania do unijnego API kluczowa jest lokalna walidacja składniowa. Poniżej przedstawiamy zestawienie struktur i algorytmów numerów VAT w poszczególnych państwach członkowskich UE.&lt;/p&gt;




&lt;h2&gt;
  
  
  Tabela formatów numerów VAT w Unii Europejskiej
&lt;/h2&gt;

&lt;p&gt;Każde z 27 państw członkowskich stosuje własny standard tworzenia numeru identyfikacji podatkowej. Poniższa tabela przedstawia strukturę wymaganą przez unijną bazę VIES:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Państwo&lt;/th&gt;
&lt;th&gt;Kod kraju (Prefiks)&lt;/th&gt;
&lt;th&gt;Długość i format znaków&lt;/th&gt;
&lt;th&gt;Przykład struktury&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Austria&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;AT&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;U&lt;/code&gt; + 8 cyfr&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ATU12345678&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Belgia&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;BE&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;10 cyfr (zaczyna się od 0 lub 1)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;BE0123456789&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Czechy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;CZ&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;8, 9 lub 10 cyfr&lt;/td&gt;
&lt;td&gt;&lt;code&gt;CZ12345678&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Dania&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;DK&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;8 cyfr&lt;/td&gt;
&lt;td&gt;&lt;code&gt;DK12345678&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Estonia&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;EE&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;9 cyfr&lt;/td&gt;
&lt;td&gt;&lt;code&gt;EE123456789&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Finlandia&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;FI&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;8 cyfr&lt;/td&gt;
&lt;td&gt;&lt;code&gt;FI12345678&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Francja&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;FR&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;2 znaki (cyfry/litery) + 9 cyfr&lt;/td&gt;
&lt;td&gt;&lt;code&gt;FRXX123456789&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Grecja&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;EL&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;9 cyfr (uwaga: prefiks &lt;code&gt;EL&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;EL123456789&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Hiszpania&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ES&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;9 znaków (litera na początku/końcu)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ESX1234567X&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Holandia&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;NL&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;9 cyfr + &lt;code&gt;B&lt;/code&gt; + 2 cyfry&lt;/td&gt;
&lt;td&gt;&lt;code&gt;NL123456789B01&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Irlandia&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;IE&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;7 cyfr + 1-2 litery&lt;/td&gt;
&lt;td&gt;&lt;code&gt;IE1234567T&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Litwa&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;LT&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;9 lub 12 cyfr&lt;/td&gt;
&lt;td&gt;&lt;code&gt;LT123456789&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Łotwa&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;LV&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;11 cyfr&lt;/td&gt;
&lt;td&gt;&lt;code&gt;LV12345678901&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Niemcy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;DE&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Dokładnie 9 cyfr&lt;/td&gt;
&lt;td&gt;&lt;code&gt;DE123456789&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Polska&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;PL&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Dokładnie 10 cyfr&lt;/td&gt;
&lt;td&gt;&lt;code&gt;PL1234567890&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Szwecja&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;SE&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;12 cyfr (kończy się &lt;code&gt;01&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;SE123456789001&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Włochy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;IT&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Dokładnie 11 cyfr&lt;/td&gt;
&lt;td&gt;&lt;code&gt;IT12345678901&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Kompletne zestawienie wszystkich 27 państw członkowskich oraz aktualną specyfikację techniczną udostępnia serwis &lt;a href="https://viesvat.com/poradniki/vies-formaty-numerow-vat/" rel="noopener noreferrer"&gt;viesvat&lt;/a&gt;, który pozwala zweryfikować dokładne reguły walidacji algorytmicznej dla poszczególnych jurysdykcji podatkowych.&lt;/p&gt;




&lt;h2&gt;
  
  
  Kluczowe pułapki implementacyjne
&lt;/h2&gt;

&lt;p&gt;Programiści integrujący formularze zamówień i walidatory NIP najczęściej napotykają na następujące specyficzne wyjątki:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Prefiks Grecji (&lt;code&gt;EL&lt;/code&gt; zamiast &lt;code&gt;GR&lt;/code&gt;):&lt;/strong&gt;&lt;br&gt;
Zgodnie z unijną specyfikacją techniczną Grecja posługuje się kodem &lt;strong&gt;EL&lt;/strong&gt;, podczas gdy międzynarodowy kod ISO państwa to &lt;em&gt;GR&lt;/em&gt;. Formularz musi automatycznie mapować ten wyjątek.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Litera &lt;code&gt;U&lt;/code&gt; w numerze austriackim (&lt;code&gt;ATU&lt;/code&gt;):&lt;/strong&gt;&lt;br&gt;
Po prefiksie kraju w Austrii zawsze występuje wielka litera &lt;code&gt;U&lt;/code&gt;, po której następuje 8 cyfr. Wpisanie samych cyfr jest najczęstszym błędem użytkowników.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Francuski klucz kontrolny modulo 97:&lt;/strong&gt;&lt;br&gt;
Dwa pierwsze znaki po prefiksie &lt;code&gt;FR&lt;/code&gt; są wyliczane na podstawie algorytmu: &lt;code&gt;[12 + 3 * (SIREN modulo 97)] modulo 97&lt;/code&gt;. Jeśli wynik jest mniejszy niż 10, prefiks uzupełnia się cyfrą zero lub literami.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Wielka Brytania i Irlandia Północna:&lt;/strong&gt;&lt;br&gt;
Po Brexicie numery z Wielkiej Brytanii (&lt;code&gt;GB&lt;/code&gt;) nie podlegają walidacji w VIES. Wyjątkiem jest Irlandia Północna dla obrotu towarowego, która posługuje się prefiksem &lt;code&gt;XI&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Walidacja wstępna (RegEx) w JavaScript
&lt;/h2&gt;

&lt;p&gt;Aby zmniejszyć obciążenie sieciowe i ograniczyć liczbę zbędnych zapytań do zewnętrznych serwerów, dobrą praktyką jest wstępna walidacja wyrażeniem regularnym przed wysłaniem żądania API:&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
javascript
// Przykładowy słownik podstawowych formatów RegEx dla wybranych krajów UE
const vatPatterns = {
  PL: /^PL[0-9]{10}$/,
  DE: /^DE[0-9]{9}$/,
  AT: /^ATU[0-9]{8}$/,
  FR: /^FR[A-Z0-9]{2}[0-9]{9}$/,
  ES: /^ES[A-Z0-9][0-9]{7}[A-Z0-9]$/,
  IT: /^IT[0-9]{11}$/,
  NL: /^NL[0-9]{9}B[0-9]{2}$/
};

function validateVatFormat(countryCode, vatNumber) {
  const sanitized = vatNumber.replace(/[\s.-]/g, '').toUpperCase();
  const pattern = vatPatterns[countryCode];

  if (!pattern) {
    return false; // Nieobsługiwany kod kraju
  }

  return pattern.test(sanitized);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>api</category>
      <category>fintech</category>
      <category>programming</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
