How to integrate the VIES VAT check into business onboarding
On Friday, you are looking through declines at your small-business lender when several German applications appear close together, each marked “VAT number not registered”. One of the businesses has already called. The owner says the number is printed on every invoice they send, and wants to know why the application stopped there. You added the VAT check last month after a broker submitted an application using another company’s number. Now the same reason sits beside businesses with very different stories, and Monday’s applications are coming. What should that answer mean before it becomes a decision?
VIES returns more than valid or invalid
A VIES answer can include registration status, a registered name, or a registry error. The European Commission’s VIES service confirms whether a VAT number is registered, and a response can include the registered name. In our calls from our own machine on 30 October 2026, we saw registered numbers with names, registered numbers with names withheld, unregistered numbers and registry errors.
One German number was valid with the name shown as “---”, then returned MS_UNAVAILABLE two minutes later. A rule that reads only valid would pass the first answer without a name to compare. Treating an absent valid value as invalid can turn a temporary registry problem into a decline.
| answer | example | HTTP status | valid | registered name | a rule reading valid alone |
|---|---|---|---|---|---|
| registered, name given | IE6388047V | 200 | true | GOOGLE IRELAND LIMITED | passes |
| registered, name withheld | DE811569869, ESB82846825 | 200 | true | --- | passes, with nothing to compare |
| not registered | IE1234567X | 200 | false | --- | declines |
| registry not answering, REST | DE811569869 | 200 | absent | absent, error MS_UNAVAILABLE | finds no valid |
| registry not answering, SOAP | DE811569869 | 200 | absent | fault MS_UNAVAILABLE | finds no valid |
| registry busy, browser endpoint | LV40003009497 | 200 | false | ---, error MS_MAX_CONCURRENT_REQ | declines |
The answer type matters: registration status says whether the number appears in the national database, while the name can help check whether the applicant is the registered business.
A status page cannot classify an individual answer
Classify each call from its response. Use the status page only for context. The browser endpoint returned isValid false with MS_MAX_CONCURRENT_REQ for a busy registry in our calls. Read on its own, that false value makes a registry problem look like an unregistered number.
The browser endpoint serves the VIES web page. The published REST contract documents a separate interface. The status endpoint also disagreed with our calls in both directions: it listed Germany as available during German MS_UNAVAILABLE responses, and Latvia as unavailable while Latvian numbers returned valid answers with names.
The Commission says VIES obtains information from member-state databases over which it has no control. Availability can differ by registry and by call.
Route a service error before deciding registration status
Connect the application’s country code and VAT number to a published VIES service, then give service errors their own outcome. The published interfaces are REST and SOAP. REST offers POST /check-vat-number, and SOAP offers checkVat. Both interfaces are available without a key or account.
In a data source, pass the country code and number from the application through the decision flow. The data source adds the response to the decision’s data, where rules can classify it. Read for an error before reading valid: in our German calls, REST returned HTTP 200 with MS_UNAVAILABLE and no valid field. The documented REST retry setting covers connection problems and selected HTTP statuses. It leaves HTTP 200 responses with MS_UNAVAILABLE for the decision flow to handle.
For example, an error response belongs in an unavailable outcome, such as referral or a later retry. A response with valid false is an unregistered number, and a response with valid true is a registered number. Test that each branch reaches its intended decision before the integration goes live.
Check the registered name separately
A valid number can belong to a different company. Compare the registered name with the company name on the application, and make registration status and name check separate values for the decision table.
Our German and Spanish calls returned valid numbers with the name and address shown as “---”. The trader match values were NOT_PROCESSED, so there was no name to compare. Classify “---” as a name that was not disclosed.
For an example rule, set the name check to match when the returned name contains the applicant’s company name, to not disclosed when the name is empty or “---”, and to mismatch when it differs from the applicant’s company name. A mismatch should go to a person to review. If VIES withholds the name, look up the registered company name in the relevant company registry. For a UK applicant, the Companies House lookup is one example of a registry check.
| vat status | name check | outcome | reason |
|---|---|---|---|
| unavailable | any | refer | VAT_CHECK_UNAVAILABLE |
| invalid | any | decline | VAT_NOT_REGISTERED |
| valid | mismatch | refer | VAT_NAME_MISMATCH |
| valid | not disclosed | refer | VAT_NAME_NOT_DISCLOSED |
| valid | match | pass | OK |
A mismatch goes to a person to review, and an undisclosed name calls for a lookup in the relevant company registry. VIES is one input alongside other checks in SME lending.
Review the terms before caching a response
Have counsel review the VIES terms for the intended use before enabling a cache. The terms restrict retransmission and other uses, and expressly forbid copying or reproducing the contents. Have counsel confirm that the intended integration and storage choices are permitted.
There is a separate technical risk. The data source caching documentation describes caching a parseable response with an HTTP status below 400. A REST response with HTTP 200 and a parseable body can therefore store an error such as MS_UNAVAILABLE like an ordinary answer.
Set the outcomes before Monday’s applications run
Before Monday’s applications arrive, put the check’s outcomes in place:
- Call the published REST contract or SOAP service with the country code and VAT number from the application. The VIES web page uses a separate browser endpoint.
- Read for an error before reading
valid. Route an error to its own outcome, such as referral or a later retry. Reserve decline for a confirmed unregistered number. - Make the call and read its answer. Use each call’s response to determine whether it worked. The status page gives service-level context.
- Compare the registered name with the applicant’s company name. Give a valid number under another name its own outcome for a person to review.
- Classify “---” as a name that was not disclosed. Check the name in the relevant company registry.
- Have counsel review the terms and approve the intended use before caching VIES answers over REST. Account for HTTP 200 error responses that a cache could store as answers.
- Keep the validation answer with the decision, in the form counsel approves, following the Commission’s recommendation for a tax control.
Questions about the VIES VAT check
Is there a free API for EU VAT number validation?
Our calls needed no key or account. The Commission documents no price for the service. Check the terms for permitted use.
What does MS_UNAVAILABLE mean and what should the decision do with it?
MS_UNAVAILABLE means the member-state application is not replying or is unavailable. Our German calls returned the error with HTTP 200. Route it to a separate outcome, such as referral or a later retry, rather than a decline.
Does a valid VIES result prove the company is who it says it is?
No. A valid number can belong to another company. Compare the registered name with the applicant’s company name, and send a mismatch to a person to review.
Is VIES REST or SOAP, and which should I use?
VIES publishes both REST and SOAP interfaces. Use the published contract your integration supports, then test how its errors reach the decision flow.
Can I store VIES answers and reuse them?
Only after counsel has reviewed the terms and approved the intended use. The terms restrict retransmission and other use, and forbid copying or reproducing the contents. Agree with counsel what validation record the intended use allows before storing or reusing a response.
How long does a VIES call take?
In our calls on 30 October 2026, most responses took 0.4 to 0.8 seconds, and some took longer. Those measurements came from one afternoon, not a service guarantee. Make sure a delayed or failed call reaches its own outcome.