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,
"fallback": 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,
"fallback": 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,
fallback: 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,
'fallback' => 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 \"fallback\": 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 \"fallback\": 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 \"fallback\": 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": {
"source": "vies",
"source_status": "live",
"cached": true,
"stale": true,
"cached_at": "<string>"
}
}
],
"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",
"vat_number": "DE123456789"
},
"meta": {
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}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.
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,
"fallback": 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,
"fallback": 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,
fallback: 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,
'fallback' => 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 \"fallback\": 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 \"fallback\": 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 \"fallback\": 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": {
"source": "vies",
"source_status": "live",
"cached": true,
"stale": true,
"cached_at": "<string>"
}
}
],
"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",
"vat_number": "DE123456789"
},
"meta": {
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}Body
Array of VAT numbers to validate (max 50)
1 - 50 elements1[
"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.
"DE987654321"
Set to false to bypass the cache and force fresh lookups. Defaults to true, or to false when requester_vat_number is supplied (no stored result is served then, not even during an outage). Pass true explicitly to opt back in.
true
Set to false so no item consults a national register when VIES is down. Defaults to true, or to false when requester_vat_number is supplied, because register answers never carry consultation numbers. Pass true explicitly to opt back in.
true