EU VAT Batch Validator avatar

EU VAT Batch Validator

Pricing

from $1.68 / 1,000 vat number checkeds

Go to Apify Store
EU VAT Batch Validator

EU VAT Batch Validator

Validate batches of EU and Northern Ireland VAT numbers through official VIES. Export validity, returned business name/address and check timestamps. Service outages remain errors, never invalid results.

Pricing

from $1.68 / 1,000 vat number checkeds

Rating

0.0

(0)

Developer

Automation Lab

Automation Lab

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

Categories

Share

Recheck supplied business VAT numbers with official EU VAT validation from VIES. Use this Actor for supplier onboarding, invoice checks and periodic compliance review. Each completed check returns validity, the business name and address when the member state supplies them, and dated source evidence.

A source outage is an error, never an invalid VAT result. This Actor does not discover VAT numbers or provide legal advice.

Why use this Actor?

  • Check an existing list instead of submitting numbers one at a time.
  • Keep definitive invalid results separate from service failures.
  • Export typed rows suitable for spreadsheets or an onboarding database.
  • Normalize case, spacing and country codes consistently.
  • Avoid duplicate charges for repeated identifiers within one run.

This is a focused batch checker. It does not provide risk scores, alerts, company search or historical validity.

Who is it for?

Accounts-payable teams can recheck supplier identifiers before cross-border invoicing. Procurement teams can attach dated checks to onboarding records. Operations teams can schedule the same supplied list periodically and compare exports in their own systems.

A valid VAT number is not proof that an invoice is legitimate, that an entity is trustworthy, or that every reverse-charge condition is met.

Getting started

  1. Open the input form.
  2. Supply VAT numbers with country prefixes.
  3. Optionally reduce maxItems for a smaller check.
  4. Run the Actor and inspect its final status.
  5. Export completed rows from the default dataset as JSON, CSV or Excel.
{
"vatNumbers": ["IE6388047V", "IE0000000AA"],
"maxItems": 10
}

The example includes a real valid Irish business identifier and an intentionally invalid identifier. Source answers can change over time. Member-state services operate independently: Germany can return MS_UNAVAILABLE while Ireland and other countries remain available. The demo does not guarantee availability for your own country; an outage still fails the run, never becomes an invalid result.

EU VAT validation coverage

Supports the 27 EU member states plus Northern Ireland's XI prefix. Use EL for Greece; GR is accepted and normalized to EL. Great Britain's GB prefix is not supported by VIES.

The Actor removes whitespace, dots and hyphens, and uppercases letters. It performs basic structural checks, not a country-specific checksum guarantee. Leading zeroes are retained because inputs are strings.

Duplicate normalized numbers are checked once, in first-occurrence order. No cached result is substituted for a new source check across runs.

Input parameters

FieldMeaning
vatNumbersRequired list of 1–1000 strings, including country prefixes.
maxItemsGlobal unique-check limit, default 10, range 1–1000. Zero is not unlimited.

The entire batch is structurally validated before billing, even if maxItems would exclude later entries. Unsupported fields fail validation rather than being silently ignored.

Returned data

FieldMeaning
normalizedVatNumberCountry prefix plus normalized local number.
countryCodeCountry sent to VIES.
vatNumberLocal number without the country prefix.
validBoolean official result, true or false.
nameRegistered business name, or null if not supplied.
addressRegistered address, or null if not supplied.
requestDateConsultation date/time returned by VIES.
checkedAtUTC timestamp when the result was received and validated.
requestIdentifierSource consultation reference when supplied, otherwise null.
sourceUrlOfficial VIES endpoint.

Business identity availability varies by member state. A null name/address does not mean the VAT number is invalid. VIES placeholders such as --- become null. No requester-VAT fields are submitted, so a consultation reference is not guaranteed.

Example output

This record reflects the actual official response shape observed for the example input; the check timestamp is illustrative.

{
"countryCode": "IE",
"vatNumber": "6388047V",
"normalizedVatNumber": "IE6388047V",
"valid": true,
"name": "GOOGLE IRELAND LIMITED",
"address": "3RD FLOOR, GORDON HOUSE, BARROW STREET, DUBLIN 4",
"requestDate": "2026-10-27T00:24:33.613Z",
"checkedAt": "2026-10-27T00:24:33.675Z",
"requestIdentifier": null,
"sourceUrl": "https://ec.europa.eu/taxation_customs/vies/rest-api/check-vat-number"
}

How much does it cost to validate EU VAT numbers?

Pay per completed unique VAT check, whether valid or invalid, plus a one-time run start charge. Failed lookups and duplicates have no item charge. A run that starts valid work but later fails may retain its start charge and charges for already completed checks.

A run starts at $0.005. Each completed check costs $0.00322 on FREE, $0.0028 on BRONZE, $0.002184 on SILVER, and $0.00168 on GOLD, PLATINUM or DIAMOND. Spend tiers follow your qualifying monthly Apify Store spend, not a private per-Actor volume schedule. Examples below use BRONZE; verify your plan in the pricing panel.

Completed checksBRONZE example total
1$0.0078
10$0.033
100$0.285

There is no separate event charge for name, address or timestamps. A maximum total charge setting may stop the run before all selected checks complete. Always compare output count with the supplied unique input count.

Limits and service failures

Requests are sequential to avoid excessive load on member-state services. Each request has a 15-second timeout and up to three attempts for transient network, rate-limit or service errors with bounded backoff. There is no paid proxy fallback.

An exhausted service error fails the run immediately. Completed earlier rows remain available but are partial, not evidence that every input was checked. Never interpret absent rows as invalid results. Retry the unresolved subset later, not a successful subset unnecessarily.

The default run timeout is five minutes. Large batches can require a higher run timeout; 1000 accepted identifiers is an input limit, not a promise that every batch will finish within five minutes. Billing limits, runtime limits and source availability can all reduce delivered coverage.

Integrations

Export CSV to a supplier-review spreadsheet. Join results to your supplier table using normalizedVatNumber, not row position. Store requestDate alongside invoice-review evidence. Schedule recurring runs with your own supplied list, then compare validity and business identity downstream.

Use Apify webhooks or Make/n8n to notify your workflow when a run completes. Check terminal status before marking the batch complete. This Actor itself does not send alerts or compare prior runs.

API usage

Use a protected API token; never paste it into the input list.

curl -X POST 'https://api.apify.com/v2/acts/automation-lab~eu-vat-batch-validator/runs' \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H 'Content-Type: application/json' \
-d '{"vatNumbers":["DE129274202"]}'

JavaScript with the official client:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/eu-vat-batch-validator').call({
vatNumbers: ['DE129274202']
});
if (run.status !== 'SUCCEEDED') throw new Error(`Partial or failed run: ${run.id}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems({ limit: 20 });
console.log(items);

Python:

import os
from apify_client import ApifyClient
client = ApifyClient(os.environ['APIFY_TOKEN'])
run = client.actor('automation-lab/eu-vat-batch-validator').call(
run_input={'vatNumbers': ['DE129274202']})
if run['status'] != 'SUCCEEDED':
raise RuntimeError('Batch failed; rows may be partial')
print(client.dataset(run['defaultDatasetId']).list_items(limit=20).items)

MCP setup

Select a stable Actor-specific subset rather than the full Store:

claude mcp add --transport http apify \
'https://mcp.apify.com?tools=automation-lab/eu-vat-batch-validator'

For compatible Claude Desktop, Cursor, and VS Code clients:

{"mcpServers":{"apify":{"url":"https://mcp.apify.com?tools=automation-lab/eu-vat-batch-validator"}}}

Authenticate through your client's secure setup. Discover actual names and input schemas with tools/list; selection also adds run/data tools, not exactly one tool. An example prompt is: “Check these supplied VAT IDs and show their returned validity and check dates.”

Start an authorized run once and retain its run/storage IDs. A tool response may contain only run metadata. If pending, check the same run with get-actor-run using 2/4/8-second backoff capped at 10 seconds and a 120-second total deadline. Do not restart after a client timeout; recover the known run or report uncertainty if its ID is unknown.

After success, read get-dataset-items in pages of 20 source rows, at most 100 rows and 64 KiB of serialized content admitted to model context. Enforce the byte budget host-side, including oversized rows; disclose any omissions. Track source offsets, report truncation and the continuation offset, and keep complete exports outside model context. If your client cannot intercept oversized responses, do not claim a hard byte guarantee. At the deadline, report pending with the run ID. On failure, report rows as partial. No universal tool-context or token savings are promised.

Legality, responsible use and privacy

Use numbers you are authorized to process and comply with VIES terms and applicable privacy/tax obligations. Returned names and addresses can identify individuals in some jurisdictions; minimize retention and protect exports. This is not an official European Commission product or a tax opinion.

Failed operations send sanitized diagnostic input, exceptions and Actor/build/run IDs to our private GlitchTip service for repair. Secret fields and URL queries are removed; reports are retained for 30 days. Do not put secrets in VAT-number fields.

The runtime does not use AI or send VAT checks to an AI provider. Run inputs and results remain in your Apify storage until your account retention rules or deletion actions remove them; this Actor has no external business-data cache. Delete run storage in Console or via the API when no longer needed. Use the Actor Issues tab for bug reports, including your run ID and a non-sensitive example.

FAQ and troubleshooting

Why is the name blank for a valid number? Some national services do not supply identity data. We preserve that absence as null.

Why did a batch fail with some rows saved? A later lookup exhausted retries or returned an unrecognizable response. Those rows are completed checks, not a full-batch result.

Does this prove past validity? No. It records a current consultation, not a historical registration certificate.

Can I send numbers without prefixes? No; include the country prefix and retain leading zeroes.

Can I compare scheduled runs? Yes, downstream. This Actor does not retain comparison state or emit change alerts.

This Actor is intentionally standalone: it validates supplied identifiers rather than discovering suppliers, customs EORI numbers or procurement notices. Export the result into your existing supplier-onboarding system; no additional Actor is required.