Validare cod TVA intracomunitar (VIES)
Verifică la VIES dacă un cod de TVA e valabil pentru operaţiuni intracomunitare şi, opţional,
emite numărul de consultare care serveşte ca dovadă a verificării.
Nu e acelaşi lucru cu /validare/tva. Acolo se citeşte registrul ANAF: dacă firma românească e
plătitoare de TVA şi dacă e inactivă fiscal. Aici se întreabă baza europeană: dacă acel cod e valabil
pentru schimburi între state membre. Un CUI poate fi plătitor de TVA în România şi să nu apară în VIES.
Numărul de consultare (solicitant). Dacă trimiţi propriul cod de TVA în solicitant, VIES
întoarce un numar_consultare — dovada că tu ai verificat acel partener la acea dată, singurul lucru
pe care îl poţi arăta la un control fiscal ca să justifici scutirea de TVA la o livrare
intracomunitară. Cererile cu solicitant NU se servesc niciodată din cache: un număr emis pentru
altcineva, sau acum două ore, nu e dovada ta.
Corpul cererii
Se trimite ca JSON, în corpul cererii (Content-Type: application/json) — nu în şirul de interogare.
RO14399840) sau fără, dacă dai tara separat. Spaţiile, punctele şi cratimele se ignoră.
max 20 car.
{
"cod": "RO14399840"
}
{
"cod": "14399840",
"tara": "RO"
}
{
"cod": "RO6719278"
}
Parametri de interogare
Cum se comportă
- Verifică la VIES dacă un cod de TVA e valabil pentru operaţiuni intracomunitare şi, opţional, obţine numărul de consultare care serveşte ca dovadă a verificării.
- Nu e acelaşi lucru cu
/validare/tva, şi confuzia costă bani. Acolo se citeşte registrul ANAF: dacă firma românească e plătitoare de TVA şi dacă e inactivă fiscal. Aici se întreabă baza europeană: dacă acel cod e valabil în schimburile între state membre. Un CUI poate fi plătitor de TVA în România şi să NU apară în VIES — iar atunci livrarea nu se poate factura cu scutire. - Numărul de consultare e miezul rutei. Trimite propriul cod de TVA în
solicitantşi VIES emite unnumar_consultare: dovada că TU ai verificat ACEL partener la ACEA dată. E singurul lucru pe care îl poţi arăta la un control fiscal ca să justifici scutirea de TVA la o livrare intracomunitară (art. 294 din Codul fiscal). Fărăsolicitantprimeşti verdictul, dar nu dovada. - Cererile cu
solicitantnu se servesc niciodată din cache. Un număr de consultare emis pentru altcineva, sau acum două ore, nu e dovada ta — deci fiecare astfel de cerere e un apel real la Comisie. Verificările simple se cache-uiesc. - Rezultatul (
validsauinvalid) se ţine în cache 10 minute, cât toate verificările externe ale platformei. Scurt deliberat: un cod de TVA se poate anula, iar un „valid" vechi ar sta la baza unei facturi cu scutire emise către un partener care nu mai e înregistrat — costul cade pe furnizor. - Trei stări, nu două.
serviciu_indisponibilşiserviciu_aglomeratîntorcvalid: null, nufalse. VIES nu are o bază proprie: întreabă în timp real baza statului membru, iar acestea au perioade de indisponibilitate anunţate. „Indisponibil" citit ca „invalid" face un client să refuze un partener legitim. - O pană a VIES nu e o eroare a rutei. Răspunsul rămâne HTTP 200, cu starea de mai sus şi
motivspune de ce:stat_membru_indisponibil(MS_UNAVAILABLE),aglomerat,timeout,conexiune,http_<cod>,raspuns_neinteligibil(un 200 fără verdict — de obicei pagina de mentenanţă),circuit_deschis(după eşecuri repetate nu mai sunăm un timp;meta.reia_dupa_sspune cât). VIES trimite unele pene cu HTTP 200 şiisValid: false; acelea nu sunt citite ca verdict şi nu intră în cache. - Denumirea şi adresa apar numai dacă statul membru le publică — unele nu o fac deloc. Un cod valabil fără denumire e normal, nu un răspuns incomplet.
- Metoda e
POSTpentru căsolicitante codul TĂU de TVA: identifică plătitorul care întreabă, iar într-un query-string ar ajunge în logurile de acces şi în istoricul browserului. - Grecia se scrie
ELîn VIES; se acceptă şiGR, se normalizează automat.
La ce folosește
- Verificarea unui partener din UE înainte de a emite o factură cu scutire de TVA.
- Obţinerea şi arhivarea numărului de consultare, ca dovadă pentru controlul fiscal.
- Reverificarea periodică a partenerilor recurenţi: un cod valabil azi poate fi anulat mâine.
Structura răspunsului
true/false de la VIES, sau null când nu ştim (serviciu indisponibil ori aglomerat, ţară necunoscută).
valid, invalid, structura_invalida, tara_necunoscuta, serviciu_indisponibil, serviciu_aglomerat.
null.
solicitant — dovada verificării. null la verificarea simplă.
serviciu_indisponibil/serviciu_aglomerat: stat_membru_indisponibil, aglomerat, timeout, conexiune, http_<cod>, raspuns_neinteligibil, circuit_deschis. Altfel null.
cache, local, extern sau circuit (fără apel: întrerupătorul e deschis). Cererile cu solicitant nu sunt niciodată cache.
Exemple de răspuns
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."
}
}
Coduri de eroare
| Cod | Slug | Când apare |
|---|---|---|
| 401 | neautentificat | Token lipsă, invalid, expirat sau revocat. |
| 403 | feature_indisponibil | Planul curent nu include funcţia de care ţine ruta. |
| 422 | validare | Lipseşte cod sau are o lungime imposibilă. Un cod prezent dar malformat întoarce 200 cu stare: "structura_invalida". |
| 429 | limita_ta | Ai depăşit ritmul tău de verificări externe; capacitate_serviciu — serviciul e la capacitate, nu e o limită a contului. Ambele cu Retry-After. |
Toate erorile au aceeași formă. eroare.cod e stabil și e cel după care trebuie să ramifici în cod — nu după textul din mesaj, care se poate schimba.
{
"eroare": {
"cod": "validare",
"mesaj": "Lipseşte cod sau are o lungime imposibilă. Un cod prezent dar malformat întoarce 200 cu stare: \"structura_invalida\"."
}
}