SFOLN

Catalogue / Compliance & public records

KYB Company Check – Registry, LEI, VAT

sfoln/kyb-company-check · Automation, Developer tools, AI On request

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.

About

What it does

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

Price per delivered record

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

Apify free plan: up to 10 items per run. Paid plans have no per-run cap; set maxTotalChargeUsd to cap spend.

Run

Call it from code, an agent or the Console

This API is private on Apify for now. Email us and we will publish it for you, usually within two working days. The calls below work once it is public. contact@sfoln.com

curl · synchronous run, rows in the response
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.json · hosted Apify MCP server
{
  "mcpServers": {
    "apify": {
      "type": "http",
      "url": "https://mcp.apify.com?tools=sfoln/kyb-company-check"
    }
  }
}
asynchronous run · for large batches
POST https://api.apify.com/v2/actors/sfoln~kyb-company-check/runs?maxTotalChargeUsd=1
GET  https://api.apify.com/v2/actor-runs/{runId}            # until status is SUCCEEDED
GET  https://api.apify.com/v2/datasets/{defaultDatasetId}/items?format=json

Authenticate with an Apify API token. MCP clients can instead sign in with OAuth when prompted. Example prompt for an agent: 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

Input fields

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.

FieldTypeDefaultMeaning
companiesarray—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.
companyNamesarray—Company names
Company names (or LEIs / VAT numbers), one per line; the country below applies to all of them.
countrystring—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).
screenSanctionsbooleantrueScreen 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.
sanctionsListsarray["ofac-sdn","ofac-cons","un","eu","uk"]Sanctions lists
Lists to screen against (default: all five).
sanctionsThresholdnumber0.85Sanctions match threshold
Minimum name score (0.5–1) for a sanctions list entry to count as a potential match. Range 0.5–1.
checkVatbooleantrueValidate VAT numbers (VIES)
Validate the given VAT number, or the one the register shows (FR, FI, CZ, PL), live against VIES.
requesterVatNumberstring—Your VAT number (for consultation numbers)
Optional: your own EU VAT number, so that VIES returns a consultation number for each check.
includeParentsbooleantrueInclude parent companies
Add the direct and ultimate parents from GLEIF and screen their names too.
minNameScorenumber0.8Minimum name score
How close (0.5–1) a register or GLEIF name must be to the searched name to be taken as the company. Range 0.5–1.
cacheMaxAgeHoursinteger24Sanctions 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. Range 0–24.
maxItemsinteger1000Max companies
Safety cap on companies per run; further companies are ignored and counted in the OUTPUT record. Range 1–10000.
concurrencyinteger3Concurrency
Companies checked in parallel (GLEIF allows about 60 requests per minute). Range 1–5.
includeRawbooleanfalseInclude raw source records
Attach the unmodified register record and GLEIF records under raw.
Example input
{
  "companies": [
    {
      "name": "Equinor ASA",
      "country": "NO"
    }
  ]
}

Output

One record per input item

Records land in the run's dataset; a synchronous call returns them directly. Each has a status (ok is charged; everything else is free) and a charged flag. The run's OUTPUT record totals items and charges.

FieldTypeMeaning
inputstring | objectInput
The company as given: { name?, country?, lei?, vatNumber?, registryId? }.
statusstringStatus
ok | not_found | error | skipped_budget | skipped_free_plan | skipped_unmetered e.g. "ok"
chargedbooleanCharged
Whether this record incurred a pay-per-event charge.
chargedEventstringCharged event
Pay-per-event event charged for this record (present only when charged).
chargedCountintegerEvents charged
Events actually charged when the charge came back short of the requested count (present only then; a warning explains it).
sourcestringSource
Upstream data source.
fetchedAtstringFetched at
ISO timestamp.
errorobjectError
{ 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).
warningsarrayWarnings
Notes about this record, e.g. a sanctions list that was unavailable in this run.
resolvedbooleanResolved
The company was found in a register, in GLEIF or as a valid VAT number.
legalNamestring | nullLegal name
Legal name: register first, then GLEIF, then VIES, then the input.
countrystring | nullCountry
Country of registration (ISO 3166-1 alpha-2).
entityStatusstringEntity status
active | inactive | unknown (register first, else GLEIF).
registrationNumberstring | nullRegistration number
Id in the national register (SIREN, organisasjonsnummer, Y-tunnus, IČO, KRS) or the register id GLEIF holds.
registerstring | nullRegister
Name of the register.
legalFormstring | nullLegal form
Legal form name.
incorporatedAtstring | nullIncorporated
Incorporation or registration date.
addressstring | nullAddress
Registered address.
websitestring | nullWebsite
Website as registered (NO, FI, PL).
leistring | nullLEI
Legal Entity Identifier, when the company has one.
vatNumberstring | nullVAT 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).
vatValidboolean | nullVAT valid
VIES answer for the VAT number (null: not checked, no answer, or no VAT registration for a number built from the register id).
sanctionsMatchStatusstring | nullSanctions
potential_match or no_match for the company's names (null when not screened: no company name, or the lists could not be loaded).
riskLevelstringRisk level
high, medium or low, from the risk flags.
riskFlagsarrayRisk 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).
summarystringSummary
One-paragraph summary of the checks.
registryobject | nullRegister 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.
leiRecordobject | nullLEI record
GLEIF record: lei, legalName, entityStatus, registrationStatus, legalForm, addresses, registrationAuthority, nextRenewalDate, directParent, ultimateParent, exceptions …
vatobject | nullVAT check
vatNumber, source (input, register, or derived: built from the register id), formatValid, valid, name, address, requestDate, consultationNumber, nameMatchScore, note.
sanctionsobject | nullSanctions screen
screened, matchStatus (null when not screened), bestScore, matches, parents (screens of the parent companies), listsComplete, listsStale, listsScreened, listsVersion.
checksobjectChecks
Per source (registry, lei, vat, sanctions): status ok | not_found | unsupported | skipped | invalid | unavailable | error, with source and message.
checkedAtstringChecked at
ISO timestamp.
rawobjectRaw records
Unmodified register and GLEIF records (only with includeRaw).
Example record
Example record
{
  "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

Questions

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.

Machine-readable

This page for agents