# EU Company VAT Finder (`lowlanddata/company-vat-finder`) Actor

Find and validate EU VAT numbers in bulk from a list of company domains. Reads the VAT id a company publishes on its site and checks it against VIES. GDPR-clean: the VIES trader name and address are never kept. Free on a no-match.

- **URL**: https://apify.com/lowlanddata/company-vat-finder.md
- **Developed by:** [Lowland Data](https://apify.com/lowlanddata) (community)
- **Categories:** Lead generation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 vat id founds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## EU Company VAT Finder

You have a list of European company domains and you need their VAT numbers — to
invoice them, to check reverse-charge eligibility, to enrich a B2B record, to run
compliance. The number is usually right there in the footer or the imprint, but
opening each site and copying it out by hand is a day's work.

Give this a list of domains and, for each one, it finds the VAT id the company
publishes on its own site — homepage or legal/imprint page — and checks it against
the EU's official **VIES** service. You get the VAT number, its country, and
whether VIES says it is valid.

It stays strictly organisation-level. The VAT number is a business identifier a
company publishes about itself. VIES also returns the trader's name and address —
which for a sole trader is personal data — and **those are never read into the
output**. The same GDPR-first line as the rest of this account.

**Live health record:** [lowlanddata.com/status/company-vat-finder](https://lowlanddata.com/status/company-vat-finder/) - 30-day success rate and daily canary results, failures included. Full input/output reference: [tool page](https://lowlanddata.com/tools/company-vat-finder/).

### Quick start (30 seconds)

1. Paste your domains into **domains**, one per line — `telekom.de`,
   `https://adyen.com` or `www.company.fr` all work.
2. Click **Start**. Each domain comes back with its VAT number, country, and VIES
   validity.
3. Only have company names? Run the
   [Company Domain Finder](https://apify.com/lowlanddata/company-domain-finder)
   first, then feed its `domain` column in here.

### What you can build with it

- **Validate customer VAT for invoicing.** Reverse-charge and zero-rating need a
  valid EU VAT id; this finds it and checks it against VIES in one pass.
- **Enrich a B2B / CRM record.** Add the official VAT id to each European account.
- **Screen a supplier or partner list.** Confirm the companies you deal with carry
  a valid, live VAT registration.
- **Feed a compliance or onboarding flow.** Turn a list of domains into
  VIES-checked VAT ids your finance system can trust.

### What you get

Each domain is one row:

```json
{
  "input": "telekom.de",
  "domain": "telekom.de",
  "website": "https://telekom.de",
  "vatNumber": "DE122265872",
  "countryCode": "DE",
  "vatValid": true,
  "source": "imprint",
  "status": "found",
  "checkedAt": "2026-09-25T10:00:00.000Z"
}
```

Field notes:

- `vatNumber` is the full EU VAT id (country code + number), exactly as the company
  publishes it, or `null` when none was found.
- `vatValid` is the VIES result: `true`, `false`, or `null` when VIES could not be
  reached (VIES is a public service and is occasionally slow or down — `null` means
  "not checked", never "invalid").
- `source` says where it was found: `homepage` or `imprint` (the legal page).
- `status` is `found`, `none` (the site published no VAT id we could find),
  `unreachable`, or `invalid`.

### How it works

It fetches each domain's homepage and looks for a VAT id in the visible text. If
there is none, it follows the legal / imprint link (German and Austrian sites carry
one by law, and it is where the VAT id lives) and looks there. Every candidate is
checked against that country's exact VAT format, so a phone number or an order id
is never mistaken for a VAT id. A found number is validated against VIES, and only
the `valid` boolean is kept — never the trader name or address.

Honest limits: it finds a VAT id only where the company publishes one, so it works
best on EU businesses (German imprints especially) and returns `none` for companies
that do not publish theirs or that render their legal page entirely in JavaScript.

### What does it cost?

$5.00 per 1,000 domains where a **VAT id is found**. A domain that publishes none,
is unreachable, or was not a valid domain is delivered **free** — you pay only for
real results, including the VIES check. A run that finds nothing costs the $0.00005
actor start and nothing else.

- **A 500-domain EU list, ~40% with a published VAT ≈ $1.00**, once.
- **A daily 50-domain feed ≈ $0.10/month.**

The price is all-inclusive: platform usage, homepage traffic and the VIES lookups
are covered, and the free plan returns a 5-item sample per run so you can see the
output shape first.

### Not technical? Let your AI assistant set it up

Copy this into ChatGPT, Claude or any AI assistant, fill in the one line, and
follow the conversation:

```text
Help me set up the "EU Company VAT Finder" actor on Apify
(https://apify.com/lowlanddata/company-vat-finder). Guide me one step at a time.

What I have: [E.G. "a spreadsheet of 200 EU company domains I need VAT numbers for"]

Guide me to:
1. Create a free Apify account (apify.com), open the actor page, and paste my
   domains into the domains field, one per line.
2. Start a run, then export the results as CSV or Excel, or read them from the API.
3. Explain the vatValid column (true / false / null) and what null means.
4. If I only have company names, point me to the Company Domain Finder first.
5. If it works, remind me to leave a quick rating on the actor page.
```

### Input

| Field      | Description                                                                                                               |
| ---------- | ------------------------------------------------------------------------------------------------------------------------- |
| `domains`  | The domains to find a VAT id for, one per line. A bare domain, a URL, or a www host all work. Best on EU lists. Required. |
| `maxItems` | Stop after this many domains. Default 1000; free-plan runs are capped at 5.                                               |

### Use it from your code

```bash
curl -X POST "https://api.apify.com/v2/acts/lowlanddata~company-vat-finder/run-sync-get-dataset-items?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"domains": ["telekom.de", "adyen.com"]}'
```

Schedules, webhooks and the Make/Zapier/n8n integrations all apply. This is a
standard Apify actor.

### Use it with AI agents (MCP)

Through Apify's hosted MCP server, an agent can call this as a tool: hand over the
domains, read the VAT ids and validity back.

Claude Code:

```bash
claude mcp add apify --transport http "https://mcp.apify.com?actors=lowlanddata/company-vat-finder"
```

Cursor or Claude Desktop (add a custom connector / MCP server with this URL):

```text
https://mcp.apify.com?actors=lowlanddata/company-vat-finder
```

Runs bill to the Apify account you sign in with. Per-client setup: [Apify MCP docs](https://docs.apify.com/platform/integrations/mcp).

### Is it legal, and is a VAT number personal data?

A VAT id is a business tax identifier, and companies publish it on their own sites —
German and Austrian law actually requires it in the imprint. This reads only that
published number and validates it through the EU's own public VIES service. It
never keeps the trader name or address VIES returns, so no personal data enters the
output, even for sole traders. Nothing gated is accessed.

### Is there a VAT lookup / VIES API?

This is one, wrapped for bulk. Send domains to `run-sync-get-dataset-items` and get
each company's VAT id and its VIES validity back as JSON, on a schedule, or as an
MCP tool — without calling VIES one number at a time yourself.

### FAQ

**What does `vatValid: null` mean?** VIES could not be reached for that number (it
is a public service and is sometimes slow or briefly down). The VAT id is still the
one published on the site; it just was not validated this run. Re-run to retry.

**Do you return the company name or address from VIES?** No, never. Only the `valid`
boolean is kept. Trader name and address — personal data for a sole trader — are
discarded.

**Why did an EU company come back `none`?** It does not publish its VAT id on its
site, or its legal page is rendered in JavaScript so the number is not in the static
page. The tool reports only VAT ids it can actually read.

**Which countries are covered?** All 27 EU member states, each matched against its
own VAT format (Greece under `EL`).

**Why did I only get 5 results?** The Apify free plan caps this actor at a 5-item
sample. Any paid plan lifts the cap to your `maxItems`.

### The company-identity family

The domain is the key that unlocks the rest. This tool is one rung, each
organisation-level, nothing personal:

- [Company Domain Finder](https://apify.com/lowlanddata/company-domain-finder) — company name → website domain, the entry point.
- [Company Logo & Favicon Finder](https://apify.com/lowlanddata/company-logo-finder) — a domain's favicon, logo and social image.
- [Company Socials Finder](https://apify.com/lowlanddata/company-socials-finder) — a domain's LinkedIn, X, Instagram and more.
- [Company Email Security Checker](https://apify.com/lowlanddata/company-email-security) — a domain's SPF, DMARC, DKIM and email-spoofing grade.

### Troubleshooting

Failures are loud and named in the run's status message:

- **"Provide at least one domain."** `domains` was empty; add at least one.
- **A row came back `unreachable`.** The homepage did not respond. Re-run later.
- **A row came back `none`.** The site published no VAT id we could read — often a US company, or a JS-rendered legal page.
- **`vatValid` is `null` across a run.** VIES was unreachable during the run; retry later.
- **5 results instead of your maxItems**: the free-plan sample cap; a paid Apify plan removes it.

### Support

Missing a VAT id a site clearly publishes, or found one parsed wrong? Open a report
on the actor's **Issues tab**; this tool is actively maintained.

If it earns its keep, a **rating on this page** takes ten seconds and tells us which
enrichment tool to build next.

# Actor input Schema

## `domains` (type: `array`):

The company domains to find and validate a VAT id for, one per line. A bare domain, a URL or a www host all work. Best on EU company lists. Only have company names? Run the Company Domain Finder first.

## `maxItems` (type: `integer`):

Stop after this many domains. Default 1000; free-plan runs are capped at 5.

## Actor input object example

```json
{
  "domains": [
    "sap.com",
    "adyen.com",
    "backmarket.com"
  ],
  "maxItems": 1000
}
```

# Actor output Schema

## `results` (type: `string`):

One JSON object per domain, with its VAT id and VIES validity.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "domains": [
        "sap.com",
        "adyen.com",
        "backmarket.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("lowlanddata/company-vat-finder").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "domains": [
        "sap.com",
        "adyen.com",
        "backmarket.com",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("lowlanddata/company-vat-finder").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "domains": [
    "sap.com",
    "adyen.com",
    "backmarket.com"
  ]
}' |
apify call lowlanddata/company-vat-finder --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,lowlanddata/company-vat-finder"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/7AVC8b3GesbkzBZfm/builds/FsHNmXeYQRILksY8R/openapi.json
