International · Validation
EU VAT number validator.
Check an EU VAT identification number's format against all 27 member states' published rules, with a real check-digit algorithm verified for Germany, France, Italy, Spain and the Netherlands. Everything runs in your browser: nothing you type is transmitted anywhere.
Inputs
Result
Enter an EU VAT number and press Validate.
What this tool checks — and what it doesn't
An EU VAT identification number is a 2-letter country prefix (ISO 3166-1, except Greece which uses EL) followed by a number whose exact shape is set by that member state. This tool checks the shape for all 27 states, and for five of them — Germany, France, Italy, Spain and the Netherlands — it also verifies the real, published check-digit algorithm, not a guessed one:
- Germany (DE): 9 digits, checked with the ISO 7064 MOD 11-10 algorithm.
- France (FR): a 2-character key + 9-digit SIREN. For the common all-numeric key, France's own INSEE formula applies:
key = [12 + 3 × (SIREN mod 97)] mod 97. Newer alphanumeric keys (at least one letter, I and O excluded) use the published alternate formula for those cases too. - Italy (IT): 11-digit Partita IVA — digits 8-10 must be a valid province code, and the 11th digit is a standard Luhn check digit over the first 10.
- Spain (ES): a 9-character NIF that covers four real sub-formats — a resident's DNI (8 digits + a mod-23 letter), a foreign national's NIE (X/Y/Z + 7 digits + the same mod-23 letter), a company's CIF (an organisation-type letter + 7 digits + a Luhn check digit, which may be shown as a digit or its equivalent letter), and the K/L/M special-case letters, which reuse the DNI algorithm.
- Netherlands (NL): 9 digits +
B+ a 2-digit company index. Older btw-nummers reuse the citizen BSN's own check ("elfproef"); numbers issued since 2020-01-01 use ISO 7064 MOD 97-10 over the whole "NL" + number string — the same algorithm this site's IBAN validator already implements. This tool tries both and accepts either.
The other 22 member states are checked for format only — correct length and character pattern for that country, nothing more. Where a source found this session confirms that country does publish its own check-digit rule (Belgium, Denmark, Finland, Croatia, Greece, Poland, Portugal, Slovenia, Slovakia), the result says so explicitly rather than silently passing it off as unverifiable. For the remaining format-only countries, no source fetched this session stated whether a check digit exists, so no claim is made either way.
| Prefix | Country | Format | Real checksum? |
|---|---|---|---|
| AT | Austria | U + 8 digits | Format only |
| BE | Belgium | 10 digits | Documented, not implemented |
| BG | Bulgaria | 9-10 digits | Format only |
| CY | Cyprus | 8 digits + letter | Format only |
| CZ | Czech Republic | 8-10 digits | Format only |
| DE | Germany | 9 digits | Verified — ISO 7064 MOD 11-10 |
| DK | Denmark | 8 digits | Documented, not implemented |
| EE | Estonia | 9 digits | Format only |
| EL | Greece | 9 digits | Documented, not implemented |
| ES | Spain | 9 characters, 4 sub-formats | Verified — DNI/NIE/CIF algorithms |
| FI | Finland | 8 digits | Documented, not implemented |
| FR | France | 2 chars + 9 digits | Verified — mod-97 key |
| HR | Croatia | 11 digits | Documented, not implemented |
| HU | Hungary | 8 digits | Format only |
| IE | Ireland | 7-9 characters | Format only |
| IT | Italy | 11 digits | Verified — Luhn + province range |
| LT | Lithuania | 9 or 12 digits | Format only |
| LU | Luxembourg | 8 digits | Format only |
| LV | Latvia | 11 digits | Format only |
| MT | Malta | 8 digits | Format only |
| NL | Netherlands | 9 digits + B + 2 digits | Verified — BSN check or ISO 7064 MOD 97-10 |
| PL | Poland | 10 digits | Documented, not implemented |
| PT | Portugal | 9 digits | Documented, not implemented |
| RO | Romania | 2-10 digits | Format only |
| SE | Sweden | 12 digits | Format only |
| SI | Slovenia | 8 digits | Documented, not implemented |
| SK | Slovakia | 10 digits | Documented, not implemented |
Verification
Formats were cross-checked between two independent sources with no contradiction between them: EUIPO's (an EU agency) own published "European Union VAT identification numbers" reference table, and Wikipedia's VAT identification number article, whose own citations trace back to national tax authorities (Austria's BMF, France's INSEE) and the EU VIES FAQ. The live VIES site (ec.europa.eu/taxation_customs/vies) is now a client-rendered single-page app with no static FAQ page left to fetch, which is exactly why this tool relies on the two fetchable references above instead.
The five real check-digit algorithms were implemented from, and independently re-run against the doctest vectors published in, the MIT-licensed python-stdnum library — the same class of independent, actively-maintained source already cited elsewhere on this site (this page's Netherlands check reuses this site's own IBAN-validator ISO 7064 MOD 97-10 code directly). France's numeric-key formula was additionally cross-verified algebraically against the independent INSEE-sourced formula on Wikipedia: the two are mathematically identical (since 100 ≡ 3 mod 97), and both reduce SIREN 404833048 to key 83, matching Wikipedia's own worked example.
This is format/checksum validation, not the VIES registry
A passing result here proves the number is well-formed and internally consistent — that its digits could belong to a real VAT number of that shape. It does not prove the number is actually issued, currently active, or belongs to the business you think it does. Confirming that requires a live lookup against the EU's own VIES (VAT Information Exchange System), which calls a real-time web service this browser-only tool does not have access to. For 22 of the 27 member states, this tool checks format only — it has no check digit to verify at all, real or otherwise. This tool runs entirely in your browser: nothing you type is transmitted, stored, or logged.