VIES + HMRC + BFS + Brønnøysund + ABR in one API

VAT number validation API for developers

One API for validating VAT and GST numbers across 32 countries. Built to handle registry downtime. Real-time lookups, automatic retries, typed SDKs, and built-in caching.

Free 500 validations/month · No credit card required

$ api.avatcado.com
curl https://api.avatcado.com/v1/validate?vat_number=NL123456789B01 \
  -H "Authorization: Bearer avat_live_..."

> TRY IT - FREE CHECKER

Enter a VAT number to see its registration result, source and freshness

Also available as a standalone free VAT checker

97.6%
30-day VIES uptime
32
Countries supported
5
Official registries
< 2 min
To first request
Validating across 32 countries

One request, 32 tax authorities

Every validation routes to the right authority automatically: VIES for the EU, HMRC for the UK, BFS for Switzerland and Liechtenstein, Brønnøysund for Norway, and ABR for Australia. You call one endpoint, Avatcado picks the registry, retries the flaky ones, and hands back a normalized response either way.

32 / Countries
5 / Registries
97.6% / 30-day VIES uptime

National registers provide another way to check

10 EU countries publish their VAT register openly enough to query during an outage. When VIES reports an eligible member-state outage, Pro and Business can use a national register through a live lookup or a sufficiently fresh snapshot. If it cannot confirm registration, an eligible cached result may answer on any plan. With no eligible answer, the API returns a refunded 503 so you can retry or review the check.

See the full coverage table

Everything you need

Validate, look up rates, and process in bulk.

01

VAT Validation

Validate any EU, UK, Swiss, Norwegian, or Australian VAT/GST number against VIES, HMRC, BFS, Bronnoysund, and ABR. Every response includes validity status and company details where the registry discloses them, plus a consultation number where supported and returned when you supply a requester VAT number.

02

VAT Rates

Current standard, reduced, and zero rates for all 32 supported countries. Free and unlimited, no quota impact.

03

Batch Validation

Validate up to 50 VAT numbers in a single request. Deduplicated counting, per-item error handling. Pro and Business plans.

Developer-first experience

Built by developers, for developers.

01

Structured Errors

Every error returns a machine-readable code, a human-readable message, and a link to the relevant docs page.

02

Test Mode

Ship with confidence. Test keys return deterministic responses with no rate limits and no quota usage.

03

Complete Docs

OpenAPI spec, per-error-code documentation, and typed SDKs for Node.js (@avatcado/node) and Python (avatcado) with copy-paste examples.

Reliable at scale

Retries, eligible fallback sources, and clear outage errors.

01

Fallbacks, Caching & Retries

Retries help with transient registry failures. On Pro and Business, eligible checks can use national registers in 10 EU countries. Eligible cached results can answer outages on every plan. If no source can answer, the API returns a refunded 503; your code should retry or route the check for review.

02

Predictable Rate Limits

Clear rate limit headers on every response. Burst-friendly defaults with transparent 429 behavior.

03

EU Infrastructure

EU-hosted on Vercel, close to the upstream registries. Automatic TLS, DDoS protection, and global CDN delivery for static assets.

Simple, transparent pricing

Start free with a production-ready VAT validation API. Validate VAT and GST numbers across 32 countries via VIES, HMRC, and more. Upgrade when you need higher limits, batch processing, or webhooks.

Free

Start here
€0forever

Includes

  • 500 validations/month
  • 20 req/min burst rate
  • 2 API keys
  • EU, UK, CH, LI, NO + AU VAT/GST validation
  • Consultation numbers
  • Test mode
  • VAT rates (unlimited)
  • Cached responses on outages
  • Email support

Pro

When you scale
€39/month

or €29/mo billed annually (€348/yr)

Everything in Free, plus

Business

High volume + Slack support
€129/month

or €99/mo billed annually (€1,188/yr)

Everything in Pro, plus

  • 50,000 validations/month
  • 120 req/min burst rate
  • 100 API keys
  • Async validation (up to 1,000/batch)
  • Priority email support + Slack support

Prices exclude VAT. VAT is added at checkout based on your billing location. See terms.

Supported Regions

One API, one endpoint. Avatcado routes each request to the correct government source automatically.

EU

European Union

27 member states. Real-time VIES (VAT Information Exchange System) lookups for EU VAT validation. Validate any European VAT number and get company name, address, and consultation numbers. Handles VIES downtime with built-in response caching and, on Pro and Business, a national register fallback for 10 member states.

UK

United Kingdom

HMRC VAT validation. Verify GB VAT numbers against HMRC's official database for reliable UK VAT number lookup. Supports consultation numbers when a valid UK requester VAT number is provided. Full GB VAT verification in one call.

CH+LI

Switzerland & Liechtenstein

BFS UID Register validation. Validate Swiss VAT numbers (CHE format) and check MWST/TVA/IVA registration status. Covers both Swiss and Liechtenstein businesses through the official UID Register.

NO

Norway

Bronnoysund Register Centre. Validate Norwegian VAT numbers (MVA format) and confirm VAT registration status for Norwegian businesses. Direct lookups against the official Bronnoysund Register.

AU

Australia

Australian Business Register (ABR). ABN validation and GST registration lookup. Send an 11-digit ABN to the same /v1/validate endpoint and get business name, status, and GST registration. Full ABN lookup API in one request.

Why not just use VIES directly?

VIES works, but building a production integration around it is a different story.

VIES is a SOAP-first service

XML request/response, inconsistent schemas across member states, no typed responses. The Commission also runs a REST endpoint, but it shares the same upstream quirks. Avatcado gives you a modern REST API with JSON, structured errors, and typed SDKs for TypeScript and Python.

VIES only covers EU

Need UK VAT validation? Swiss VAT validation? Australian GST validation? You would need to integrate HMRC, BFS UID Register, Bronnoysund Register, and ABR separately. Avatcado wraps all 5 government sources in one endpoint for tax ID validation across 32 countries.

VIES has no caching or retry logic

Member state services go down regularly. When a country's tax office is offline, VIES returns an error. Avatcado retries transient failures and can use eligible national register fallback in 10 EU countries on Pro and Business, or eligible cached results on every plan. If no source can answer, it returns a refunded 503; your application should retry or route the check for review.

No test mode, no rate limiting, no SDKs

VIES has no keyed sandbox, no magic test numbers, no predictable rate limits, and no official SDKs. Avatcado provides test mode with magic numbers, clear rate limit headers, and a typed TypeScript SDK. Build and test your VIES VAT number validation without hitting production services.

Frequently asked questions

Avatcado retries transient VIES failures. On Pro and Business, eligible checks can then use one of ten national VAT registers, through a live lookup or a sufficiently fresh snapshot. A confirmed registration returns meta.source_status: "fallback" and the register name in meta.source. On every plan, an eligible stored result can answer an outage, with meta.cached: true and meta.stale: true when it is past the cache window. Requester checks disable cache and fallback by default, with explicit cache=true or fallback=true opting back in. Cache eligibility also includes the requester context, so a previous lookup does not guarantee a reusable result. If neither fallback nor cache can answer, the API returns a structured 503 and refunds the validation quota. Your application should handle this path with retries or review and inspect source and freshness metadata before accepting a result. The coverage page lists which register backs each country, and the national registry fallback guide walks through the precedence in full. See our live VIES uptime data for current reliability metrics.
In our monitoring, fresh VIES lookups typically take 1-3 seconds depending on the member state; latency varies by country because each EU registry answers at its own speed. UK (HMRC) lookups are consistently fast. Cached responses return in milliseconds: results are cached, so repeat validations of the same number skip the upstream registry entirely and arrive flagged with meta.cached: true. Caching also shields you from upstream limits such as the Swiss BFS UID Register's strict 20 requests per minute cap. Every response includes meta.request_duration_ms, the total processing time in milliseconds, so you can monitor performance in your own systems without extra instrumentation. If checkout latency matters, use async validation on Pro and Business plans: the endpoint returns 202 immediately and delivers the result to your webhook when validation completes, which keeps slow member states out of your critical path.
All 27 EU member states plus Northern Ireland via VIES (Northern Ireland uses the XI prefix), the United Kingdom via HMRC, Switzerland and Liechtenstein via the BFS UID Register (both countries share the Swiss registry), Norway via the Bronnoysund Register Centre, and Australia via the ABR (Australian Business Register). That is 32 countries backed by 5 official government registries behind one endpoint. Send any supported VAT or GST number to /v1/validate: Avatcado detects the country from the prefix, routes the lookup to the right registry, and returns the same snake_case JSON response shape for every country, so you write one integration instead of five. The /v1/rates endpoint covers VAT and GST rates for the same 32 countries. A number from an unsupported country returns a structured unsupported_country error instead of a false negative, so you can handle that case explicitly in your code.
Yes. GET /v1/rates returns current rates for all 32 supported countries in a single response: the standard rate plus reduced, super-reduced, and zero rates where a country has them, together with the country name, currency, and a per-country updated_at timestamp. GET /v1/rates/NL (or any supported country code) returns one country. Rates endpoints are free and unlimited on every tier, including Free, and never count against your monthly validation quota; only the standard per-minute burst limit applies. That makes them practical for high-frequency use, such as computing checkout prices on the fly or refreshing a pricing table on a daily schedule. Responses use the same { data, meta } envelope as validation responses, so your existing client code and error handling carry over unchanged. Deciding which rate applies to a specific product category remains your tax logic; the API reports the official current rates per country.
Yes. The free tier includes 500 validations per month, up to 2 API keys, and a burst limit of 20 requests per minute, with no credit card required. It uses the same API, the same response format, the same caching, and the same 32-country registry coverage as paid plans, so nothing about your integration changes when you upgrade. Test mode is included too: requests made with an avat_test_ key never reach the registries and never consume quota, so integration tests are effectively free and unmetered. VAT rate lookups via /v1/rates are also free and unlimited on every tier and do not count against the 500. When you need more volume, Pro offers 10,000 validations per month with 10 keys for EUR 39 per month (EUR 29 per month billed annually), and Business offers 50,000 per month with 100 keys for EUR 129 per month (EUR 99 per month billed annually).
Use a test-mode API key (prefixed avat_test_) and every request runs in test mode: nothing reaches VIES, HMRC, BFS, Bronnoysund, or ABR, nothing counts against your monthly quota, and every response carries meta.mode: "test" so you can tell environments apart. Magic VAT numbers trigger predictable scenarios: DE111111111 returns a valid company, DE000000000 returns valid: false, DE999999999 simulates a 503 upstream error, DE777777777 simulates a 429 rate limit response, and DE555555555 simulates the stale cache fallback. Magic numbers also exist for the UK, France, Switzerland, Liechtenstein, and Norway. Any other correctly formatted number returns a generic valid result, while malformed input still returns invalid_vat_format exactly as in live mode, so your error handling gets exercised too. The result is fast, deterministic integration tests with no flaky upstream dependencies. One exception: async endpoints require a live key. See the docs for the full list of magic numbers.
VIES is a SOAP-first service (the Commission also runs an official REST API) with inconsistent availability across member states, undocumented per-IP rate limits, no UK support, no batch endpoint, and no caching. When a member state is down you get a SOAP fault such as MS_UNAVAILABLE and are left to build your own retry and fallback logic. Avatcado wraps VIES, HMRC, the Swiss UID Register, the Norwegian Bronnoysund Register, and the Australian ABR in a modern REST API with JSON responses, a built-in cache with stale fallback for outages, documented per-tier rate limits, structured errors with machine-readable codes and a docs_url on every error, typed SDKs for TypeScript (@avatcado/node on npm) and Python (avatcado on PyPI), batch validation of up to 50 numbers per request, async validation with HMAC-SHA256 signed webhooks, and a deterministic test mode. You don't have to build and maintain that infrastructure yourself.
No. One API key, one endpoint. Avatcado detects the country from the number itself and routes automatically: EU prefixes and XI (Northern Ireland) go to VIES, GB goes to HMRC, CH and LI go to the Swiss BFS UID Register, NO goes to the Bronnoysund Register, and AU goes to the ABR. Input is normalized before routing, so lowercase letters, spaces, dots, and dashes are stripped, and common variants such as the Swiss CHE prefix or the Australian ABN prefix are rewritten to CH and AU for you. Every registry returns the same response shape, so there is no per-country parsing either. The only key distinction is mode: avat_test_ keys run in deterministic test mode while avat_live_ keys query real registries. If you want separate keys per service or environment anyway, you can create up to 2 on Free, 10 on Pro, and 100 on Business.
VAT validation provides registration evidence, but the legal requirements depend on the transaction. Article 138 sets a VAT-number condition for the intra-Community goods exemption; that is separate from the reverse charge for ordinary cross-border B2B services under Articles 44 and 196. For services, establish customer status and capacity, the receiving establishment and supplier establishment separately. Article 18 of Implementing Regulation 282/2011 describes customer-status evidence, including a route for a customer awaiting a VAT number it has applied for. Missing, invalid or unavailable results do not independently prove consumer status or determine a VAT rate. The supplier can be outside the EU. Keep the validation result, original timestamp and source, plus any consultation number actually returned, with the transaction assessment. Our reverse charge guide explains the scope and links to the European Commission and legislation.
A consultation number is a reference returned by VIES where supported when you supply a genuine requester VAT number. Store it with the original result timestamp, source and customer number as evidence of that check. It is not guaranteed and does not establish the transaction tax treatment by itself. A non-EU seller without a suitable requester number can still validate the customer; omit the requester field and record missing consultation proof explicitly. Never invent a number or substitute an OSS/IOSS identifier. Supplying a requester disables cache reads and national register fallback by default; with both disabled, an upstream outage returns a refunded 503. Explicit cache=true or fallback=true opts back into the corresponding path. A cached result can carry an older consultation number, so inspect source_status, cached and stale before describing a lookup as fresh. Avatcado allows consultation requests on every tier; HMRC supports its own reference for UK checks. Consultation numbers are not available for Switzerland, Liechtenstein, Norway or Australia.
VATlayer only supports EU VAT validation: no UK coverage post-Brexit, no test mode, no typed SDKs, and no webhooks in the reviewed documentation. VATsense covers more regions (including South Africa and Brazil) and ships SDKs in several languages, but offers no test mode, no batch validation, and no webhooks, and uses HTTP Basic Auth. VATsense also documents same-day caching (bypassed with a requester VAT number) and alternate VIES routes. Avatcado validates across the EU, UK, Switzerland, Liechtenstein, Norway, and Australia with a single API. Every plan includes typed SDKs for TypeScript and Python, a deterministic test mode with magic VAT numbers, structured error codes with a docs_url on every error, and eligible cached results during outages, with a refunded 503 if no eligible source can answer. Batch validation of up to 50 numbers per request and webhook-based async validation are available on Pro and Business plans. See the full API comparison guide, or the dedicated vatlayer and VATsense comparison pages, for details.
Yes. Avatcado is a standalone API, independent of your payment provider. Stripe validates tax IDs against government databases for three regions only (EU, UK, and Australia), and only within its billing flow, tied to Customer objects; for other countries, including Switzerland and Norway, Stripe performs a format check without confirming the number is real. Mollie and Adyen do not offer a customer VAT validation API at all. Avatcado works alongside any payment setup: validate at signup before the customer reaches checkout, revalidate stored numbers on a schedule, enrich CRM records with registry company names and addresses, or run compliance checks across your existing customer base. Because it is a plain REST API with typed SDKs for TypeScript and Python, you can call it from anywhere you need to verify a VAT or GST number, not just inside a payment flow. See the integration guides for Stripe, Mollie, and Adyen.
An ABN (Australian Business Number) is an 11-digit identifier issued to Australian businesses and held in the Australian Business Register (ABR). Avatcado validates ABNs against the ABR and returns the registered business name, ABN status, and whether the business is registered for GST. That last part matters: holding an ABN does not mean a business is GST-registered, because GST registration is separate and only becomes mandatory above AUD 75,000 annual turnover. Avatcado checks both. valid: true means the ABN exists and has an active GST registration; an existing ABN without GST registration returns valid: false with the company details still present, so you can distinguish the two cases in code. Send the number to the same /v1/validate endpoint you use for EU VAT numbers with the AU prefix, for example AU51824753556; the ABN prefix and spaced formats like ABN 51 824 753 556 are normalized automatically. Results are cached like every other country.
Yes. POST /v1/validate/async accepts a single VAT number, and the async batch endpoint accepts up to 200 numbers per batch on Pro or 1,000 on Business. Both return 202 immediately with a request_id, then deliver the result to your configured webhook URL when validation completes, as validation.completed, validation.failed, or batch.completed events. Every delivery is signed with HMAC-SHA256 so you can verify it came from Avatcado, and the dashboard logs every delivery attempt and lets you replay failed deliveries. This is useful for large batch processing, for checkout flows where you want to keep 1-3 second VIES lookups out of the critical path, and for resilience against registry downtime: if a country's service is temporarily unavailable, Avatcado queues the request and retries automatically. Async validation and webhooks are available on Pro and Business plans and require a live avat_live_ key; test keys are rejected with a 403.
Yes. The /v1/validate/batch endpoint accepts up to 50 VAT/GST numbers in a single request and is available on Pro and Business plans. Each number is validated independently against the appropriate registry (VIES, HMRC, BFS, Bronnoysund, or ABR), and results come back in the same order as the input array. The response is always HTTP 200: individual failures such as an upstream timeout or an invalid format appear inline as per-item error objects instead of failing the whole request, so one bad number never costs you the other 49 results. Per-item meta shows cache state, since one item may be a fresh lookup while another comes from the cache. Duplicates in the input are deduplicated: only unique numbers are validated and counted against your monthly quota, while the response still returns one result per input item. Pass a genuine requester_vat_number once to request consultation numbers for supported EU items; retain them only when returned. Requester batches disable cache reads and national register fallback by default, with explicit cache=true or fallback=true opting back into the corresponding path. For larger batches, use async batch validation.