W System / VIES error codes explained

VIES error codes explained: MS_UNAVAILABLE, MS_MAX_CONCURRENT_REQ, TIMEOUT and more

Short answer: VIES has six documented fault codes. Only INVALID_INPUT means your request is wrong; the other five (MS_UNAVAILABLE, MS_MAX_CONCURRENT_REQ, GLOBAL_MAX_CONCURRENT_REQ, SERVICE_UNAVAILABLE, TIMEOUT) mean the answer is unknown right now. Never treat them as "VAT number invalid": retry with backoff and keep the customer moving.

VIES codeOfficial meaning (EC WSDL)Is the VAT number invalid?What to doW System answer
INVALID_INPUTThe country code is invalid or the VAT number is emptyUnknown: the request itself is malformedFix the input (2-letter prefix, EL for Greece, no spaces); don't retry unchangedinvalid_format before VIES is called, with the expected format; otherwise status: error
MS_UNAVAILABLEThe member state's application is not replying or not availableNo: unknownRetry later; don't block the customer; keep the order pendingRetries with backoff, then a flagged fallback (official national source or last dated VIES result) or member_state_unavailable, valid: null
MS_MAX_CONCURRENT_REQToo many concurrent requests for this member stateNo: unknownBack off and retry; queue bulk checks per countrySame as MS_UNAVAILABLE
GLOBAL_MAX_CONCURRENT_REQToo many concurrent requests to VIES overallNo: unknownBack off and retry with jitterSame as MS_UNAVAILABLE
SERVICE_UNAVAILABLENetwork or VIES web application errorNo: unknownRetry laterSame as MS_UNAVAILABLE
TIMEOUTVIES got no reply from the member state in timeNo: unknownRetry later; use a client timeout above 10 sSame as MS_UNAVAILABLE

Meanings are paraphrased from the European Commission's checkVatService WSDL (checked 2026-10-26). Live member-state status: our VIES status page.

Handling them in code

A safe pattern: treat valid: true and valid: false from a successful answer as final, put the five transient codes into a retry queue with exponential backoff (for example 1 s, 2 s, 4 s, then minutes), and never cache an error as "invalid".

TRANSIENT = {"MS_UNAVAILABLE", "MS_MAX_CONCURRENT_REQ", "GLOBAL_MAX_CONCURRENT_REQ",
             "SERVICE_UNAVAILABLE", "TIMEOUT"}
if error in TRANSIENT:
    status = "unknown"      # retry later, don't reject the customer
elif error == "INVALID_INPUT":
    status = "bad_request"  # fix the country prefix / number

Or let an API do the retries

We make W System, an EU VAT check API. It retries VIES with backoff and, when a member state stays down, answers from that country's official source (PL, CZ, FI, FR) or the last dated VIES result, flagged with fallback: true. Otherwise you get member_state_unavailable, valid: null and retry_after_seconds, never a false "invalid". Free: 20 calls a day per IP, or a free key with 500 units a month.

curl "https://api.wsystem.dev/verify?vat=IE6388047V"

Questions and answers

What does MS_UNAVAILABLE mean in VIES?

The member state's VAT database did not answer VIES. It says nothing about the number: treat the result as unknown, not invalid, and check again later. The EC's VIES page shows which member states are currently down.

What is MS_MAX_CONCURRENT_REQ?

VIES refused the request because too many requests are already open for that member state. It is throttling, not a verdict on the VAT number. Wait, retry with backoff, and spread bulk checks over time; MS_MAX_CONCURRENT_REQ_TIME and GLOBAL_MAX_CONCURRENT_REQ_TIME are variants that W System treats the same way.

Should I reject a customer when VIES returns an error?

No. Only valid: false from a successful VIES answer means the number is not registered for intra-EU trade. For the six error codes, keep the order pending or charge VAT provisionally and re-check, depending on your tax adviser's guidance.

Why does my VIES library say 'invalid' when VIES is down?

Some libraries catch the timeout or fault and return is_valid=False. Check the library's error or log field and map these codes to 'unknown'. W System never returns valid: false for an outage; it returns member_state_unavailable with valid: null and retry_after_seconds.

Do these errors come from the REST API too?

Yes. The VIES REST endpoint (/check-vat-number) returns the same codes in userError or errorWrappers; the SOAP service returns them as SOAP faults.

Related

Facts checked 2026-10-26. W System is the maker of this product. Not affiliated with the European Commission. Not legal or tax advice.