Intra-Community VAT validation (VIES)
Checks with VIES whether a VAT number is valid for intra-Community operations and, optionally, issues the consultation number that serves as proof of the check.
It is not the same as /validare/tva. There the ANAF register is read: whether the Romanian company is VAT-registered and whether it is tax-inactive. Here the European database is queried: whether that number is valid for exchanges between member states. A tax id can be VAT-registered in Romania and not appear in VIES.
The consultation number (solicitant). If you send your own VAT number in solicitant, VIES returns a numar_consultare — the proof that you checked that partner on that date, the only thing you can show at a tax inspection to justify the VAT exemption on an intra-Community supply. Requests carrying solicitant are NEVER served from cache: a number issued for somebody else, or two hours ago, is not your proof.
Request body
Sent as JSON in the request body (Content-Type: application/json) — not in the query string.
RO14399840) or without it if you pass tara separately. Spaces, dots and hyphens are ignored.
max 20 car.
{
"cod": "RO14399840"
}
{
"cod": "14399840",
"tara": "RO"
}
{
"cod": "RO6719278"
}
Query parameters
How it behaves
- Checks with VIES whether a VAT number is valid for intra-Community transactions and, optionally, obtains the consultation number that serves as proof of the check.
- This is not the same as
/validare/tva, and the confusion costs money. There, the ANAF register is read: whether a Romanian company is VAT-registered and whether it is inactive for tax purposes. Here, the European database is queried: whether that number is valid in exchanges between member states. A Romanian tax code can be VAT-registered domestically and NOT appear in VIES — and then the supply cannot be invoiced as exempt. - The consultation number is the heart of this route. Send your own VAT number in
solicitantand VIES issues anumar_consultare: proof that YOU checked THAT partner on THAT date. It is the only thing you can show at a tax audit to justify VAT exemption on an intra-Community supply (art. 294 of the Romanian Tax Code). Withoutsolicitantyou get the verdict, but not the proof. - Requests with
solicitantare never served from cache. A consultation number issued for someone else, or two hours ago, is not your proof — so every such request is a real call to the Commission. Plain checks are cached. - The result (
validorinvalid) is cached for 10 minutes, like every external check on the platform. Short on purpose: a VAT number can be cancelled, and a stale "valid" would underpin an exempt invoice issued to a partner who is no longer registered — the cost falls on the supplier. - Three states, not two.
serviciu_indisponibilandserviciu_aglomeratreturnvalid: null, notfalse. VIES has no database of its own: it queries the member state's database in real time, and those have announced periods of unavailability. Reading "unavailable" as "invalid" makes a client refuse a legitimate partner. - A VIES outage is not a route error. The response stays HTTP 200, with the state above and
motivsays why:stat_membru_indisponibil(MS_UNAVAILABLE),aglomerat(busy),timeout,conexiune(connection failed),http_,raspuns_neinteligibil(a 200 without a verdict — usually the maintenance page),circuit_deschis(after repeated failures we stop calling for a while;meta.reia_dupa_ssays how long). VIES sends some outages with HTTP 200 andisValid: false; those are not read as a verdict and are not cached. - Name and address appear only if the member state publishes them — some do not at all. A valid number without a name is normal, not an incomplete answer.
- The method is
POSTbecausesolicitantis YOUR VAT number: it identifies the taxable person asking, and in a query string it would end up in access logs and in browser history. - Greece is written
ELin VIES;GRis also accepted and normalised automatically.
What it is for
- Checking an EU partner before issuing a VAT-exempt invoice.
- Obtaining and archiving the consultation number as proof for a tax audit.
- Periodically re-checking recurring partners: a number valid today may be cancelled tomorrow.
Response structure
true/false from VIES, or null when we do not know (service unavailable or busy, unknown country).
valid, invalid, structura_invalida, tara_necunoscuta, serviciu_indisponibil, serviciu_aglomerat.
null otherwise.
solicitant — the proof of the check. null on a plain check.
serviciu_indisponibil/serviciu_aglomerat: stat_membru_indisponibil, aglomerat, timeout, conexiune, http_, raspuns_neinteligibil, circuit_deschis. null otherwise.
cache, local, extern or circuit (no call: the circuit breaker is open). Requests with solicitant are never cache.
Response examples
body: {"cod": "RO14399840"}
{
"data": {
"cod": "RO14399840",
"tara": "RO",
"numar": "14399840",
"valid": true,
"stare": "valid",
"denumire": "DANTE INTERNATIONAL SA",
"adresa": "MUNICIPIUL BUCUREŞTI, SECTOR 2 00000 STR. GARA HERĂSTRĂU Nr. 6 Et. 1,2,3,5,8",
"verificat_la": "2026-10-06T22: 58: 02.749Z",
"numar_consultare": null,
"motiv": null,
"provenienta": "extern"
},
"meta": {
"sursa": "Comisia Europeană — VIES (VAT Information Exchange System).",
"temei": "Regulamentul (UE) 904/2010; scutirea de TVA la livrări intracomunitare — art. 294 din Codul fiscal.",
"provenienta": "Apel la VIES.",
"nota_consultare": "Nu s-a emis număr de consultare. Trimite propriul cod de TVA în `solicitant` dacă ai nevoie de dovada verificării.",
"nota_vamal": "Pentru operaţiuni cu ţări terţe, identificatorul e EORI, verificat prin `/validare/eori` — nu codul de TVA."
}
}
body: {"cod": "14399840", "tara": "RO"}
{
"data": {
"cod": "RO14399840",
"tara": "RO",
"numar": "14399840",
"valid": true,
"stare": "valid",
"denumire": "DANTE INTERNATIONAL SA",
"adresa": "MUNICIPIUL BUCUREŞTI, SECTOR 2 00000 STR. GARA HERĂSTRĂU Nr. 6 Et. 1,2,3,5,8",
"verificat_la": null,
"numar_consultare": null,
"motiv": null,
"provenienta": "cache"
},
"meta": {
"sursa": "Comisia Europeană — VIES (VAT Information Exchange System).",
"temei": "Regulamentul (UE) 904/2010; scutirea de TVA la livrări intracomunitare — art. 294 din Codul fiscal.",
"provenienta": "Răspuns din cache — nu s-a făcut apel extern. Verificările cu `solicitant` nu se servesc din cache.",
"nota_consultare": "Nu s-a emis număr de consultare. Trimite propriul cod de TVA în `solicitant` dacă ai nevoie de dovada verificării.",
"nota_vamal": "Pentru operaţiuni cu ţări terţe, identificatorul e EORI, verificat prin `/validare/eori` — nu codul de TVA."
}
}
body: {"cod": "RO6719278"}
{
"data": {
"cod": "RO6719278",
"tara": "RO",
"numar": "6719278",
"valid": true,
"stare": "valid",
"denumire": "MEGA IMAGE SRL",
"adresa": "MUNICIPIUL BUCUREŞTI, SECTOR 6 61331 BLD. TIMIŞOARA Nr. 26 Et. 2",
"verificat_la": "2026-10-06T22: 58: 03.329Z",
"numar_consultare": null,
"motiv": null,
"provenienta": "extern"
},
"meta": {
"sursa": "Comisia Europeană — VIES (VAT Information Exchange System).",
"temei": "Regulamentul (UE) 904/2010; scutirea de TVA la livrări intracomunitare — art. 294 din Codul fiscal.",
"provenienta": "Apel la VIES.",
"nota_consultare": "Nu s-a emis număr de consultare. Trimite propriul cod de TVA în `solicitant` dacă ai nevoie de dovada verificării.",
"nota_vamal": "Pentru operaţiuni cu ţări terţe, identificatorul e EORI, verificat prin `/validare/eori` — nu codul de TVA."
}
}
Error codes
| Code | Slug | When it occurs |
|---|---|---|
| 401 | neautentificat | Token missing, invalid, expired or revoked. |
| 403 | feature_indisponibil | The current plan does not include the feature the route depends on. |
| 422 | validare | cod missing or of an impossible length. A code that is present but malformed returns 200 with stare: "structura_invalida". |
| 429 | limita_ta | You exceeded your rate for external checks; capacitate_serviciu — the service is at capacity, not a limit on your account. Both with Retry-After. |
All errors share the same shape. eroare.cod is stable and is the value you should branch on in code — not the text in mesaj, which may change.
{
"eroare": {
"cod": "validare",
"mesaj": "cod missing or of an impossible length. A code that is present but malformed returns 200 with stare: \"structura_invalida\"."
}
}