VIES VAT Checker — Bulk VAT Number Validation avatar

VIES VAT Checker — Bulk VAT Number Validation

Pricing

Pay per event

Go to Apify Store
VIES VAT Checker — Bulk VAT Number Validation

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

DevilScrapes

Maintained by Community

Actor 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/5xx instead 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 checkServiceStatus to 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

  1. Click Try for free at the top of the page.
  2. Fill in the input form — most fields have sensible defaults.
  3. Click Start. Output streams into the run's dataset.
  4. Export from Storage → Dataset as JSON, CSV, or Excel — or fetch via the API.

📥 Input

FieldTypeRequiredDefaultNotes
vatNumbersarrayyes['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…
checkServiceStatusbooleannoFalseIf enabled, calls the VIES check-status endpoint once at the start of the run and surfaces any member-state outage…
maxConcurrencyintegerno3Cap on concurrent requests to VIES. Kept low by design — VIES is a shared public EC service that rejects excessive…
proxyConfigurationobjectno{}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.

FieldTypeNotes
countryCodestringParsed from input / echoed from VIES.
vatNumberstringNormalised input (country prefix stripped, whitespace removed).
isValidbooleanVIES response 'valid'/'isValid' field. Only null for skipped rows.
namestringVIES response 'name'; the literal '---' (DE/ES policy) is normalised to null.
addressstringVIES response 'address'; same '---' normalisation as name.
requestDatestringVIES response 'requestDate', ISO-8601 passthrough.
skippedbooleanTrue when the input entry could not be parsed or the request could not complete after retries.
skipReasonstringHuman-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:

EventUSDWhat it is
actor-start$0.2One-off warm-up charge per run
vat-number-checked$0.001PPE 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 null for 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.