# VIES is down: how to validate an EU VAT number anyway

Source: https://veriport.io/guides/vies-down-validate-eu-vat-number-anyway (published 2026-10-24)

When VIES is down, check the number’s structure and check digit yourself, serve the last answer you had for it (dated and marked as cached), retry with bounded backoff, and keep the evidence: treat the outage neither as "invalid" nor as "valid". VIES is a relay at the European Commission that forwards each query to the register of the member state named in the number, so one of the 27 can be unavailable (`MS_UNAVAILABLE`) while the others answer (European Commission, VIES help page). The four steps below are the middle path between losing the sale and taking the tax risk.

- VIES returns `MS_UNAVAILABLE` when one member state’s system is down, `SERVICE_UNAVAILABLE` or `TIMEOUT` when the Commission’s relay itself fails, and `MS_MAX_CONCURRENT_REQ` / `GLOBAL_MAX_CONCURRENT_REQ` when you (or everyone) ask too fast.
- The Commission publishes a live availability table per member state (check-status); the status page mirrors it.
- A number that passed VIES in the last 30 days is still, with very high probability, registered today: registrations change slowly and deregistration is announced.
- For the zero-rating of an intra-EU supply, what an auditor asks for is evidence that you checked at the time: a dated answer, ideally with a consultation number.

## Why does a member state go dark?

Each national system has its own maintenance windows (several run overnight batches that take the service down for an hour or two), its own capacity limits, and its own incidents. Germany, Italy and Spain are the ones developers notice most because they are the ones most queried. The Commission’s relay adds its own failure mode: when too many requests are in flight globally it refuses new ones for a while, and it blocks addresses that keep hammering it.

None of this is in your control, which is why the fallback has to be decided before it happens.

## What is the fallback, step by step?

1. **Structure first.** Check the country prefix, the length, the character pattern and, where the member state publishes one, the check digit. A number that fails here is wrong regardless of VIES; do not retry, tell the user. (A number that passes is not yet valid: it has the shape of a registered number.)

2. **Serve the last known answer, marked as such.** If you validated this number recently, use that answer and record that you did. The decision whether a dated answer is good enough is a business one: for a €40 subscription most sellers accept a week-old pass; for a €40,000 machine they wait for a live one.

3. **Retry with backoff, bounded.** Member-state outages last minutes to hours; retry at 30 s, 2 min, 10 min, then stop and queue the number for a later batch. Honour the Commission’s concurrency codes; never spin.

4. **Keep the evidence.** Store the answer, its date, and the consultation number when you have one. The consultation number is what VIES issues when you identify yourself (your own VAT number as requester); it proves to your tax administration that the check was made on that day with that result.

## How does Veriport handle it for you?

The validation endpoint runs the four steps and tells you which one answered. The structure check happens before VIES is called and costs nothing. A live answer is `source.kind: "live"`. When VIES or the member state is down and we hold an answer for that number from the last 30 days, you get a 200 with `source.kind: "cache"`, `source.stale: true`, `source.checkedAt` (when it was obtained) and `upstream.status` (why it was not refreshed). When there is no cached answer, you get a 503 `vies_unavailable` with `retryAfter`, not counted. The consultation number is requested when you pass `requester=<your VAT number>` (prepaid credits or the monthly plan) and is returned only on a live answer: a cached one never carries a consultation number it did not just obtain.

```bash
curl "https://veriport.io/api/v1/vat/validate?country=DE&number=136695976"
```

```json
{
  "valid": true,
  "countryCode": "ES",
  "vatNumber": "B58378431",
  "full": "ESB58378431",
  "name": "EJEMPLO SL",
  "address": "CALLE EJEMPLO 1, 28001 MADRID",
  "requestDate": "2026-10-17",
  "consultationNumber": null,
  "source": {
    "kind": "cache",
    "checkedAt": "2026-10-17T16:40:11Z",
    "cacheAgeSeconds": 578632,
    "stale": true
  },
  "upstream": {
    "service": "vies",
    "transport": "rest",
    "status": "member_state_unavailable",
    "memberStateAvailable": false
  }
}
```

> A cached answer is evidence that the number was registered on `checkedAt`, not today. Decide the age you accept per transaction amount, and log `source.stale` with the order.

## What should you tell the customer?

When a live check is impossible and no cached answer exists, do not block the purchase silently and do not call the number invalid. Charge VAT provisionally, say that the VAT number will be verified within 24 hours and the VAT refunded on the invoice if it checks out, and queue the number. Most B2B buyers accept that; what they do not accept is a form that says "invalid VAT number" for a number they use every day.

## Questions

### Is a cached answer acceptable evidence for an audit?

Evidence of a check on the cached date, yes; of a check on the day of the sale, no. Auditors look for a reasonable, documented process. A process that checks live when possible, falls back to a recent answer when not, and re-checks when VIES is back is defensible; one that never checks is not.

### Why does VIES give no name or address for some countries?

Germany and Spain, among others, answer valid/invalid only ("---" in the name field) for data-protection reasons. The API returns null for those fields; it is not an error.

### How often is VIES actually down?

The relay itself has high availability; individual member states have scheduled windows and incidents that add up to several hours a month in the worst cases. The [VIES status page](/vies-status) shows the current table and the measured record per member state over the last 24 hours and 30 days, with the episodes and their durations; we publish no statistic we have not measured ourselves.

## Read next

- [The VIES API: calling it directly](https://veriport.io/guides/vies-api-check-eu-vat-number)
- [Reference: EU VAT number validation](https://veriport.io/docs/vat-validation)
- [Node, Python and PHP snippets](https://veriport.io/guides/validate-eu-vat-number-node-python-php)
- [Is VIES down? Availability by member state](https://veriport.io/vies-status)
- [Status and VIES availability](https://veriport.io/status)

## Sources

- VIES — help page: what the consultation number proves, member-state availability — https://ec.europa.eu/taxation_customs/vies/#/help (2026-10-24)
- VIES REST API — check-vat-number, check-status (technical information) — https://ec.europa.eu/taxation_customs/vies/#/technical-information (2026-10-24)
- VIES SOAP service — checkVatService WSDL — https://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl (2026-10-24)
