All posts
· 4 min read

VIES API Is Painful. Here Is a Better Way.

The VIES SOAP API works — until it does not. Timeouts, XML parsing, 27 different national back-ends, no JSON. Here is why most teams reach for a wrapper instead.


VIES is the right data source for EU VAT validation. It is authoritative, free, and covers all 27 member states. The problem is not the data — it is the interface. Building a production integration against raw VIES is an exercise in frustration that most teams only do once before looking for alternatives.

What raw VIES actually looks like

VIES exposes a SOAP endpoint. You construct an XML envelope, POST it, parse an XML response, and handle SOAP faults. Here is the minimal request just to check a single number:

VIES SOAP request
<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>

That is the happy path. On top of that you need to handle connection timeouts (common), SOAP fault responses (each country formats these differently), and the fact that some member states — Germany being the notable example — periodically restrict cross-border queries.

The three real problems

  • Uptime is per-country — VIES federates 27 separate national databases. When the Italian or Polish back-end goes down, VIES returns a fault for those countries. Your code needs to distinguish "number invalid" from "Italy is offline right now".
  • No JSON — SOAP is not going away. Every team that integrates VIES ends up writing an XML parser they did not want to write.
  • Rate limits and IP blocks — sustained query volumes from a single IP can trigger throttling or soft-blocks from national registries, with no published limits to plan against.

What a REST alternative looks like

A wrapper API handles the SOAP layer, retries transient failures, normalises responses across all 27 countries, and returns plain JSON. The same check becomes:

REST request
GET /api/v1/validate?vat_number=DE123456789
Authorization: Bearer your_api_key
Response
{
  "valid": true,
  "country_code": "DE",
  "vat_number": "123456789",
  "company_name": "Example GmbH",
  "company_address": "Musterstraße 1, 10115 Berlin"
}

No XML. No SOAP faults. No per-country error handling. If VIES is unreachable for a given country, the wrapper falls back gracefully rather than surfacing a raw fault to your application.

When to use raw VIES

Raw VIES is reasonable for low-volume internal tooling where you control the environment, can absorb occasional failures, and want zero external dependencies. If you are building a customer-facing flow — signup, checkout, onboarding — the reliability and latency requirements make a wrapper the more practical choice.

Try it without an account

VatBase offers a free checker with no signup required, and a free API plan with 50 requests per month. If the volume fits, it costs nothing.

Automate your VAT checks with VatBase

One API call. Clean JSON. 27 EU countries. Try it free.

VatBase

© 2026 VatBase. All rights reserved.