EORI validation API

One GET request checks an EORI number against the register that issued it and returns JSON: HMRC for GB numbers, the European Commission for the 27 EU member states and XI. The free plan includes 500 requests a month, shared with VAT validation.

500 requests a month on the free plan. No credit card required.

One request, one JSON answer

# Set AVATCADO_API_KEY in this server environment first.
curl --max-time 30 \
  "https://api.avatcado.com/v1/eori/validate?eori_number=GB123456789000" \
  --header "Authorization: Bearer $AVATCADO_API_KEY"
{
  "data": {
    "valid": true,
    "eori_number": "GB123456789000",
    "country_code": "GB",
    "company": {
      "name": "EXAMPLE TRADING LTD",
      "address": "1 HIGH STREET, LONDON, SW1A 1AA"
    },
    "requested_at": "2026-11-13T09:19:29.000Z"
  },
  "meta": {
    "request_id": "550e8400-e29b-41d4-a716-446655440000",
    "request_duration_ms": 312,
    "source": "hmrc",
    "source_status": "live",
    "cached": false,
    "stale": false
  }
}

valid says whether the register lists the number. company holds the trader's name and address when the register publishes them, and is null otherwise. meta.source names the register that answered, and meta.source_status says whether the answer is live, cached or a stored answer served during an outage.

What the API does for you

Without itWith it
A SOAP client for the EU register and a separate JSON client for HMRCOne GET request. The prefix decides the register
The EU register answers "not valid" for a GB number that HMRC lists as validGB goes to HMRC, XI and the EU go to the Commission
One malformed number makes either register refuse the whole requestA 422 invalid_eori_format that names the rule, before any register is called and without using quota
Uppercase, no spaces, or the request failsgb 123.456.789 000 is accepted and normalized
A Greek number typed with the VAT prefix EL comes back "not valid"EL is rewritten to the EORI prefix GR
Your own retries and storage for register outagesUp to three attempts, then the last stored answer flagged unavailable, or a 503 that is not counted

Each row was measured against the live registers on 13 November 2026. The details are in the guides to the EU EORI validation service and the HMRC EORI check API, including code for calling both directly if that suits you better.

Try it on a real number

The checker below calls the same endpoint. Open the raw JSON to see the full response.

Enter an EORI number to see whether it is valid, who holds it and which register answered

Coverage

PrefixRegistermeta.source
GBHMRC, Check an EORI numberhmrc
XIEuropean Commission EORI validation serviceec_eos
27 EU member statesEuropean Commission EORI validation serviceec_eos

Pricing

An EORI check counts as one request against the same monthly quota as VAT validation. There is no separate EORI plan.

PlanRequests per monthRequests per minute
Free50020
Pro10,00060
Business50,000120

A malformed number and a register outage with no stored answer are not counted. Prices are on the pricing page.

What it does not do

  • One number per request. There is no batch or async endpoint for EORI numbers.
  • No webhook when an EORI number's status changes.
  • No search by company name. Neither register offers one.
  • No second register to fall back on. During an outage the API can only serve an answer it stored earlier.
  • The Node.js and Python SDKs do not have an EORI method yet. Call the endpoint over HTTP.

EORI and VAT numbers on one key

An EORI number is a customs registration and a VAT number is a tax registration, so a system that ships goods to business customers often needs both checks. The same API key calls GET /v1/validate for VAT numbers in 32 countries. See EORI number vs VAT number for when to check which, or try the free EORI checker and VAT checker.

Frequently asked questions

Numbers issued by the 27 EU member states, XI numbers for Northern Ireland, and GB numbers. The API reads the prefix and asks the register that holds the number: the European Commission's EORI validation service for EU and XI numbers, HMRC for GB numbers.
Each check counts as one request against the same monthly quota as VAT validation: 500 on Free, 10,000 on Pro and 50,000 on Business. A malformed number (422) and a register outage with no stored answer (503) are not counted.
When the register publishes it. Both registers show a holder's name and address only with the holder's consent, so many valid numbers return company as null. A response with valid true and company null is a complete answer.
The API tries the register up to three times. If it still gets no answer and has an earlier answer for the number on file, it returns that answer with source_status set to unavailable, so you can see it is not a fresh check. With no answer on file it returns a 503 that is not counted. Pass cache=false if you only ever want a fresh check or an error.
The endpoint takes one number per request. There is no batch or async endpoint for EORI numbers and no webhook for status changes. To check a list, send the requests one after another within your plan's per-minute limit.
The endpoint is a plain GET that returns JSON, so any HTTP client works, and the page shows the request in cURL. The Node.js and Python SDKs cover VAT validation and VAT rates and do not have an EORI method yet.
By Remco from Avatcado

Sources

Add EORI checks to your application

Create an account to get your API key. The same key validates VAT numbers.