VAT Number Checker & EORI Checker: VIES, HMRC, EOS avatar

VAT Number Checker & EORI Checker: VIES, HMRC, EOS

Pricing

from $1.60 / 1,000 number checkeds

Go to Apify Store
VAT Number Checker & EORI Checker: VIES, HMRC, EOS

VAT Number Checker & EORI Checker: VIES, HMRC, EOS

Check trading partners' EU VAT numbers with VIES and GB, EU and XI EORI numbers with HMRC and EOS. Local format checks first, one row per number, no API key.

Pricing

from $1.60 / 1,000 number checkeds

Rating

0.0

(0)

Developer

Your Evenings

Your Evenings

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Share

VAT Number Checker and EORI Checker: VIES, HMRC and EOS

VAT Number Checker & EORI Checker checks lists of VAT and EORI numbers you supply against the official public services and returns one clear JSON row per number, with no API key needed:

  • EU VAT numbers (all 27 member states, plus Northern Ireland XI): checked with VIES, the European Commission's VAT Information Exchange System.
  • GB EORI numbers: checked with HMRC's Check an EORI number API.
  • EU and XI EORI numbers: checked with the European Commission's EORI validation service (EOS).

Each row says valid, invalid or why the number wasn't checked, with the official check date, the source, and (if you ask for them) the trader name and address where the service publishes them. Turn on monitor mode and schedule it to hear when a trading partner's number becomes invalid.

Use it as a VAT number checker and EU VAT validator for your own customers and suppliers: a VIES VAT checker for bulk VAT checks of up to 500 numbers per run, and an EORI number checker that uses HMRC EORI checks for GB numbers and EOS for EU and XI numbers. Export rows as CSV, JSON or Excel.

For checking your own trading partners' VAT and EORI numbers. Don't republish or resell the results as a database.

Not affiliated with the European Commission or HMRC. This Actor is independent and is not affiliated with, endorsed by or sponsored by either of them. It calls their public checking services one number at a time and passes on their answers. Each row carries the source's terms and attribution (see Data sources, terms and attribution).

GB VAT numbers are not checked online. HMRC's VAT number checking API needs an HMRC developer account and application, so this Actor doesn't use it. GB VAT numbers get a free not_supported row with a local check-digit result only.

Why use this VAT number checker?

  • An outage is never reported as invalid. When VIES or a national VAT database is down or busy, the number gets a free source_unavailable row that says to try again later. Busy answers are retried twice, after 5 and 15 seconds.
  • Bad numbers never reach the official service. Format and check digits are checked locally first for every EU country and for GB and XI VAT numbers (format only for a few formats that can be personal identity numbers; tested against an independent open-source implementation on 84,000 numbers). A number that fails gets a free invalid_format row with the reason.
  • Kind to VIES, so it keeps answering. Each VAT number is checked with VIES at most once a day (later runs that day get the cached answer, free), duplicates are removed, VIES is called one number at a time at most once a second, and a VIES refusal stops VIES for the rest of the run.
  • Proof of the check. Every answer has the official checkDate. Add your own EU VAT number as requesterVatNumber and VIES answers also carry a consultationNumber you can keep as evidence.
  • Monitor mode. A scheduled run flags numbers that became_invalid or became_valid since the last run. Outages are marked not_checked and don't overwrite the last real answer.
  • You pay only for real answers. Only a fresh valid or invalid answer from the official service is charged. Local failures, cached answers, outages and unsupported numbers are free.

Use it to check your own trading partners

VIES exists so businesses can confirm the VAT numbers of the customers and suppliers they trade with. Its terms forbid extracting, retransmitting or copying its content beyond that. Use this Actor to check numbers of businesses you trade with or are about to trade with, and don't republish or resell the answers. It takes up to 500 numbers per run, checks only numbers you supply, and has no search, listing or number-generation mode.

How do I check VAT and EORI numbers? Quick start

Press Start with the prefilled input, or paste this into the JSON view of the Input tab:

{
"vatNumbers": ["IE6388047V", "ATU13585627"],
"eoriNumbers": ["GB220430231000"]
}

In our test run on 30 October 2026 it returned IE6388047V valid and ATU13585627 invalid (VIES), and GB220430231000 valid (HMRC), in about 4 seconds.

With trader names where published:

{
"vatNumbers": ["IE6388047V"],
"includeTraderDetails": true
}

Add "requesterVatNumber" with your own EU VAT number to get a VIES consultation number with each answer.

Weekly monitor of your customers' VAT and EORI numbers:

{
"vatNumbers": ["IE6388047V", "DE129273398"],
"eoriNumbers": ["GB220430231000", "XI220430231000"],
"monitorMode": true,
"stateStoreName": "customer-numbers"
}

Who it's for

  • Finance, accounts and tax teams checking the EU VAT numbers of their own customers and suppliers, with the official check date (and a VIES consultation number when you add your own VAT number) as a record of the check.
  • Customs, shipping and logistics teams confirming the GB, XI or EU EORI numbers of the businesses they trade with.
  • Online shops and B2B platforms checking the VAT and EORI numbers their own business customers give them, from code or on a schedule.

Input: which numbers can I check?

Add at least one number to vatNumbers or eoriNumbers, always with its country prefix.

VAT numbers (vatNumbers)

EU VAT numbers with their country prefix (DE…, FR…, EL… or GR… for Greece, XI… for Northern Ireland). GB VAT numbers get a local check only. Spaces, dots and dashes are removed.

EORI numbers (eoriNumbers)

EORI numbers: GB… (HMRC), XI… and EU (EOS).

Your own VAT number (optional) (requesterVatNumber)

Your own EU VAT number. VIES then returns a consultation number with each fresh answer. If VIES rejects it, numbers are still checked without one and a free requester_rejected row says so.

Include trader name and address (includeTraderDetails)

Default false. Return the trader name and address where the official service publishes them, unless the name looks like a private person.

Cache EORI checks for the day (useDailyCache)

Default true. Answers EORI numbers already checked today from the cache. VAT numbers are always answered from the cache when already checked today.

Monitor mode (monitorMode)

Compare each answer with the last run. See How do I hear when a VAT or EORI number changes? below.

State store name (stateStoreName)

Named key-value store for the daily cache and monitor history. Use a different name per list you monitor. See How do I hear when a VAT or EORI number changes? below.

Maximum numbers per run (maxNumbers)

Up to 500 numbers per run (default 500). Extra numbers get a free too_many_numbers row.

Output: what does each row say?

Every row has rowType. A result row (result) has checkType (vat or eori), input, number (cleaned), countryCode, localCheck (pass, fail, format_only or not_checked), localCheckNote, status, valid, message, checkDate, consultationNumber, requesterVatNumber, traderName, traderAddress, traderDetailsStatus, fromCache, source, sourceName, licence, licenceUrl, attribution, changeType, previousStatus and checkedAt. Values shortened:

{
"rowType": "result",
"checkType": "vat",
"input": "IE6388047V",
"number": "IE6388047V",
"countryCode": "IE",
"localCheck": "pass",
"status": "valid",
"valid": true,
"checkDate": "2026-10-30T15:02:39.392Z",
"consultationNumber": null,
"traderName": null,
"traderDetailsStatus": "not_requested",
"fromCache": false,
"source": "VIES",
"licence": "VIES terms of use: for confirming VAT numbers of trading partners …"
}
statusMeaningCharged
validThe official service says the number is valid on checkDateyes (fresh answers only)
invalidThe official service says it isn't validyes (fresh answers only)
invalid_formatWrong format or check digits (local check or VIES); not sent to any service by this Actor if the local check failedno
not_supportedGB VAT number (local check-digit result in message) or an unsupported country prefixno
source_unavailableThe service or the national database didn't answer; says nothing about the numberno
blockedVIES won't check this number (VAT_BLOCKED)no
not_checked_budgetNot checked because the run reached your maximum costno

localCheck is format_only for some formats that can be personal identity numbers (for example Romanian 13-digit and Latvian personal codes), where only the format is checked locally and VIES gives the answer.

traderDetailsStatus is not_requested, not_published (the service gave no name), withheld_person_like (the name doesn't look like a company, so it is not returned) or included.

Status rows (status, free): duplicates_removed, too_many_numbers, requester_rejected, source_unavailable, no_changes or budget_reached, each with a plain-English message.

The SUMMARY record in the default key-value store lists the input, statuses, request counts, what isn't covered and each source's terms and attribution. The dataset has views for Overview, Monitor: changes, and Status rows.

How do I hear when a VAT or EORI number changes?

Set monitorMode to true and schedule a saved task with your list. The Actor remembers each number's last answer in the named key-value store stateStoreName (for 400 days). On later runs, changeType is first_check, unchanged, became_valid, became_invalid or not_checked (outage, budget or unsupported number), with previousStatus. A run with no change gets a free no_changes row. Use the Monitor: changes view, or a webhook, to act on changes. Because each VAT number is checked once a day, schedule monitors daily or less often.

How much does it cost to check a VAT or EORI number?

Pay per event:

EventPrice
Number checked (a fresh valid or invalid answer from the official service)$0.002
Alert run with changes (monitor mode only, once per run where at least one number changed)$0.01
Actor start$0.00005

Higher Apify plans get lower prices (shown on the Pricing tab). Local format failures, cached answers, outages, unsupported numbers, status rows and the SUMMARY record are free. Set Maximum cost per run in the run options: the Actor stops before going over it, marks unchecked numbers not_checked_budget and adds a free budget_reached row.

Data sources, terms and attribution

Every result row from an official service carries its licence, licenceUrl and attribution. Answers are passed on with field names and dates normalised.

SourceServiceTerms or licenceAttribution (in every row's attribution)
VIESVIES REST API (check-vat-number, check-status)VIES disclaimer and FAQ: for confirming VAT numbers of trading partners (Art. 31, Regulation (EU) No 904/2010); extraction, retransmission and copying of VIES content are forbiddenSource: VIES, European Commission. Answers come from the national VAT databases of the EU member states and Northern Ireland (XI).
HMRC EORICheck an EORI number API (open access)HMRC Developer Hub terms of use; HMRC states no separate data licence for this APISource: HMRC Check EORI number API. Trader name and address are shown only when the trader has agreed to HMRC publishing them.
EU EOSEORI number validation (SOAP service)European Commission legal notice: reuse under CC BY 4.0 unless otherwise indicated (Decision 2011/833/EU)Source: EORI number validation (EOS), European Commission. Trader name and address are shown only when the trader has agreed to publication.

Not used: HMRC's Check a UK VAT number API (needs an HMRC developer account).

Company data, not personal data

Sole traders also have VAT and EORI numbers, and some VAT number formats are personal identity numbers. So:

  • Trader names and addresses are off by default (includeTraderDetails: false).
  • When on, a name is returned only if it contains a company form or organisation word (for example Ltd, GmbH, S.A., Α.Ε., ЕООД). Other names get withheld_person_like and are not returned or stored. A partnership named after its partners can still be returned.
  • The daily cache and monitor history live in your own key-value store and hold only what the Actor is allowed to return.
  • Your input numbers are echoed back in input and number.

What are the limits?

  • Coverage: EU VAT (27 member states and XI) via VIES; GB EORI via HMRC; EU and XI EORI via EOS. GB VAT: local check only. Other countries: not_supported.
  • Speed: VIES is called one number at a time, at most once a second, so allow about 1 second per VAT number (more when VIES is busy and retries). HMRC takes 10 EORI numbers per request at most once a second, EOS 10 per request at most once every 2 seconds.
  • Once a day: each VAT number is checked with VIES at most once a day per stateStoreName; a consultation number is only returned on that day's first check.
  • Up to 500 numbers per run. Only numbers you supply are checked: no search, listing or number generation.
  • Your own trading partners only: use it to check the VAT and EORI numbers of businesses you trade with or are about to trade with. Don't republish or resell the results as a database.
  • If VIES blocks requests: when VIES refuses further requests from a run (IP_BLOCKED), the Actor stops calling VIES for the rest of that run; the remaining VAT numbers get a free source_unavailable row and a status row says so. Try again later.
  • What valid means: VIES says whether a number is valid for cross-border trade within the EU on the check date; a domestic-only VAT registration can show as invalid. EORI services say whether the number is a valid EORI number.

Use the VAT number checker from code, spreadsheets or an AI agent

Run it with the Apify API or client libraries, schedule it, or connect it to Make, Zapier, Google Sheets or webhooks through Apify integrations. AI agents can call it through Apify's MCP server.

The examples below check two VAT numbers and set a maximum cost of $0.05 for the run, so trying them costs a few cents at most. Read your API token from an environment variable (APIFY_TOKEN) rather than pasting it into code.

JavaScript (Node.js)

// npm install apify-client
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('yourevenings/eu-uk-vat-eori-checker').call(
{
"vatNumbers": [
"IE6388047V",
"ATU13585627"
]
},
{ maxTotalChargeUsd: 0.05 },
);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

Python

# pip install "apify-client>=3"
import os
from decimal import Decimal
from apify_client import ApifyClient
client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("yourevenings/eu-uk-vat-eori-checker").call(
run_input={
"vatNumbers": [
"IE6388047V",
"ATU13585627"
]
},
max_total_charge_usd=Decimal("0.05"),
)
for item in client.dataset(run.default_dataset_id).iterate_items():
print(item)

HTTP API (cURL)

curl -X POST "https://api.apify.com/v2/acts/yourevenings~eu-uk-vat-eori-checker/run-sync-get-dataset-items?maxTotalChargeUsd=0.05" \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"vatNumbers": ["IE6388047V", "ATU13585627"]}'

AI agents (MCP)

Add Apify's MCP server with just this Actor as a tool. On first connection your browser opens so you can sign in to Apify and approve access.

{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com?tools=yourevenings/eu-uk-vat-eori-checker"
}
}
}

FAQ

Why is a number source_unavailable and not invalid? The service, or that country's national VAT database, didn't answer or was busy. That says nothing about the number. You're not charged; run it again later.

Why didn't a second run today ask VIES again? VIES asks that the same number isn't checked several times a day, so each VAT number is checked once a day and later runs that day get the cached answer, free, with fromCache: true.

Why are GB VAT numbers not checked? HMRC's VAT number API needs an HMRC developer account, which this Actor doesn't use. You get the local check-digit result.

Why is the trader name empty? Either you didn't turn on includeTraderDetails, the service didn't publish one (many countries and traders don't), or the name looked like a private person's (withheld_person_like).

Can I check EORI numbers only? Yes. Leave vatNumbers empty and list GB, XI or EU EORI numbers in eoriNumbers.

How do I get a consultation number? Put your own EU VAT number in requesterVatNumber. VIES returns a consultation number on the first check of a number each day.

Feedback

Found a problem or need a feature? Open an issue on the Issues tab.