31 countries · REST · Sub-100ms

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

31
Countries supported
< 10ms
Cached response time
99.9%
API uptime SLA

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.

GET /api/v1/validate/DE/DE123456789
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

TypeScript
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
}
Python
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.

StatusMeaning
activeVAT number is valid and currently registered
invalidNumber does not exist in the registry
inactivePreviously registered, now deregistered
format_invalidWrong format for the country code
service_unavailableUpstream authority temporarily unreachable

Common use cases

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 APIVIES direct
ProtocolREST + JSONSOAP + XML
Invalid vs unavailable5 distinct status codes1 error for both
Cached responsesYes — under 10ms warmNo cache
Response time (p95)~40ms1–4 seconds
Company name returnedYes (where available)Yes (where available)
Non-EU countriesUK, AU, NO, CHEU only
Free tier100/month, no CCUnlimited, no key

Pricing

Free
$0forever
  • 100 validations/month
  • All 31 countries
  • No credit card
Get started
Starter
$19/month
  • 1,000 validations/month
  • All 31 countries
  • Priority support
Start free trial
Scale
$79/month
  • 10,000 validations/month
  • SLA guarantee
  • Volume discounts
See all plans

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.