How to use it: 3 steps
- Make a free Apify accountApify is the cloud platform where our tools run. The free plan gives you $5 of usage every month, no credit card needed. You pay Apify, not us.
- Paste your input and press StartNo code needed: you fill in a form (the input). It already has a working example. For example:
IE6388047Vin VAT numbers. Each start is one run. - Download the resultsWhen the run ends, the results are in a table (the dataset). Open Output, press Export and pick Excel or CSV. JSON and the API are there too.
This tool is an Apify Actor: a small program that runs on Apify. You can also run it on a schedule, for example every Monday. New to it? Read how it works, step by step and the 8 words you need first.
What it does
Check a list of EU VAT numbers against the European Commission's VIES service and get one row per number: valid or invalid, the registered company name and address when the country shares them, and an honest status when a country's database is down. No login, no API key.
Good for
- Check customer VAT numbers before you send an invoice without VAT (EU reverse charge).
- Clean a CRM or lead list: mark invalid numbers and fill in the registered company name.
- Re-check a supplier list and keep the VIES consultation number as proof of the check.
Not a good fit
- UK (GB) numbers are not checked. They left VIES in 2021, and the UK HMRC API needs registered API credentials. They get
status: "unsupported_country". Northern Ireland traders (XIprefix) are checked through VIES. - Non-EU numbers (Norway, Switzerland, US and others) get
unsupported_country. - You cannot search by company name. VIES only checks a number.
- Some countries (for example Germany and Spain) do not share the name and address. Then
nameandaddressarenulleven when the number is valid. - This is a one-time check of a list. There is no monitoring mode and no history.
Who uses it
Finance and billing teams
Check customers before a reverse-charge invoice.
CRM owners
Mark bad VAT numbers and add official company names.
Procurement teams
Re-check supplier VAT numbers every month.
Price
Pay per event: you pay for each result the tool saves, plus a small start fee for each run. The price includes Apify platform costs. Apify bills you, not us. Prices below are for the Apify free plan.
| What you pay for | Price | When |
|---|---|---|
| Start fee | $0.0007 | Charged once per run. This tool uses 1 GB of memory or less by default; more memory costs more. |
| VAT number checked | $0.0019 (from $0.0016 on paid Apify plans) | One unique VAT number that received a VIES verdict (valid or invalid). Unavailable countries, format errors, unsupported countries and not-checked numbers have no check fee. |
| Result row | $0.00002 | One result row saved to the dataset, for any status. |
Examples
- One VAT number: about $0.0026.
- 1,000 VAT numbers: about $1.90.
- Every day 100 VAT numbers, for 30 days: about $5.72 a month.
Free to try: the Apify free plan gives you $5 of usage every month, no credit card needed. That is enough for about 2,600 VAT numbers.
Prices checked on 24 October 2026. See the current price on Apify.
Questions
Can I check UK VAT numbers?
Not GB numbers. They left VIES in 2021. XI numbers work.
Is unavailable the same as invalid?
No. The country did not answer. Run it later. There is no check fee.
Why is the company name empty?
Some countries, like Germany and Spain, do not share name and address.
Do I need a login?
No. VIES is a public EU service. You only need an Apify account.
Do I need a login or an API key?
No. VIES is a public service of the European Commission. You only need an Apify account to run the Actor.
Is a service_unavailable number invalid?
No. It means the country did not answer. Run it again later. You do not pay the check fee for it.
How fresh is the data?
Each check is a live VIES request at run time. requestDate shows the time of the VIES answer. The Actor does not cache results.
Is the result legal proof?
When you add your own VAT number in requesterVat, VIES returns a consultation number. It is the VIES record that you checked this number on that date. Whether it is enough proof for your tax office is a question for your tax adviser.
Details
Step by step on Apify
- Open the Input tab.
- Add your numbers to VAT numbers (
vatNumbers), one per line, with the two-letter country prefix. The form is prefilled with 5 public company numbers and one number with a wrong format (DE12). - Optional: add your own EU VAT number in
requesterVatto get a consultation number for each valid check. - Click Start.
- Open the Output tab. The Results view shows
status,valid,nameandaddressfor each number.
Use cases
| Task | Input | Key fields | Next step |
|---|---|---|---|
| Check a customer before a reverse-charge invoice | vatNumbers + requesterVat | status, valid, consultationNumber, requestDate | Save the consultation number with the invoice |
| Clean a CRM or lead list | vatNumbers (export from CRM) | status, name, address | Export CSV and update the CRM |
| Re-check suppliers every month | vatNumbers in a saved task | status, errorCode | Schedule the task; follow up on invalid rows |
Tips for better results
- Add your own VAT number to get a consultation number as a record.
- Keep retry on. Busy countries get a few more tries.
- Use XI for Northern Ireland. GB numbers are not in VIES.
Limits and good to know
- Up to 1,000 numbers per run. Split bigger lists into several runs
- Speed: about 100 numbers per minute when the list has many countries (1,000 numbers from 12 countries took about 4.5 minutes in our test). The Actor sends only one request at a time to each country, because VIES limits parallel requests per country. So a list from one country is slower: 194 German numbers took about 1.5 minutes in our test. A very long list from one slow country may not finish within the 900-second timeout; the rest is then marked
not_checked(no check fee) — split such lists or raise the timeout - Default run options: 256 MB memory, 900-second timeout. More memory does not make the run faster
- If the run time limit is close, the Actor stops sending numbers 20 seconds before it and marks the rest as
not_checked - If VIES gives no verdict at all for 2 minutes (only "busy" or "unavailable" answers), the Actor stops early with
reason: "VIES_NOT_RESPONDING"instead of waiting until the timeout. Run the list again later
For developers
Sample result
One result from a real test run, in JSON. Real values change from run to run. In Excel or CSV each field is a column.
[
{
"input": "IE6388047V",
"countryCode": "IE",
"vatNumber": "6388047V",
"fullVatNumber": "IE6388047V",
"status": "valid",
"valid": true,
"name": "GOOGLE IRELAND LIMITED",
"address": "3RD FLOOR, GORDON HOUSE, BARROW STREET, DUBLIN 4",
"requestDate": "2026-10-13T16:13:43.268Z",
"consultationNumber": null,
"errorCode": null,
"errorMessage": null,
"attempts": 1,
"duplicateInputs": 0,
"source": "EU VIES (European Commission)",
"sourceUrl": "https://ec.europa.eu/taxation_customs/vies/",
"checkedAt": "2026-10-13T16:13:43.314Z"
},
{
"input": "DE12",
"countryCode": "DE",
"vatNumber": "12",
"fullVatNumber": "DE12",
"status": "format_error",
"valid": null,
"name": null,
"address": null,
"requestDate": null,
"consultationNumber": null,
"errorCode": "FORMAT_ERROR",
"errorMessage": "Does not match the DE VAT number format.",
"attempts": 0,
"duplicateInputs": 0,
"source": "EU VIES (European Commission)",
"sourceUrl": "https://ec.europa.eu/taxation_customs/vies/",
"checkedAt": "2026-10-13T16:13:42.494Z"
}
]Use it from code
Actor ID: cliqtomedia/vat-number-validator. You need your Apify API token from Apify Console → Settings → API & Integrations.
from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("cliqtomedia/vat-number-validator").call(run_input={
"vatNumbers": [
"IE6388047V",
"LU20260743",
"NL810433941B01",
"DE143454214",
"ATU33803701",
"DE12"
],
"retryUnavailable": True
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)curl -X POST "https://api.apify.com/v2/acts/cliqtomedia~vat-number-validator/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"vatNumbers": ["IE6388047V", "LU20260743", "NL810433941B01", "DE143454214", "ATU33803701", "DE12"], "retryUnavailable": true}'# pip install langchain-apify
# set APIFY_TOKEN in your environment
from langchain_apify import ApifyActorsTool
tool = ApifyActorsTool("cliqtomedia/vat-number-validator")
result = tool.invoke({"run_input": {"vatNumbers": ["IE6388047V", "LU20260743", "NL810433941B01", "DE143454214", "ATU33803701", "DE12"], "retryUnavailable": True}})
print(result)The cURL call waits for the results, up to 300 seconds. For longer runs, start a run (/runs) and get the results with a webhook or by checking the run. Apify API docs. LlamaIndex, MCP for AI agents and the JavaScript client: AI agents & MCP.
Data fields (17)
| Field | Type | Meaning |
|---|---|---|
input | string | VAT number exactly as provided. |
countryCode | string | VIES country code (EL for Greece, XI for Northern Ireland). |
vatNumber | string | Number without the country prefix and separators. |
fullVatNumber | string | Country code + number, normalised. |
status | string | valid / invalid come from VIES; service_unavailable means the member state could not answer (NOT invalid). |
valid | boolean | VIES verdict; null when VIES gave no verdict. |
name | string | Registered trader name; null when the member state does not disclose it. |
address | string | Registered address on one line; null when not disclosed. |
requestDate | string | VIES request timestamp. |
consultationNumber | string | Official VIES consultation number (only with requesterVat). |
errorCode | string | VIES error code (e.g. MS_UNAVAILABLE) or FORMAT_ERROR / UNSUPPORTED_COUNTRY / CHARGE_LIMIT. |
errorMessage | string | Plain-language explanation. |
attempts | integer | VIES requests made for this number. |
duplicateInputs | integer | How many more times the same number appeared in the input. |
source | string | |
sourceUrl | string | |
checkedAt | string | When this row was produced (ISO 8601). |
Input settings (3)
The main fields of the input form. With the API you send them as JSON.
| Setting | Name in the API | Type | Example value |
|---|---|---|---|
| VAT numbers required | vatNumbers | array | ["IE6388047V", "LU20260743", "NL810433941B01", "DE143454214", "ATU33803701", "DE12"] |
| Your own EU VAT number (optional) | requesterVat | string | |
| Retry unavailable countries | retryUnavailable | boolean | true |
Use cases with this tool
Each guide shows all the steps and the other tools.
