# EU VAT Validator (VIES): Check VAT Numbers, Pay Per Answer (`lerider/eu-vat-validator`) Actor

Validate EU VAT numbers live in the official EU VIES register and get the registered company name. Offline format and Dutch checksum pre-check, optional name match, batches of up to 200. $0.003 per VAT number VIES answers; bad formats and VIES outages are free.

- **URL**: https://apify.com/lerider/eu-vat-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 $3.00 / 1,000 vat number checked in vies

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

## EU VAT Validator (VIES): Check VAT Numbers, Pay Per Answer

Check EU VAT numbers live in **VIES**, the European Commission's official register, and get the registered company
name back. Built for supplier onboarding, invoice checks, checkout VAT exemption and AI agents that need to know
"is this VAT number real, and whose is it?"

- **Live VIES lookup** for all 27 EU member states plus Northern Ireland (XI)
- **Offline pre-check** of the number format per country (and the checksum for Dutch numbers), so typos are caught
  without a register call
- **Name match** (optional): pass the name you expect and get a 0–1 score; legal forms and punctuation are ignored
- **Batches** of up to 200 numbers per run; a number repeated in the same run is looked up once
- **Retries** when a member state's VIES service is slow, and an honest `unavailable` status when it stays down

### Pricing: you pay only when VIES answers

| Event | Price | When |
|---|---|---|
| `vat-check` | **$0.003** | VIES answered: the number is `valid` or `invalid` |
| (free) | $0 | Wrong format (`invalid_format`), non-EU prefix (`not_checkable`), VIES down (`unavailable`), malformed item |

That is $3 per 1,000 answered checks. A batch full of typos or a VIES outage costs nothing.

### Input

One number:

```json
{"vat_id": "IE6388047V", "expected_name": "Google Ireland Limited"}
```

A batch (strings or objects, up to 200):

```json
{"vat_ids": ["NL123456789B01", "DE 123.456.789", {"vat_id": "FR40303265045", "expected_name": "Sodimas"}]}
```

Spaces, dots and dashes are ignored, and `GR` is read as `EL` (VIES uses EL for Greece). Clear the single `vat_id`
field when you send `vat_ids`.

### Output

One dataset item per number, in input order:

```json
{
  "index": 0,
  "vat_id": "IE6388047V",
  "country": "IE",
  "format_ok": true,
  "status": "valid",
  "valid": true,
  "name": "GOOGLE IRELAND LIMITED",
  "name_match": 1.0,
  "checked_at": "2026-10-28T12:00:00+00:00",
  "cached": false,
  "detail": null,
  "source": "VIES"
}
```

| `status` | Meaning | Charged |
|---|---|---|
| `valid` | Registered in VIES for intra-EU trade | yes |
| `invalid` | VIES says the number is not registered | yes |
| `invalid_format` | Not the format of that country's VAT numbers; VIES was not asked | no |
| `not_checkable` | Prefix is not a VIES country (e.g. GB, CH, NO) | no |
| `unavailable` | VIES or the member state's service did not answer; try again later | no |

Dutch numbers also get `nl_checksum_ok`. Some member states (for example Germany) never return a name through
VIES; `name` is then `null` and `name_match` stays `null`.

### Good to know

- VIES confirms that a number is registered for **intra-EU** transactions. A business can have a domestic VAT number
  that is not active in VIES.
- Results come straight from VIES at the time of the run (`checked_at`). Nothing is stored beyond your run's dataset.
- Need more than a VAT number, for example the IBAN, Peppol registration and invoice VAT maths before you pay a
  supplier? Use [Payee Check](https://apify.com/lerider/payee-check), built on the same engine.

Not tax or legal advice. Made by Lerider Technologies (lerider.com).

# Changelog

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

# Actor input Schema

## `vat_id` (type: `string`):

One EU VAT number with its country prefix, e.g. NL123456789B01, DE123456789 or FR40303265045. Spaces, dots and dashes are ignored; GR is read as EL. Leave empty when you use 'VAT numbers (batch)'.

## `expected_name` (type: `string`):

For a single VAT number: the name you expect. The output's name_match is 1.0 when the VIES name is the same company (legal forms and punctuation ignored), lower when it differs. Only works for countries where VIES returns a name.

## `vat_ids` (type: `array`):

Up to 200 VAT numbers per run: a list of strings, or of objects {"vat_id": ..., "expected_name": ...}. Clear the single 'VAT number' field when you use this.

## Actor input object example

```json
{
  "vat_id": "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 = {
    "vat_id": "IE6388047V"
};

// Run the Actor and wait for it to finish
const run = await client.actor("lerider/eu-vat-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 = { "vat_id": "IE6388047V" }

# Run the Actor and wait for it to finish
run = client.actor("lerider/eu-vat-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 '{
  "vat_id": "IE6388047V"
}' |
apify call lerider/eu-vat-validator --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,lerider/eu-vat-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/1PfaHfkvFa3Z3CfG4/builds/o3zoMfOpFSGPh4rXr/openapi.json
