# EU Company Check (KYB) – LEI, Register Number & VAT (`fast_data_asap/dach-company-kyb-official`) Actor

KYB check by company name, LEI or register number (e.g. HRB 719915) using official sources only: GLEIF legal name, legal form, status, LEI renewal, addresses, direct and ultimate parent, plus optional EU VIES VAT check. One flat row with plausibility flags per company.

- **URL**: https://apify.com/fast_data_asap/dach-company-kyb-official.md
- **Developed by:** [Fast Data](https://apify.com/fast_data_asap) (community)
- **Categories:** Business, AI
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$4.00 / 1,000 company profiles

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 Check (KYB) – LEI, Register Number & VAT from Official Sources

Check suppliers, customers and business partners in one step. Enter a **company name**, an **LEI** or a **register number** (for example `HRB 719915`). For each company you get **one flat row** with the details a finance, procurement or compliance team checks first: legal name, legal form, entity and LEI status, LEI renewal date, register number, legal and headquarters address, **direct and ultimate parent company**, and optionally the **EU VAT (VIES) check** of the VAT number you supply. Plausibility **flags** such as `LEI lapsed`, `No match` or `VAT invalid` sit in the same row, so a person or an AI agent can decide quickly.

All data comes **only from official open APIs**:

- **GLEIF** – the Global Legal Entity Identifier Foundation (`api.gleif.org`), the public LEI database overseen by the Regulatory Oversight Committee.
- **EU VIES** – the European Commission's VAT Information Exchange System, queried only for VAT numbers you provide.

No commercial register, Bundesanzeiger or third-party website is scraped, and no person data (managing directors, shareholders) is collected. GLEIF does not contain any.

### Who it's for

- **Finance and accounts payable**: verify a new supplier before the first payment
- **Procurement and vendor onboarding**: KYB / supplier due diligence with a documented source per row
- **Sales ops and CRM teams**: clean company master data (legal name, LEI, register number, parent company)
- **AI agents and MCP clients**: a single tool call returns a compact, flat answer instead of raw JSON:API documents

### Why use this actor

- **One row per company, all signals together.** Name, legal form, status, register number, addresses, parents, VAT validity and flags, without merging several API responses yourself.
- **Automatic input detection.** Names, LEIs (with checksum validation) and register numbers such as `HRB 86891`, `HRA 1234`, `FN 123456a` or `CHE-123.456.789` all go into the same list.
- **Group structure included.** Direct and ultimate parent (LEI and legal name) as reported to GLEIF.
- **Plausibility flags** instead of silent failures: `No match`, `LEI lapsed (not renewed)`, `Entity inactive`, `Renewal date passed`, `Fuzzy name match - verify`, `Name differs from query`, `Multiple matches (n) - showing k`, `VAT invalid`, `VAT check unavailable`, `Name differs from VAT name`, `Country differs from VAT country`, `Invalid LEI checksum`.
- **Clean on terms of use.** Official APIs only, an honest User-Agent (`FastDataKYB/1.0`), at most 5 requests per second and retries with backoff.
- **Pay only for found companies.** Entries without a match are free, and the VAT check costs nothing extra.

### Input

```json
{
  "companies": ["SAP SE; DE143454214", "Siemens Healthineers AG", "HRB 719915", "529900D6BF99LW9R2E68"],
  "country": "DE",
  "vatNumbers": [],
  "includeParents": true,
  "maxMatchesPerName": 1
}
```

| Field | Description |
|---|---|
| `companies` | Company names, 20-character LEIs or register numbers. The type is detected automatically. Append a VAT number after a semicolon (`"SAP SE; DE143454214"`) to check it as well. |
| `country` | ISO 2 country code of the legal address used to narrow name and register-number searches (default `DE`). Leave empty for all countries. Not applied to LEI lookups. |
| `vatNumbers` | Optional. VAT numbers matched to `companies` by position (1st to 1st, and so on). Checked with EU VIES. |
| `includeParents` | Add the direct and ultimate parent (default `true`). |
| `maxMatchesPerName` | Matches returned per name or register number (default `1`, best match first: active entities with an issued LEI are preferred). |

**How matching works:** a name is first searched as an exact legal name. If GLEIF has no exact match, a full-text search is used and the row is flagged `Fuzzy name match - verify`. Register numbers are not unique across register courts, so use the `country` filter and check the `Multiple matches` flag.

### Output

Real rows from a test run on 2026-11-10 (input `"SAP SE; DE143454214"`, `"Siemens Healthineers AG"` and a fictitious name):

```json
{
  "query": "SAP SE",
  "matchType": "name",
  "found": true,
  "lei": "529900D6BF99LW9R2E68",
  "legalName": "SAP SE",
  "otherNames": [],
  "legalForm": "Europäische Aktiengesellschaft",
  "legalFormCode": "SGST",
  "status": "ACTIVE",
  "registrationStatus": "ISSUED",
  "initialRegistration": "2014-01-27T10:55:08Z",
  "lastUpdate": "2025-12-05T13:35:00Z",
  "nextRenewal": "2027-01-26T23:00:00Z",
  "registeredAs": "HRB 719915",
  "registrationAuthorityId": "RA000296",
  "jurisdiction": "DE",
  "category": "GENERAL",
  "country": "DE",
  "legalAddress": {"street": "Dietmar-Hopp-Allee 16", "postalCode": "69190", "city": "Walldorf", "region": "DE-BW", "country": "DE"},
  "headquartersAddress": {"street": "Dietmar-Hopp-Allee 16", "postalCode": "69190", "city": "Walldorf", "region": "DE-BW", "country": "DE"},
  "directParent": null,
  "ultimateParent": null,
  "vat": {"number": "DE143454214", "valid": true, "name": null, "address": null, "checkedAt": "2026-11-10T09:26:52Z", "error": null},
  "flags": ["Multiple matches (2) - showing 1"],
  "sourceUrls": [
    "https://api.gleif.org/api/v1/lei-records/529900D6BF99LW9R2E68",
    "https://search.gleif.org/#/record/529900D6BF99LW9R2E68",
    "https://ec.europa.eu/taxation_customs/vies/rest-api/ms/DE/vat/143454214"
  ],
  "checkedAt": "2026-11-10T09:26:52Z",
  "error": null
}
```

```json
{"query": "Siemens Healthineers AG", "lei": "529900QBVWXMWANH7H45", "legalName": "Siemens Healthineers AG",
 "legalForm": "Aktiengesellschaft", "status": "ACTIVE", "registrationStatus": "ISSUED", "registeredAs": "HRB 237558",
 "directParent": {"lei": "W38RGI023J3WT1HWRP32", "legalName": "Siemens Aktiengesellschaft"},
 "ultimateParent": {"lei": "W38RGI023J3WT1HWRP32", "legalName": "Siemens Aktiengesellschaft"}, "flags": []}
```

```json
{"query": "Nonexistent Testfirma XYZ GmbH", "matchType": "name", "found": false, "lei": null, "flags": ["No match"]}
```

Germany and some other member states do not share the trader name and address through VIES, so `vat.name` is `null` for German VAT numbers. For countries that do share it, the actor compares it with the GLEIF legal name and sets `Name differs from VAT name` if they clearly differ.

### What this is not

- **Not a commercial register extract** (Handelsregisterauszug). GLEIF data is reported by the entity and validated by its LEI issuer. It is not the official register entry and contains no officers or shareholders.
- **Not a credit report** or solvency assessment.
- **Not legal advice.** Flags are technical hints that need a human review.
- Companies without an LEI (many small firms) are not in GLEIF and return `No match`.

### Pricing

Pay per event: **$0.004 per company profile found** ($4 per 1,000). The optional VIES VAT check is included. Entries without a match, failed lookups and skipped entries are free. Platform usage is low: a 4-company test run took about 5 seconds at 256 MB.

### Usage via API, n8n and MCP

- **API:** `POST https://api.apify.com/v2/acts/fast_data_asap~dach-company-kyb-official/run-sync-get-dataset-items?token=YOUR_TOKEN` with the input JSON above.
- **n8n / Make / Zapier:** use the Apify integration and select this actor.
- **MCP (Claude, Cursor and other AI agents):** `https://mcp.apify.com?tools=fast_data_asap/dach-company-kyb-official`

### Complete your supplier check

- [EU VAT Number Validator](https://apify.com/fast_data_asap/eu-vat-number-validator) – bulk VIES checks with consultation number
- [IBAN Validator & Bank Lookup](https://apify.com/fast_data_asap/iban-validator-bank-lookup) – check the bank details on an invoice
- [BaFin Investor Warnings](https://apify.com/fast_data_asap/bafin-investor-warnings) – screen against warnings from the German financial regulator

### Sources and disclaimer

LEI data: GLEIF, available under the CC0 license. VAT data: European Commission, VIES. Results reflect the API responses at the time of the check (`checkedAt`). This actor is not affiliated with GLEIF or the European Commission.

# Actor input Schema

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

One entry per company: a legal name (e.g. SAP SE), a 20-character LEI (e.g. 529900D6BF99LW9R2E68) or a register number (e.g. HRB 719915, FN 123456a, CHE-123.456.789). The type is detected automatically. You can append a VAT number after a semicolon, e.g. "SAP SE; DE143454214".

## `country` (type: `string`):

Two-letter country code of the legal address used to narrow name and register-number searches (e.g. DE, AT, CH, FR). Leave empty to search all countries. Ignored for LEI lookups.

## `vatNumbers` (type: `array`):

Optional EU VAT numbers, matched to the companies by position (1st VAT number to the 1st company, and so on; leave a line empty to skip). Each is checked against the official EU VIES service. Included in the price.

## `includeParents` (type: `boolean`):

Adds the direct and ultimate parent company (LEI and legal name) as reported to GLEIF.

## `maxMatchesPerName` (type: `integer`):

How many matching entities to return per name or register number (best match first: active entities with an issued LEI are preferred). Each returned match is one charged result.

## Actor input object example

```json
{
  "companies": [
    "SAP SE"
  ],
  "country": "DE",
  "includeParents": true,
  "maxMatchesPerName": 1
}
```

# Actor output Schema

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

No description

# 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": [
        "SAP SE"
    ],
    "country": "DE"
};

// Run the Actor and wait for it to finish
const run = await client.actor("fast_data_asap/dach-company-kyb-official").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": ["SAP SE"],
    "country": "DE",
}

# Run the Actor and wait for it to finish
run = client.actor("fast_data_asap/dach-company-kyb-official").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": [
    "SAP SE"
  ],
  "country": "DE"
}' |
apify call fast_data_asap/dach-company-kyb-official --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,fast_data_asap/dach-company-kyb-official"
        }
    }
}
```

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/o3EJNa7Zb1AeH2mqL/builds/SnaJaErqdEYdL3RFP/openapi.json
