EU VAT Validator – VIES Check with Consultation Number
Pricing
from $2.50 / 1,000 vat checks
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
Maintained by CommunityActor 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.
statusis one ofvalid,invalid,service_unavailableorinvalid_input-service_unavailableandis_valid: nullwhen a member state's system is busy, retried up to 3 times first. Never reported asinvalid. - Consultation number as audit proof. Supply your own EU VAT number (
requesterVatNumber) and VIES hands back aconsultation_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) addstrader_name/trader_addressexactly as VIES publishes them. Turn it off and you get only the match result: nothing butstatus,is_validand 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 tovatNumbers; leave an entry blank to skip the name check for that number. - Your EU VAT number (
requesterVatNumber) - optional; set it to get a realconsultation_numberback 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.