sfoln/vat-number-validator · Automation, Developer tools, AI
Validate EU VAT numbers live against the European Commission's VIES service: valid or invalid, the registered company name and address where the member state shares them, and an official consultation number when you add your own VAT number. $2 per 1,000 checks; outages are free.
EU VAT Number Validator (VIES) checks EU VAT numbers live against the European Commission's VIES service and returns one record per number: valid or invalid, the registered company name and address where the member state shares them, and an official consultation number when you add your own VAT number. Every number is first checked against its country's format, so typos are caught without a request. Built for invoicing and checkout flows, supplier and customer onboarding, CRM clean-up and AI agents. $0.002 per checked number; member-state outages are reported as errors and never charged.
Price
Price per delivered record
Event
Price
Per 1,000
Charged for
VAT number check vat-check
$0.002
$2 / 1,000
One VAT number checked against VIES with a definitive answer (valid or invalid).
Apify free plan: up to 10 items per run. Paid plans have no per-run cap; set maxTotalChargeUsd to cap spend.
POST https://api.apify.com/v2/actors/sfoln~vat-number-validator/runs?maxTotalChargeUsd=1
GET https://api.apify.com/v2/actor-runs/{runId} # until status is SUCCEEDED
GET https://api.apify.com/v2/datasets/{defaultDatasetId}/items?format=json
Authenticate with an Apify API token. MCP clients can instead sign in with OAuth when prompted. Example prompt for an agent: Check whether the EU VAT numbers NL004495445B01 and FR27552032534 are valid and return the registered company names.
Input
Input fields
EU VAT numbers to validate against VIES. Each number produces one dataset record.
Field
Type
Default
Meaning
vatNumbers
array
—
VAT numbers EU VAT numbers with their country prefix, one per line (e.g. NL004495445B01, FR27552032534, DE123456789); spaces, dots and dashes are ignored. Accounts on the Apify free plan can process up to 10 VAT numbers per run.
requesterVatNumber
string
—
Your VAT number (for consultation numbers) Optional: your own EU VAT number. VIES then returns a consultation number for each check, which tax authorities accept as proof that you verified the number.
defaultCountry
string
—
Default country prefix Optional: the prefix (e.g. DE) for numbers given without one. Greece is EL, Northern Ireland XI.
maxItems
integer
10000
Max VAT numbers Safety cap on VAT numbers per run; further numbers are ignored and counted in the OUTPUT record. Range 1–100000.
concurrency
integer
2
Concurrency Checks in parallel. VIES limits concurrent requests per member state; busy answers are retried. Range 1–4.
includeRaw
boolean
false
Include raw VIES response Attach the unmodified VIES answer under raw.
Example input
{
"vatNumbers": [
"NL004495445B01"
]
}
Output
One record per input item
Records land in the run's dataset; a synchronous call returns them directly. Each has a status (ok is charged; everything else is free) and a charged flag. The run's OUTPUT record totals items and charges.
Field
Type
Meaning
input
string | object
Input The VAT number as given.
status
string
Status ok | error | skipped_invalid | skipped_budget | skipped_free_plan | skipped_unmetered e.g. "ok"
charged
boolean
Charged Whether this record incurred a pay-per-event charge.
chargedEvent
string
Charged event Pay-per-event event charged for this record (present only when charged).
chargedCount
integer
Events charged Events actually charged when the charge came back short of the requested count (present only then; a warning explains it).
source
string
Source Upstream data source.
fetchedAt
string
Fetched at ISO timestamp.
error
object
Error { code, message, provider?, status? } when status is not ok. Codes set by the runtime: budget_exhausted, free_plan_limit, unmetered, aborted, charge_failed, record_too_large, invalid_record, dataset_push_failed; this Actor: invalid_format, vies_ms_unavailable, vies_timeout, vies_service_unavailable, vies_ms_max_concurrent_req, vies_global_max_concurrent_req, vies_invalid_input, vies_vat_blocked, vies_ip_blocked; upstream: rate_limit, timeout, network, server, client, invalid_response.
warnings
array
Warnings Notes about this record, e.g. a requester VAT number VIES rejected.
vatNumber
string
VAT number Normalised VAT number: prefix + number, no separators (Greece EL).
countryCode
string | null
Country prefix VIES member-state prefix.
countryName
string | null
Country Member state name.
number
string
National number The number without its prefix.
formatValid
boolean
Format valid The number has the member state's VAT format.
valid
boolean | null
Valid VIES answer: true (registered for intra-EU trade), false (not valid), null (no answer: see error).
name
string | null
Registered name Trader name from VIES (null when the member state does not share it).
address
string | null
Registered address Trader address from VIES, lines joined with commas (null when not shared).
requestDate
string | null
Request date When VIES answered (ISO).
consultationNumber
string | null
Consultation number VIES consultation number (requestIdentifier), issued when requesterVatNumber is set.
requesterVatNumber
string | null
Requester VAT number Your VAT number as sent to VIES.
raw
object
Raw VIES answer Unmodified VIES response (only with includeRaw).
What happens when a member state's VIES service is down?
VIES answers MS_UNAVAILABLE (often during night-time maintenance). The Actor retries, then returns the number with status error and code vies_ms_unavailable. It is never reported as invalid and never charged; run it again later.
Why are name and address empty for some valid numbers?
Some member states (Germany, for example) do not share trader details through VIES; the number is still confirmed valid.
What is a consultation number?
When you set your own VAT number as the requester, VIES issues a consultation number (requestIdentifier) per check that proves when you verified your customer's number.