Validating a VAT number sounds like a single operation, but it involves querying one of 31 different national registries — each with its own format rules, response fields, and reliability characteristics. The TaxID API abstracts this complexity behind a single REST endpoint: GET /api/v1/validate/:country/:vat. This guide explains what happens inside that call for each of the 31 supported countries, what data each registry actually returns, and the edge cases that cause silent failures if you do not know to look for them.
The 27 EU Member States via VIES
All 27 EU member states are validated via VIES (VAT Information Exchange System), the European Commission's centralised routing layer. VIES does not maintain its own database — it routes each query to the national tax authority of the relevant member state and relays the response. This means that validation quality, response time, and available fields vary by country even though you use the same API endpoint.
The VIES company_name and address fields are returned by most — but not all — member states. Germany, France, Netherlands, Belgium, and most northern European states return full company name and registered address. Some southern and eastern European states (notably Romania and Bulgaria) return only valid/invalid status with no company details. The API response includes company_name: null and address: null in these cases — this is correct behaviour, not an error.
| Country | Code | Format example | Returns company name? | Notes |
|---|---|---|---|---|
| Germany | DE | DE123456789 | ✓ Yes | Validated by BZST |
| France | FR | FR12345678901 | ✓ Yes | First 2 chars alphanumeric |
| Netherlands | NL | NL123456789B01 | ✓ Yes | B + 2 digits mandatory |
| Spain | ES | ESX1234567X | ✓ Yes | Complex format — letter+7+letter |
| Italy | IT | IT12345678901 | ✓ Yes | 11 digits |
| Poland | PL | PL1234567890 | ✓ Yes | 10 digits |
| Belgium | BE | BE0123456789 | ✓ Yes | Leading zero valid |
| Sweden | SE | SE123456789001 | ✓ Yes | 12 digits, ends 01 |
| Greece | EL | EL123456789 | ✓ Yes | EL not GR — common mistake |
| Portugal | PT | PT123456789 | ✓ Yes | 9 digits |
| Romania | RO | RO12345678 | ✗ Status only | 2–10 digits, variable length |
| Bulgaria | BG | BG123456789 | ✗ Status only | 9 or 10 digits |
Note
Greece is the single most common integration gotcha: its VIES country code is EL, not GR. GR is the ISO 3166-1 alpha-2 code, but Greece registered under the name Ελλάδα in the VIES system. The TaxID API accepts both GR and EL and normalises to EL automatically.
United Kingdom: HMRC VAT Validation
Post-Brexit, UK VAT numbers are no longer accessible through VIES. The TaxID API validates UK numbers via the HMRC VAT Registration Number API directly. UK VAT numbers use the GB prefix (9 digits) or the XI prefix for Northern Ireland businesses that remain in the EU VAT area under the Northern Ireland Protocol. XI numbers are validated via VIES, not HMRC.
HMRC returns company name and registered address for valid UK VAT numbers, making it one of the most complete data sources of the 31 supported registries. The HMRC API is RESTful (unlike VIES SOAP), generally faster (200–400ms), and has better uptime than most EU member state VIES nodes.
Australia: ABN/ABR Validation
Australian businesses use ABNs (Australian Business Numbers) rather than VAT numbers. ABNs are 11-digit numbers validated via the Australian Business Register (ABR). The TaxID API uses the AU country code for ABN validation. The ABR returns business name, ABN status (active/cancelled), entity type (company, sole trader, trust, etc.), and the date of GST registration.
Australian GST (Goods and Services Tax) operates differently from EU VAT: there is no intra-country reverse charge, and GST applies to B2B and B2C supplies alike in most cases. ABN validation is primarily used for supplier onboarding (confirming a supplier is registered before including them in PAYG withholding calculations) and for B2B export invoices where the buyer needs to claim GST input tax credits.
Norway: Brønnøysund/MVA Validation
Norwegian VAT numbers (MVA numbers) are validated via the Brønnøysund Register Centre. The format is a 9-digit organisation number followed by 'MVA' (e.g., 123456789MVA). The TaxID API uses the NO country code. Norway is part of the EEA but not the EU — its VAT system is not connected to VIES, so it requires a separate API call to the Norwegian Enhetsregisteret.
Switzerland: UID Validation
Swiss businesses use UID numbers (Unternehmens-Identifikationsnummer). The standard VAT-relevant format is CHE-XXX.XXX.XXX MWST (French: TVA, Italian: IVA). Switzerland is not in the EU or EEA — its VAT system is managed by the ESTV (Swiss Federal Tax Administration) and is entirely separate from VIES. The TaxID API uses the CH country code for Swiss UID validation via the Zefix registry.
The Single Endpoint Pattern
The major practical advantage of using an API that covers all 31 countries is that your integration code does not need country-specific conditional logic. The same endpoint, the same response shape, and the same status codes apply regardless of whether you are validating a German DE number via VIES, a UK GB number via HMRC, or an Australian AU ABN via the ABR.
// Same function works for all 31 countries
async function validateTaxId(country: string, taxId: string) {
const res = await fetch(
`https://taxid.dev/api/v1/validate/${country}/${taxId}`,
{ headers: { Authorization: `Bearer ${process.env.TAXID_API_KEY}` } }
);
const data = await res.json();
// Response structure is identical regardless of country
return {
valid: data.status === 'active',
status: data.status,
companyName: data.company_name,
address: data.address,
};
}
// Works for all of these:
await validateTaxId('DE', 'DE123456789'); // Germany via VIES
await validateTaxId('GB', 'GB123456789'); // UK via HMRC
await validateTaxId('AU', '51824753556'); // Australia via ABR
await validateTaxId('NO', '123456789MVA'); // Norway via Brønnøysund
await validateTaxId('CH', 'CHE-123.456.789'); // Switzerland via ZefixFor country-specific format details, example numbers, and per-country API documentation, see the individual country pages: Germany, France, United Kingdom, Italy, Spain, Netherlands, Australia, Norway, and Switzerland. Each page includes the regex pattern, a live validation tool, and integration code in Node.js and Python.
VIES Reliability Varies Significantly by Country
Even though all 27 EU member states are accessible through the same VIES endpoint, their reliability characteristics differ substantially. Germany, France, the Netherlands, and Belgium have well-maintained national VIES nodes with consistent sub-500ms response times and high availability. Some smaller member states — particularly Malta, Cyprus, and Luxembourg — have historically lower VIES uptime and slower response times. Romania and Bulgaria return only status (valid/invalid) without company name or address data, which affects use cases that need company identity verification.
The practical implication for your integration is that you cannot assume uniform behaviour across all 27 countries. A validation that takes 300ms for a German company may take 1,200ms for a Romanian company, and the Romanian response will not include a company name. Handle both cases: use a timeout that accommodates the slowest member states (5 seconds is safe), and do not treat a null company_name as an error — for some countries it is the expected response even for fully valid registrations. The TaxID API normalises these differences in its status taxonomy and documents per-country field availability.