VIES — formaty numerów VAT we wszystkich krajach UE
Znajomość formatów numerów VAT 27 krajów UE pozwala szybko wykryć błąd w numerze kontrahenta jeszcze przed sprawdzeniem w VIES. Oszczędza to zapytania, czas i nerwy.
Dlaczego formaty się różnią
Każde państwo członkowskie nadaje numery VAT niezależnie, według własnego systemu identyfikacji podatników. Format wynika z historii podatkowej kraju, infrastruktury administracyjnej i algorytmów weryfikacji cyfry kontrolnej. Ujednolicenie formatów byłoby ekonomicznie nieuzasadnione (koszt migracji 27 systemów krajowych), więc UE pozostawia tę autonomię. Punktem wspólnym jest jedynie dwuliterowy prefiks ISO oraz wymóg, by numer był unikalny w skali kraju.
Tabela krajów alfabetycznie z formatami
Austria (AT): U + 8 cyfr, np. ATU12345678. Belgia (BE): 10 cyfr, zaczynających się od 0 lub 1, np. BE0123456789. Bułgaria (BG): 9 lub 10 cyfr, np. BG123456789. Chorwacja (HR): 11 cyfr, np. HR12345678901. Cypr (CY): 9 znaków (8 cyfr + litera kontrolna), np. CY12345678X. Czechy (CZ): 8, 9 lub 10 cyfr, np. CZ12345678. Dania (DK): 8 cyfr, np. DK12345678. Estonia (EE): 9 cyfr, np. EE123456789. Finlandia (FI): 8 cyfr, np. FI12345678.
Tabela krajów alfabetycznie — ciąg dalszy
Francja (FR): 11 znaków = 2 znaki klucza + 9 cyfr SIREN, np. FR12345678901. Grecja (EL): 9 cyfr, np. EL123456789. Hiszpania (ES): 9 znaków = litera + 7 cyfr + litera lub cyfra kontrolna, np. ESX1234567X. Holandia (NL): 12 znaków = 9 cyfr + B + 2 cyfry, np. NL123456789B01. Irlandia (IE): 8 lub 9 znaków mieszanych cyfr i liter, np. IE1234567WA. Litwa (LT): 9 lub 12 cyfr, np. LT123456789. Luksemburg (LU): 8 cyfr, np. LU12345678. Łotwa (LV): 11 cyfr, np. LV12345678901.
Tabela krajów alfabetycznie — koniec
Malta (MT): 8 cyfr, np. MT12345678. Niemcy (DE): 9 cyfr, np. DE123456789. Polska (PL): 10 cyfr NIP, np. PL1234567890. Portugalia (PT): 9 cyfr, np. PT123456789. Rumunia (RO): 2 do 10 cyfr, np. RO1234567890. Słowacja (SK): 10 cyfr, np. SK1234567890. Słowenia (SI): 8 cyfr, np. SI12345678. Szwecja (SE): 12 cyfr kończących się na 01, np. SE123456789001. Węgry (HU): 8 cyfr, np. HU12345678. Włochy (IT): 11 cyfr, np. IT12345678901.
Algorytmy cyfry kontrolnej — wybrane przykłady
Polski NIP: ostatnia cyfra = (cyfry × wagi [6,5,7,2,3,4,5,6,7]) mod 11. Jeśli wynik = 10, NIP jest nieprawidłowy. Niemiecki USt-IdNr: MOD 11/10. Francuski TVA: pierwsze 2 cyfry to klucz = (12 + 3 × SIREN mod 97) mod 97. Włoski 11-cyfrowy IVA: Luhn z różnymi wagami. Hiszpański NIF: tablica liter kontrolnych dla 23 możliwych reszt z 23 dzielenia. Pełne specyfikacje algorytmów dostępne są na stronach krajowych w sekcji [Kraje UE](/kraje-ue/) — strona każdego kraju ma swój kod walidatora.
Częste pomyłki przy formatach
(1) Mylenie krajów o podobnych formatach (DE 9 cyfr, EE/EL/PT/BG też 9 — łatwo pomylić). (2) Pomyłka prefiksu — zwłaszcza GR vs EL (Grecja używa EL, nie GR). (3) Nie usunięcie spacji/myślników przy kopiowaniu numeru z dokumentów. (4) Brak rozróżnienia wielkości liter w krajach z literami (HR, IE, ES — wszystko uppercase). (5) Mylenie numeru VAT z innym identyfikatorem (REGON, KRS w Polsce; Steuernummer w Niemczech).
Specjalne przypadki
Numery XI z Irlandii Północnej (post-Brexit) mają format brytyjski 9 cyfr, ale są weryfikowalne w VIES wyłącznie dla obrotu towarami. Numery z prefiksem EU dla niektórych usług elektronicznych OSS — nie są weryfikowalne w VIES standardowym, używają osobnego serwisu. Numery TINs (Tax Identification Number) niektórych krajów spoza UE — niezgodne z VIES, wymagają osobnej weryfikacji w kraju źródłowym.
Detailed cyfra kontrolna polskiego NIP — krok po kroku
Polski NIP ma 10 cyfr. Ostatnia cyfra (10.) jest cyfrą kontrolną wyliczaną z pierwszych 9. Algorytm: weź pierwsze 9 cyfr, pomnóż przez wagi [6, 5, 7, 2, 3, 4, 5, 6, 7], zsumuj iloczyny, podziel modulo 11. Wynik powinien równać się 10. cyfrze NIP. Jeśli wynik = 10, NIP jest nieprawidłowy (taka cyfra nie może być 10. cyfrą). Przykład pełny dla NIP 525-202-33-38. Cyfry: 5, 2, 5, 2, 0, 2, 3, 3, 3 (pierwsze 9). Wagi: 6, 5, 7, 2, 3, 4, 5, 6, 7. Iloczyny: 5×6=30, 2×5=10, 5×7=35, 2×2=4, 0×3=0, 2×4=8, 3×5=15, 3×6=18, 3×7=21. Suma: 30+10+35+4+0+8+15+18+21 = 141. 141 mod 11 = 9 (bo 11×12=132, 141-132=9). Ostatnia cyfra NIP: 8. 9 ≠ 8 → NIP NIEPRAWIDŁOWY (przykład celowo zmyślony). Drugi przykład dla autentycznego NIP 525-22-09-540. Cyfry: 5, 2, 5, 2, 2, 0, 9, 5, 4. Iloczyny: 30, 10, 35, 4, 6, 0, 45, 30, 28. Suma: 188. 188 mod 11 = 0. Ostatnia cyfra: 0. 0 = 0 → NIP poprawny. Implementacja w SQL (PostgreSQL): CREATE FUNCTION validate_nip(nip TEXT) RETURNS BOOLEAN AS $$ ... $$ LANGUAGE plpgsql; Pełny kod w naszej dokumentacji /poradniki/vies-vat-number-validation/.
Cyfra kontrolna francuskiego TVA — algorytm SIREN
Francuski numer TVA ma 11 znaków: 2 znaki klucza (mogą zawierać litery) + 9 cyfr SIREN (krajowy numer identyfikacji firm). Algorytm klucza: klucz = (12 + 3 × SIREN mod 97) mod 97. Wynik to 2-cyfrowa liczba w zakresie 00–96 (97 możliwych wartości). Przykład dla SIREN 552120222: 552120222 mod 97 = 552120222 / 97 = 5692991... → 552120222 - 97×5692990 = 552120222 - 552120030 = 192. 192 mod 97 = 192 - 97 = 95 (bo 97×1=97<192, 97×2=194>192). 3 × 95 = 285. 12 + 285 = 297. 297 mod 97 = 297 - 97×3 = 297 - 291 = 6. Klucz to 06. Pełny TVA: FR06552120222. Implementacja w PHP: function calcFrenchVatKey($siren): string { return sprintf('%02d', (12 + 3 * ($siren % 97)) % 97); } Walidacja: pierwsze 2 znaki TVA = calcFrenchVatKey(siren). Wyjątek: niektóre starsze TVA (sprzed 1980) mogą mieć litery w kluczu — nie spełniają algorytmu, ale są nadal aktywne. To rzadkie przypadki (< 0,1% wszystkich francuskich TVA), więc dla walidacji praktycznej można je pominąć i akceptować jako manualną weryfikację.
Cyfra kontrolna włoskiego Partita IVA — wariant Luhn
Włoski Partita IVA ma 11 cyfr. Algorytm walidacji to wariant algorytmu Luhn (znanego głównie z numerów kart kredytowych). Krok 1: weź pierwsze 10 cyfr. Krok 2: dla cyfr na pozycjach nieparzystych (pierwsza, trzecia, piąta, ..., dziewiąta) — pozostaw bez zmian. Krok 3: dla cyfr na pozycjach parzystych (druga, czwarta, ..., dziesiąta) — pomnóż przez 2. Jeśli wynik > 9, odejmij 9 (lub równoważnie zsumuj cyfry wyniku). Krok 4: zsumuj wszystkie wartości z kroku 2 i 3. Krok 5: oblicz cyfrę kontrolną: jeśli suma mod 10 = 0, cyfra kontrolna = 0. W przeciwnym razie: cyfra kontrolna = 10 - (suma mod 10). Krok 6: porównaj wyliczoną cyfrę kontrolną z 11. cyfrą Partita IVA. Jeśli równe, numer poprawny. Przykład dla Partita IVA 12345678903. Pierwszych 10 cyfr: 1, 2, 3, 4, 5, 6, 7, 8, 9, 0. Pozycje nieparzyste (1, 3, 5, ...): 1, 3, 5, 7, 9. Pozycje parzyste pomnożone przez 2: 2×2=4, 4×2=8, 6×2=12 → 1+2=3, 8×2=16 → 1+6=7, 0×2=0. Suma: 1+4+3+8+5+3+7+7+9+0 = 47. 47 mod 10 = 7. Cyfra kontrolna: 10 - 7 = 3. 11. cyfra: 3. 3 = 3 → poprawny. Implementacja: 15 linii w dowolnym języku.
Hiszpański NIF/NIE — tablica liter kontrolnych
Hiszpański NIF (Número de Identificación Fiscal) ma 9 znaków: 8 cyfr + litera kontrolna LUB litera + 7 cyfr + litera kontrolna. Pierwsza wersja dla osób fizycznych, druga dla firm (CIF — Código de Identificación Fiscal, choć od 2008 ujednolicony pod NIF). Algorytm walidacji litery kontrolnej. Krok 1: weź cyfry. Dla osoby fizycznej — wszystkie 8 cyfr. Dla firmy — cyfry między literą początkową a końcową. Krok 2: oblicz mod 23 z cyfr. Krok 3: znajdź odpowiadającą literę w tablicy: 0=T, 1=R, 2=W, 3=A, 4=G, 5=M, 6=Y, 7=F, 8=P, 9=D, 10=X, 11=B, 12=N, 13=J, 14=Z, 15=S, 16=Q, 17=V, 18=H, 19=L, 20=C, 21=K, 22=E. Litery I, O, U są pomijane (mogą być mylone z cyframi). Krok 4: porównaj z literą kontrolną w NIF. Przykład dla NIF 12345678Z. Cyfry: 12345678. 12345678 mod 23 = 12345678 / 23 = 536768.6... → 12345678 - 23×536768 = 12345678 - 12345664 = 14. Tabela[14] = Z. Litera w NIF: Z. Z = Z → poprawny. Hiszpański NIF dla firm (zaczyna się literą A, B, C, D, ...) ma podobny algorytm, ale z mod 11 i tablicą cyfr/liter zamiast tylko liter. Pełne implementacje wszystkich krajowych algorytmów są w naszych SDK.
Format vs treść — co zmienia się w czasie
Formaty numerów VAT są stosunkowo stabilne — większość krajów nie zmieniała formatu od kilkudziesięciu lat. Wyjątki. Belgia 2008: zmiana z 9 na 10 cyfr (dodanie cyfry 0 lub 1 na początku). Stare 9-cyfrowe BE są nieprawidłowe. Niemcy ostatnie zmiany w 1968 (wprowadzenie USt-IdNr.). Chorwacja 2013: wprowadzenie obecnego formatu wraz z wstąpieniem do UE. Polska: format 10-cyfrowego NIP od 1995 (wcześniej REGON jako VAT), niezmieniony do dziś. W przyszłości najprawdopodobniej zmiany przyjdzie z pakietem ViDA. Single VAT Registration od ~2028 wymagać będzie ujednoliconego formatu numerów VAT dla całej UE — projekt nadal w fazie konsultacji, nie jest jasne, czy to będzie nowy format czy adaptacja istniejących. KE preferuje opcję 2 — zachowanie krajowych formatów, dodanie warstwy abstrakcji. To minimalizuje koszty migracji dla 27 administracji skarbowych. Dla podatników oznacza to: w okresie 2028–2030 musisz nadal obsługiwać krajowe formaty VAT (DE, FR, IT itp.), ale jeden numer może działać dla całej UE. ViesVAT będzie wspierał Single VAT Registration od dnia jego wprowadzenia — udostępniamy w SDK metodę resolveSingleVat(unifiedNumber) która tłumaczy zunifikowany numer na lokalne odpowiedniki.
Format VAT a wewnętrzna struktura krajowych numerów
Format numeru VAT w każdym kraju nie jest losowy — często odzwierciedla wewnętrzną strukturę administracyjną. Polska: 10-cyfrowy NIP, gdzie pierwsze cyfry historycznie identyfikowały urząd skarbowy rejestrujący (przed 2003) — teraz losowe. Niemcy: 9-cyfrowy USt-IdNr. (od 1968), kompletnie losowy bez znaczenia geograficznego. Francja: 11-znakowy z 2-cyfrowym kluczem na początku + 9-cyfrowy SIREN. SIREN sam ma strukturę: pierwsze 3 cyfry mogą wskazywać region (historycznie, dziś mieszane). Włochy: 11-cyfrowy Partita IVA. Pierwsze 7 cyfr to identyfikator firmy + 1 cyfra dla regionu + 3 cyfry kontrolne. Hiszpania: 9-znakowy NIF z literą początkową wskazującą typ firmy (A = spółka akcyjna, B = sp. z o.o., C = spółdzielnia, itd.). Te informacje strukturalne są przydatne dla weryfikacji manualnej — np. jeśli kontrahent francuski twierdzi, że ma siedzibę w Lyonie, ale SIREN sugeruje rejestrację w Paryżu, warto wyjaśnić rozbieżność. Dla większości codziennych weryfikacji nie ma to znaczenia — VIES sprawdza tylko ważność, nie analizuje wewnętrznej struktury.
Walidacja krajów z literami — wyzwania specjalne
Kraje z literami w numerach VAT (Austria AT-U, Cypr CY-X, Hiszpania ES-XXX, Holandia NL-B, Irlandia IE-XX) wymagają specjalnej obsługi walidacji. Pierwsze wyzwanie: normalizacja wielkości liter. Wszystkie litery muszą być uppercase — niektóre interfejsy akceptują tylko wielkie, inne tolerują dowolne. Bezpieczna strategia: zawsze toUpperCase() przed walidacją. Drugie wyzwanie: dopuszczalne litery. Hiszpania używa tablicy 23 liter (pomija I, O, U). Holandia ma wyłącznie literę B na pozycji 10. Irlandia ma 2 ostatnie litery od A do Z. Austria ma literę U tylko na pozycji 1. Walidacja musi sprawdzać te ograniczenia. Trzecie wyzwanie: zakodowanie znaków. Wszystkie litery w numerach VAT to ASCII (a-z, A-Z) — żadnych znaków diakrytycznych. To upraszcza, ale czasem klienci przesyłają numery skopiowane z dokumentów z polskimi znakami (np. zamiast O wpisują Ó). Walidacja powinna odrzucać takie wpisy z jasnym komunikatem. Czwarte: kombinacja z prefiksem kraju. Niektóre kraje używają liter w prefiksie (CZ, NL, EL) — należy je odróżnić od liter w numerze. Funkcja parseVatNumber powinna najpierw odciąć prefiks, potem walidować resztę.
Implementacja kompletnego walidatora 27 krajów — open source
Pełen walidator formatu dla 27 krajów UE wraz z algorytmami cyfry kontrolnej wymaga ok. 800 linii kodu w PHP/Python/Node.js. Implementacje open source. JavaScript: 'jsvat' (npm) — popularny pakiet, wspiera 50+ krajów, 2k+ stars na GitHubie. PHP: 'php-vat' (Packagist) — Composer pakiet, wspiera UE + UK + CH + NO. Python: 'python-stdnum' (PyPI) — szeroka biblioteka walidatorów (nie tylko VAT, też IBAN, ISBN, itp.), wspiera wszystkie UE. Ruby: 'valvat' (RubyGems) — wspiera UE, dobrze utrzymywany. Go: 'go-vat-validator' — mniej dojrzały, ale działa. .NET: 'VatNumberValidation.NET' (NuGet) — wspiera UE. Wszystkie te biblioteki są bezpłatne i mogą być używane do walidacji formatu offline. Ograniczenia: nie weryfikują statusu w VIES (tylko format), nie zawsze są aktualne dla rzadko zmieniających się przepisów (np. zmiana belgijskiego formatu w 2008). Dla produkcji rekomendujemy używanie tych bibliotek do warstwy 1-2 (format + checksum), a następnie naszego API ViesVAT dla warstwy 3-4 (cache + VIES query). To dzielenie odpowiedzialności jest efektywne kosztowo i zwiększa wydajność (mniej zapytań VIES, szybsze odpowiedzi dla błędów formatu).
Najczęściej zadawane pytania
Jak rozpoznać kraj po numerze VAT?
Po dwuliterowym prefiksie ISO. Dla Grecji to EL (nie GR), dla UK to GB (już nie w VIES), dla Irlandii Płn to XI.
Czy numer VAT zawiera litery?
W większości krajów tylko cyfry, ale Cypr, Hiszpania, Irlandia, Niderlandy i Austria używają liter.
Czy mogę zwalidować numer offline?
Format i cyfrę kontrolną — tak. Aktywność — tylko przez VIES.
Dlaczego Polska ma 10 cyfr a Niemcy 9?
Polska używa NIP-u jako VAT-UE — 10 cyfr to historyczny format polskiego NIP.
Czy formaty się zmieniają?
Rzadko — ostatnie zmiany były >10 lat temu. Belgia w 2008 dodała 0 jako pierwszą cyfrę.