# KYB Company Check – Registry, LEI, VAT (`sfoln/kyb-company-check`)

Know-your-business check in one call: national business register (France, Norway, Finland, Czechia, Poland), GLEIF LEI with parent companies, live EU VAT validation (VIES) and a sanctions screen on OFAC, UN, EU and UK lists, with risk flags and a summary. $12 per 1,000 companies.

- Family: Compliance & public records
- Categories: Automation, Developer tools, AI
- Availability: on request (private on Apify). Email contact@sfoln.com with subject "Access request: KYB Company Check – Registry, LEI, VAT (sfoln/kyb-company-check)" before calling; calls fail until it is public.
- JSON: https://www.sfoln.com/actors/kyb-company-check.json
- MCP: https://mcp.apify.com?tools=sfoln/kyb-company-check
- REST (sync): POST https://api.apify.com/v2/actors/sfoln~kyb-company-check/run-sync-get-dataset-items
- REST (async): POST https://api.apify.com/v2/actors/sfoln~kyb-company-check/runs

KYB Company Check – Registry, LEI, VAT runs a know-your-business check on each company in one call: the national business register (France, Norway, Finland, Czech Republic, Poland), the GLEIF LEI record with its parent companies, a live EU VAT validation in VIES and a sanctions screen of the company and its parents against the OFAC, UN, EU and UK lists. Each company becomes one record with its legal identity, riskFlags, a riskLevel and a plain-language summary. Built for customer and supplier onboarding, payment and procurement checks, compliance tools and AI agents. $0.012 per company checked; companies that cannot be found are free.

## Price per delivered record

| Event | Price | Per 1,000 | Charged for |
| --- | --- | --- | --- |
| KYB company check (`kyb-check`) | $0.012 | $12 / 1,000 | One company checked: national register, GLEIF LEI and parents, VIES VAT validation and a sanctions screen, with risk flags and a summary. |

Pay-per-event, USD, billed by Apify; no platform usage charge. Only records with status `ok` are charged. Cap a run with `maxTotalChargeUsd`. Apify free plan: up to 10 per run.

## Run

```bash
curl -X POST "https://api.apify.com/v2/actors/sfoln~kyb-company-check/run-sync-get-dataset-items" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"companies":[{"name":"Equinor ASA","country":"NO"}]}'
```

MCP client configuration:

```json
{
  "mcpServers": {
    "apify": {
      "type": "http",
      "url": "https://mcp.apify.com?tools=sfoln/kyb-company-check"
    }
  }
}
```

Example prompt: Run a KYB check on Equinor ASA in Norway: is it active, what is its LEI and parent company, and is it on any sanctions list?

## Input

Companies to check, by name and country, LEI, VAT number or national registry id. Each company produces one dataset record with risk flags and a summary.

| Field | Type | Default | Meaning |
| --- | --- | --- | --- |
| `companies` | array | — | Companies: One object per company with any of name, country, lei, vatNumber, registryId, e.g. [{"name": "Equinor ASA", "country": "NO"}, {"lei": "969500KMUQ2B6CBAF162"}, {"vatNumber": "FR27552032534"}, {"country": "CZ", "registryId": "00177041"}]. A plain string is read as an LEI, a VAT number or a company name. Accounts on the Apify free plan can process up to 10 companies per run. |
| `companyNames` | array | — | Company names: Company names (or LEIs / VAT numbers), one per line; the country below applies to all of them. |
| `country` | string | — | Country: Default country for companies given without one (ISO code like FR or a country name). Registers searched by name: FR, NO, FI, CZ (PL by KRS number). |
| `screenSanctions` | boolean | `true` | Screen against sanctions lists: Screen the company's legal name (and the searched name and parent companies) against OFAC SDN and Consolidated, UN, EU and UK sanctions lists. |
| `sanctionsLists` | array | `["ofac-sdn","ofac-cons","un","eu","uk"]` | Sanctions lists: Lists to screen against (default: all five). |
| `sanctionsThreshold` | number | `0.85` | Sanctions match threshold: Minimum name score (0.5–1) for a sanctions list entry to count as a potential match. |
| `checkVat` | boolean | `true` | Validate VAT numbers (VIES): Validate the given VAT number, or the one the register shows (FR, FI, CZ, PL), live against VIES. |
| `requesterVatNumber` | string | — | Your VAT number (for consultation numbers): Optional: your own EU VAT number, so that VIES returns a consultation number for each check. |
| `includeParents` | boolean | `true` | Include parent companies: Add the direct and ultimate parents from GLEIF and screen their names too. |
| `minNameScore` | number | `0.8` | Minimum name score: How close (0.5–1) a register or GLEIF name must be to the searched name to be taken as the company. |
| `cacheMaxAgeHours` | integer | `24` | Sanctions list cache age (hours): Reuse sanctions lists your account downloaded within this many hours (kept in the key-value store "kyb-company-check-cache"); 0 downloads fresh copies. |
| `maxItems` | integer | `1000` | Max companies: Safety cap on companies per run; further companies are ignored and counted in the OUTPUT record. |
| `concurrency` | integer | `3` | Concurrency: Companies checked in parallel (GLEIF allows about 60 requests per minute). |
| `includeRaw` | boolean | `false` | Include raw source records: Attach the unmodified register record and GLEIF records under raw. |

Example input:

```json
{
  "companies": [
    {
      "name": "Equinor ASA",
      "country": "NO"
    }
  ]
}
```

## Output

One record per input item with `status` (`ok` is charged; `not_found`, `error`, `skipped_*` are free) and `charged`. The run stores an `OUTPUT` summary record.

| Field | Type | Meaning |
| --- | --- | --- |
| `input` | string | object | Input: The company as given: { name?, country?, lei?, vatNumber?, registryId? }. |
| `status` | string | Status: ok \| not_found \| error \| skipped_budget \| skipped_free_plan \| skipped_unmetered |
| `charged` | boolean | Charged: Whether this record incurred a pay-per-event charge. |
| `chargedEvent` | string | Charged event: Pay-per-event event charged for this record (present only when charged). |
| `chargedCount` | integer | Events charged: Events actually charged when the charge came back short of the requested count (present only then; a warning explains it). |
| `source` | string | Source: Upstream data source. |
| `fetchedAt` | string | Fetched at: ISO timestamp. |
| `error` | object | Error: { code, message, provider?, status? } when status is not ok. Codes set by the runtime: budget_exhausted, free_plan_limit, unmetered, aborted, charge_failed, record_too_large, invalid_record, dataset_push_failed; this Actor: not_found, sources_failed, name_required (known only from a valid VAT number without a name: not screened, not charged). |
| `warnings` | array | Warnings: Notes about this record, e.g. a sanctions list that was unavailable in this run. |
| `resolved` | boolean | Resolved: The company was found in a register, in GLEIF or as a valid VAT number. |
| `legalName` | string | null | Legal name: Legal name: register first, then GLEIF, then VIES, then the input. |
| `country` | string | null | Country: Country of registration (ISO 3166-1 alpha-2). |
| `entityStatus` | string | Entity status: active \| inactive \| unknown (register first, else GLEIF). |
| `registrationNumber` | string | null | Registration number: Id in the national register (SIREN, organisasjonsnummer, Y-tunnus, IČO, KRS) or the register id GLEIF holds. |
| `register` | string | null | Register: Name of the register. |
| `legalForm` | string | null | Legal form: Legal form name. |
| `incorporatedAt` | string | null | Incorporated: Incorporation or registration date. |
| `address` | string | null | Address: Registered address. |
| `website` | string | null | Website: Website as registered (NO, FI, PL). |
| `lei` | string | null | LEI: Legal Entity Identifier, when the company has one. |
| `vatNumber` | string | null | VAT number: VAT number given, published by the register or confirmed by VIES (null for a number built from the register id that VIES does not know). |
| `vatValid` | boolean | null | VAT valid: VIES answer for the VAT number (null: not checked, no answer, or no VAT registration for a number built from the register id). |
| `sanctionsMatchStatus` | string | null | Sanctions: potential_match or no_match for the company's names (null when not screened: no company name, or the lists could not be loaded). |
| `riskLevel` | string | Risk level: high, medium or low, from the risk flags. |
| `riskFlags` | array | Risk flags: sanctions_potential_match, parent_sanctions_potential_match, entity_inactive, insolvency_proceedings, vat_invalid (high); vat_name_mismatch, lei_lapsed, name_mismatch, not_found_in_registry, recently_incorporated, registry_unavailable, lei_unavailable, vat_unverified, sanctions_not_screened, sanctions_partial, company_not_found (medium). |
| `summary` | string | Summary: One-paragraph summary of the checks. |
| `registry` | object | null | Register record: Normalised register record: source, register, country, id, idType, name, otherNames, status, insolvency, statusDetail, legalForm, incorporatedAt, dissolvedAt, address, industryCode, industryDescription, employees, website, vatNumber, financials, registryUrl. |
| `leiRecord` | object | null | LEI record: GLEIF record: lei, legalName, entityStatus, registrationStatus, legalForm, addresses, registrationAuthority, nextRenewalDate, directParent, ultimateParent, exceptions … |
| `vat` | object | null | VAT check: vatNumber, source (input, register, or derived: built from the register id), formatValid, valid, name, address, requestDate, consultationNumber, nameMatchScore, note. |
| `sanctions` | object | null | Sanctions screen: screened, matchStatus (null when not screened), bestScore, matches, parents (screens of the parent companies), listsComplete, listsStale, listsScreened, listsVersion. |
| `checks` | object | Checks: Per source (registry, lei, vat, sanctions): status ok \| not_found \| unsupported \| skipped \| invalid \| unavailable \| error, with source and message. |
| `checkedAt` | string | Checked at: ISO timestamp. |
| `raw` | object | Raw records: Unmodified register and GLEIF records (only with includeRaw). |

Example record:

```json
{
  "input": {
    "name": "Equinor ASA",
    "country": "NO"
  },
  "status": "ok",
  "charged": true,
  "chargedEvent": "kyb-check",
  "source": "kyb",
  "fetchedAt": "2026-10-14T22:58:52.980Z",
  "resolved": true,
  "legalName": "EQUINOR ASA",
  "country": "NO",
  "entityStatus": "active",
  "registrationNumber": "923609016",
  "register": "Brønnøysund Register Centre (Norway)",
  "legalForm": "Allmennaksjeselskap",
  "incorporatedAt": "1972-09-18",
  "address": "Forusbeen 50, 4035 STAVANGER, Norge",
  "website": "www.equinor.com",
  "lei": "OW6OFBNCKXC4US5C7523",
  "vatNumber": "NO923609016MVA",
  "vatValid": true,
  "sanctionsMatchStatus": "no_match",
  "riskLevel": "low",
  "riskFlags": [],
  "summary": "EQUINOR ASA (NO) is active in Brønnøysund Register Centre (Norway) (organisasjonsnummer 923609016). LEI OW6OFBNCKXC4US5C7523 is ISSUED. VAT number NO923609016MVA is valid. No sanctions match on 5 lists. Risk: low.",
  "registry": {
    "source": "no-brreg",
    "register": "Brønnøysund Register Centre (Norway)",
    "country": "NO",
    "idType": "organisasjonsnummer",
    "id": "923609016",
    "name": "EQUINOR ASA",
    "otherNames": [
      "Den norske stats oljeselskap a.s",
      "STATOIL ASA",
      "STATOILHYDRO ASA"
    ],
    "status": "active",
    "insolvency": null,
    "legalForm": "Allmennaksjeselskap",
    "incorporatedAt": "1972-09-18",
    "address": "Forusbeen 50, 4035 STAVANGER, Norge",
    "industryCode": "06.100",
    "industryDescription": "Utvinning av råolje",
    "employees": "21231",
    "website": "www.equinor.com",
    "vatNumber": "NO923609016MVA",
    "vatNumberSource": "register",
    "registryUrl": "https://virksomhet.brreg.no/oppslag/enheter/923609016"
  },
  "leiRecord": {
    "lei": "OW6OFBNCKXC4US5C7523",
    "legalName": "EQUINOR ASA",
    "entityStatus": "ACTIVE",
    "registrationStatus": "ISSUED",
    "legalForm": {
      "code": "IQGE",
      "name": "Allmennaksjeselskap"
    },
    "registrationAuthority": {
      "id": "RA000472",
      "name": "The Register of Business Enterprises",
      "entityId": "923 609 016"
    },
    "nextRenewalDate": "2027-11-09T18:00:00Z",
    "bic": [
      "SASANO22XXX"
    ],
    "directParent": null,
    "directParentException": {
      "category": "DIRECT_ACCOUNTING_CONSOLIDATION_PARENT",
      "reason": "NATURAL_PERSONS"
    },
    "ultimateParent": null,
    "gleifUrl": "https://search.gleif.org/#/record/OW6OFBNCKXC4US5C7523"
  },
  "vat": {
    "vatNumber": "NO923609016MVA",
    "source": "register",
    "formatValid": true,
    "valid": true,
    "name": null,
    "address": null,
    "requestDate": null,
    "consultationNumber": null,
    "nameMatchScore": null,
    "note": "Registered for VAT (MVA) in the Norwegian register; Norway is not part of VIES."
  },
  "sanctions": {
    "screened": true,
    "matchStatus": "no_match",
    "bestScore": 0.626,
    "matches": [],
    "parents": [],
    "listsComplete": true,
    "listsStale": false,
    "listsScreened": [
      "ofac-sdn",
      "ofac-cons",
      "un",
      "eu",
      "uk"
    ],
    "listsVersion": {
      "ofac-sdn": {
        "list": "ofac-sdn",
        "name": "OFAC Specially Designated Nationals (SDN) List",
        "status": "ok",
        "sourceUrls": [
          "https://sanctionslistservice.ofac.treas.gov/api/PublicationPreview/exports/SDN.CSV"
        ],
        "fetchedAt": "2026-10-14T22:58:38.350Z",
        "publishedAt": "2026-10-14T14:02:30.000Z",
        "recordCount": 19430,
        "fromCache": false
      }
    }
  },
  "checks": {
    "registry": {
      "status": "ok",
      "source": "no-brreg",
      "message": "Matched by name (score 1)."
    },
    "lei": {
      "status": "ok",
      "source": "gleif"
    },
    "vat": {
      "status": "ok",
      "source": "no-brreg"
    },
    "sanctions": {
      "status": "ok",
      "source": "sanctions-lists"
    }
  },
  "checkedAt": "2026-10-14T22:58:51.185Z"
}
```

## FAQ

**Which countries have a business register check?**

France (Sirene / RNE by SIREN or name), Norway (Brønnøysund by organisation number or name), Finland (PRH YTJ by Y-tunnus or name), the Czech Republic (ARES by IČO or name) and Poland (KRS by KRS number). Companies elsewhere are checked through GLEIF, VIES and the sanctions lists; their records say registry: unsupported.

**What do the risk flags mean?**

High: sanctions_potential_match, parent_sanctions_potential_match, entity_inactive, insolvency_proceedings, vat_invalid. Medium: vat_name_mismatch, lei_lapsed, name_mismatch, not_found_in_registry, recently_incorporated, registry_unavailable, lei_unavailable, vat_unverified, sanctions_not_screened, sanctions_partial, company_not_found. riskLevel is high, medium or low accordingly.

**Is a company I cannot find charged?**

No. When no register, GLEIF record or valid VAT number matches and its name is not a potential sanctions match, the record has status not_found and is free. A company known only from a valid VAT number whose name VIES withholds (e.g. Germany) cannot be screened: it is returned free with error.code name_required; add the company name.


## Related

- [Sanctions Screening – OFAC, EU, UK, UN Lists](https://www.sfoln.com/actors/sanctions-screening.md) (`sfoln/sanctions-screening`)
- [LEI Lookup – GLEIF Legal Entity Search](https://www.sfoln.com/actors/lei-lookup.md) (`sfoln/lei-lookup`)
- [EU VAT Number Validator (VIES)](https://www.sfoln.com/actors/vat-number-validator.md) (`sfoln/vat-number-validator`)
- [Website Contact Details Scraper](https://www.sfoln.com/actors/company-contacts-finder.md) (`sfoln/company-contacts-finder`)
- [Domain WHOIS & DNS Lookup](https://www.sfoln.com/actors/domain-intelligence.md) (`sfoln/domain-intelligence`)

Publisher: SFOLN LLC, contact@sfoln.com. Catalogue: https://www.sfoln.com/catalog.json. Agent guide: https://www.sfoln.com/agents.md.
