EU VAT Validation API
Validate EU VAT numbers programmatically against the official VIES database. Free to use, no API key, CORS enabled.
Base URL
https://vat.businesspress.io
All endpoints are relative to this base URL. Use HTTPS in production.
Endpoints
/api/vat/validation/validate
Validate a single EU VAT number in real-time against the VIES database. Results are cached for 7 days for performance.
Request Body
| Parameter | Type | Required | Description |
|---|---|---|---|
country_code |
string | required | 2-letter ISO code (e.g. LT, DE). Greece uses EL. |
vat_number |
string | required | VAT number without the country prefix (e.g. 100019070512 not LT100019070512). |
company_name |
string | optional | Expected company name for fuzzy matching verification. |
address |
string | optional | Expected address for additional verification. |
Example Request
curl -X POST https://vat.businesspress.io/api/vat/validation/validate \
-H "Content-Type: application/json" \
-d '
{
"country_code": "LT",
"vat_number": "100019070512"
}'
Example Response
{
"success": true,
"data": {
"valid": true,
"country_code": "LT",
"vat_number": "100019070512",
"name": "UAB Company Name",
"address": "Vilnius, Lithuania",
"source": "vies",
"request_identifier": "..."
}
}
/api/vat/validation/batch
max 10
Validate up to 10 VAT numbers in a single request. Each number is validated independently against VIES.
Example Request
{
"validations": [
{
"country_code": "LT",
"vat_number": "100019070512"
},
{
"country_code": "DE",
"vat_number": "129274202"
}
]
}
Example Response
{
"success": true,
"total": 2,
"data": [
{
"valid": true,
"country_code": "LT",
"vat_number": "100019070512",
"name": "UAB ...",
...
},
{ ... }
]
}
/api/vat/validation/health
Check the operational status of the VAT validation service.
{
"status": "operational",
"service": "VAT VIES Validation API",
"timestamp": "2026-04-07T10:00:00+00:00"
}
Interactive Playground
Batch demo will validate the above number + a static DE example to show the multi-result response format.
Response Fields
| Field | Type | Description |
|---|---|---|
success |
boolean | Always true for 200 responses. |
data.valid |
boolean | Whether the VAT number is currently active in VIES. |
data.country_code |
string | ISO 2-letter country code echoed back. |
data.vat_number |
string | The VAT number as validated (without prefix). |
data.name |
string|null | Company name returned by VIES. May be N/A if withheld by country. |
data.address |
string|null | Registered address. May be withheld by some countries. |
data.source |
string | vies (live lookup), cache, or database (cached result). |
data.request_identifier |
string|null | VIES consultation reference number for audit purposes. |
Error Responses
| HTTP Status | When |
|---|---|
| 422 | Validation failed — missing or invalid country_code or vat_number. Check the errors field in the response. |
| 429 | Too many requests — fair-use rate limit reached. Retry after a brief pause. |
| 503 | The upstream VIES system is temporarily unavailable. Check ec.europa.eu/taxation_customs/vies for status. |
Code Examples
curl-X POST https://vat.businesspress.io/api/vat/validation/validate \ -H"Content-Type: application/json"\ -d'{"country_code":"LT","vat_number":"100019070512"}'
constresponse=awaitfetch('https://vat.businesspress.io/api/vat/validation/validate', {method:'POST',headers: {'Content-Type':'application/json'},body:JSON.stringify({country_code:'LT',vat_number:'100019070512'}) });constdata=awaitresponse.json();console.log(data.data.valid);// true
$response=Http::post('https://vat.businesspress.io/api/vat/validation/validate', ['country_code'=>'LT','vat_number'=>'100019070512', ]);$data=$response->json('data');$isValid=$data['valid'];// true
importrequestsres=requests.post("https://vat.businesspress.io/api/vat/validation/validate",json={"country_code":"LT","vat_number":"100019070512"} )data=res.json()["data"]data["valid"])# True
On This Page
Quick Reference
/api/vat/validation/validate
/api/vat/validation/batch
/api/vat/validation/health