# EU VAT Validator — Batch VIES Check for All EU Countries (`agoradelmediterraneo/eu-vat-validator`) Actor

Batch validate EU VAT numbers across all 27 EU member states via the official EU Commission VIES system. Returns company name and address for 16 countries. Up to 500 VAT numbers per run. No API key required.

- **URL**: https://apify.com/agoradelmediterraneo/eu-vat-validator.md
- **Developed by:** [Agora](https://apify.com/agoradelmediterraneo) (community)
- **Categories:** Business, Lead generation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $10.00 / 1,000 results

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## EU VAT Validator — Batch VIES Check for 16 EU Countries

Validate EU VAT numbers in bulk using the **official EU VIES system** (ec.europa.eu/taxation\_customs/vies). Returns company name and address for all supported countries. No API key required.

**Data source:** European Commission VIES — official EU tax authority system, real-time validation.

***

### Why This Actor?

EU VAT validation is a legal compliance requirement for any business issuing B2B invoices across EU borders. Reverse-charging VAT incorrectly can result in penalties. This actor automates bulk validation that would otherwise require manual checks per number.

- **16 EU countries supported:** BE, BG, CZ, DE, DK, EE, EL, ES, FI, FR, HR, HU, IE, IT, LT, LU, LV, MT, NL, PL, PT, RO, SE, SI, SK
- **Real-time VIES:** every check hits the official EU Commission API, not a cached database
- **Batch processing:** validate up to 500 numbers per run
- **Structured output:** valid/invalid flag + company name + address where available

***

### Use Cases

#### 1. Accounts Payable / Invoice Validation

Before processing a supplier invoice, validate their VAT number. Catch fraudulent VAT numbers before payments are made.

#### 2. CRM Enrichment

Enrich your B2B customer database with validated VAT status and official company name/address. Identify invalid entries before they cause tax issues.

#### 3. E-commerce B2B Checkout

Validate VAT numbers provided by business customers at checkout to apply correct VAT treatment (reverse charge).

#### 4. KYC / Onboarding

Include VAT validation as part of your business customer onboarding flow to verify company identity.

#### 5. Compliance Audit

Run quarterly audits on your full supplier/customer database to ensure all VAT numbers remain valid (companies can be deregistered).

***

### Input Parameters

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `vatNumbers` | array | required | List of VAT numbers including country prefix: `["ES12345678A", "FR12345678901", "DE123456789"]` |
| `maxResults` | integer | 500 | Maximum results to return |

#### Example: Validate 3 VAT numbers

```json
{
  "vatNumbers": [
    "ES12345678A",
    "FR83404833048",
    "DE811780526"
  ]
}
```

#### Example: Bulk validation from CSV column

```json
{
  "vatNumbers": ["IT12345678901", "NL123456789B01", "BE0123456789", "PL1234567890"]
}
```

***

### Output Format

| Field | Type | Description |
|-------|------|-------------|
| `vat_number` | string | Input VAT number as provided |
| `country` | string | 2-letter ISO country code |
| `is_valid` | boolean | True if VIES confirms the number is active |
| `name` | string | Registered company name (if country provides it) |
| `address` | string | Registered address (if country provides it) |
| `city` | string | City extracted from address |
| `checked_at` | string | ISO timestamp of the VIES check |

#### Sample Output

```json
[
  {
    "vat_number": "ES12345678A",
    "country": "ES",
    "is_valid": true,
    "name": "TELEFONICA SA",
    "address": "GRAN VIA 28, 28013 MADRID",
    "city": "MADRID",
    "checked_at": "2026-07-23T10:15:32Z"
  },
  {
    "vat_number": "FR83404833048",
    "country": "FR",
    "is_valid": true,
    "name": "TOTAL ENERGIES SE",
    "address": "2 PL JEAN MILLIER, 92400 COURBEVOIE",
    "city": "COURBEVOIE",
    "checked_at": "2026-07-23T10:15:33Z"
  },
  {
    "vat_number": "XX99999999",
    "country": "XX",
    "is_valid": false,
    "name": null,
    "address": null,
    "city": null,
    "checked_at": "2026-07-23T10:15:34Z"
  }
]
```

***

### Country Coverage

| Country | Code | Name returned | Address returned |
|---------|------|--------------|-----------------|
| Austria | AT | ✅ | ✅ |
| Belgium | BE | ✅ | ✅ |
| Bulgaria | BG | ✅ | ✅ |
| Croatia | HR | ✅ | ✅ |
| Czech Republic | CZ | ✅ | ✅ |
| Denmark | DK | ✅ | ✅ |
| Estonia | EE | ✅ | ✅ |
| Finland | FI | ✅ | ✅ |
| France | FR | ✅ | ✅ |
| Germany | DE | ❌ | ❌ (privacy law) |
| Greece | EL | ✅ | ✅ |
| Hungary | HU | ✅ | ✅ |
| Ireland | IE | ✅ | ✅ |
| Italy | IT | ✅ | ✅ |
| Latvia | LV | ✅ | ✅ |
| Lithuania | LT | ✅ | ✅ |
| Luxembourg | LU | ✅ | ✅ |
| Malta | MT | ✅ | ✅ |
| Netherlands | NL | ❌ | ❌ (privacy law) |
| Poland | PL | ✅ | ✅ |
| Portugal | PT | ✅ | ✅ |
| Romania | RO | ✅ | ✅ |
| Slovakia | SK | ✅ | ✅ |
| Slovenia | SI | ✅ | ✅ |
| Spain | ES | ✅ | ✅ |
| Sweden | SE | ✅ | ✅ |

***

### Pricing

**$0.01 per validated number** (+ $0.00005 base start cost).

100 VAT numbers = **$1.00**. 1,000 numbers = **$10.00**.

***

### Integration Examples

#### n8n: Validate new B2B customers on signup

```
Webhook (new customer)
→ EU VAT Validator (vatNumbers: [customer.vatNumber])
→ IF is_valid = false → Reject / Flag for review
→ IF is_valid = true → Continue onboarding
```

#### Python

```python
from apify_client import ApifyClient
client = ApifyClient("YOUR_TOKEN")
run = client.actor("agoradelmediterraneo/eu-vat-validator").call(
    run_input={"vatNumbers": ["ES12345678A", "FR83404833048"]}
)
results = list(client.dataset(run["defaultDatasetId"]).iterate_items())
```

***

### FAQ

**Why does Germany/Netherlands not return company name?**
These countries restrict name/address lookup via VIES for privacy reasons. The valid/invalid flag is still returned.

**Is VIES always available?**
VIES has occasional downtime per country. The actor retries automatically and marks unavailable checks clearly.

**How current is the data?**
Real-time — each check goes directly to the EU Commission VIES system at the moment of the run.

**Can I validate non-EU VAT numbers (UK, Norway)?**
Not with this actor. UK VAT requires HMRC API (separate actor). Norway is not EU.

# Actor input Schema

## `vatList` (type: `array`):

List of EU VAT numbers with country prefix (e.g. 'BE0403170701', 'PL5270103391', 'SE556026688301', 'IT00159560366'). Max 500 per run.

## `vatText` (type: `string`):

Paste VAT numbers separated by newlines or commas. Include 2-letter country prefix.

## `includeInvalid` (type: `boolean`):

If true, invalid VAT numbers appear in output with is\_valid: false.

## Actor input object example

```json
{
  "includeInvalid": true
}
```

# 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 = {};

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

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

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

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

```

## CLI example

```bash
echo '{}' |
apify call agoradelmediterraneo/eu-vat-validator --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=agoradelmediterraneo/eu-vat-validator",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

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