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. If you are still working out what a VIES validation actually proves and what to keep as evidence, start there instead — this page assumes you have decided to integrate. If you want to see a VIES response before writing any SOAP at all, our VAT number checker issues the same query from the browser and shows you the raw result.
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.
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"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_unavailableWhat 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.
29 countries (VIES + more)
all 27 EU member states via VIES, plus the United Kingdom and Norway — one unified endpoint.
VIES API vs TaxID REST API
Same authoritative data source. Completely different integration experience.
| TaxID REST API | VIES direct | |
|---|---|---|
| Protocol | REST + JSON | SOAP + XML |
| Response time (warm) | < 10ms (cached) | 1–4 seconds |
| Downtime handling | service_unavailable status | Generic MS_UNAVAILABLE |
| Error granularity | 5 distinct status codes | 1 error for invalid + unavailable |
| Caching | Yes — 24h TTL | No cache |
| Company name returned | Yes (where available) | Yes (where available) |
| Non-EU countries | UK, Norway | EU27 only |
| Authentication | Bearer token | No auth required |
| Free tier | 100/month, no CC | Unlimited, 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.
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 the EU 27, HMRC for the UK, and Brønnøysundregistrene for Norway. Responses are cached with a 24-hour TTL to reduce latency. Cache bypasses are available for real-time validation requirements.
Related resources
- EU VAT Validation API — full feature overview →
- Free VAT API — a REST wrapper over VIES at no cost →
- How to validate EU VAT numbers with VIES API (and why most teams use a wrapper) →
- VIES downtime: how to build a resilient VAT validation flow →
- VAT VIES check: a developer's guide to EU VAT validation →
- Free EU VAT number validator tool →
- API reference documentation →
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.