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.

CountryPrefixFormatExample
AustriaATATU + 8 digitsATU33864707
BelgiumBEBE + 0/1 + 9 digitsBE0417497106
BulgariaBGBG + 9–10 digitsBG131468980
CroatiaHRHR + 11 digitsHR81793146560
CyprusCYCY + 8 digits + 1 letterCY90000005D
Czech RepublicCZCZ + 8–10 digitsCZ45274649
DenmarkDKDK + 8 digitsDK22756214
EstoniaEEEE + 9 digitsEE100220641
FinlandFIFI + 8 digitsFI01120389
FranceFRFR + 2 alphanumeric + 9 digitsFR81775670417
GermanyDEDE + 9 digitsDE143454214
GreeceELEL + 9 digitsEL094019245
HungaryHUHU + 8 digitsHU10773381
IrelandIEIE + 7 digits + 1–2 lettersIE6388047V
ItalyITIT + 11 digitsIT15844561009
LatviaLVLV + 11 digitsLV40003032949
LithuaniaLTLT + 9 or 12 digitsLT212154314
LuxembourgLULU + 8 digitsLU20260743
MaltaMTMT + 8 digitsMT12826209
NetherlandsNLNL + 9 digits + B + 2 digitsNL805734958B01
PolandPLPL + 10 digitsPL7342867148
PortugalPTPT + 9 digitsPT500100144
RomaniaRORO + 2–10 digitsRO9010105
SlovakiaSKSK + 10 digitsSK2020310578
SloveniaSISI + 8 digitsSI82646716
SpainESES + letter/digit + 7 digits + letter/digitESA15075062
SwedenSESE + 10 digits + 01SE556703748501
Northern IrelandXIXI + 9 digits, 12 digits, or GD/HA + 3 digitsXI197211009

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) and HA (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.

cURL — live validation
# 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"
TypeScript — normalize, then validate
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.