VIES VAT Checker — Bulk VAT Number Validation
Pricing
Pay per event
VIES VAT Checker — Bulk VAT Number Validation
Bulk VAT number validation against the official, keyless VIES REST API. This EU VAT validator accepts numbers in any common format and returns one row each: validity, registered name and address where disclosed, and a clear skip reason. A VIES VAT checker built for whole lists.
Pricing
Pay per event
Rating
0.0
(0)
Developer
DevilScrapes
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
17 hours ago
Last modified
Categories
Share
🎯 What this scrapes
A customer hands us a list of VAT numbers — glued, spaced, or structured pairs, mixed together — and we return one row per number: validity, the registered company name and address where the member state discloses it, and a clear skip reason for anything we can't parse or that VIES can't complete. Think of it as a VIES VAT checker and EU VAT validator in one: built for a recurring compliance/onboarding batch job running VAT number validation against a customer list, not a one-off lookup — the product optimizes for cheap, high-volume, fault-isolated throughput. One bad entry in a 5,000-row batch never fails the run — it lands as its own explained row and everything else still ships.
🔥 What we handle for you
- 🧾 Any input shape, one clean pair — glued (
DE811907980), spaced (DE 811907980), or structured ({"country":"DE","number":"811907980"}) all normalize to the same(country, number)before we ever call VIES. - 🧱 Bounded, polite concurrency — VIES is a shared EC service that throttles hard under load, so we cap in-flight requests and back off automatically on
429/5xxinstead of hammering it. - ✅ Clean negatives are not errors — an invalid VAT number is a normal, useful answer. Every entry — valid, cleanly invalid, or unparseable — lands as its own row with a clear status, so one bad number never fails your whole batch.
- 🕵️ Optional service-status pre-flight — turn on
checkServiceStatusto see which member states are down before you burn a run against unavailable infrastructure. - 🧊 Typed, validated dataset rows — Pydantic-checked, one row per requested number, every time — the row count you get back always matches the row count you sent in.
- 💰 Pay-Per-Event pricing — priced for volume, not per-lookup margin. You always know what a batch costs before you run it.
💡 Use cases
- Customer onboarding — validate a new B2B customer's VAT number before invoicing them without VAT.
- Recurring compliance sweeps — re-validate an entire customer list on a schedule to catch deregistered numbers.
- Invoice/AR cleanup — batch-check VAT numbers on file before a VAT audit.
- CRM/ERP enrichment — attach the registered company name and address VIES discloses to existing records.
⚙️ How to use it
- Click Try for free at the top of the page.
- Fill in the input form — most fields have sensible defaults.
- Click Start. Output streams into the run's dataset.
- Export from Storage → Dataset as JSON, CSV, or Excel — or fetch via the API.
📥 Input
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
vatNumbers | array | yes | ['DE811907980', 'IE 6388047V', {'country': 'NL', 'number': '810462215B01'}] | VAT numbers to validate, one per list item. Each item is either a glued string ('DE811907980'), a spaced string ('DE… |
checkServiceStatus | boolean | no | False | If enabled, calls the VIES check-status endpoint once at the start of the run and surfaces any member-state outage… |
maxConcurrency | integer | no | 3 | Cap on concurrent requests to VIES. Kept low by design — VIES is a shared public EC service that rejects excessive… |
proxyConfiguration | object | no | {} | Apify Proxy configuration. Present per org standard — VIES is a public keyless API, so no proxy is used unless you… |
Example input
{"vatNumbers": ["DE811907980","IE 6388047V",{"country": "NL","number": "810462215B01"}],"checkServiceStatus": false,"maxConcurrency": 3,"proxyConfiguration": {"useApifyProxy": true}}
📤 Output
Every row is one dataset item.
| Field | Type | Notes |
|---|---|---|
countryCode | string | Parsed from input / echoed from VIES. |
vatNumber | string | Normalised input (country prefix stripped, whitespace removed). |
isValid | boolean | VIES response 'valid'/'isValid' field. Only null for skipped rows. |
name | string | VIES response 'name'; the literal '---' (DE/ES policy) is normalised to null. |
address | string | VIES response 'address'; same '---' normalisation as name. |
requestDate | string | VIES response 'requestDate', ISO-8601 passthrough. |
skipped | boolean | True when the input entry could not be parsed or the request could not complete after retries. |
skipReason | string | Human-readable reason, only set when skipped=true. |
Example output
{"countryCode": "IE","vatNumber": "6388047V","isValid": true,"name": "GOOGLE IRELAND LIMITED","address": null,"requestDate": "2026-09-06+02:00","skipped": false,"skipReason": null}
💰 Pricing
Pay-Per-Event — you pay only when these events fire:
| Event | USD | What it is |
|---|---|---|
actor-start | $0.2 | One-off warm-up charge per run |
vat-number-checked | $0.001 | PPE event |
Example: 1 000 VAT numbers checked at the rates above ≈ $1.20. No subscription, no minimum, no card to start — Apify gives every new account $5 of free credit.
🚧 Limitations
- VIES covers EU member states only — no UK post-Brexit, Norwegian, or Swiss tax-ID formats.
- Some member states (confirmed: DE, ES) never return a registered company name or address by policy — those fields come back
nullfor those countries even on a valid VAT number, not a scraping gap. - Concurrency is capped at 5 requests in flight by design — VIES is a shared public EC service and rejects excessive parallel load.
- No caching or dedup of previously-seen VAT numbers across runs — every run re-checks every number you send.
❓ FAQ
Why do some rows have a null name and address even though the VAT number is valid?
A handful of EU member states (Germany and Spain, confirmed) never disclose the registered company name or address through VIES, by that country's own policy — we normalize their internal '---' placeholder to null so it's clear this is a policy limit, not missing data.
Is an invalid VAT number a failed run?
No. A VAT number VIES reports as invalid is a normal, useful answer — the run still succeeds, and that row simply says isValid: false.
What happens if one VAT number in my batch is malformed?
It lands as its own row with skipped: true and a human-readable skipReason explaining why — the rest of your batch is processed normally.
Can I check if VIES itself is having an outage before I run a large batch?
Yes — enable checkServiceStatus and we call VIES's own status endpoint once at the start of the run and surface any member-state outage.
💬 Your feedback
Spotted a bug, hit a weird edge case, or need a new field? Open an issue on the Actor's Issues tab on Apify Console — we ship fixes weekly and we read every report.