Validate multiple VAT numbers
curl --request POST \
--url https://api.avatcado.com/v1/validate/batch \
--header 'Content-Type: application/json' \
--data '
{
"vat_numbers": [
"NL123456789B01",
"DE987654321",
"GB123456789",
"CHE123456789MWST",
"NO123456789MVA",
"AU51824753556"
],
"requester_vat_number": "DE987654321",
"cache": true
}
'import requests
url = "https://api.avatcado.com/v1/validate/batch"
payload = {
"vat_numbers": ["NL123456789B01", "DE987654321", "GB123456789", "CHE123456789MWST", "NO123456789MVA", "AU51824753556"],
"requester_vat_number": "DE987654321",
"cache": True
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
vat_numbers: [
'NL123456789B01',
'DE987654321',
'GB123456789',
'CHE123456789MWST',
'NO123456789MVA',
'AU51824753556'
],
requester_vat_number: 'DE987654321',
cache: true
})
};
fetch('https://api.avatcado.com/v1/validate/batch', 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/batch",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'vat_numbers' => [
'NL123456789B01',
'DE987654321',
'GB123456789',
'CHE123456789MWST',
'NO123456789MVA',
'AU51824753556'
],
'requester_vat_number' => 'DE987654321',
'cache' => true
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.avatcado.com/v1/validate/batch"
payload := strings.NewReader("{\n \"vat_numbers\": [\n \"NL123456789B01\",\n \"DE987654321\",\n \"GB123456789\",\n \"CHE123456789MWST\",\n \"NO123456789MVA\",\n \"AU51824753556\"\n ],\n \"requester_vat_number\": \"DE987654321\",\n \"cache\": true\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.avatcado.com/v1/validate/batch")
.header("Content-Type", "application/json")
.body("{\n \"vat_numbers\": [\n \"NL123456789B01\",\n \"DE987654321\",\n \"GB123456789\",\n \"CHE123456789MWST\",\n \"NO123456789MVA\",\n \"AU51824753556\"\n ],\n \"requester_vat_number\": \"DE987654321\",\n \"cache\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.avatcado.com/v1/validate/batch")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"vat_numbers\": [\n \"NL123456789B01\",\n \"DE987654321\",\n \"GB123456789\",\n \"CHE123456789MWST\",\n \"NO123456789MVA\",\n \"AU51824753556\"\n ],\n \"requester_vat_number\": \"DE987654321\",\n \"cache\": true\n}"
response = http.request(request)
puts response.read_body{
"data": {
"results": [
{
"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": {
"cached": true,
"cached_at": "<string>",
"stale": true,
"source_status": "live"
}
}
],
"summary": {
"total": 3,
"succeeded": 2,
"failed": 1
}
},
"meta": {
"request_id": "550e8400-e29b-41d4-a716-446655440000",
"mode": "test",
"request_duration_ms": 120
}
}{
"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": "tier_insufficient",
"message": "Batch validation requires a Pro or Business plan",
"docs_url": "https://docs.avatcado.com/errors/tier_insufficient"
},
"meta": {
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"error": {
"code": "validation_error",
"message": "At least one VAT number is required",
"docs_url": "https://docs.avatcado.com/errors/validation_error"
},
"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"
},
"meta": {
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}VAT Validation
Validate multiple VAT numbers
Validate up to 50 VAT numbers in a single request. Each VAT number is validated independently against the appropriate upstream service (VIES, HMRC, BFS, BRREG, or ABR). Results are returned in the same order as the input array.
Duplicate VAT numbers are deduplicated internally. Only unique numbers count against your monthly quota. Per-item errors are returned inline in the results array; the overall response is always 200.
Available to Pro and Business tiers only.
POST
/
v1
/
validate
/
batch
Validate multiple VAT numbers
curl --request POST \
--url https://api.avatcado.com/v1/validate/batch \
--header 'Content-Type: application/json' \
--data '
{
"vat_numbers": [
"NL123456789B01",
"DE987654321",
"GB123456789",
"CHE123456789MWST",
"NO123456789MVA",
"AU51824753556"
],
"requester_vat_number": "DE987654321",
"cache": true
}
'import requests
url = "https://api.avatcado.com/v1/validate/batch"
payload = {
"vat_numbers": ["NL123456789B01", "DE987654321", "GB123456789", "CHE123456789MWST", "NO123456789MVA", "AU51824753556"],
"requester_vat_number": "DE987654321",
"cache": True
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
vat_numbers: [
'NL123456789B01',
'DE987654321',
'GB123456789',
'CHE123456789MWST',
'NO123456789MVA',
'AU51824753556'
],
requester_vat_number: 'DE987654321',
cache: true
})
};
fetch('https://api.avatcado.com/v1/validate/batch', 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/batch",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'vat_numbers' => [
'NL123456789B01',
'DE987654321',
'GB123456789',
'CHE123456789MWST',
'NO123456789MVA',
'AU51824753556'
],
'requester_vat_number' => 'DE987654321',
'cache' => true
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.avatcado.com/v1/validate/batch"
payload := strings.NewReader("{\n \"vat_numbers\": [\n \"NL123456789B01\",\n \"DE987654321\",\n \"GB123456789\",\n \"CHE123456789MWST\",\n \"NO123456789MVA\",\n \"AU51824753556\"\n ],\n \"requester_vat_number\": \"DE987654321\",\n \"cache\": true\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.avatcado.com/v1/validate/batch")
.header("Content-Type", "application/json")
.body("{\n \"vat_numbers\": [\n \"NL123456789B01\",\n \"DE987654321\",\n \"GB123456789\",\n \"CHE123456789MWST\",\n \"NO123456789MVA\",\n \"AU51824753556\"\n ],\n \"requester_vat_number\": \"DE987654321\",\n \"cache\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.avatcado.com/v1/validate/batch")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"vat_numbers\": [\n \"NL123456789B01\",\n \"DE987654321\",\n \"GB123456789\",\n \"CHE123456789MWST\",\n \"NO123456789MVA\",\n \"AU51824753556\"\n ],\n \"requester_vat_number\": \"DE987654321\",\n \"cache\": true\n}"
response = http.request(request)
puts response.read_body{
"data": {
"results": [
{
"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": {
"cached": true,
"cached_at": "<string>",
"stale": true,
"source_status": "live"
}
}
],
"summary": {
"total": 3,
"succeeded": 2,
"failed": 1
}
},
"meta": {
"request_id": "550e8400-e29b-41d4-a716-446655440000",
"mode": "test",
"request_duration_ms": 120
}
}{
"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": "tier_insufficient",
"message": "Batch validation requires a Pro or Business plan",
"docs_url": "https://docs.avatcado.com/errors/tier_insufficient"
},
"meta": {
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"error": {
"code": "validation_error",
"message": "At least one VAT number is required",
"docs_url": "https://docs.avatcado.com/errors/validation_error"
},
"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"
},
"meta": {
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}Body
application/json
Array of VAT numbers to validate (max 50)
Required array length:
1 - 50 elementsMinimum string length:
1Example:
[
"NL123456789B01",
"DE987654321",
"GB123456789",
"CHE123456789MWST",
"NO123456789MVA",
"AU51824753556"
]
Your own VAT number, to receive consultation numbers. For EU targets, provide an EU requester. For UK targets, provide a UK requester.
Example:
"DE987654321"
Set to false to bypass the cache and force fresh lookups. Defaults to true.
Example:
true
⌘I