EU VAT Number Formats: Structure and Examples for Every Country
A reference of the VAT identification number format for each of the 27 EU member states plus Northern Ireland (XI) — the country prefix, the structure, and a real example you can check.
What an EU VAT number looks like
A VAT identification number is the code a business uses on invoices and VAT returns. Every EU VAT number begins with a two-letter prefix identifying the issuing member state, followed by a country-specific sequence of digits and — in some countries — letters. The prefix almost always matches the ISO country code: DE for Germany, FR for France. The two exceptions worth memorising are Greece, which uses EL instead of GR, and Northern Ireland, which uses XI.
Beyond the prefix, formats vary widely. Germany is a clean nine digits; Ireland mixes digits and letters; the Netherlands embeds a literal B; some countries allow a variable number of digits. There is no single universal length or shape — which is exactly why a per-country reference is useful.
It also helps to be clear about what the number is for. A VAT identification number is what a business quotes for VAT purposes — on invoices, on its VAT returns, and when trading across EU borders. It is not the same as a national company-registration number, though in some countries the two are related. When you collect a VAT number from a customer, you are collecting the identifier you will check against the registry and store against the invoice, not a general company ID. Some businesses are registered for domestic VAT but not enabled for intra-EU transactions, in which case their number can be valid at home yet fail a cross-border check — another reason a live lookup matters more than the format alone.
VAT number format by country
Formats below are drawn from vatnode's VAT dataset; examples are real, currently-valid VAT numbers of well-known companies. Click a country code to run a live check and see its current VAT rates.
| Country | Prefix | Format | Example |
|---|---|---|---|
| Austria | AT | ATU + 8 digits | ATU33864707 |
| Belgium | BE | BE + 0/1 + 9 digits | BE0417497106 |
| Bulgaria | BG | BG + 9–10 digits | BG131468980 |
| Croatia | HR | HR + 11 digits | HR81793146560 |
| Cyprus | CY | CY + 8 digits + 1 letter | CY90000005D |
| Czech Republic | CZ | CZ + 8–10 digits | CZ45274649 |
| Denmark | DK | DK + 8 digits | DK22756214 |
| Estonia | EE | EE + 9 digits | EE100220641 |
| Finland | FI | FI + 8 digits | FI01120389 |
| France | FR | FR + 2 alphanumeric + 9 digits | FR81775670417 |
| Germany | DE | DE + 9 digits | DE143454214 |
| Greece | EL | EL + 9 digits | EL094019245 |
| Hungary | HU | HU + 8 digits | HU10773381 |
| Ireland | IE | IE + 7 digits + 1–2 letters | IE6388047V |
| Italy | IT | IT + 11 digits | IT15844561009 |
| Latvia | LV | LV + 11 digits | LV40003032949 |
| Lithuania | LT | LT + 9 or 12 digits | LT212154314 |
| Luxembourg | LU | LU + 8 digits | LU20260743 |
| Malta | MT | MT + 8 digits | MT12826209 |
| Netherlands | NL | NL + 9 digits + B + 2 digits | NL805734958B01 |
| Poland | PL | PL + 10 digits | PL7342867148 |
| Portugal | PT | PT + 9 digits | PT500100144 |
| Romania | RO | RO + 2–10 digits | RO9010105 |
| Slovakia | SK | SK + 10 digits | SK2020310578 |
| Slovenia | SI | SI + 8 digits | SI82646716 |
| Spain | ES | ES + letter/digit + 7 digits + letter/digit | ESA15075062 |
| Sweden | SE | SE + 10 digits + 01 | SE556703748501 |
| Northern Ireland | XI | XI + 9 digits, 12 digits, or GD/HA + 3 digits | XI197211009 |
A few formats deserve a closer look. Greece is the prefix trap — the number uses EL, not GR, so a naive “take the first two letters as the ISO code” will reject valid Greek numbers. Spain and France include alphanumeric characters, not just digits. Northern Ireland (XI) has three accepted shapes, including the special GD and HA government and health-authority forms. When in doubt, validate rather than assume.
Edge cases that trip up format checks
Most format bugs come from a handful of recurring assumptions. Knowing them up front saves you from rejecting perfectly valid customers:
- Greece uses EL, not GR. If you derive the country from the first two characters, special-case EL or you will reject every Greek number. GR is only the ISO/rates code.
- Variable lengths exist. Bulgaria, the Czech Republic, Romania, and Lithuania all accept more than one length. A fixed-length regex will wrongly fail valid numbers.
- Letters are not just in the prefix. Ireland, Spain, France, and the Netherlands embed letters inside the body of the number. Do not assume everything after the prefix is numeric.
- Northern Ireland has special forms. Beyond the standard 9- and 12-digit XI numbers, the
GD(government departments) andHA(health authorities) prefixes are valid and short. - Input is messy. Customers paste numbers with spaces, dots, and dashes. Normalize before you test the format, not after.
For country-by-country detail — rates, examples, and a live check — every prefix in the table above links to its page under vatnode.dev/check, and current standard and reduced rates for all member states are listed on the EU VAT rates page.
How to validate a VAT number programmatically
A format match is necessary but not sufficient. The recommended approach is two steps: a cheap local format check to fail fast on typos, then a live lookup to confirm the number is actually registered. The format check runs in your code; the live check goes to the EU's VIES system via a single API call.
# The full VAT number includes the country prefix.
# Spaces, dots, dashes, and mixed case are normalized automatically.
curl https://api.vatnode.dev/v1/vat/IE6388047V \
-H "Authorization: Bearer vat_live_your_key_here"function normalizeVatId(raw: string): string {
// Trim, uppercase, strip spaces, dots and dashes
return raw.trim().toUpperCase().replace(/[\s.\-]/g, '')
}
async function validateVat(rawVatId: string): Promise<boolean> {
const vatId = normalizeVatId(rawVatId)
// Fail fast on an obviously malformed value before any network call
if (vatId.length < 4 || !/^[A-Z]{2}/.test(vatId)) {
return false
}
try {
const res = await fetch(
`https://api.vatnode.dev/v1/vat/${encodeURIComponent(vatId)}`,
{ headers: { Authorization: `Bearer ${process.env.VATNODE_API_KEY}` } },
)
if (!res.ok) {
// VIES may be temporarily unavailable — handle without blocking the user
return false
}
const result = await res.json()
return result.valid === true
} catch (err) {
console.error('VAT validation failed:', err)
return false
}
}For the full validation pattern — including handling VIES downtime, capturing the consultation number, and storing an audit record — see how to validate EU VAT numbers. To make your first call, the quickstart gets you from sign-up to a working request in a few minutes.
Frequently asked questions
What does the two-letter prefix on a VAT number mean?
It identifies the member state that issued the VAT number, and it almost always matches the ISO country code — DE for Germany, FR for France, and so on. The notable exception is Greece, which uses the prefix EL rather than GR. Northern Ireland uses XI. You must always include the prefix when validating a number against VIES.
Why does a correctly formatted VAT number still fail validation?
Format is only the first gate. A number such as DE123456789 has the right shape for Germany but is invalid unless a real business actually holds it. A format check catches typos cheaply; a VIES lookup confirms the number is registered and active. You need both — format first to fail fast, then a live check before relying on the result.
Is Northern Ireland (XI) part of EU VAT?
For goods, yes. Under the Windsor Framework (which amended the Northern Ireland Protocol), Northern Ireland VAT numbers for goods carry the XI prefix and remain checkable in VIES even though Great Britain (GB) numbers left VIES after Brexit. That is why a complete EU VAT format reference includes XI alongside the 27 member states.
Should I strip spaces and dashes before validating?
Yes. Customers enter VAT numbers with spaces, dots, and dashes in all sorts of ways. Normalize first — trim, uppercase, and remove spaces, dots, and dashes — then check the format and call the API. The vatnode API normalizes input for you, but normalizing client-side as well gives users faster feedback on obvious typos.
Check any EU VAT number now
Paste a number into the free checker, or get an API key to validate formats and live status programmatically across all 27 EU countries plus XI.