curl --request GET \
--url https://api.avatcado.com/v1/eori/validateimport requests
url = "https://api.avatcado.com/v1/eori/validate"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.avatcado.com/v1/eori/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/eori/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/eori/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/eori/validate")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.avatcado.com/v1/eori/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,
"eori_number": "GB123456789000",
"country_code": "GB",
"company": {
"name": "Acme B.V.",
"address": "Keizersgracht 123, Amsterdam"
},
"requested_at": "2026-11-13T09:19:29.000Z"
},
"meta": {
"request_id": "550e8400-e29b-41d4-a716-446655440000",
"source": "hmrc",
"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: eori_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_eori_format",
"message": "Invalid EORI number format: GB123. GB EORI numbers are GB followed by 12 to 15 digits",
"docs_url": "https://docs.avatcado.com/errors/invalid_eori_format",
"eori_number": "GB123"
},
"meta": {
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"error": {
"code": "rate_limit_exceeded",
"message": "Monthly limit of 500 requests exceeded",
"docs_url": "https://docs.avatcado.com/errors/rate_limit_exceeded",
"eori_number": "GB123456789000"
},
"meta": {
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"error": {
"code": "upstream_unavailable",
"message": "The HMRC EORI service is unavailable",
"docs_url": "https://docs.avatcado.com/errors/upstream_unavailable",
"eori_number": "GB123456789000"
},
"meta": {
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}Validate an EORI number
Check an EORI number (the customs identifier a business needs to import, export or move goods in transit) against the register that issued it. GB numbers are checked with HMRC; numbers from the 27 EU member states and XI (Northern Ireland) are checked with the European Commission’s EORI validation service.
Input is normalized automatically: spaces, dots, dashes and casing are handled for you ("gb 123.456.789 000" -> "GB123456789000"). A number neither register would accept is rejected with a 422 before any register is called, and does not count against your quota.
company is null for many valid numbers: both registers publish a trader’s name and address only when the trader agreed to it.
Answers are cached. Every response carries meta.source (ec_eos or hmrc), meta.source_status (live, cached or unavailable), meta.cached and meta.stale. When the register is down, the most recent stored answer is served with source_status “unavailable”; with no stored answer the request ends in a 503 that is not counted. Pass cache=false to force a fresh check: the request then answers with a fresh check or a 503.
An EORI number and a VAT number are separate registrations. A valid VAT number does not imply a valid EORI number. Use GET /v1/validate for VAT numbers.
curl --request GET \
--url https://api.avatcado.com/v1/eori/validateimport requests
url = "https://api.avatcado.com/v1/eori/validate"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.avatcado.com/v1/eori/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/eori/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/eori/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/eori/validate")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.avatcado.com/v1/eori/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,
"eori_number": "GB123456789000",
"country_code": "GB",
"company": {
"name": "Acme B.V.",
"address": "Keizersgracht 123, Amsterdam"
},
"requested_at": "2026-11-13T09:19:29.000Z"
},
"meta": {
"request_id": "550e8400-e29b-41d4-a716-446655440000",
"source": "hmrc",
"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: eori_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_eori_format",
"message": "Invalid EORI number format: GB123. GB EORI numbers are GB followed by 12 to 15 digits",
"docs_url": "https://docs.avatcado.com/errors/invalid_eori_format",
"eori_number": "GB123"
},
"meta": {
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"error": {
"code": "rate_limit_exceeded",
"message": "Monthly limit of 500 requests exceeded",
"docs_url": "https://docs.avatcado.com/errors/rate_limit_exceeded",
"eori_number": "GB123456789000"
},
"meta": {
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"error": {
"code": "upstream_unavailable",
"message": "The HMRC EORI service is unavailable",
"docs_url": "https://docs.avatcado.com/errors/upstream_unavailable",
"eori_number": "GB123456789000"
},
"meta": {
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}Query Parameters
The EORI number to check: a two-letter country code followed by 1 to 15 letters or digits (GB numbers: 12 to 15 digits). Supports the 27 EU member states, XI and GB. Will be normalized to uppercase with spaces, dots and dashes removed, and the Greek VAT prefix EL is rewritten to the EORI prefix GR.
1"GB123456789000"
Set to false to skip the cache and check the register again. The fresh answer is still stored for later requests. With the cache off, no stored answer is served when the register is down: the request answers with a fresh check or a 503. Defaults to true.
true, false "true"