# KYB Company Check – VAT, Company Registry & Sanctions in One (`wsystem/kyb-company-check`) Actor

KYB company check in one call for suppliers and customers: EU VAT validation (VIES), official company registry lookup and EU/UN/OFAC/UK sanctions screening, with a pass / review / fail verdict and reasons. Batch, audit-ready.

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

## Pricing

Pay per event

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

## KYB Company Check – VAT, Company Registry & Sanctions in One

**KYB company check** for supplier and customer verification. **Verify a supplier or customer in one call.** Give a VAT number, a registry number or a company name and get back a single **pass / review / fail verdict with reasons**, built from three official checks:

1. **EU VAT validation via VIES** (European Commission) – valid/invalid, registered name and address, optional **VIES consultation number** as audit proof.
2. **Official business register lookup** – France (SIRENE), Norway (Brønnøysund), Finland (PRH/YTJ), Czech Republic (ARES), Poland (KRS), Estonia; all other countries via the GLEIF LEI index. Checks the company exists and is **active**.
3. **Sanctions screening** – fuzzy match against the **EU, UN, OFAC SDN and UK** sanctions lists, refreshed daily.

Built for **supplier onboarding, vendor due diligence, accounts payable fraud prevention, B2B customer onboarding, reverse-charge invoicing, marketplaces, fintechs and AI agents** that need a fast "is this counterparty OK to do business with?" answer – without three separate integrations.

### Verdict logic

| Verdict | When |
|---|---|
| `pass` | VAT valid (if given), company found and active, no sanctions match |
| `review` | VIES temporarily down, company not found, VIES and register names differ, or a possible sanctions match (score ≥ threshold) |
| `fail` | VAT invalid, company dissolved/inactive, or a strong sanctions match (score ≥ 90) |

Every reason is spelled out in `reasons`, so a human or agent can act on it.

### Input

```json
{
  "companies": ["FR27552032534", "CZ00177041", "NO:equinor", "Acme Trading Ltd"],
  "companyObjects": [{"name": "Siemens AG", "vatNumber": "DE129273398", "country": "DE"}],
  "requesterVatNumber": "",
  "sanctionsThreshold": 85
}
```

Tip: German VAT numbers return no name from VIES – pass the name via `companyObjects` so sanctions screening has a name to check.

### Output example

```json
{
 "input": "FR27552032534",
 "company_name": "SA DANONE",
 "country": "FR",
 "verdict": "pass",
 "reasons": [],
 "vat": {
  "vat": "FR27552032534",
  "status": "valid",
  "valid": true,
  "name": "SA DANONE",
  "address": "59 RUE LA FAYETTE, 75009 PARIS",
  "consultation_number": null,
  "request_date": "2026-10-15T13:34:30.814Z",
  "error": null
 },
 "registry": {
  "status": "found",
  "error": null,
  "match": {
   "registry_id": "552032534",
   "name": "DANONE",
   "status": "A",
   "active": true,
   "address": "59-61 RUE LA FAYETTE 75009 PARIS",
   "activity_code": "70.10Z",
   "source_url": "https://annuaire-entreprises.data.gouv.fr/entreprise/552032534"
  }
 },
 "sanctions": {
  "status": "no_match",
  "top_score": 0,
  "matches": [],
  "lists_date": "2026-10-15T13:34:20Z"
 }
}
```

### Pricing

Pay per event: **$0.025 per company checked** (VAT + register + sanctions together) + $0.005 per run start. 1,000 suppliers ≈ $25 – a fraction of commercial KYB tools.

### Use with AI agents (MCP)

Enable this Actor in the Apify MCP server (`https://mcp.apify.com`). Prompts:

- "Run a KYB check on our new supplier, VAT FR27552032534, and tell me if we can onboard them."
- "Check these 20 customers before we invoice them with reverse charge and list anything that needs review."

### Notes

A screening and verification **aid**, not legal advice: `review` and `fail` results should be reviewed by a person. Sanctions coverage: EU, UN, OFAC SDN, UK (no PEP/adverse media). All data comes from official public sources: VIES, national registers' open-data APIs, GLEIF, EU/UN/US/UK sanctions lists.

Related Actors: EU VAT Number Checker, European Company Registry Lookup, Sanctions Screening (EU, UN, OFAC, UK), EU Public Tenders Search.

Keywords: KYB API, know your business, supplier verification, vendor due diligence, counterparty check, company verification API, VAT validation, VIES, business register, sanctions screening, OFAC check, AML, supplier onboarding, AP fraud, MCP KYB tool.

# Actor input Schema

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

One per line: an EU VAT number (FR27552032534), a country-prefixed registry ID or name (NO:923609016, CZ:skoda auto, FI:0112038-9), or just a company name.

## `companyObjects` (type: `array`):

Advanced: \[{"name": "Siemens AG", "vatNumber": "DE129273398", "country": "DE", "registryId": "..."}]. Best for German VAT numbers, where VIES does not return names.

## `requesterVatNumber` (type: `string`):

Optional. If set, VIES returns a consultation number you can keep as proof of verification for tax audits.

## `sanctionsThreshold` (type: `integer`):

Score from which a sanctions hit triggers 'review' (90+ triggers 'fail').

## Actor input object example

```json
{
  "companies": [
    "FR27552032534",
    "CZ00177041",
    "NO:equinor"
  ],
  "sanctionsThreshold": 85
}
```

# Actor output Schema

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

No description

## `resultsJson` (type: `string`):

No description

## `summary` (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": [
        "FR27552032534",
        "CZ00177041",
        "NO:equinor"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("wsystem/kyb-company-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": [
        "FR27552032534",
        "CZ00177041",
        "NO:equinor",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("wsystem/kyb-company-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": [
    "FR27552032534",
    "CZ00177041",
    "NO:equinor"
  ]
}' |
apify call wsystem/kyb-company-check --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,wsystem/kyb-company-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/dXbf8NGx9FTaVj0Pi/builds/QEbRNCsiV3xvd4X9X/openapi.json
