# EU VAT, LEI & UK Company Verifier (KYB batch check) (`cheesemonger_george/counterparty-verifier`) Actor

Verify suppliers and customers in bulk: EU VAT numbers (VIES), Legal Entity Identifiers (GLEIF) and UK companies (Companies House) in one run, with a single verdict and name-mismatch warnings per company.

- **URL**: https://apify.com/cheesemonger_george/counterparty-verifier.md
- **Developed by:** [Cheesemonger George](https://apify.com/cheesemonger_george) (community)
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $8.00 / 1,000 company records

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 VAT, LEI & UK Company Verifier

Check a list of suppliers, customers or partners against three official registries in one run, and get back a single verdict per company:

| Source | What it checks |
|---|---|
| **EU VIES** (European Commission) | The VAT number is valid and registered; the trader name and address where the member state discloses them |
| **GLEIF** | The LEI exists, the entity is active and the registration hasn't lapsed |
| **UK Companies House** | The company exists and is active, and its accounts or confirmation statement aren't overdue |

Names returned by each registry are compared with the name you supplied (ignoring legal forms such as Ltd, GmbH or S.A.), so a VAT number that belongs to a different company is flagged.

### Use cases

- Supplier onboarding and KYB (know-your-business) checks
- Cleaning a vendor master file before an ERP migration
- Checking EU VAT numbers before zero-rating an intra-EU invoice
- Periodic re-verification of a customer base

### Input

```json
{
  "companies": [
    { "reference": "supplier-001", "name": "Google Ireland Limited", "vatNumber": "IE6388047V" },
    { "reference": "supplier-002", "name": "Apple Inc.", "lei": "HWUPKR0MPOU8FGXBT394" },
    { "reference": "supplier-003", "ukCompanyNumber": "00445790" }
  ]
}
```

Any combination of `vatNumber`, `lei` and `ukCompanyNumber` works. `name` and `reference` are optional.

### Output

One dataset row per company:

```json
{
  "reference": "supplier-001",
  "verdict": "verified",
  "resolvedName": "Google Ireland Limited",
  "warnings": [],
  "checks": {
    "vat": { "source": "vies", "status": "valid", "vatNumber": "IE6388047V", "name": "GOOGLE IRELAND LIMITED", "address": "..." }
  },
  "charged": true,
  "checkedAt": "2026-10-31T12:00:00.000Z"
}
```

| Verdict | Meaning |
|---|---|
| `verified` | Every identifier you gave checks out and the names agree |
| `review` | Identifiers are valid but something needs a look: name mismatch, lapsed LEI, overdue UK filings |
| `failed` | An identifier is invalid, unknown, or belongs to an inactive or dissolved entity |
| `incomplete` | A registry was down (VIES often is for some countries). **Not charged**; run it again later |
| `no_identifiers` | The row had nothing to check. **Not charged** |

### Pricing

You pay per company that reaches a verdict. Companies that come back `incomplete` or `no_identifiers` are free. The run stops cleanly when it reaches the maximum cost you set.

### Notes

- Germany and some other member states don't disclose trader names through VIES, so name matching uses the other sources there.
- UK numbers are zero-padded automatically (`445790` → `00445790`). Scottish (`SC`) and Northern Irish (`NI`) prefixes are supported.
- Data comes directly from the official public APIs at run time; nothing is scraped and nothing is stored.

# Actor input Schema

## `companies` (type: `array`):

One object per company. Give any of: vatNumber (with country prefix), lei, ukCompanyNumber. Add name to detect mismatches and reference to tag results with your own ID.

## `maxConcurrency` (type: `integer`):

Companies checked at the same time. Keep it low; VIES throttles bursts.

## Actor input object example

```json
{
  "companies": [
    {
      "reference": "supplier-001",
      "name": "Google Ireland Limited",
      "vatNumber": "IE6388047V"
    },
    {
      "reference": "supplier-002",
      "name": "Apple Inc.",
      "lei": "HWUPKR0MPOU8FGXBT394"
    }
  ],
  "maxConcurrency": 3
}
```

# Actor output Schema

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

One row per company with its verdict, warnings and per-registry details.

# 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 = {
    "companies": [
        {
            "reference": "supplier-001",
            "name": "Google Ireland Limited",
            "vatNumber": "IE6388047V"
        },
        {
            "reference": "supplier-002",
            "name": "Apple Inc.",
            "lei": "HWUPKR0MPOU8FGXBT394"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("cheesemonger_george/counterparty-verifier").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 = { "companies": [
        {
            "reference": "supplier-001",
            "name": "Google Ireland Limited",
            "vatNumber": "IE6388047V",
        },
        {
            "reference": "supplier-002",
            "name": "Apple Inc.",
            "lei": "HWUPKR0MPOU8FGXBT394",
        },
    ] }

# Run the Actor and wait for it to finish
run = client.actor("cheesemonger_george/counterparty-verifier").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 '{
  "companies": [
    {
      "reference": "supplier-001",
      "name": "Google Ireland Limited",
      "vatNumber": "IE6388047V"
    },
    {
      "reference": "supplier-002",
      "name": "Apple Inc.",
      "lei": "HWUPKR0MPOU8FGXBT394"
    }
  ]
}' |
apify call cheesemonger_george/counterparty-verifier --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,cheesemonger_george/counterparty-verifier"
        }
    }
}
```

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/nkR1ByrWai8B9iotd/builds/5IQmizYBpkI8q16yj/openapi.json
