EU VAT Number Validator API (VIES): Name, Address, Proof
Pricing
from $1.70 / 1,000 verified vat numbers
EU VAT Number Validator API (VIES): Name, Address, Proof
Bulk-check EU VAT numbers on official VIES: validity, company name, address, request date and consultation number as proof. CSV or Google Sheets input, auto-retry on VIES errors. No API key, no login. MCP-ready for AI agents. Invalid numbers and errors are free. $2 per 1,000 valid numbers.
Pricing
from $1.70 / 1,000 verified vat numbers
Rating
0.0
(0)
Developer
ABM
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Security
Limited permissionsShare
EU VAT Number Validator API (VIES) — Bulk Check with Company Name, Address and Proof
$2 per 1,000 verified VAT numbers ($0.002 each). Invalid numbers, format errors and VIES outages are free.
Validate EU VAT numbers in bulk against the official VIES service of the European Commission. For each number you get: validity, registered company name and address, the VIES request timestamp (proof of check) and, if you give your own VAT number, the official VIES consultation number you can keep as legal evidence for zero-rated intra-EU invoices.
- Paste a list or point to a CSV file / Google Sheet — the VAT column is detected automatically.
- Automatic retries on VIES temporary errors (
MS_MAX_CONCURRENT_REQ,MS_UNAVAILABLE,TIMEOUT...), with per-country throttling. - Cleans input: spaces, dots, dashes, lowercase,
GR→EL, duplicates removed. - All 27 EU member states + Northern Ireland (
XI). - No API key, no login, no monthly rental. MCP-ready for Claude, Cursor, ChatGPT and AI agents.
onlyNewandstatusChangedfor scheduled re-verification of your customer or supplier base.- An audit CSV report is saved in the key-value store (
vat-report.csv).
How much does it cost?
Pay per event: numero-verifie = $0.002, charged only when VIES confirms the number is valid.
| You check | Valid numbers | You pay |
|---|---|---|
| 100 numbers | 90 valid, 10 invalid | $0.18 |
| 1,000 numbers | 1,000 valid | $2.00 |
| 10,000 numbers | 8,500 valid, 1,500 invalid/unavailable | $17.00 |
Invalid numbers, bad formats and numbers VIES could not check (national service down) cost nothing. Set "Max cost per run" in Apify to cap your spend: the actor stops cleanly when the limit is reached.
Input
{"vatNumbers": ["FR40303265045", "DE811128135", "IE 6388047 V", "gr094014201"],"csvUrl": "https://docs.google.com/spreadsheets/d/<your-sheet-id>/edit#gid=0","requesterVatNumber": "FR12345678901","onlyNew": false,"includeInvalid": true,"maxConcurrency": 5,"maxRetries": 6}
| Field | Description |
|---|---|
vatNumbers | List of VAT numbers with country prefix. |
csvUrl | Public CSV/TXT link or Google Sheet ("anyone with the link"). Combined with the list. |
csvColumn | Column header to use if auto-detection is wrong. |
requesterVatNumber | Your own EU VAT number → VIES returns a consultation number per check. |
onlyNew | Skip numbers already confirmed valid in previous runs. |
includeInvalid | Output invalid / badly formatted numbers too (free). Default true. |
maxConcurrency | Parallel checks (max 2 per country). Default 5. |
maxRetries | Retries on VIES temporary errors. Default 6 (0 = no retry). At most 75 s of retrying per number; national services VIES reports as down get at most 2 retries; numbers left when the run is about to time out are returned as unavailable (free). |
Output
One object per VAT number in the dataset:
{"input": "IE 6388047 V","vatNumber": "IE6388047V","countryCode": "IE","vatNumberLocal": "6388047V","isValid": true,"status": "valid","companyName": "GOOGLE IRELAND LIMITED","companyAddress": "3RD FLOOR, GORDON HOUSE, BARROW STREET, DUBLIN 4","companyAddressLines": ["3RD FLOOR, GORDON HOUSE, BARROW STREET, DUBLIN 4"],"nameAvailable": true,"requestDate": "2026-10-20T04:20:33.853Z","checkedAt": "2026-10-20T04:20:34Z","consultationNumber": "WAPIAAAAZ3xxxxxx","requesterVatNumber": "FR12345678901","viesErrorCode": null,"message": "VAT number is valid and active in VIES.","proofText": "On 2026-10-20T04:20:33.853Z, the EU VIES service confirmed that VAT number IE6388047V is valid, registered to GOOGLE IRELAND LIMITED, 3RD FLOOR, GORDON HOUSE, BARROW STREET, DUBLIN 4. Consultation number: WAPIAAAAZ3xxxxxx.","attempts": 1,"previousStatus": "valid","statusChanged": false,"source": "VIES REST API (European Commission)"}
status values: valid (charged), invalid, invalid_input (wrong format), unavailable (VIES/national service down after
all retries — run again later), error. Only valid is charged.
Use cases
1. Finance team: monthly check of the customer base before zero-rated invoicing
An accounts-receivable manager exports 2,400 B2B EU customers from the ERP into a Google Sheet. The actor runs on the 1st of every month with their own VAT number to get consultation numbers.
Input:
{"csvUrl": "https://docs.google.com/spreadsheets/d/1AbC.../edit#gid=0", "requesterVatNumber": "FR12345678901"}
Output extract:
[{"vatNumber": "NL004495445B01", "status": "valid", "companyName": "OPENJONGERENVERENIGING DE KOORNBEURS", "consultationNumber": "WAPIAAAAZ3..."},{"vatNumber": "BE0123456789", "status": "invalid", "previousStatus": "valid", "statusChanged": true}]
Next: rows with statusChanged: true go to a "VAT revoked" tab; the billing team switches those customers to domestic VAT.
Cost: ~2,300 valid × $0.002 = $4.60 per month, with consultation numbers archived for tax audits.
2. E-commerce / SaaS: verify B2B sign-ups every morning
A growth ops engineer stores new business sign-ups in a CSV. A schedule at 7:00 runs with onlyNew: true, so only the ~40
new numbers of the day are checked.
Input:
{"csvUrl": "https://example.com/exports/new-b2b-signups.csv", "csvColumn": "vat_id", "onlyNew": true}
Output extract:
[{"input": "de 811 128 135", "vatNumber": "DE811128135", "status": "valid", "nameAvailable": false},{"input": "IT0074311015", "status": "invalid_input", "message": "VIES rejected the number format (wrong length or characters for this country)."}]
Next: valid accounts get reverse-charge invoices automatically; invalid_input rows trigger an email asking the customer to fix
their VAT number. Cost: ~$0.08 per day.
3. Procurement / KYB: supplier onboarding with name matching
A procurement analyst checks 300 new suppliers before the first payment and compares companyName with the name on the
supplier's invoice.
Input:
{"vatNumbers": ["PL7740001454", "EL094014201", "LU26375245", "IT00743110157"]}
Output extract:
[{"vatNumber": "PL7740001454", "companyName": "ORLEN SPÓŁKA AKCYJNA", "companyAddress": "CHEMIKÓW 7, 09-411 PŁOCK"},{"vatNumber": "EL094014201", "companyName": "ΤΡΑΠΕΖΑ ΕΘΝΙΚΗ ΤΗΣ ΕΛΛΑΔΟΣ ΑΝΩΝΥΜΗ ΕΤΑΙΡΕΙΑ"}]
Next: an LLM compares companyName with the invoice name (any alphabet), mismatches go to manual review. Cost: 300 × $0.002 = $0.60.
Call it from the API
Python:
from apify_client import ApifyClientclient = ApifyClient("<APIFY_TOKEN>")run = client.actor("<username>/eu-vat-vies-validator").call(run_input={"vatNumbers": ["FR40303265045", "DE811128135"]})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["vatNumber"], item["status"], item["companyName"])
JavaScript:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<APIFY_TOKEN>' });const run = await client.actor('<username>/eu-vat-vies-validator').call({vatNumbers: ['FR40303265045', 'DE811128135'],});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items.map((i) => `${i.vatNumber} ${i.status} ${i.companyName ?? ''}`));
Synchronous HTTP (one call, results in the response):
POST https://api.apify.com/v2/acts/<username>~eu-vat-vies-validator/run-sync-get-dataset-items?token=<APIFY_TOKEN>{"vatNumbers": ["IE6388047V"]}
Integrations (Make, Zapier, n8n, Google Sheets)
- n8n: Schedule Trigger (monthly) → Apify: Run actor (
csvUrl= your Google Sheet export) → Apify: Get dataset items → IFstatusChanged = true→ Google Sheets "Append row" + Slack message to the finance channel. - Make: Watch new rows in Google Sheets → Apify "Run an actor" with
{"vatNumbers": ["{{VAT}}"]}→ writestatus,companyNameandconsultationNumberback into the row. - Zapier: New customer in your CRM → Apify "Run actor" → update the CRM field "VAT verified".
- Google Sheets: export the dataset as CSV/XLSX, or use the
vat-report.csvaudit file from the key-value store.
Use with AI agents (MCP)
The actor works as a tool in the Apify MCP server (https://mcp.apify.com) for Claude, Cursor, ChatGPT and other agents.
Ask "Check whether these EU VAT numbers are valid and give me the company names: …" — the agent calls the actor and gets
structured JSON plus a ready-to-quote proofText sentence for each number.
FAQ
Is this the official VIES data? Yes. Every number is checked live against the European Commission VIES REST API. Nothing is cached or guessed.
Why is the company name empty for some countries? Some member states (e.g. Germany, Spain) don't disclose name and address
through VIES. The validity check still works; nameAvailable is false.
What is a consultation number? An identifier VIES issues when you give your own VAT number as requester. Tax authorities accept it as proof that you checked your customer's VAT number on a given date.
What happens when VIES is down? The actor retries with exponential backoff (per-country throttling). If a national service stays
down, the number is returned with status: "unavailable" and is not charged — run it again later.
Can I validate UK (GB) numbers? No: VIES covers EU member states and Northern Ireland (XI) only.
Does "invalid" mean the company doesn't exist? It means the number is not active for intra-EU transactions in VIES (not registered, deregistered, or not activated for cross-border trade).
Limits
- VIES limits concurrent requests per member state; large countries (FR, DE, IT) can be busy during office hours, which slows big batches. Expect roughly 1,000–3,000 numbers per 10 minutes depending on VIES load.
- Name/address availability depends on the member state.
- Consultation numbers require a valid EU VAT number of your own.
- CSV files are limited to 20 MB per run;
onlyNewmemory holds ~150,000 numbers.