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.
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.
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 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, AU, NO, CH | 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 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
- EU VAT Validation API — full feature overview →
- 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.