# EU Company Verification — VAT (VIES) + Official Registry Data (`aspiring_barricade/eu-company-verification`) Actor

Verify EU companies on official state data: validate any intra-EU VAT number against VIES (27 member states) to get the registered legal name and address, enriched with INSEE Sirene official registry data for France (industry/NAF, legal form, active/ceased status). Verified, not guessed.

- **URL**: https://apify.com/aspiring\_barricade/eu-company-verification.md
- **Developed by:** [Joachim Pouchain](https://apify.com/aspiring_barricade) (community)
- **Categories:** Agents, Automation, 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 results

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## EU Company Verification — VAT (VIES) + Official Registry Data

Verify EU companies against **official state data**, not scraped guesses. This actor validates any **intra-EU VAT number** with the **VIES** service (27 member states) to return the **registered legal name and address**, and enriches French companies with **INSEE Sirene** official registry data (industry/NAF code, legal form, active/ceased status, creation date). The clean answer to **EU company verification** and **KYB Europe** from sources that are the legal source of truth.

Generic B2B enrichers scrape websites and guess. This one performs **EU VAT validation** against VIES and reads the **official company registry** — verified, official, multi-country.

### What it does

- **VIES VAT validation** — checks an intra-EU VAT number across all 27 member states; returns `valid` / `invalid` / `unavailable` (correctly distinguishing a non-existent number from a national database being temporarily offline).
- **Registered identity** — official legal name + registered address from VIES when valid.
- **France registry enrichment (INSEE Sirene)** — NAF/industry code, legal form, active/ceased status, creation date, employee range, company category.
- **Flexible input** — accepts a VAT number (prefixed or with a country code), a French SIREN/SIRET, or a company name (FR name search via INSEE).

### Output fields

| Field | Meaning |
|-------|---------|
| `vat_number`, `country_code` | Normalised VAT identity |
| `vat_status` | `valid` / `invalid` / `unavailable` / `not_checked` |
| `vat_valid` | Boolean (or null when unavailable) |
| `legal_name`, `registered_address` | Official registered identity (VIES) |
| `registry` | INSEE Sirene block for FR: `siren`, `naf_code`, `status`, `legal_form_code`, `creation_date`, `employee_range`, `company_category` |
| `input_type` | `vat` / `siren` / `name` |

### Why this one

- **Official, verified — not guessed.** VIES is the EU's own VAT service; INSEE Sirene is the French state business registry.
- **Three-state VAT logic done right.** A temporarily-offline national VAT base is reported as `unavailable`, never as a false `invalid` (a compliance trap most validators get wrong).
- **VAT + registry in one call** — validation *and* a registry profile, multi-country.
- **Agent- & n8n-ready.** One clean JSON row per company; usable as an MCP tool.

### Input

```json
{
  "queries": ["IE6388047V", "FR22424761419"],
  "max_items": 20
}
```

| Field | Type | Description |
|-------|------|-------------|
| `query` | string | A VAT number (`FR22424761419`, `IE6388047V`), a French SIREN/SIRET, or a company name (FR). |
| `queries` | array | Optional list to verify in one run (overrides `query`). |
| `country_code` | string | 2-letter EU code (use `EL` for Greece) when the VAT number has no country prefix. |
| `max_items` | integer | Max records returned/charged. Default 20. |

### Output

Real output for a valid IE number and a French company (with registry enrichment):

```json
{
  "query": "IE6388047V",
  "input_type": "vat",
  "country_code": "IE",
  "vat_number": "IE6388047V",
  "vat_valid": true,
  "vat_status": "valid",
  "legal_name": "GOOGLE IRELAND LIMITED",
  "registered_address": "3RD FLOOR, GORDON HOUSE, BARROW STREET, DUBLIN 4",
  "registry": null,
  "source": "EU VIES REST API (ec.europa.eu)",
  "timestamp": "2026-06-29T10:36:00.000Z",
  "disclaimer": "Official data from EU VIES (and INSEE Sirene for FR). Indicative, not a compliance opinion."
}
```

```json
{
  "query": "FR22424761419",
  "input_type": "vat",
  "country_code": "FR",
  "vat_number": "FR22424761419",
  "vat_valid": true,
  "vat_status": "valid",
  "legal_name": "SAS OVH",
  "registry": {
    "source": "INSEE Sirene V3.11 (api.insee.fr)",
    "siren": "424761419",
    "legal_name": "OVH",
    "status": "active",
    "legal_form_code": "5710",
    "naf_code": "63.11Z",
    "creation_date": "1999-10-15",
    "employee_range": "42",
    "company_category": "ETI"
  },
  "source": "EU VIES REST API (ec.europa.eu) + INSEE Sirene V3.11 (api.insee.fr)",
  "timestamp": "2026-06-29T10:36:00.000Z"
}
```

### Use cases

- **KYB / onboarding compliance** — confirm a counterparty's VAT number resolves to the right registered entity.
- **Invoice & tax validation** — validate supplier/customer VAT numbers in bulk before issuing/accepting invoices.
- **Lead data hygiene** — verify and enrich EU company records with official identity + industry code.
- **AI agents / n8n** — a verification tool an agent can call before trusting a company claim.

### Pricing

Pay-per-result: target **$0.005 per record** ($5 / 1,000), plus Apify platform usage. `max_items` caps spend.

### Categories

`Developer tools`, `Automation`, `Agents`, `Business`.

### Setup & notes

- **VIES** works with no key (the default run validates IE/DE/… out of the box).
- **French registry enrichment** needs an INSEE Sirene API key (free at api.insee.fr). Set it as a **secret environment variable** `INSEE_SIRENE_API_KEY` on the actor. Without it, FR records still return VIES validation (graceful degradation).
- VIES rate-limits some national bases (notably FR) — those are reported as `unavailable`, not `invalid`. Re-run to retry.
- Official data, **not a compliance opinion**.

# Actor input Schema

## `query` (type: `string`):

Intra-EU VAT number (e.g. FR22424761419, IE6388047V), a French SIREN/SIRET (9/14 digits), or a company name (FR name search via INSEE).

## `queries` (type: `array`):

Optional list of VAT numbers / SIRENs / names to verify in one run (overrides 'query').

## `country_code` (type: `string`):

2-letter EU code (use EL for Greece) for when the VAT number is given WITHOUT its country prefix. Empty = inferred from the query.

## `max_items` (type: `integer`):

Maximum records returned/charged per run (a name search may return several).

## Actor input object example

```json
{
  "query": "IE6388047V",
  "queries": [
    "IE6388047V",
    "FR22424761419"
  ],
  "max_items": 20
}
```

# 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 = {
    "query": "IE6388047V",
    "max_items": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("aspiring_barricade/eu-company-verification").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 = {
    "query": "IE6388047V",
    "max_items": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("aspiring_barricade/eu-company-verification").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "query": "IE6388047V",
  "max_items": 20
}' |
apify call aspiring_barricade/eu-company-verification --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=aspiring_barricade/eu-company-verification",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/1T8OeVHvQy05s6OUW/builds/U0crSTrHUu97eks2t/openapi.json
