# Company Verification Checker (Not-Found Free) (`locaihost/kyb-check`) Actor

Verify a company by name, LEI, VAT or UK company number: official name, registry status, incorporation date, registered address, LEI parents, VAT check digits and an OFAC, UK and EU sanctions screen with risk flags. No API key needed, and not-found rows are free. $2 per 1,000 companies.

- **URL**: https://apify.com/locaihost/kyb-check.md
- **Developed by:** [locaihost data](https://apify.com/locaihost) (community)
- **Categories:** Business, Automation, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.10 / 1,000 company checks

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## Company Verification Checker (Not-Found Free)

Run a KYB check on any company in one call, from its name, LEI, VAT number or UK company number: the official record from UK Companies House or GLEIF, its parent companies, an offline VAT check and an entity sanctions screen against the OFAC, UK and EU lists, with plain-language risk flags, one row per company. No login and no API key needed, even for UK companies.

- **Onboard business customers:** does the company exist, is it active, is it on a sanctions list, and is its parent?
- **Check suppliers:** screen a whole supplier file and re-run it on a schedule to catch status changes and new listings.
- **Clean up a CRM:** legal name, LEI, registry number and registered address for every account, and dissolved companies flagged before you quote.
- **Give an AI agent a counterparty check:** one call answers "is this company real, active, VAT-format-valid and not on a sanctions list?".

### Quick start

Paste this into the **JSON** tab of the input and click **Start**:

```json
{
  "companies": [
    {"name": "Tesco PLC", "country": "GB", "companyNumber": "00445790"},
    {"name": "Siemens AG", "country": "DE"},
    "529900S21EQ1BO4ESM68",
    "FR40303265045",
    "Microsoft Corporation"
  ]
}
```

You get 5 rows, five companies given in five different ways, usually in about 25 seconds (the sanctions lists load at the start of every run). Strings and objects can be mixed; an object can carry `name`, `country`, `companyNumber`, `lei` and `vatNumber`, and a country makes name lookups more precise.

### What data can I get?

![Real rows from this Actor's output: matched name, registry status, incorporation date, LEI parent, VAT check and sanctions-screen result for five companies](https://locaihost.org/img/readme/kyb-check.png)

| Group | Fields |
|---|---|
| Match | `input`, `found`, `matchedName`, `matchedVia` (LEI, company number, VAT number or name), `nameMatchScore`, `matchConfidence`, `candidates` (up to 3 closest Companies House names for a name lookup) |
| Official record | `registryStatus`, `registryStatusSource`, `incorporationDate`, `dissolutionDate`, `registeredAddress`, `address`, `legalForm`, `sicCodes`, `sic` (codes with descriptions), `country` |
| Identifiers | `identifiers` (LEI, company number, VAT number, registration authority) |
| UK register detail | `companiesHouse` (link, status detail, insolvency history, charges, accounts and confirmation statement overdue, next due dates, last accounts date, `dataAsOf`), `companiesHouseSource` |
| LEI | `lei` (registration and entity status, renewal date, **direct and ultimate parent** or GLEIF's reason none is reported), `leiStatus` |
| VAT | `vat`, `vatValid` (format and check digits, offline) |
| Sanctions | `sanctionsHitCount`, `sanctionsHits` (list, entry ID, matched name, score, method, programmes, listing date, link), `sanctionsScreened` (lists, threshold, names screened) |
| Flags | `riskFlags`: `SANCTIONS_POSSIBLE_MATCH`, `PARENT_SANCTIONS_POSSIBLE_MATCH`, `NOT_FOUND`, `NOT_ACTIVE`, `LEI_LAPSED`, `LEI_NOT_ISSUED`, `VAT_INVALID`, `NAME_MISMATCH`, `ID_MISMATCH`, `INSOLVENCY_HISTORY`, `ACCOUNTS_OVERDUE`, `CONFIRMATION_STATEMENT_OVERDUE`, `RECENTLY_INCORPORATED`, `COMPANY_NUMBER_NOT_FOUND`, `LEI_NOT_FOUND`, `SANCTIONS_NOT_SCREENED`, `LOOKUP_FAILED`, `INPUT_WARNING`, `SOLE_PROPRIETOR` |
| Run detail | `sources`, `warnings`, `errors`, `checkedAt` |

One real row (run on 2026-10-18 with the quick-start input, shortened):

```json
{
  "input": {"name": "Tesco PLC", "country": "GB", "companyNumber": "00445790"},
  "found": true,
  "matchedName": "TESCO PLC",
  "matchedVia": "company-number",
  "nameMatchScore": 1,
  "country": "GB",
  "identifiers": {"lei": "2138002P5RNKC5W2JZ46", "companyNumber": "00445790", "vatNumber": null, "registrationAuthority": "Companies House"},
  "registryStatus": "active",
  "registryStatusSource": "companies-house",
  "incorporationDate": "1947-11-27",
  "registeredAddress": "Tesco House, Shire Park, Kestrel Way, Welwyn Garden City, AL7 1GA, United Kingdom",
  "sicCodes": ["47110"],
  "legalForm": "Public limited company",
  "companiesHouse": {"hasInsolvencyHistory": false, "accountsOverdue": false, "confirmationStatementOverdue": false, "accountsNextDue": "2027-08-26", "source": "companies-house-web"},
  "matchConfidence": 1,
  "lei": {"registrationStatus": "ISSUED", "entityStatus": "ACTIVE", "nextRenewalDate": "2027-01-10", "directParent": null, "directParentException": "NON_CONSOLIDATING"},
  "sanctionsHitCount": 0,
  "sanctionsScreened": {"lists": ["OFAC SDN", "OFAC Consolidated", "UK Sanctions List", "EU Consolidated"], "threshold": 0.9, "names": 2},
  "riskFlags": [],
  "warnings": [],
  "errors": []
}
```

The dataset has two views (**KYB results**, **Sanctions hits**) and exports to JSON, CSV, Excel or HTML. The run's `SUMMARY` record lists the sanctions lists used with their publication dates, plus risk-flag counts and any invalid entries.

#### How the sanctions matching works

- **Entities only.** Individuals, vessels and aircraft are removed from the lists before matching, so the Actor never matches or returns a person.
- **Names screened:** the name you gave, the official registry or LEI name (plus GLEIF's other names), and the direct and ultimate parent. If a list records an LEI for an entity, an LEI match counts as a certain hit.
- **Normalisation:** case, accents and punctuation are ignored, and legal forms are dropped (Ltd = Limited = PLC; GmbH; OOO, PJSC, Sp. z o.o. and others). Descriptive words such as *Bank* or *Group* are kept.
- **Score (0-1), best of several methods:** `exact` after normalisation; `jaro-winkler` per word for misspellings (each word must be within typo distance); `token-sort` for word-order changes; `token-set` for names contained in a longer name (scores 0.85-0.99, never 1). Scores are rounded down.
- **Typos must look like typos:** every word has to be the same word, perhaps misspelt. Two names that share one long word but differ in a short one ("KT Logistics" and "KG Logistics") are not a hit.
- **Threshold:** default **0.9**. In our October 2026 test on 1,500 ordinary active companies from GLEIF, 1.1% got any hit at 0.9. Listed names with one wrong letter (after the first three) were found 99.9% of the time, and with the words in a different order 100%. Use 0.95 for fewer reviews, or 0.85 for wider recall.

#### Sources and licences

| Source | Used for | Licence |
|---|---|---|
| UK Companies House register: the public website (no key), or the Public Data API (your own key) | Company overview and company search only. Never officers, PSC or filed documents | Open Government Licence v3.0 |
| GLEIF LEI API | LEI records, parents, legal forms | CC0 |
| OFAC SDN and Consolidated (non-SDN) lists | Entity screening | US Government work, public domain |
| UK Sanctions List (FCDO) | Entity screening | Open Government Licence v3.0 |
| EU Financial Sanctions Files | Entity screening | © European Union, reuse under Commission Decision 2011/833/EU |

*Contains public sector information licensed under the Open Government Licence v3.0.* Lists are downloaded fresh at the start of every run.

### How much does it cost?

You pay per company checked, and only when the company is identified or there is a possible sanctions match. There is no charge for Apify platform usage on top.

| Row | Free and Starter | Scale | Business |
|---|---|---|---|
| Company checked | $2.00 per 1,000 | $1.50 per 1,000 | $1.10 per 1,000 |

Plus $0.00005 per run start. **Apify's free $5 monthly credit covers about 2,500 companies.** Free-plan runs check up to 25 companies each; any paid Apify plan removes the cap.

**What's free:** invalid entries, "not found" results, sole-proprietor LEIs (no name is returned for those), rows where every lookup failed for technical reasons, and companies not reached before the run's time limit. Not-found and failed rows still appear in the dataset, so you can see why. Duplicates are merged first. Set `maxResults` to stop after a number of companies, or **Maximum cost per run** in the run options to cap a run's spend.

### Limits, stated up front

- **VAT numbers are validated offline** (format and official check digits, cross-checked against a reference implementation on 76,000 numbers). VIES is not queried, because its terms forbid retransmitting its answers. For legal proof that a VAT number is registered, check it yourself on the EU VIES website.
- **The UN Security Council list is not screened separately:** its terms allow personal, non-commercial use only. UN designations are carried into the UK, EU and US lists, which are screened.
- **UK companies need no key.** Without one, the Actor reads the public Companies House website at no more than one request a second. The website doesn't show a company's `jurisdiction`, so that field is `null` on the keyless route; your own free Companies House key fills it in. A name with no country is looked up in GLEIF first (worldwide), and in the UK register when GLEIF has no match. Non-UK companies are covered through GLEIF.
- Fuzzy matching only compares names that share the first three letters of at least one word, so a typo in the first letters of every word is missed. Non-Latin scripts are not transliterated.
- **Up to 1,000 companies per run** (duplicates merged first); split longer lists across runs or tasks.
- GLEIF allows 60 requests a minute, so expect about 40 companies a minute when you give LEIs and fewer for name-only lookups (the default 1-hour timeout covers 1,000 companies). If the time limit comes first, the run stops cleanly: companies already checked are kept, the rest are not charged, and the status message says how many were left.
- A sanctions list whose server doesn't deliver within 2.5 minutes is skipped for that run: the status message and `SUMMARY` name it, and each row's `sanctionsScreened` lists only the lists actually used.
- **A screening aid, not legal advice.** A hit is a *possible* match that a person must review. No hit does not prove a company is clean: lists change daily, names vary, and ownership or control can make a company subject to sanctions even when it is not listed. Check results against the official sources before you decide. The Actor is not affiliated with or endorsed by Companies House, GLEIF, OFAC, the FCDO or the European Commission.

### Schedules

Each run downloads the current official lists and reads the registers live. To monitor counterparties, save your list as a task and add a schedule under **Schedules** in Apify Console: a weekly run catches status changes, overdue filings and new listings.

### Integrations: API, n8n, Make and AI agents

**API.** Run it and get the rows back in one call:

```bash
curl -X POST "https://api.apify.com/v2/acts/locaihost~kyb-check/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"companies": [{"name": "Tesco PLC", "country": "GB"}, "529900S21EQ1BO4ESM68"]}'
```

Apify's API clients for Python and JavaScript work the same way.

**n8n, Make, Zapier, Google Sheets, Slack, webhooks.** Apify's built-in integrations send each run's dataset wherever you need it, for example an alert when `riskFlags` is not empty.

**AI agents (MCP).** Add this Actor to Claude, Cursor or any MCP client with `https://mcp.apify.com/?tools=locaihost/kyb-check`, then ask something like *"Is Acme Shipping Ltd, UK company 01234567, active, and do it or its parent appear on any sanctions list?"* The agent passes `companies` and reads `riskFlags` and `sanctionsHits`.

### FAQ

#### How much does a company check cost?

$2.00 per 1,000 companies on the Free and Starter plans, less on Scale and Business, charged only when the company is identified or there is a possible sanctions match. Not-found results are free. Apify's free $5 monthly credit covers about 2,500 companies.

#### Can I use it through the API or from Python?

Yes. Use the `run-sync-get-dataset-items` call above, or Apify's Python and JavaScript clients. Every run's data is also available as JSON, CSV or Excel from its dataset.

#### Can I use it from an AI agent?

Yes. No sign-up with any registry and no API key are needed. Use the Apify MCP server (`https://mcp.apify.com/?tools=locaihost/kyb-check`) or the run-sync API.

#### Is it legal to use this data?

Every source is an official open source with a published licence (see the table above), and the Actor reads only public records. It never logs in. You remain responsible for how you use the results, including your own compliance duties.

#### Does it return personal data?

No. People are filtered out of the sanctions lists before matching. From Companies House only the company overview and company search are read, never the officers or PSC pages. Addresses are company registered offices, and a "c/o" part of an address (which can name a person) is dropped. GLEIF also issues LEIs to sole proprietors: for those the row says `SOLE_PROPRIETOR` and gives the LEI status and country, but no name, address, registration number or creation date, and it is not charged.

#### Why are some fields empty?

Fields come from the source that matched: UK companies have Companies House detail, others only what GLEIF records. `jurisdiction` is empty on the keyless UK route, `vat` is empty unless you give a VAT number, and parents are empty when GLEIF reports none (the reason is in `directParentException`).

#### Do I need a Companies House API key?

No. UK companies are read from the public Companies House register website. If you add your own free key, the official API route is used instead; rows have the same fields, plus `jurisdiction`.

### More from locaihost data

- [Company Enrichment by Domain](https://apify.com/locaihost/company-profile): name, description, logo, socials and role contact addresses from each company's own website.
- [LinkedIn Company Scraper](https://apify.com/locaihost/linkedin-company): industry, size band and headquarters from each company's public LinkedIn page.
- [Tech Stack & Domain Lookup](https://apify.com/locaihost/domain-intel): email provider, DNS, SSL and registrar for each company's domain.
- [SEC EDGAR Financials & Filings](https://apify.com/locaihost/sec-edgar): fundamentals and filings for US-listed companies.

### Did it help?

If this saved you time, a quick rating on the Store helps other people find it.

### Support

Something not working, or a register you need covered? Open an issue on the **Issues** tab: we answer issues within 24 hours.

# Changelog

This Actor's version history is a separate document: https://apify.com/locaihost/kyb-check/changelog.md

# Actor input Schema

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

Companies to check. Each entry is a string (company name, LEI, EU/UK VAT number or UK company number) or an object: {"name": "Acme Ltd", "country": "GB", "companyNumber": "01234567", "lei": "…", "vatNumber": "…"}. A country makes name lookups more precise. Up to 1,000 per run.

## `matchThreshold` (type: `number`):

Minimum name similarity (0.7–1.0) for a sanctions hit. 1.0 = exact after removing legal forms (Ltd, GmbH…). Default 0.9 catches typos and word-order changes; lower finds more possible matches but more false positives.

## `sanctionsLists` (type: `array`):

Lists to screen against (entity entries only). Default: all four.

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

Look up the direct and ultimate parent from GLEIF and screen their names against the sanctions lists too.

## `companiesHouseApiKey` (type: `string`):

Leave empty: UK companies are read from the public Companies House website with no key. Add your own free key from developer.company-information.service.gov.uk only if you prefer the official API route (it also returns the company's jurisdiction).

## `maxResults` (type: `integer`):

Stop after this many companies. 0 = no limit.

## Actor input object example

```json
{
  "companies": [
    {
      "name": "Tesco PLC",
      "country": "GB",
      "companyNumber": "00445790"
    },
    {
      "name": "Siemens AG",
      "country": "DE"
    },
    "529900S21EQ1BO4ESM68",
    "FR40303265045",
    "Microsoft Corporation"
  ],
  "matchThreshold": 0.9,
  "sanctionsLists": [
    "OFAC-SDN",
    "OFAC-CONSOLIDATED",
    "UK",
    "EU"
  ],
  "includeParents": true,
  "maxResults": 0
}
```

# Actor output Schema

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

One record per company: registry status, LEI, VAT check, sanctions hits and risk flags (overview view).

## `summary` (type: `string`):

Companies checked and charged, invalid inputs, risk-flag counts and the sanctions lists used with their publication dates.

# 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": [
        {
            "name": "Tesco PLC",
            "country": "GB",
            "companyNumber": "00445790"
        },
        {
            "name": "Siemens AG",
            "country": "DE"
        },
        "529900S21EQ1BO4ESM68",
        "FR40303265045",
        "Microsoft Corporation"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("locaihost/kyb-check").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": [
        {
            "name": "Tesco PLC",
            "country": "GB",
            "companyNumber": "00445790",
        },
        {
            "name": "Siemens AG",
            "country": "DE",
        },
        "529900S21EQ1BO4ESM68",
        "FR40303265045",
        "Microsoft Corporation",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("locaihost/kyb-check").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": [
    {
      "name": "Tesco PLC",
      "country": "GB",
      "companyNumber": "00445790"
    },
    {
      "name": "Siemens AG",
      "country": "DE"
    },
    "529900S21EQ1BO4ESM68",
    "FR40303265045",
    "Microsoft Corporation"
  ]
}' |
apify call locaihost/kyb-check --silent --output-dataset

```

## MCP server setup

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

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/uHdmWeOsQ0jAJ0TXD/builds/VJVeLfqrnkME28yJT/openapi.json
