# EU VAT Number Validator (VIES): Bulk Check, Proof & Alerts (`euroscrape/vat-validator`) Actor

Validate EU VAT numbers in bulk against VIES, the European Commission's official registry: company name and address, official consultation proof for tax audits, syntax pre-checks, and monthly monitoring that alerts you when a customer's VAT number becomes invalid.

- **URL**: https://apify.com/euroscrape/vat-validator.md
- **Developed by:** [EuroScrape](https://apify.com/euroscrape) (community)
- **Categories:** Business, Automation, Integrations
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.40 / 1,000 vat number checkeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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 Number Validator (VIES): Bulk Check, Proof & Alerts

**Validate any number of EU VAT numbers against VIES, the European Commission's official registry — with the legal proof tax auditors ask for.** Paste your customer list, get back valid/invalid, the registered company name and address, and an official consultation number for every check.

- ✅ **Official source**: every answer comes from VIES, the EU's own VAT Information Exchange System. No third-party database, no stale copies.
- 🧾 **Audit-proof**: add your own VAT number and each check is registered by the Commission and returns a **consultation number** — your dated evidence that you verified the customer (required to safely zero-rate intra-EU B2B invoices).
- 🔁 **Monitoring**: schedule it monthly with a monitor name and get a Telegram, Slack, Discord or webhook alert the day a customer's VAT number **becomes invalid** — before you issue the next invoice without VAT.
- 🆓 **Fair billing**: syntax errors are caught locally for free, and when a member state's registry is down (it happens), you are not charged — the number is flagged `memberStateUnavailable` so you can re-run later.

### ✨ Why this Actor

| | |
|---|---|
| 🌍 **28 registries** | All 27 EU formats plus XI (Northern Ireland). Greece accepted as GR or EL. Clear message for GB numbers (the UK left VIES). |
| 🧹 **Forgiving input** | `FR 40-303.265 045`, lowercase, dots, dashes: everything is normalized before checking. Duplicates are checked once. |
| 🏢 **Company identity** | The registered name and address, straight from the national registry (a few countries, like Germany, keep them private). |
| 🔂 **Built for VIES's moods** | VIES throttles and member states go offline: automatic retries with backoff, and honest `null` + free re-run instead of a false "invalid". |
| 📊 **Free summary** | Valid / invalid counts, syntax errors, per-country breakdown, and the exact list of invalid numbers. |

### 🎯 Use cases

- **Finance & invoicing**: validate every customer's VAT ID before zero-rating an intra-EU invoice, and keep the consultation number as proof.
- **Accountants**: check a whole client portfolio in one run, monthly, with alerts on deregistrations.
- **E-commerce & SaaS**: validate VAT IDs at scale behind your checkout or CRM (call the Actor through the Apify API).
- **Data teams**: enrich a company list with registered names and addresses from official registries.

### 🚀 Examples

**Validate a customer list with official proof:**

```json
{
  "vatNumbers": ["FR40303265045", "IE 6388047V", "PL 526-025-09-95", "IT00743110157"],
  "requesterVatNumber": "FR40303265045"
}
```

**Monthly monitoring of your customer base, alert on deregistrations:**

```json
{
  "vatNumbers": ["FR40303265045", "IE6388047V", "DE811569869"],
  "monitorName": "customers-vat",
  "slackWebhookUrl": "https://hooks.slack.com/services/…"
}
```

### 📦 Output

Real results:

```json
{
  "type": "vat",
  "input": "IE 6388047V",
  "countryCode": "IE",
  "vatNumber": "6388047V",
  "vatNumberFormatted": "IE6388047V",
  "syntaxValid": true,
  "valid": true,
  "companyName": "GOOGLE IRELAND LIMITED",
  "companyAddress": "3RD FLOOR, GORDON HOUSE, BARROW STREET, DUBLIN 4",
  "consultationNumber": "WAPIAAAAaD5Jk8-i",
  "memberStateUnavailable": false,
  "checkedAt": "2026-10-01T20:27:12.735Z"
}
```

An invalid number comes back with `valid: false`; a malformed one is explained (`"wrong format for DE"`, `"missing country prefix…"`); a GB number gets a clear message instead of a wrong answer. The free summary lists totals, the per-country breakdown and every invalid number.

### 💰 Pricing

| Event | Price |
|---|---|
| Run start | $0.003 |
| VAT number answered by VIES | $0.002 |
| Syntax errors, member-state outages, summary | free |

1,000 customer checks ≈ $2 — with official consultation proof included. Apify subscribers pay less: −10% (Starter), −20% (Scale), −30% (Business). Set a **maximum cost per run** in the run options and the Actor stops cleanly when it's reached.

### ❓ FAQ

**Why do I need the consultation number?** When a tax authority questions a zero-rated intra-EU invoice, the consultation number proves you checked the customer's VAT number in VIES on that date. Without it, you may be held liable for the VAT. You get one for each check as soon as you fill in `requesterVatNumber`.

**Why is the company name sometimes "null" for a valid number?** A few member states (notably Germany) confirm validity but do not publish the name and address through VIES.

**What does `memberStateUnavailable` mean?** VIES queries each country's national registry live; registries go down for minutes or hours. The Actor retries 4 times with pauses, then reports the number as unanswered — free of charge — so you can re-run it later. It never guesses.

**Can it check UK VAT numbers?** Great Britain left VIES (Brexit); GB numbers get an explicit message. Northern Ireland numbers (XI prefix) are still in VIES and fully supported.

**Can I call it from my own system?** Yes — the Apify API runs the Actor and returns the dataset as JSON or CSV; works with Make, Zapier, n8n or plain HTTP.

### ⭐ Your feedback

If this Actor saves you time, a short review on Apify Store helps other users find it. Missing a field or an integration? Say it in your review: the most requested features are added first.

### 🔗 More from EuroScrape

- [France Real Estate Sold Prices (DVF): €/m², Sales & Trends](https://apify.com/euroscrape/france-property-prices): every property sale registered by the French State — real prices, €/m², addresses, GPS, market trends per city and alerts on new sales.
- [Impressum & Legal Notice Scraper (EU)](https://apify.com/euroscrape/company-identity): legal identity, registry numbers and VAT IDs from any website, registry-verified.
- [French Companies Scraper (SIRENE)](https://apify.com/euroscrape/france-companies): every French company by activity, area and size, with verified websites and emails.
- [UK Companies House Scraper](https://apify.com/euroscrape/uk-companies): UK companies by SIC code and location, with directors, websites and emails.
- [EU Public Tenders Scraper: TED, BOAMP & Awards](https://apify.com/euroscrape/eu-public-tenders): open tenders and contract awards from all of Europe (TED) and France (BOAMP, DECP), with winners per lot, values in € and daily alerts.
- [Website Tech Stack Detector: 280+ Technologies, Leads & Signals](https://apify.com/euroscrape/website-intelligence): technologies, company identity, contacts and sales signals for any website.
- [Google Flights Scraper: Cheapest Dates, Prices & Price History](https://apify.com/euroscrape/google-flights-prices): flight prices for any route and dates, cheapest day to fly, typical price range and price-drop alerts.
- [Google Hotels Scraper: Prices from Every Booking Site](https://apify.com/euroscrape/google-hotels-prices): hotel prices for any destination and dates, with the price on every booking site, rate parity, price calendars and alerts.
- [App Store Reviews Scraper + Google Play Reviews](https://apify.com/euroscrape/app-reviews): reviews from both stores in 58 countries, rating by version and country, alerts on new negative reviews.
- [Vinted Scraper: 26 Countries, Deals, Alerts & Seller Data](https://apify.com/euroscrape/vinted-scraper): search Vinted across 26 countries, prices with buyer fees, seller ratings and instant alerts on new listings.
- [EU Second-Hand Marketplaces Scraper: Vinted, OLX & More](https://apify.com/euroscrape/eu-marketplace-deals): one search on the top second-hand marketplaces of 18 European countries, prices in €, cheapest country and resale margin.
- [Kleinanzeigen Scraper: Deal Finder & Price-Drop Alerts](https://apify.com/euroscrape/kleinanzeigen-scraper): German classifieds with view counts, full seller details and instant alerts.

# Actor input Schema

## `vatNumbers` (type: `array`):

One per line, with the country prefix: FR40303265045, IE 6388047V, PL 526-025-09-95… Spaces, dots and dashes are fine. Greece can be written GR or EL; Northern Ireland is XI.

## `requesterVatNumber` (type: `string`):

When set, every check is registered by the European Commission and returns a consultation number — your legal proof towards tax authorities that you verified the customer on that date.

## `includeSummary` (type: `boolean`):

Totals, breakdown by country, list of invalid numbers.

## `monitorName` (type: `string`):

Set a name and schedule the Actor (e.g. monthly): each run then flags numbers that became invalid or valid again since the last run, and can alert you.

## `telegramBotToken` (type: `string`):

Alerts on Telegram: create a bot with @BotFather and paste its token.

## `telegramChatId` (type: `string`):

Your chat ID (send a message to your bot, then open api.telegram.org/bot<token>/getUpdates).

## `discordWebhookUrl` (type: `string`):

Alerts in a Discord channel: Channel settings → Integrations → Webhooks.

## `slackWebhookUrl` (type: `string`):

Alerts in Slack: create an Incoming Webhook for your channel.

## `webhookUrl` (type: `string`):

Receives one POST per run with every number that became invalid (Make, Zapier, n8n…).

## `maxNotifications` (type: `integer`):

Maximum number of alert messages per run.

## Actor input object example

```json
{
  "vatNumbers": [
    "FR40303265045",
    "IE6388047V",
    "PL5260250995"
  ],
  "includeSummary": true,
  "maxNotifications": 30
}
```

# Actor output Schema

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

One row per VAT number.

## `runSummary` (type: `string`):

Counters for this run (items found, output, errors).

# 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 = {
    "vatNumbers": [
        "FR40303265045",
        "IE6388047V",
        "PL5260250995"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("euroscrape/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 = { "vatNumbers": [
        "FR40303265045",
        "IE6388047V",
        "PL5260250995",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("euroscrape/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 '{
  "vatNumbers": [
    "FR40303265045",
    "IE6388047V",
    "PL5260250995"
  ]
}' |
apify call euroscrape/vat-validator --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,euroscrape/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/SJVSN0Pf1pSf40GbF/builds/qNVLmJytGfbqvfetf/openapi.json
