curl --request GET \
--url https://api.avatcado.com/v1/validateimport requests
url = "https://api.avatcado.com/v1/validate"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.avatcado.com/v1/validate', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.avatcado.com/v1/validate",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.avatcado.com/v1/validate"
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.avatcado.com/v1/validate")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.avatcado.com/v1/validate")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body{
"data": {
"valid": true,
"vat_number": "NL123456789B01",
"country_code": "NL",
"company": {
"name": "Acme B.V.",
"address": "Keizersgracht 123, Amsterdam"
},
"requested_at": "2026-03-06T12:00:00.000Z",
"consultation_number": "WAPIAAAAA1BBB2"
},
"meta": {
"request_id": "550e8400-e29b-41d4-a716-446655440000",
"source": "vies",
"source_status": "live",
"cached": true,
"stale": true,
"request_duration_ms": 120,
"mode": "test",
"cached_at": "<string>"
}
}{
"error": {
"code": "missing_parameter",
"message": "Missing required query parameter: vat_number",
"docs_url": "https://docs.avatcado.com/errors/missing_parameter"
},
"meta": {
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"error": {
"code": "unauthorized",
"message": "Missing or invalid API key",
"docs_url": "https://docs.avatcado.com/errors/unauthorized"
},
"meta": {
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"error": {
"code": "invalid_vat_format",
"message": "The VAT number format is invalid. Expected format: CC123456789",
"docs_url": "https://docs.avatcado.com/errors/invalid_vat_format",
"vat_number": "DE123"
},
"meta": {
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"error": {
"code": "rate_limit_exceeded",
"message": "Monthly validation limit exceeded",
"docs_url": "https://docs.avatcado.com/errors/rate_limit_exceeded",
"vat_number": "DE123456789"
},
"meta": {
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"error": {
"code": "upstream_unavailable",
"message": "The upstream VAT validation service is currently unavailable",
"docs_url": "https://docs.avatcado.com/errors/upstream_unavailable",
"vat_number": "SE556677889901"
},
"meta": {
"request_id": "550e8400-e29b-41d4-a716-446655440000",
"validation_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7"
}
}Validate a VAT number
Validate a VAT number against the appropriate upstream service (VIES, HMRC, BFS, BRREG, or ABR) and return the validity status, company details, and an optional consultation number.
Input is normalized automatically - spaces, dots, and casing are handled for you ("nl 123.456.789 b01" -> "NL123456789B01").
Results are cached for 25 days. Every response carries meta.source (which registry answered), meta.source_status (live, cached, unavailable, degraded or fallback), meta.cached and meta.stale. On Pro and Business plans, when VIES is down for one of the 10 EU countries with an open national tax register (BE, CZ, EE, FI, FR, HR, LV, RO, SI, SK) that register is consulted and served when it confirms the number (source_status “fallback”); otherwise, and on the Free plan, the most recent stored result is served (source_status “unavailable”). Pass cache=false to bypass the cache and force a fresh lookup, and fallback=false so this request does not consult a national register. Both default to true, except when requester_vat_number is supplied: a consultation-number request then skips the cache, the register and any stored result, and answers with a fresh check or a 503. Pass cache=true or fallback=true explicitly to opt back in.
Company data is null for DE and ES: neither member state publishes company names or addresses through VIES.
curl --request GET \
--url https://api.avatcado.com/v1/validateimport requests
url = "https://api.avatcado.com/v1/validate"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.avatcado.com/v1/validate', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.avatcado.com/v1/validate",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.avatcado.com/v1/validate"
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.avatcado.com/v1/validate")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.avatcado.com/v1/validate")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body{
"data": {
"valid": true,
"vat_number": "NL123456789B01",
"country_code": "NL",
"company": {
"name": "Acme B.V.",
"address": "Keizersgracht 123, Amsterdam"
},
"requested_at": "2026-03-06T12:00:00.000Z",
"consultation_number": "WAPIAAAAA1BBB2"
},
"meta": {
"request_id": "550e8400-e29b-41d4-a716-446655440000",
"source": "vies",
"source_status": "live",
"cached": true,
"stale": true,
"request_duration_ms": 120,
"mode": "test",
"cached_at": "<string>"
}
}{
"error": {
"code": "missing_parameter",
"message": "Missing required query parameter: vat_number",
"docs_url": "https://docs.avatcado.com/errors/missing_parameter"
},
"meta": {
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"error": {
"code": "unauthorized",
"message": "Missing or invalid API key",
"docs_url": "https://docs.avatcado.com/errors/unauthorized"
},
"meta": {
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"error": {
"code": "invalid_vat_format",
"message": "The VAT number format is invalid. Expected format: CC123456789",
"docs_url": "https://docs.avatcado.com/errors/invalid_vat_format",
"vat_number": "DE123"
},
"meta": {
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"error": {
"code": "rate_limit_exceeded",
"message": "Monthly validation limit exceeded",
"docs_url": "https://docs.avatcado.com/errors/rate_limit_exceeded",
"vat_number": "DE123456789"
},
"meta": {
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"error": {
"code": "upstream_unavailable",
"message": "The upstream VAT validation service is currently unavailable",
"docs_url": "https://docs.avatcado.com/errors/upstream_unavailable",
"vat_number": "SE556677889901"
},
"meta": {
"request_id": "550e8400-e29b-41d4-a716-446655440000",
"validation_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7"
}
}Query Parameters
The VAT number to validate (e.g. NL123456789B01, GB123456789, CHE-123.456.789 MWST, NO123456789MVA, AU51824753556). Supports EU, UK, CH, LI, NO, and AU formats. Will be normalized to uppercase with spaces and dots removed.
1"NL123456789B01"
Your own VAT number, to receive a consultation number. For EU targets, provide an EU requester. For UK targets, provide a UK requester.
"DE987654321"
Set to false to bypass the cache and force a fresh lookup from the upstream service. The fresh result is still cached for subsequent requests. Defaults to true, or to false when requester_vat_number is supplied, so that a consultation number always comes from a fresh check. With a requester and the cache off, no stored result is served during an outage either. Pass true explicitly to opt back in.
true, false "true"
Set to false so this request does not consult a national register when VIES is down. Applies on Pro and Business plans and is ignored on Free. Defaults to true, or to false when requester_vat_number is supplied, because register answers never carry a consultation_number. Pass true explicitly to accept a register answer next to a requester.
true, false "true"