Skip to content
Holits
Platform Engineering3 min readBy Holits

VIES is free and unreliable. Compliance can't be built on the free part alone.

The EU's VAT validation service is a government endpoint with no fallback of its own. What it takes to turn it into something a business can depend on for reverse-charge compliance.

VIES — the EU's VAT Information Exchange System — looks like a solved problem from the outside. It's an official, free, government-run endpoint that answers one question: is this VAT number currently valid. For a B2B platform running reverse-charge validation on every invoice, that sounds like the whole implementation.

It isn't, because "free government endpoint" and "reliable enough to depend on" aren't the same property. VIES goes down per member state, rate-limits aggressively, and offers no fallback behavior of its own — when it's unavailable, it's just unavailable, and every caller has to decide for themselves what "unavailable" should mean to their users.

The product is what happens around the lookup, not the lookup itself

A circuit breaker sits in front of VIES per country, because a member state's VIES endpoint being down doesn't mean every other member state's endpoint is also down — treating VIES as one global dependency instead of 27 independent ones means one country's outage takes out validation for every country's VAT numbers. Three consecutive failures trip a given country's breaker open; a cooldown period gates recovery; and while the breaker is open, the service serves the last known-good response instead of an error, clearly labeled as cached rather than live.

That label matters more than it sounds like it should. A cached "valid" from six hours ago is useful for most purposes and wrong to present as equivalent to a live check for a use case that specifically needs current-moment certainty — which is why a ?live=true path exists as an explicit, separately-priced bypass for callers who need the compliance-grade guarantee regardless of what the cache currently holds.

An audit trail is not a boolean

Every VAT check, live or cached, returns VIES's own consultation number alongside the result. This is the detail that turns "we checked" into something a business can actually use if a tax authority later asks for proof — an internal true/false in a database row isn't evidence of anything; a consultation number issued by VIES itself is.

Scoping the promise to what you actually control

It would have been easy to publish a single blended uptime number for the service — the kind of "99.9% uptime" line that reads well on a pricing page. We didn't, because that number would have depended on VIES's own availability, which isn't something we control or have load-tested. The uptime claim that shipped is scoped explicitly to what the service itself is responsible for, kept separate from what upstream availability contributes — a smaller claim, and a true one.

Start narrow, get the identifier model right, then widen

The first version of the company-registry side of this system deliberately ingested one country's data before attempting a second. The reasoning was direct: ingesting two national registries at once was the single biggest schedule risk in the early build, and the harder problem — resolving records from incompatible national formats into one canonical, stable company identifier — needed to be solved once, correctly, against a single source before it was asked to reconcile two.

Reliability, here, wasn't a feature bolted onto a VAT lookup. It was the actual engineering problem the lookup existed to solve.