# EORI Number Validator: EU Customs EORI Check (EOS) (`lerider/eori-validator`) Actor

Check EU EORI numbers live in the European Commission's EOS customs register: valid or not, plus the trader's name and address where published. Batches of up to 500, GB numbers flagged, $0.002 per answered check; bad formats and outages are free.

- **URL**: https://apify.com/lerider/eori-validator.md
- **Developed by:** [Lerider Technologies](https://apify.com/lerider) (community)
- **Categories:** Business, Developer tools, Agents
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 eori number checked in eu eos

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## EORI Number Validator: EU Customs EORI Check (EOS)

Check EORI numbers live in **EOS**, the European Commission's official register of Economic Operators Registration
and Identification numbers. Built for import/export and customs workflows, freight and marketplace onboarding, and
AI agents that must confirm a trading partner's customs ID before they book, ship or pay.

- **Live EOS lookup** for EORI numbers issued by all 27 EU member states and Northern Ireland (XI)
- **Trader name and address** when the trader agreed to publish them in EOS
- **Batches of up to 500** per run (sent to EOS in groups of 10, its limit); a number repeated in the same run is
  checked and charged once
- **Honest edge cases:** GB numbers are UK-issued (HMRC) and not in EOS since Brexit, so they come back as
  `not_checkable` instead of a misleading "not valid"; an EOS outage comes back as `unavailable`

### Pricing: you pay only when EOS answers

| Event | Price | When |
|---|---|---|
| `eori-check` | **$0.002** | EOS answered: the number is `valid` or `invalid` |
| (free) | $0 | Wrong format, GB or non-EU prefix, EOS down, a repeat in the same run, malformed item |

That is $2 per 1,000 answered checks.

### Input

```json
{"eori": "IE6388047V"}
```

```json
{"eoris": ["DE123456789012345", "nl 123.456.789", "XI123456789000", "GB123456789000"]}
```

Spaces, dots, dashes and slashes are ignored, and `GR` is read as `EL` (Greece). Clear the single `eori` field when
you send `eoris`.

### Output

One dataset item per number, in input order:

```json
{
  "index": 0,
  "eori": "IE6388047V",
  "country": "IE",
  "format_ok": true,
  "status": "valid",
  "valid": true,
  "trader": null,
  "checked_at": "2026-10-28T19:30:00+00:00",
  "detail": "registered; the trader did not agree to publish name and address",
  "source": "EU EOS"
}
```

| `status` | Meaning | Charged |
|---|---|---|
| `valid` | Registered in an EU customs system | yes |
| `invalid` | EOS says the number is not registered | yes |
| `invalid_format` | Not 2 letters + 1–15 letters/digits; EOS was not asked | no |
| `not_checkable` | GB (check with HMRC) or a non-EU prefix | no |
| `unavailable` | EOS did not answer; try again later | no |

`trader` holds whatever EOS publishes for that number (typically name, street, postal code, city, country), or
`null` when the trader did not consent to publication.

### Related

- [EU VAT Validator (VIES)](https://apify.com/lerider/eu-vat-validator): VAT numbers, same pay-per-answer model
- [EU TIN Validator](https://apify.com/lerider/eu-tin-validator): tax identification numbers, 27 EU countries
- [Payee Check](https://apify.com/lerider/payee-check): IBAN, VAT, Peppol and invoice checks before you pay a supplier

Results come straight from EOS at the time of the run. Nothing is stored beyond your run's dataset. Not legal or
customs advice. Made by Lerider Technologies (lerider.com).

# Changelog

This Actor's version history is a separate document: https://apify.com/lerider/eori-validator/changelog.md

# Actor input Schema

## `eori` (type: `string`):

One EORI number with its country prefix, e.g. DE123456789012345 or NL123456789. Spaces, dots and dashes are ignored. Leave empty when you use 'EORI numbers (batch)'.

## `eoris` (type: `array`):

Up to 500 EORI numbers per run. Clear the single 'EORI number' field when you use this.

## Actor input object example

```json
{
  "eori": "IE6388047V"
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `overview` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "eori": "IE6388047V"
};

// Run the Actor and wait for it to finish
const run = await client.actor("lerider/eori-validator").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "eori": "IE6388047V" }

# Run the Actor and wait for it to finish
run = client.actor("lerider/eori-validator").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "eori": "IE6388047V"
}' |
apify call lerider/eori-validator --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,lerider/eori-validator"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/GQeq8AkVv6cpKJQoX/builds/juzk4TLpwk9Fr4ZBA/openapi.json
