# Check EORI Number
Checks an EORI (Economic Operators Registration and Identification) number: its format first, then its registration in the official register. Name and address are returned when the trader agreed to publish them.
Request Method: GET
Request URL: https://api.vatcheckapi.com/v2/eori?eori_number=[[ eori_number ]]
# Request Parameters
| Parameter | Type | Mandatory | Description |
|---|---|---|---|
apikey | string | Your API Key | |
eori_number | string | The EORI number to check, including its two-letter country prefix (e.g. DE4204891), or without any country code if you pass country_code. Spaces, invisible characters (such as zero-width spaces), dots, dashes and slashes are ignored, and lower case is accepted. At most 64 characters | |
country_code | string | One of the supported country codes (e.g. DE), put in front of an eori_number given without any country code. Ignored when the number starts with a supported code. A number that starts with another country's code (such as EL or US) is not completed and fails with a 422 |
# Sample Request
curl -G https://api.vatcheckapi.com/v2/eori \
-d eori_number=DE4204891 \
-H "apikey: YOUR-APIKEY"
# Sample Response
{
"country_code": "DE",
"eori_number": "DE4204891",
"format_valid": true,
"registration_info": {
"is_registered": true,
"name": "Friedrich-Alexander-Universität Erlangen-Nürnberg",
"address": "Freyeslebenstr. 1\n91058 Erlangen\nGermany",
"address_parts": {
"street": "Freyeslebenstr. 1",
"postcode": "91058",
"city": "Erlangen",
"country": "Germany"
},
"checked_at": "2026-10-04T19:04:07Z"
},
"source": "eu_eos"
}
# Response Fields
| Field | Description |
|---|---|
country_code | The country prefix of the number (GR for Greece, XI for Northern Ireland) |
eori_number | The number as it was checked: normalised, upper case, with its country prefix |
format_valid | Whether the number has a valid EORI format. If false, no register was asked |
registration_info.is_registered | Whether the register knows the number as a valid EORI number |
registration_info.name | The trader's name, or null when the register published none |
registration_info.address | The address, one line each for the street, the postcode and city, and the country; null when the register published none |
registration_info.address_parts | The address as the register publishes it (street, postcode, city, country), or null. The European Commission writes the country name in English; HMRC sends no country, so country is null for GB numbers |
registration_info.checked_at | When the register was asked (UTC). null when the format is invalid |
source | The register that answered: hmrc or eu_eos. null when the format is invalid |
# Registers
Each number is checked in the register for its prefix:
| Prefix | Register | source |
|---|---|---|
GB | HMRC's public "Check an EORI number" API | hmrc |
EU member states and XI | The European Commission's EORI validation service | eu_eos |
Northern Ireland (XI) numbers are checked with the European Commission, not with HMRC.
# Name and address
The registers only publish a trader's name and address when the trader agreed to it. A registered number can therefore come back with is_registered: true and name, address and address_parts all null:
{
"country_code": "GB",
"eori_number": "GB220430231000",
"format_valid": true,
"registration_info": {
"is_registered": true,
"name": null,
"address": null,
"address_parts": null,
"checked_at": "2026-10-04T19:04:25Z"
},
"source": "hmrc"
}
# Format Check
The format is checked before any register is asked:
GBandXInumbers: the prefix followed by 12 or 15 digits.- EU numbers: the country prefix followed by 1 to 15 letters or digits.
A number with an invalid format comes back with format_valid: false, checked_at: null and source: null. It counts against your quota like any other check.
{
"country_code": "GB",
"eori_number": "GB1234567890001",
"format_valid": false,
"registration_info": {
"is_registered": false,
"name": null,
"address": null,
"address_parts": null,
"checked_at": null
},
"source": null
}
# Caching
Answers are cached: a registered number for up to 1 hour, a number that is not registered for up to 10 minutes. Within that time the same number gets the same answer, with the checked_at of the original lookup. Every answer, cached or not, counts as one request.
# Rate Limit for GB Numbers
HMRC allows only a few requests per second for all our customers together. Uncached lookups of GB numbers are therefore paced: each account gets about one per second.
- When your next turn is less than about a second away, the request waits for it.
- Further requests in the same burst are answered at once with a
503and the headerRetry-After: 1. They are not counted against your quota. - If you check a list of GB numbers, check them one after the other, or retry after the
Retry-Afterdelay.
Cached GB numbers, and numbers of the EU member states and XI, are not paced this way.
# Errors
| Status | When | Counted |
|---|---|---|
422 | eori_number is missing, not a string or longer than 64 characters; country_code is not a string; or the number does not start with a supported country code: it starts with another country's code (such as EL or US), or it has none and country_code names no supported one. See validation errors (opens new window) | No |
503 | The register did not answer in time or is failing, or the GB rate limit is used up for the moment | No |
The 503 body is a bare message:
{
"message": "The EORI validation service is currently not available. Please check again later."
}
When the register's rate limit is the reason, the response carries Retry-After: 1: retry after one second. Without that header the register is down or slow; retry a little later.
# Sandbox
Requests with a sandbox API key (opens new window) never query a register and cost nothing (X-Cost: 0). A number with a valid format gets a fixed answer, chosen by its last character:
| Last character | Answer |
|---|---|
8 or 9 | Not registered |
6 or 7 | Registered, without name and address |
| anything else | Registered to a fictional trader: SANDBOX TRADING LTD, 1 Example Street, AA1 1AA London for GB numbers; Sandbox Trading GmbH, Beispielstraße 1, 10115 Berlin, Germany for EU and XI numbers |
checked_at is the time of the request and source follows the prefix. A number with an invalid format gets the same answer as with a live key.
# Supported Countries
The API checks EORI numbers from the following 29 countries: the 27 EU member states, the United Kingdom (GB), and Northern Ireland (XI). Note that Greece is GR in EORI numbers, not EL as in VAT numbers.
| Code | Country | Code | Country |
|---|---|---|---|
AT | Austria | IT | Italy |
BE | Belgium | LT | Lithuania |
BG | Bulgaria | LU | Luxembourg |
CY | Cyprus | LV | Latvia |
CZ | Czechia | MT | Malta |
DE | Germany | NL | Netherlands |
DK | Denmark | PL | Poland |
EE | Estonia | PT | Portugal |
ES | Spain | RO | Romania |
FI | Finland | SE | Sweden |
FR | France | SI | Slovenia |
GB | United Kingdom | SK | Slovakia |
GR | Greece | XI | Northern Ireland |
HR | Croatia | ||
HU | Hungary | ||
IE | Ireland |
Numbers that start with any other country code, such as EL or US, fail with a 422 validation error (opens new window), also when you pass country_code. country_code only completes a number given without any country code.