EU VAT Validation API — 31 Countries, REST, Sub-100ms
One REST endpoint to validate VAT numbers across all 27 EU member states, the UK, Australia, Norway, and Switzerland. Machine-readable status codes, company name returned, and resilient handling of VIES downtime built in.
Free plan: 100 validations/month · No credit card · Working integration in under 2 minutes
What the VAT validation API includes
31 countries
EU27 via VIES, UK (HMRC), Australia (ABR), Norway, Switzerland. One unified API.
Sub-100ms responses
Warm-cached responses served in under 10ms. Cold VIES calls average 300–600ms.
5 machine-readable statuses
active · invalid · inactive · format_invalid · service_unavailable. Never guess.
Downtime handled
VIES is down ~2% of the time. The API returns service_unavailable so you can retry instead of reject.
One request. Structured JSON back.
Pass the country code and VAT number. Get back the validation status, company name, and registered address — no SOAP, no XML.
curl https://www.taxid.dev/api/v1/validate/DE/DE123456789 \
-H "Authorization: Bearer vat_xxxxxxxxxxxx"
{
"valid": true,
"status": "active",
"country_code": "DE",
"vat_number": "DE123456789",
"company_name": "Example GmbH",
"company_address": "Musterstraße 1, 10115 Berlin, DE",
"request_id": "req_01HX..."
}Integration examples
const res = await fetch(
`https://www.taxid.dev/api/v1/validate/${country}/${vatNumber}`,
{ headers: { Authorization: `Bearer ${process.env.TAXID_API_KEY}` } }
);
const data = await res.json();
switch (data.status) {
case "active": // Valid — apply reverse charge
case "invalid": // Does not exist — reject
case "inactive": // Deregistered — charge local VAT
case "format_invalid":// Bad format — prompt to correct
case "service_unavailable": // VIES down — allow, retry later
}import requests
def validate_vat(country: str, vat_number: str) -> dict:
r = requests.get(
f"https://www.taxid.dev/api/v1/validate/{country}/{vat_number}",
headers={"Authorization": f"Bearer {TAXID_API_KEY}"},
timeout=10,
)
r.raise_for_status()
return r.json()
result = validate_vat("DE", "DE123456789")
if result["status"] == "active":
# Apply reverse charge — valid EU business
apply_reverse_charge(customer_id, result["company_name"])5 machine-readable status codes
VIES returns one error for both “number does not exist” and “service is down”. TaxID returns five distinct statuses so your integration can handle each case correctly.
| Status | Meaning |
|---|---|
| active | VAT number is valid and currently registered |
| invalid | Number does not exist in the registry |
| inactive | Previously registered, now deregistered |
| format_invalid | Wrong format for the country code |
| service_unavailable | Upstream authority temporarily unreachable |
Common use cases
SaaS billing →
Validate at signup and re-validate monthly. Apply reverse charge automatically for EU B2B customers.
B2B checkout →
Add a VAT number field to checkout. Validate before processing payment and store the audit record.
Marketplace DAC7 →
Validate seller VAT numbers as part of DAC7 KYB onboarding. Store request_id for audit logs.
ERP / bulk import →
Validate supplier and customer VAT numbers in bulk. Re-validate your database monthly.
VAT Validation API vs calling VIES directly
VIES is the authoritative source — but raw SOAP, 1–4 second latency, and no error granularity make it painful to use in production.
| TaxID API | VIES direct | |
|---|---|---|
| Protocol | REST + JSON | SOAP + XML |
| Invalid vs unavailable | 5 distinct status codes | 1 error for both |
| Cached responses | Yes — under 10ms warm | No cache |
| Response time (p95) | ~40ms | 1–4 seconds |
| Company name returned | Yes (where available) | Yes (where available) |
| Non-EU countries | UK, AU, NO, CH | EU only |
| Free tier | 100/month, no CC | Unlimited, no key |
Pricing
VAT Validation API — frequently asked questions
What is a VAT validation API?
A VAT validation API lets you programmatically check whether a VAT number is active and registered. It queries official sources (VIES for the EU, HMRC for the UK) and returns structured JSON with the status, company name, and address — no manual lookups, no SOAP.
How does TaxID's API differ from calling VIES directly?
VIES uses SOAP/XML, returns ambiguous errors (no distinction between 'invalid' and 'service unavailable'), has no caching, and averages 1–4 seconds per call. TaxID wraps VIES with REST, adds 5 distinct status codes, caches responses under 10ms, and handles downtime gracefully.
Which countries are supported?
All 27 EU member states via VIES, plus UK (HMRC), Australia (ABR), Norway (Brønnøysundregistrene), and Switzerland (ZEFIX) — 31 countries total via a single endpoint.
What does service_unavailable mean and how should I handle it?
It means the upstream authority (VIES or another registry) is temporarily unreachable. You should never treat this as invalid. The recommended pattern is to allow the customer through but flag the order for re-validation once the service recovers.
How much does it cost?
There is a free plan with 100 validations/month, no credit card required. Paid plans start at $19/month for 1,000 validations. Enterprise pricing is available for high-volume use cases.
VAT Number Check API
Use TaxID as a VAT number check API to verify any EU, UK, Australian, Norwegian, or Swiss business registration in real time. A single GET request returns the validity status, company name, and registered address — no parsing SOAP XML, no guessing which errors mean “invalid” vs “service down”.
The check runs against VIES for EU27, HMRC for the UK, ABR for Australia, and the national registries for Norway and Switzerland. Results are cached for 24 hours so repeated checks on the same number return in under 10ms.
Tax ID Validation API
Beyond EU VAT numbers, TaxID works as a tax ID validation API for non-EU jurisdictions. Validate UK VAT numbers against HMRC, Australian Business Numbers (ABN) against the ABR, Norwegian organisation numbers against Brønnøysundregistrene, and Swiss UID numbers against ZEFIX — all through the same endpoint.
The response schema is identical regardless of country: valid, status, company_name, company_address, and request_id for audit trails.
Related resources
Start validating VAT numbers today
Free plan: 100 validations/month, all 31 countries, no credit card. Working integration in under 2 minutes.