EU VAT Validator – VIES Check with Consultation Number avatar

EU VAT Validator – VIES Check with Consultation Number

Pricing

from $2.50 / 1,000 vat checks

Go to Apify Store
EU VAT Validator – VIES Check with Consultation Number

EU VAT Validator – VIES Check with Consultation Number

Check EU VAT numbers against the EU's own VIES service. A busy member state is reported as unavailable, never as invalid. Official consultation number, optional trade name, name match.

Pricing

from $2.50 / 1,000 vat checks

Rating

0.0

(0)

Developer

Rowfeed

Rowfeed

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Categories

Share

Validate EU VAT numbers straight against the European Commission's own VIES service - no key, no signup. Built for finance and ops teams, invoicing/e-commerce checkout flows, accounting integrations, and AI agents that need a clean, typed answer instead of a scraped confirmation page. Every check can carry your own EU VAT number to get a real consultation number, the evidence an auditor asks for.

Unavailable is never reported as invalid. When a member state's own VIES system is too busy to answer, this Actor retries and tells you so - it never turns "we don't know yet" into "invalid", which is the mistake that makes a buyer wrongly refuse zero-rating to a legitimate business.

What you get

  • A real answer, not a guess. status is one of valid, invalid, service_unavailable or invalid_input - service_unavailable and is_valid: null when a member state's system is busy, retried up to 3 times first. Never reported as invalid.
  • Consultation number as audit proof. Supply your own EU VAT number (requesterVatNumber) and VIES hands back a consultation_number - the same evidence an auditor asks for when you claim zero-rating on an intra-EU sale.
  • Trader name and address, straight from VIES - or none at all. includeTraderDetails (on by default) adds trader_name/trader_address exactly as VIES publishes them. Turn it off and you get only the match result: nothing but status, is_valid and the name-match fields below.

Verify a name without ever seeing it

Give an expectedNames entry (the name on your invoice) alongside a VAT number and this Actor tells you how well it matches VIES's own record - exact, strong, weak or none, with a 0.0-1.0 name_match_score - after normalising both names (case, punctuation, legal forms like B.V., BV, LTD, LIMITED, GMBH, AB, AS, SA, SRL, OY stripped so "Coolblue BV" matches "Coolblue B.V."). This works whether or not includeTraderDetails is on, so you can wire up a name check without ever pulling the raw trader name into your own systems if you don't need it.

Example output row

One real row from a default run (NL810433941B01, 2026-09-23, requesterVatNumber left blank so consultation_number is null here - see below for a row with one):

{
"input_vat": "NL810433941B01",
"country_code": "NL",
"vat_number": "810433941B01",
"status": "valid",
"is_valid": true,
"service_error": "VALID",
"request_date": "2026-09-23T12:30:59.208Z",
"consultation_number": null,
"name_match": null,
"name_match_score": null,
"details_available": true,
"checked_at": "2026-09-23T12:30:56+00:00",
"trader_name": "COOLBLUE B.V.",
"trader_address": "\nWEENA 00664\n3012CN ROTTERDAM\n"
}

With requesterVatNumber: "IE6388047V" set, the same number instead returns a real consultation_number: "WAPIAAAAaDOP_yao". With includeTraderDetails: false, the trader_name/trader_address keys are absent from the row entirely - not null, not present.

Some member states (Germany here) don't publish a name/address at all - VIES sends back the placeholder "---" for both, which this Actor turns into trader_name: null, trader_address: null and details_available: false, never the literal string "---".

You can download the dataset in various formats such as JSON, CSV or Excel from the Apify Console, or pull it through the API/integrations.

Input

  • VAT numbers (vatNumbers) - with the 2-letter country code; accepts "NL810433941B01", "NL 8104 33941 B01" or "nl810433941b01". Default: NL810433941B01, IE6388047V, DE811907980.
  • Expected names (expectedNames) - optional, matched positionally to vatNumbers; leave an entry blank to skip the name check for that number.
  • Your EU VAT number (requesterVatNumber) - optional; set it to get a real consultation_number back on every row.
  • Include trader name and address (includeTraderDetails) - on by default. Turn off for a match-only result with no trader name or address anywhere in the row.
  • Max VAT numbers (maxNumbers) - cap on rows checked, 1-1000. Default 100.

A syntactically impossible VAT number (unrecognised country code, empty) never touches the network - it comes back as status: "invalid_input" with an errorMessage, and the run still exits successfully.

The default input runs with zero edits and returns three real, valid VAT numbers.

Pricing

Pay-per-event:

  • Actor start - $0.001, once per run.
  • VAT check - $0.0025 per VAT number checked (status, optional trader details, optional name match, optional consultation number - all in one event).

$2.50 per 1,000 VAT numbers checked. invalid_input rows (malformed input, no network call made) are not charged.

Reliability

Requests stay under ~2/second. When VIES itself reports a member state's system as busy (MS_MAX_CONCURRENT_REQ, MS_UNAVAILABLE, TIMEOUT, SERVICE_UNAVAILABLE) the check is retried up to 3 times with exponential backoff before the row is reported service_unavailable. Separately, network errors, HTTP 429 and 5xx responses retry with their own exponential backoff (429 honours Retry-After); 401/403 and other unexpected responses are reported once, not retried. Every failure is counted by category in the run's STATS key-value record.

Trader name and address are never logged and never written anywhere outside the dataset row you own - not even when includeTraderDetails is off, since in that case they are simply left out of the row.

Not affiliated with the European Commission or VIES.