VAT number validation
Checks the structure of an EU VAT number (28 states) and, for Romanian numbers, returns the tax status from ANAF: VAT-registered, VAT on collection, tax inactivity, e-invoicing.
A valid structure does not mean the company exists. For the other member states we check only the form of the number (for Romania, the CUI check digit too); existence is confirmed at VIES.
Being VAT-registered in Romania is NOT the same as being valid in VIES for intra-Community operations — they are different registers, and the response says so explicitly.
Request body
Sent as JSON in the request body (Content-Type: application/json) — not in the query string.
{
"cod": "RO14399840"
}
{
"cod": "14399840"
}
{
"cod": "RO 6719278"
}
{
"cod": "RO1"
}
Query parameters
How it behaves
- Checks the structure of an EU VAT number (28 states, including
XIfor Northern Ireland) and, for Romanian numbers, returns the tax status from the ANAF register. - A valid structure does not mean the company exists. For member states other than Romania we check only the shape of the number — the national check digit differs from state to state and we do not compute it. For Romanian numbers the CUI check digit is verified too (ANAF key 753217532), so a wrong digit gives
structura_valida: false. Existence is confirmed through VIES. - Being VAT-registered in Romania is NOT the same as being valid in VIES for intra-Community transactions. They are different registers. Taking
platitor_tva: trueas grounds for an exempt intra-Community supply is a mistake: that requires a VIES check, with a consultation number. The response repeats the warning on every request, inmeta.atentie_intracomunitar. fiscal.stare_la_datais the date for which ANAF confirmed the status, NOT the time of our import. It is per company: on a partial refresh, each company carries its own date.inactiv_fiscaldeserves particular attention: invoices issued to a taxpayer declared inactive have a special tax regime. When it istrue, the note in the response flags it explicitly.- A missing tax status (
motiv_fiscal: "fara_stare_fiscala") does NOT mean the company is not VAT-registered — it means we do not have the information for that tax code. - The code is accepted with or without the country prefix:
RO14399840or14399840. Without a prefix Romania is assumed — the dominant case, and no other EU VAT number circulates without letters. The assumption is reported intara_presupusa, so it stays visible. - Greece uses the prefix
ELin the VAT system, notGR. Both are accepted on input and normalised toEL. split_tvais not returned: the measure was repealed in 2020 and the field isfalseon every record. A field that is always false is noise.
What it is for
- Checking a business partner before issuing an invoice.
- Spotting taxpayers declared inactive.
- Checking whether a partner uses VAT on collection.
Response structure
EL for Greece).
true when the code arrived without a prefix and Romania was assumed.
doar_pentru_romania or fara_stare_fiscala. Absent when the structure is invalid — there structura_valida is already the explanation.
Response examples
body: {"cod": "RO14399840"}
{
"data": {
"cod": "RO14399840",
"tara": "RO",
"tara_presupusa": false,
"numar": "14399840",
"structura_valida": true,
"fiscal": {
"platitor_tva": true,
"tva_de_la": "2002-02-01",
"tva_pana_la": null,
"tva_la_incasare": false,
"tva_la_incasare_de_la": null,
"inactiv_fiscal": false,
"data_inactivare": null,
"data_reactivare": null,
"e_factura": false,
"e_factura_de_la": null,
"data_radiere": null,
"stare_la_data": "2026-08-16"
},
"motiv_fiscal": null
},
"meta": {
"temei": "structura numărului de TVA pentru cele 28 de state (la România şi cifra de control a CUI-ului, cheia 753217532); statutul fiscal din registrul ANAF.",
"sursa_fiscal": "ANAF — registrul plătitorilor de TVA",
"atentie_intracomunitar": "Statutul de plătitor de TVA în România nu atestă valabilitatea codului pentru operaţiuni intracomunitare: sunt registre diferite. Pentru livrări intracomunitare scutite e nevoie de verificare VIES, cu număr de consultare.",
"nota": "Statut fiscal preluat din registrul ANAF, la data din `stare_la_data`."
}
}
body: {"cod": "14399840"}
{
"data": {
"cod": "RO14399840",
"tara": "RO",
"tara_presupusa": true,
"numar": "14399840",
"structura_valida": true,
"fiscal": {
"platitor_tva": true,
"tva_de_la": "2002-02-01",
"tva_pana_la": null,
"tva_la_incasare": false,
"tva_la_incasare_de_la": null,
"inactiv_fiscal": false,
"data_inactivare": null,
"data_reactivare": null,
"e_factura": false,
"e_factura_de_la": null,
"data_radiere": null,
"stare_la_data": "2026-08-16"
},
"motiv_fiscal": null
},
"meta": {
"temei": "structura numărului de TVA pentru cele 28 de state (la România şi cifra de control a CUI-ului, cheia 753217532); statutul fiscal din registrul ANAF.",
"sursa_fiscal": "ANAF — registrul plătitorilor de TVA",
"atentie_intracomunitar": "Statutul de plătitor de TVA în România nu atestă valabilitatea codului pentru operaţiuni intracomunitare: sunt registre diferite. Pentru livrări intracomunitare scutite e nevoie de verificare VIES, cu număr de consultare.",
"nota": "Statut fiscal preluat din registrul ANAF, la data din `stare_la_data`."
}
}
body: {"cod": "RO 6719278"}
{
"data": {
"cod": "RO6719278",
"tara": "RO",
"tara_presupusa": false,
"numar": "6719278",
"structura_valida": true,
"fiscal": {
"platitor_tva": true,
"tva_de_la": "1995-01-04",
"tva_pana_la": null,
"tva_la_incasare": false,
"tva_la_incasare_de_la": null,
"inactiv_fiscal": false,
"data_inactivare": null,
"data_reactivare": null,
"e_factura": false,
"e_factura_de_la": null,
"data_radiere": null,
"stare_la_data": "2026-08-16"
},
"motiv_fiscal": null
},
"meta": {
"temei": "structura numărului de TVA pentru cele 28 de state (la România şi cifra de control a CUI-ului, cheia 753217532); statutul fiscal din registrul ANAF.",
"sursa_fiscal": "ANAF — registrul plătitorilor de TVA",
"atentie_intracomunitar": "Statutul de plătitor de TVA în România nu atestă valabilitatea codului pentru operaţiuni intracomunitare: sunt registre diferite. Pentru livrări intracomunitare scutite e nevoie de verificare VIES, cu număr de consultare.",
"nota": "Statut fiscal preluat din registrul ANAF, la data din `stare_la_data`."
}
}
body: {"cod": "RO1"}
{
"data": {
"cod": "RO1",
"tara": "RO",
"tara_presupusa": false,
"numar": "1",
"structura_valida": false,
"fiscal": null,
"motiv_fiscal": null
},
"meta": {
"temei": "structura numărului de TVA pentru cele 28 de state (la România şi cifra de control a CUI-ului, cheia 753217532); statutul fiscal din registrul ANAF.",
"atentie_intracomunitar": "Statutul de plătitor de TVA în România nu atestă valabilitatea codului pentru operaţiuni intracomunitare: sunt registre diferite. Pentru livrări intracomunitare scutite e nevoie de verificare VIES, cu număr de consultare.",
"nota": "Structura nu corespunde formatului statului RO."
}
}
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 wrong returns 200 with structura_valida: false. |
| 429 | cota_depasita | The plan's monthly quota has been exceeded (see 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 wrong returns 200 with structura_valida: false."
}
}