VIES Downtime: Why It Happens and How to Handle It

If you validate EU VAT numbers, you depend on VIES. And VIES goes down. Not occasionally, but regularly, and often for specific countries rather than the entire system. This guide explains why VIES downtime happens, how it affects your application, and what you can do about it.

Why VIES goes down

VIES is not a single database. It is a gateway operated by the European Commission that routes validation requests to 27 independent national tax authority databases. When you validate a French VAT number, VIES forwards your request to the French tax authority (DGFiP). When you validate an Italian number, it goes to Italy's Agenzia delle Entrate.

This means VIES availability is only as good as the weakest link in any given request. Each member state maintains its own infrastructure with its own uptime characteristics, maintenance windows, and capacity limits.

Common offenders

Historically, some member states are less reliable than others:

  • Italy: Frequent maintenance windows, sometimes during business hours. The Italian tax system (Sistema di Interscambio) has regular planned outages.
  • Spain: The Agencia Tributaria service experiences intermittent availability, particularly during tax filing periods.
  • Greece: AADE (Independent Authority for Public Revenue) has had extended outages lasting hours.
  • Belgium: Occasional rate limiting issues that cause cascading failures.

Germany, the Netherlands, and the Nordic countries tend to have the most reliable national services.

You can monitor current and historical availability on our VIES uptime monitor.

What happens to your application

When a member state is down and you call VIES directly, you get a SOAP fault with code MS_UNAVAILABLE or TIMEOUT. If your code is not built to handle this, your checkout flow, invoice generation, or customer onboarding breaks. The user sees an error and either retries (adding load) or abandons the process.

This is particularly painful for SaaS applications where VAT validation happens at signup or checkout. A 30-minute outage in one country means you cannot process any customers from that country for 30 minutes.

Strategies for handling downtime

Build your own cache

Cache validation results on your side with a TTL (e.g., 24 hours). When VIES is down, serve the cached result. Trade-offs: you need to manage cache storage, decide on an acceptable staleness window, and handle cache misses for numbers you have never seen before. A 24-hour cache is generally reasonable because VAT registrations do not change frequently.

Retry with backoff

Implement exponential backoff on VIES failures. This helps with transient issues but does not solve sustained outages. If a member state is down for an hour, your users are still waiting. Retries are a good complement to caching, not a replacement.

Use a wrapper API

Instead of calling VIES directly, use an API that handles caching, retries, and fallback logic for you. This is what Vatly does.

How Vatly handles VIES downtime

Vatly caches every validation result for 25 days. When a member state goes down, Vatly serves the cached result transparently. The response tells you exactly what happened through the meta fields.

A normal (live) response:

curl https://api.vatly.dev/v1/validate?vat_number=IT12345678901 \
  -H "Authorization: Bearer vtly_live_your_api_key"
{
  "data": {
    "valid": true,
    "vat_number": "IT12345678901",
    "country_code": "IT",
    "company": {
      "name": "ESEMPIO S.R.L.",
      "address": "VIA ROMA 1, 00100 ROMA"
    },
    "consultation_number": null,
    "requested_at": "2026-03-24T10:30:00Z"
  },
  "meta": {
    "request_id": "550e8400-e29b-41d4-a716-446655440000",
    "request_duration_ms": 1420,
    "cached": false,
    "source_status": "live"
  }
}

A stale cache response (when Italy is down):

{
  "data": {
    "valid": true,
    "vat_number": "IT12345678901",
    "country_code": "IT",
    "company": {
      "name": "ESEMPIO S.R.L.",
      "address": "VIA ROMA 1, 00100 ROMA"
    },
    "consultation_number": null,
    "requested_at": "2026-03-23T14:00:00Z"
  },
  "meta": {
    "request_id": "661f9500-f30c-52e5-b827-557766551111",
    "request_duration_ms": 45,
    "cached": true,
    "cached_at": "2026-03-23T14:00:00Z",
    "stale": true,
    "source_status": "unavailable"
  }
}

Here's what each meta field tells you:

  • cached: true means this result came from cache, not a live lookup.
  • cached_at tells you when the original lookup happened.
  • stale: true means the cache entry has expired (older than 25 days) but is being served because the upstream is unavailable.
  • source_status: "unavailable" means the member state service was down when Vatly tried to reach it.
  • source_status: "degraded" means VIES returned a result but Vatly detected a possible silent false negative (some member states return "invalid" for valid numbers during partial outages).

Handling meta fields in your code

Here's how you might use these fields in a TypeScript application:

const response = await fetch(
  "https://api.vatly.dev/v1/validate?vat_number=IT12345678901",
  { headers: { Authorization: "Bearer vtly_live_your_api_key" } }
);

const { data, meta } = await response.json();

if (data.valid) {
  if (meta.stale) {
    // Result is valid but based on stale cache
    // Consider flagging for re-validation later
    console.log("Valid (stale cache, upstream was down)");
  } else {
    console.log("Valid (fresh result)");
  }
}

// Log source status for monitoring
if (meta.source_status === "unavailable") {
  console.warn(`VIES unavailable for ${data.country_code}`);
} else if (meta.source_status === "degraded") {
  console.warn(`VIES degraded for ${data.country_code}, result may be unreliable`);
}

Get started

Stop building VIES reliability infrastructure yourself. Vatly handles caching, retries, and stale fallback so your application stays up even when VIES does not.

Monitor VIES availability in real-time on our uptime monitor. Read the VIES API guide for more on how VIES works under the hood.

Vatly's free tier includes 500 validations per month with the same caching and reliability features as paid plans.

Start validating for free →

Frequently asked questions

How often does VIES go down?

VIES experiences partial outages (individual member states) almost daily. Full system outages are rare. The frequency varies by country: Italy and Spain have regular maintenance windows, while Germany and the Netherlands are typically stable. Check the Vatly VIES uptime monitor for current data.

What does source_status: 'degraded' mean?

Degraded status means VIES returned a response, but Vatly detected a likely silent false negative. Some member states return 'invalid' for valid VAT numbers during partial outages instead of returning an error. Vatly compares against cached results to detect this and serves the cached (correct) result instead.

Is it safe to accept a stale cached VAT validation?

Generally yes. VAT registrations rarely change without notice, and a 25-day-old result is almost always still accurate. For high-value transactions, you may want to flag stale results for re-validation once the upstream service recovers. The meta.stale field lets you implement this logic.

What happens when VIES is down for a number I have never validated?

If there is no cached result and the upstream is unavailable, Vatly returns a 503 error with the code upstream_unavailable or upstream_member_state_unavailable. Your application should handle this gracefully, for example by letting the customer proceed and re-validating later.