# KYB Company Lookup: LEI Search + OFAC Sanctions Screening (`sefran1/kyb-company-check`) Actor

KYB company check API for AI agents and scripts: screen a company name against the live OFAC SDN sanctions list and find its GLEIF LEI. Batch up to 100. One JSON result per company, $0.05 per check. Potential matches only, not a clearance.

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

## Pricing

from $50.00 / 1,000 kyb checks

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: OFAC Sanctions Screening + LEI Lookup

**KYB company check API** for AI agents, compliance teams and scripts. Give it a company name and it does two things in one call:

### Sample output (real run of the default input, 7 s)

| query | status | summary | list_as_of |
|---|---|---|---|
| {"name":"Siemens AG","country":null,"lei":null,"threshold":0.55,"li... | ok | {"ofac_potential_match":false,"ofac_hit_count":0,"ofac_top_score":n... | {"ofac":"2026-10-15","gleif":"2026-10-17T00:00:00Z"} |

<details><summary>One full JSON row</summary>

```json
{
  "status": "ok",
  "query": {
    "name": "Siemens AG",
    "country": null,
    "lei": null,
    "threshold": 0.55,
    "limit": 10
  },
  "checked_at": "2026-10-17T15:07:06.787Z",
  "summary": {
    "ofac_potential_match": false,
    "ofac_hit_count": 0,
    "ofac_top_score": null,
    "ofac_top_name": null,
    "ofac_top_programs": [],
    "gleif_match_count": 10,
    "gleif_best_match": {
      "lei": "W38RGI023J3WT1HWRP32",
      "legalName": "Siemens Aktiengesellschaft",
      "status": "ACTIVE",
      "country": "DE"
    },
    "lei_resolved": null,
    "note": "No OFAC SDN name match at or above the threshold. This is NOT a clearance."
  },
  "ofac": {
    "query": "Siemens AG",
    "query_norm": "SIEMENS AG",
    "threshold": 0.55,
    "hit_count": 0,
    "hits": [],
    "list_as_of": "2026-10-15",
    "list_fetched_at": "2026-10-17T15:07:06.786Z",
    "entity_count": 19458,
    "source": "OFAC_SDN",
    "potential_matches_only": true,
    "disclaimer": "Directional OFAC SDN screen only — returns potential matches with confidence scores. Not a legal or compliance determination, clearance, certification, or attestation. False positives and false negatives are possible. Verify against official U.S. Treasury / OFAC publications and your own counsel."
  },
  "gleif": {
    "match": {
      "query": "Siemens AG",
      "country_filter": null,
      "hit_count": 10,
      "matches": [
        {
          "lei": "W38RGI023J3WT1HWRP32",
          "legalName": "Siemens Aktiengesellschaft",
          "score": 1,
          "jurisdiction": "DE",
          "legal_address_country": "DE",
          "status": "ACTIVE",
          "registration_status": "ISSUED",
          "via": "fuzzycompletions+lei-records-filter",
          "country_match": null
        },
        {
          "lei": "52990021T5LVTQOGSU18",
          "legalName": "Siemens Aktiengesellschaft Österreich",
          "score": 0.6667,
          "jurisdiction": "AT",
          "legal_address_country": "AT",
          "status": "ACTIVE",
          "registration_status": "ISSUED",
          "via": "fuzzycompletions+lei-records-filter",
          "country_match": null
        },
        {
          "lei": "5299004MG7BJU2QS6Q75",
          "legalName": "Siemens Energy AG",
          "score": 0.6667,
          "jurisdiction": "CH",
          "legal_address_country": "CH",
          "status": "ACTIVE",
          "registration_status": "ISSUED",
          "via": "lei-records-filter",
          "country_match": null
        },
        {
          "lei": "529900QBVWXMWANH7H45",
          "legalName": "Siemens Healthineers AG",
          "score": 0.6667,
          "jurisdiction": "DE",
          "legal_address_country": "DE",
          "status": "ACTIVE",
          "registration_status": "ISSUED",
          "via": "lei-records-filter",
          "country_match": null
        },
        {
          "lei": "529900K9JUX6PNXADV92",
          "legalName": "Siemens Mobility AG",
          "score": 0.6667,
          "jurisdiction": "CH",
          "legal_address_country": "CH",
          "status": "ACTIVE",
          "registration_status": "ISSUED",
          "via": "lei-records-filter",
          "country_match": null
        },
        {
          "lei": "5299005CHJZ14D4FDJ62",
          "legalName": "Siemens Energy AG",
          "score": 0.6667,
          "jurisdiction": "DE",
          "legal_address_country": "DE",
          "status": "ACTIVE",
          "registration_status": "ISSUED",
  
...
```

</details>

- **Sanctions screening**: fuzzy-matches the name against the **live U.S. OFAC SDN sanctions list** (names, aliases, a.k.a.s).
- **LEI lookup**: finds the company in the **GLEIF LEI register** (Legal Entity Identifier), and resolves an LEI if you have one.

You get one clean JSON result per company: OFAC potential match yes/no, similarity score, sanctions programs, best LEI match, legal name, country and entity status. Batch up to 100 companies per run. **$0.05 per company check**, and failed or invalid checks are free.

Good for KYB (Know Your Business) and AML onboarding, supplier and counterparty checks, B2B payments, vendor due diligence, and AI agents that need a quick "is this company sanctioned, and what is its LEI?" answer.

> **Directional screening only, not a clearance.** This Actor returns *potential* name matches with similarity scores. It is not a legal or compliance determination, clearance, certification or attestation. It is not OFAC, not GLEIF, not an LOU and not a bank substitute. False positives and false negatives are possible. Verify against official U.S. Treasury / OFAC and GLEIF publications and your own counsel.

### What it does

For each company you give it:

1. **OFAC SDN screen**: fuzzy-matches the name against every SDN primary name, alias and "a.k.a." in the remarks. The list is downloaded fresh from the public U.S. Treasury files at the start of every run.
2. **GLEIF LEI match**: finds legal entities with similar names in the free public GLEIF API, with LEI, legal name, country, entity status and registration status.
3. **LEI resolve** (optional): if you pass an LEI, it looks up that exact record too.
4. **Country** (optional): narrows the LEI search to that legal-address country, and flags OFAC hits with an address in that country. OFAC hits in other countries are **still returned**, never hidden.

### Pricing

Pay per event: **$0.05 per `kyb-check`** ($50 per 1,000 companies), meaning one company checked and one dataset item saved.

- Invalid input (for example a 1-letter name) is **not charged**.
- If an upstream source fails mid-check, that company is **not charged**.
- If you set a maximum cost per run, the Actor stops cleanly at that limit and does not check or charge the rest.

### Input

Single company:

```json
{ "name": "Sberbank of Russia", "country": "RU" }
```

With an LEI to resolve:

```json
{ "name": "Apple Inc.", "lei": "HWUPKR0MPOU8FGXBT394" }
```

Batch (up to 100 per run, each one is one `kyb-check`):

```json
{
  "companies": [
    { "name": "Siemens AG", "country": "DE" },
    { "name": "Apple Inc.", "lei": "HWUPKR0MPOU8FGXBT394" },
    { "name": "Sberbank of Russia", "country": "RU" }
  ]
}
```

| Field | Type | Notes |
|---|---|---|
| `name` | string | Company legal or trade name (2–256 characters). |
| `country` | string | Optional. 2-letter ISO code, e.g. `DE`. |
| `lei` | string | Optional. 20-character LEI. |
| `companies` | array | Optional batch of `{name, country?, lei?}`. |
| `threshold` | number | OFAC similarity threshold, 0–1, default `0.55`. |
| `limit` | integer | Max OFAC hits and LEI matches per company, 1–50, default `10`. |

### Output

One dataset item per company. Abbreviated example for a sanctioned-entity hit:

```json
{
  "status": "ok",
  "query": { "name": "Sberbank of Russia", "country": "RU", "lei": null, "threshold": 0.55, "limit": 10 },
  "summary": {
    "ofac_potential_match": true,
    "ofac_hit_count": 3,
    "ofac_top_score": 1,
    "ofac_top_name": "PUBLIC JOINT STOCK COMPANY SBERBANK OF RUSSIA",
    "ofac_top_programs": ["UKRAINE-EO13662", "RUSSIA-EO14024"],
    "gleif_match_count": 1,
    "gleif_best_match": { "lei": "549300WE6TAF5EEWQS81", "status": "ACTIVE", "country": "RU" },
    "lei_resolved": null,
    "note": "Potential OFAC SDN name match(es): review manually against official Treasury data."
  },
  "ofac": { "hit_count": 3, "hits": [ { "score": 1, "match_via": "alias", "country_match": true, "entity": { "ent_num": "…", "name": "…", "programs": ["…"], "aliases": ["…"], "addresses": ["…"] } } ], "list_as_of": "2026-10-02" },
  "gleif": { "match": { "matches": [ { "lei": "…", "legalName": "…", "legal_address_country": "RU", "status": "ACTIVE" } ] }, "resolve": null },
  "list_as_of": { "ofac": "2026-10-02", "gleif": "2026-10-08T00:00:00Z" },
  "banner": "DIRECTIONAL ONLY — not clearance/attestation; not OFAC/GLEIF/LOU; false positives/negatives possible; potential_matches_only.",
  "disclaimer": "Directional KYB entity diligence check only …",
  "potential_matches_only": true,
  "not_clearance": true,
  "charged": true
}
```

A company with no OFAC hit gets `"ofac_potential_match": false` and the note *"No OFAC SDN name match at or above the threshold. This is NOT a clearance."*

Items that weren't charged have `"status": "invalid_input"` or `"upstream_error"`, an `error` message, and `"charged": false`.

### Use from an AI agent (MCP, API)

This Actor is built for agent use: pay-per-event, one result per call, limited permissions, no browser and no proxy.

- **Apify MCP server**: add `https://mcp.apify.com?tools=sefran1/kyb-company-check` to any MCP client (Claude, Cursor, VS Code, your own agent). The Actor shows up as the tool `sefran1--kyb-company-check`. Agents using the default MCP setup can also find it with `search-actors` (try "KYB company check") and run it with `call-actor`.
- **Apify API**:

```bash
curl -X POST "https://api.apify.com/v2/acts/sefran1~kyb-company-check/run-sync-get-dataset-items" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{"name":"Sberbank of Russia","country":"RU"}'
```

Need a wallet or name-only OFAC screen (no LEI)? See [OFAC Sanctions Screen](https://apify.com/sefran1/ofac-sanctions-screen).

### FAQ

**Is this a KYB API?** Yes, a lightweight one: a company sanctions check (OFAC SDN) plus LEI lookup, returned as JSON. It does not pull company registry filings, UBOs or officers.

**Which sanctions lists?** The U.S. OFAC SDN list, downloaded fresh from the U.S. Treasury at the start of every run. EU, UK and UN lists are not included yet.

**What is an LEI?** A Legal Entity Identifier, the 20-character global ID for legal entities, published by GLEIF. If the company has one, this Actor finds it.

**How much does it cost?** $0.05 per company checked. Invalid input and upstream errors are not charged. Set a maximum cost per run and the Actor stops cleanly at that limit.

**Is a "no match" result a clearance?** No. It is directional screening only. Always verify against official sources.

### Data sources

- **OFAC SDN**: public U.S. Treasury files `sdn.csv`, `alt.csv` and `add.csv`, fetched at run start. `list_as_of.ofac` is the date of the Treasury file.
- **GLEIF**: public GLEIF API (`api.gleif.org`), CC0 data. `list_as_of.gleif` is the GLEIF golden-copy publish date.

Not affiliated with, endorsed by or certified by the U.S. Treasury, OFAC, GLEIF or any LOU.

### Limits

- The OFAC screen covers names only. It does not check ownership (the 50% rule), other sanctions lists (EU, UK, UN) or adverse media.
- Name matching is fuzzy. Transliterations and very short or common names can produce false positives or misses.
- GLEIF only covers entities that have an LEI.

# Actor input Schema

## `name` (type: `string`):

Legal or trade name to check, e.g. "Siemens AG". Use this for a single check, or use the companies list below for several.

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

2-letter ISO country code of the company's legal address, e.g. "DE". Narrows the LEI search and flags OFAC hits whose address is in that country. OFAC hits elsewhere are still returned.

## `lei` (type: `string`):

20-character Legal Entity Identifier. When given, the LEI record is resolved too.

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

Check several companies in one run. Each item: {"name": "...", "country": "US", "lei": "..."}. country and lei are optional. Max 100 per run. Each company is one kyb-check event.

## `threshold` (type: `number`):

Minimum name-similarity score (0 to 1) for an OFAC potential match. Lower finds more, with more false positives.

## `limit` (type: `integer`):

Maximum OFAC hits and GLEIF matches returned per company (1 to 50).

## Actor input object example

```json
{
  "name": "Siemens AG",
  "threshold": 0.55,
  "limit": 10
}
```

# Actor output Schema

## `results` (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 = {
    "name": "Siemens AG"
};

// Run the Actor and wait for it to finish
const run = await client.actor("sefran1/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 = { "name": "Siemens AG" }

# Run the Actor and wait for it to finish
run = client.actor("sefran1/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 '{
  "name": "Siemens AG"
}' |
apify call sefran1/kyb-company-check --silent --output-dataset

```

## MCP server setup

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