# Bulk EU VAT number validator with VIES

> Bulk VAT number validator with the official EU VIES service. Check up to 1,000 numbers. Get valid or invalid, company name and address. No login.

URL: https://cliqtomedia.com/actors/vat-number-validator/

Category: Leads, companies & validation · Status: live on Apify Store · Apify page: https://apify.com/cliqtomedia/vat-number-validator?fpr=cliqto

Paste a list of EU VAT numbers. Each one is checked with the official VIES service. You get valid or invalid, and the company name when the country shares it.

## How to use it: 3 steps

1. **Make a free Apify account.** Apify 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.
2. **Paste your input and press Start.** No code needed: you fill in a form (the input). It already has a working example. For example: `IE6388047V` in VAT numbers. Each start is one run.
3. **Download the results.** When 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.

## 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 (`XI` prefix) 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 `name` and `address` are `null` even when the number is valid.
- This is a one-time check of a list. There is no monitoring mode and no history.

## Price

Pay per event. Apify bills you, not us.

| 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. |

- 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.

Prices checked on 24 October 2026. Current price: https://apify.com/cliqtomedia/vat-number-validator?fpr=cliqto

## 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.

## Data fields

- `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

- `vatNumbers` (array, required): EU VAT numbers with the two-letter country prefix, one per line, e.g. IE6388047V or DE 143 454 214. Spaces, dots and dashes are ignored; GR is accepted for Greece (EL). Northern Ireland uses XI. Up to 1,000 per run; duplicates are checked once.
- `requesterVat` (string): Add your company's EU VAT number to receive an official VIES consultation number for each valid check (proof that you verified your customer). Leave empty if you only need valid/invalid.
- `retryUnavailable` (boolean): When a member state's database is down or busy, wait and retry it up to 3 more times (about 2 minutes in total) before reporting 'service_unavailable'. Such numbers are never reported as invalid and have no check fee.

## Step by step on Apify

1. Open the Input tab.
2. 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`).
3. Optional: add your own EU VAT number in `requesterVat` to get a consultation number for each valid check.
4. Click Start.
5. Open the Output tab. The Results view shows `status`, `valid`, `name` and `address` for 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

- 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



- 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.

## Sample result

```json
[
  {
    "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`

```python
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)
```

```bash
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}'
```

```python
# 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)
```

run-sync waits up to 300 seconds; for longer runs start a run and use a webhook. LlamaIndex and MCP: https://cliqtomedia.com/actors/ai-agents/

## Use cases with this tool

- [Lead lists from public data](https://cliqtomedia.com/actors/use-cases/lead-generation/): Build lists of companies and contacts from public sites. Check emails and phones before you send.

## Similar tools

- [Website Contact Scraper](https://cliqtomedia.com/actors/website-contacts-scraper/)
- [Bulk Email Verifier: MX, Disposable, Role & Typo Check](https://cliqtomedia.com/actors/email-verifier/)
- [Domain WHOIS (RDAP) & DNS Lookup, No Login](https://cliqtomedia.com/actors/domain-whois-dns-lookup/)
- [Europages Scraper: B2B Suppliers & Certificates (No Login)](https://cliqtomedia.com/actors/europages-companies-scraper/)
- [France Company & SIRET Search](https://cliqtomedia.com/actors/france-sirene-company-search/)
- [Norway Company Register (Brreg) & Updates](https://cliqtomedia.com/actors/norway-brreg-company-register/)
