EU VAT validation · VIES · REST wrapper

VIES API — Query EU VAT Numbers via the EU Validation System

VIES (VAT Information Exchange System) is the EU's official VAT registry. It works — but its SOAP interface, 1–4 second latency, and regular downtime make it painful to use directly in production. TaxID wraps VIES into a fast, reliable REST API with machine-readable status codes and caching.

Free plan: 100 validations/month · No credit card · Working integration in under 2 minutes

What is the VIES API?

VIES stands for VAT Information Exchange System. It is operated by the European Commission and allows anyone to check whether a VAT number is currently registered and active in any of the 27 EU member states.

The system exposes a public SOAP/XML web service. Developers can call it directly — no API key required — to verify a VAT number against the national tax authority database of the relevant member state.

VIES is the authoritative source for EU VAT validation. All serious VAT validation APIs — including TaxID — ultimately query VIES for EU27 numbers. The difference lies in the interface, reliability, and additional features built on top.

VIES API limitations in production

VIES is reliable as a data source. Its interface is not designed for modern production integrations.

SOAP/XML only

VIES exposes a SOAP endpoint. No REST, no JSON. You need a SOAP client library and XML parsing to integrate.

1–4 second response times

Live VIES calls average 1–4 seconds per request. No caching layer means every request hits the upstream system.

~2% downtime

VIES aggregates 27 national systems. Any member state going offline returns a generic error with no retry guidance.

Ambiguous error codes

VIES returns one error for both 'number does not exist' and 'service is temporarily unavailable' — impossible to distinguish without guessing.

Calling VIES directly vs using a REST wrapper

Raw VIES call vs TaxID REST API — same underlying data, very different developer experience.

Raw VIES SOAP (XML)
curl -X POST \
  https://ec.europa.eu/taxation_customs/vies/services/checkVatService \
  -H "Content-Type: text/xml" \
  -d '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
        xmlns:urn="urn:ec.europa.eu:taxud:vies:services:checkVat:types">
  <soapenv:Body>
    <urn:checkVat>
      <urn:countryCode>DE</urn:countryCode>
      <urn:vatNumber>123456789</urn:vatNumber>
    </urn:checkVat>
  </soapenv:Body>
</soapenv:Envelope>'

# Response: XML with valid/name/address — or INVALID_INPUT / MS_UNAVAILABLE
# No distinction between "number does not exist" and "service is down"
TaxID REST API (JSON)
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",
  "cached": true,
  "request_id": "req_01HX..."
}

# 5 distinct statuses: active · invalid · inactive · format_invalid · service_unavailable

What TaxID adds on top of VIES

REST + JSON

One GET request. Structured JSON response. No SOAP client, no XML parsing.

5 machine-readable statuses

active · invalid · inactive · format_invalid · service_unavailable. Handle each case explicitly.

Sub-10ms cached responses

Frequently validated numbers served from cache in under 10ms. Cold VIES calls still return in ~300ms.

31 countries (VIES + more)

All 27 EU states via VIES, plus UK (HMRC), Australia (ABR), Norway, and Switzerland — one unified endpoint.

VIES API vs TaxID REST API

Same authoritative data source. Completely different integration experience.

TaxID REST APIVIES direct
ProtocolREST + JSONSOAP + XML
Response time (warm)< 10ms (cached)1–4 seconds
Downtime handlingservice_unavailable statusGeneric MS_UNAVAILABLE
Error granularity5 distinct status codes1 error for invalid + unavailable
CachingYes — 24h TTLNo cache
Company name returnedYes (where available)Yes (where available)
Non-EU countriesUK, AU, NO, CHEU27 only
AuthenticationBearer tokenNo auth required
Free tier100/month, no CCUnlimited, no key

How VIES downtime is handled

VIES aggregates live data from 27 national tax authority systems. When a member state's system goes offline — for maintenance, technical issues, or peak load — VIES returns a generic MS_UNAVAILABLE error for that country.

This happens regularly. If your integration treats MS_UNAVAILABLE as invalid, you will reject valid customers during routine maintenance windows.

TaxID returns service_unavailable for these cases — a distinct status code your code can handle explicitly: allow the customer through, flag the order for re-validation, and retry when the service recovers.

Recommended downtime handling pattern
const result = await validateVat(country, vatNumber);

switch (result.status) {
  case "active":
    applyReverseCharge(customerId);
    break;
  case "invalid":
  case "inactive":
    rejectWithMessage("VAT number not valid");
    break;
  case "format_invalid":
    promptUserToCorrect();
    break;
  case "service_unavailable":
    // VIES is down for this country — allow through, flag for retry
    allowAndScheduleRevalidation(customerId, result.request_id);
    break;
}

Read more: How to build a resilient VAT validation flow for VIES downtime →

VIES API — frequently asked questions

What is the VIES API?

VIES (VAT Information Exchange System) is the EU's official system for checking VAT registrations across all 27 member states. It offers a public SOAP/XML endpoint that developers can call directly — but it requires SOAP clients, returns ambiguous errors, has no caching, and goes down regularly.

Can I call VIES directly without using a wrapper?

Yes. VIES is publicly accessible at the European Commission's SOAP endpoint. It works for simple scripts and low-volume lookups. For production integrations, the lack of REST, caching, reliable error codes, and regular downtime (especially per-country unavailability) make a REST wrapper the practical choice.

Is the VIES API free to use?

The raw VIES SOAP endpoint is free with no API key. TaxID's REST wrapper offers a free plan with 100 validations/month (no credit card). Paid plans add higher limits, SLA guarantees, and support.

Why does VIES return MS_UNAVAILABLE so often?

VIES is a federation of 27 national tax authority systems. When any country's system is offline for maintenance or technical reasons, VIES returns MS_UNAVAILABLE for that country. This is common and unpredictable. TaxID translates this to service_unavailable so your code can safely retry without rejecting valid customers.

Does TaxID query VIES or maintain its own database?

TaxID queries official sources in real time — VIES for EU27, HMRC for the UK, ABR for Australia, and national registries for Norway and Switzerland. Responses are cached with a 24-hour TTL to reduce latency. Cache bypasses are available for real-time validation requirements.

Related resources

Use VIES data without the SOAP headaches

Free plan: 100 EU VAT validations/month, all 27 member states via VIES, no credit card. Working integration in under 2 minutes.