KYB Company Verification — Business Registry & LEI Check avatar

KYB Company Verification — Business Registry & LEI Check

Pricing

from $5.50 / 1,000 results

Go to Apify Store
KYB Company Verification — Business Registry & LEI Check

KYB Company Verification — Business Registry & LEI Check

Company verification and KYB screening by name: checks Colorado, Connecticut, New York, Oregon, Pennsylvania and Delaware state registries, France (INSEE SIRENE) and the global GLEIF LEI register in one call. Per registry: exists, status, IDs, officers, address, match confidence. Keyless.

Pricing

from $5.50 / 1,000 results

Rating

0.0

(0)

Developer

Kyle Maloney

Kyle Maloney

Maintained by Community

Actor stats

0

Bookmarked

4

Total users

2

Monthly active users

9 hours ago

Last modified

Features

Limited permissions

Share

KYB Company Verifier - Cross-Registry Business Verification API

Verify a company name against nine official, keyless company registries in one call and get, per registry: whether a record exists, the normalized legal status, jurisdiction, identifiers, formation date, registered agent, officers, and a graded name match.

Coverage at a glance: Colorado, Connecticut, New York, Oregon, Pennsylvania, Delaware (business-licence list) and Texas (Comptroller franchise-tax roster, with tax standing) state registries, plus France (INSEE SIRENE) and the global GLEIF register - see Registries covered. Lead feeds whose businesses you can verify here are listed at the end of this page.

This is a screening and grounding tool over public government registries. It is not a KYB, AML or compliance determination. A registry record is evidence, not a decision. Confirm identifiers against the source registry before onboarding, contracting or paying.

The rule this actor now enforces: a partial check is never presented as a complete one

Three things could previously make a partial verification look like a finished one. All were reproduced live and fixed on 2026-08-01.

  1. A registry that failed was skipped entirely - no row, no field, nothing. You got seven rows instead of eight and no way to tell which registry was never checked. If every registry failed, the run emitted zero rows and reported SUCCESS: a silent, confident "we found nothing". Now every unreachable registry emits an explicit row with exists: null, registry_status: "unavailable" and the error, and a run where no registry answered fails and bills nothing.
  2. A near name was presented as a match. Registry name search is not relevance-ranked. Live: querying GLEIF for Siemens AG returns ten records with zero exact matches, led by Siemens Energy AG (CH) - a different, spun-off company - at confidence 0.667. GLEIF registers the parent as Siemens Aktiengesellschaft, which is not on page one at all. With maxPerRegistry: 1 that wrong company was the answer. Every row now carries name_match_grade and verification_outcome, and only an exact normalized name match is ever called verified_exact_name_match.
  3. A negative was over-read. US-DE is the Delaware business licence list, not the Delaware corporate registry. Danone US, Inc. is a Delaware entity - Colorado publishes jurisdictonofformation: "DE" for it - and US-DE returned exists: false. Every row now carries registry_scope and registry_false_means, spelling out what a negative on that particular registry does and does not prove.

exists is tri-state: true matched, false the registry answered and nothing matched, null the registry was not checked. Never read null as a negative.

Three status defects fixed at the same time

RegistryWhat was wrongNow
US-CORegistered Agent Resigned (663 live entities) matched the word "registered" and was reported active.unknown, with the registry's own words in status_raw.
US-DEStatus was hard-coded to Licensed (so, active) while the licence expiry date was fetched and thrown away. An expired Delaware licence read as active.Status is computed from current_license_valid_to; an expired licence is inactive.
US-PAtypeofbusinessregistration was mapped to status. All 18 distinct live values are entity types ("Domestic Limited Liability Company"), so every one of ~4.5M rows produced unknown from a column that never held a status.PA publishes no status: status_basis says not_published_by_registry, and the value is surfaced in entity_type where it belongs.
US-NY / US-ORActive was hard-coded.Still active - the datasets are scoped to active registrations - but status_basis now reads implied_by_dataset_scope, not fetched.

status_raw carries the registry's own string on every row. The normalizer collapses 15 distinct Colorado statuses and 26 Connecticut ones into four buckets, and status_raw is what was actually published.

Who it's for

  • KYB / AML onboarding and vendor-risk teams grounding a company claim in an official registry record before contracting or paying.
  • Sales and RevOps enriching and de-duplicating accounts with a registry identifier.
  • Fintech and marketplace compliance confirming a merchant entity exists and is in good standing in its stated jurisdiction.
  • AI agents that need a chainable verification tool which can say "not checked" rather than guessing.

Registries covered

CodeRegistryWhat a negative means here
FR-INSEEFrench national register (INSEE SIRENE + RNE)No French entity matched. Says nothing about entities outside France.
GLEIFGlobal LEI registerNo LEI matched. Most companies worldwide have no LEI, so this is not evidence the company does not exist.
US-COColorado SoS business entities (all statuses)No Colorado-registered entity matched.
US-CTConnecticut SoS registrations (all statuses)No Connecticut registration matched.
US-NYNew York DOS, "Active Corporations: Beginning 1800"No active New York corporation matched. A dissolved NY entity also returns false.
US-OROregon SoS, "Active Businesses - ALL"No active Oregon registration matched.
US-PAPennsylvania DOS, current registered businessesNo current Pennsylvania registration matched.
US-DEDelaware business licence listNo Delaware licence matched. Not evidence the company is not a Delaware-incorporated entity - the Delaware Division of Corporations publishes no open bulk dataset.
US-TXTexas Comptroller franchise-tax roster ("Active Franchise Taxpayers", 3.5M taxpayers, forfeited ones included) joined on taxpayer number to the active sales-tax permit roster (893k outlets). Exact normalized-name match only.No Texas taxpayer has this exact name. Near names are never returned, so a different legal name, a DBA, different punctuation or a name over 50 characters (the roster truncates names) will not match - search the Comptroller by taxpayer number before concluding.

Iowa was removed in July 2026: data.iowa.gov migrated off Socrata and every Iowa request returned the portal's HTML 404 page.

Texas (US-TX): tax standing, not just existence

Added 2026-11-13. Texas publishes no open Secretary of State registry, but the Texas Comptroller of Public Accounts publishes its franchise-tax roster, which carries the SOS file number, SOS charter date and SOS status for every chartered entity plus the Comptroller's own "right to transact business" code. That makes US-TX the one registry here that says whether an entity is current on a state tax obligation.

tx_right_to_transactCodeWhat the Comptroller publishes
trueAActive - the right to transact business is intact.
trueDActive - eligible for termination / withdrawal.
falseNForfeited - typically for not filing a franchise-tax report or not paying the tax (471,180 taxpayers on 2026-11-12).
falseIFranchise tax involuntarily ended.
nullUFranchise tax not established - no standing to report.

What it means, and its limits. It is a screening signal, not a legal determination:

  • A forfeited right to transact is serious (in Texas it can bar the entity from suing in Texas courts and expose officers to personal liability for the entity's debts), but it is often cured by filing and paying, and the roster is refreshed weekly, so it can lag a reinstatement or a new forfeiture by days.
  • true means the Comptroller lists the right as active. It is not a Certificate of Account Status, says nothing about other taxes, licences or litigation, and is not the same as good standing with the Secretary of State.
  • The SOS status and the Comptroller status are separate facts and can disagree. Live example: DANONE USA, INC. - SOS status Active, right to transact Forfeited. status combines them conservatively (an SOS ending or forfeiture wins; otherwise the right to transact decides) and status_raw shows both, verbatim.
  • For a legal determination, obtain a Certificate of Account Status from the Comptroller.

Matching. Only an exact normalized name match is returned, using the same normalizer as every other registry (case, punctuation and legal-form words such as INC, LLC and CO are ignored). Danone does not return DANONE US, LLC. Because legal-form words are ignored, Danone US, Inc. does match DANONE US, LLC - check entity_type and the taxpayer number before acting. When several Texas taxpayers share the exact normalized name, the row is candidate_match_review_required, lists the others in tx_other_taxpayer_numbers, and shows the one ranked first (right to transact, then SOS standing, then newest). Names longer than 50 characters are truncated on the roster, so they can only come back as a review candidate (tx_data_flags: registry_name_truncated_at_50_chars). For very common names (more than 1,000 Texas taxpayers starting with the same words) only the exact name plus common legal-suffix spellings are compared, and tx_match_scope says so.

Always exactly one US-TX row per company: the match, the review candidate, a no_match_on_registry row, or - if Texas cannot be checked - a registry_unavailable_not_checked row with exists: null. A Texas outage is never reported as "not found".

Live checks on every run (tx_drift_gate_status): each name-search row is re-checked against the exact predicate that was sent; row-count floors on both rosters (franchise at least 2.5M, sales at least 600k); a nonsense-name negative control must match nothing; a positive canary (Southwest Airlines Co., taxpayer 17415632409) must be found with every required column populated; at least 99% of right-to-transact codes must be known codes (unknown ones are surfaced); and the roster must have been updated within 60 days. A failed check makes the US-TX row "not checked". A corroborating check that cannot run (a timeout) is disclosed as verified_degraded, never hidden. Transient errors (429, 5xx, timeouts) are retried inside a 45-second budget.

On by default. US-TX is in the default registry set and in country: "US". It runs in parallel with the other registries and finishes before the slowest of them (about 5-9 seconds on the Apify platform, against roughly 20 seconds for the full fan-out), so it does not lengthen a default run: a same-minute A/B of the prefilled example measured 23.04 s before and 23.26 s after. It always returns exactly one row. That is one extra billed row per company for callers who do not pass registries. To keep the previous eight-registry behaviour, pass an explicit registries list without US-TX.

Example input

{ "companyName": "Danone", "maxPerRegistry": 5 }

Restrict the fan-out with country (FR or US; GLEIF is global and always included) or with an explicit registries list. maxPerRegistry caps candidates per registry, ranked by name-match confidence - but read name_match_grade rather than assuming the top row is the company you meant.

{ "companyName": "Acme Holdings LLC", "registries": ["US-CO", "US-NY", "GLEIF"] }

Texas tax standing only:

{ "companyName": "Southwest Airlines Co.", "registries": ["US-TX"] }

Output fields (73)

Verification verdict

FieldMeaning
input_nameThe company name you queried.
registryRegistry code this row came from.
verification_outcomeverified_exact_name_match, candidate_match_review_required, no_match_on_registry, or registry_unavailable_not_checked.
outcome_reasonPlain-language explanation, including what a negative does and does not prove here.
existsTri-state: true matched, false checked and no match, null not checked.
name_match_gradeexact, strong, partial, weak, none. Only exact is a name verification.
match_confidence0-1 token similarity after legal-form tokens are normalized away. null when not checked.
matched_nameThe registry's record name.
entity_idRegistry identifier: SIREN, LEI, entity id, filing number, licence number.

Status

FieldMeaning
statusNormalized active, inactive, dissolved, unknown. null when not checked.
status_rawThe registry's own status string, before normalization.
status_basisfetched, implied_by_dataset_scope, or not_published_by_registry.

Per-registry outcome contract (on every row)

FieldMeaning
registry_statusok or unavailable for the registry this row came from.
registry_errorWhy it did not answer, when unavailable.
registry_scopeWhat this registry actually covers.
registry_false_meansWhat exists: false does and does not prove here.
verification_completetrue only when every requested registry answered and passed its drift assertions.
registries_requestedEvery registry this run attempted.
registries_checkedThe ones that answered. The result is valid only against these.
registries_unavailableThe ones that did not. null on a complete run.
registry_errorsPer-registry failure detail.
registries_expected_count, registries_checked_countCoverage of this run.
fr_insee_status, gleif_status, us_co_status, us_ct_status, us_ny_status, us_or_status, us_pa_status, us_de_status, us_tx_statusok / unavailable / not_requested per registry.

The registry record

FieldMeaning
jurisdictionRegistry jurisdiction, e.g. US-CO, FR, GLOBAL.
entity_typeLegal entity type as published.
formation_dateFormation or first-registration date, YYYY-MM-DD.
jurisdiction_of_formationWhere the entity was originally formed - often the key KYB fact.
addressPrincipal or legal address.
mailing_addressMailing or agent address, where published separately.
registered_agentRegistered agent or entity of record.
officersDirectors, officers or agent name, where published.
countyCounty of record (New York, Pennsylvania).
legal_form, registration_authority, entity_category, other_namesGLEIF LEI attributes.
trade_name, license_category, license_valid_from, license_valid_toDelaware business-licence detail.
activity_code, activity_section, employee_rangeINSEE activity and size data for French entities. The INSEE API publishes no human-readable activity label, only the NAF code and section letter.
source_urlLink to the registry record or search page.
retrieved_atISO 8601 timestamp of the query.

Everything in the last block except address, officers, jurisdiction, source_url and retrieved_at was already being fetched on every run since v1.0 and thrown away.

Texas (US-TX rows only; absent on every other registry's rows)

FieldMeaning
tx_taxpayer_number11-digit Comptroller taxpayer number (also entity_id).
tx_right_to_transactTax standing, tri-state: true active, false forfeited or ended, null not established, unrecognised or not checked. See the Texas section.
tx_right_to_transact_code, tx_franchise_tax_statusRaw code (A, D, N, I, U) and its Comptroller label.
tx_sos_file_number, tx_sos_charter_dateTexas SOS file or certificate-of-authority number, and charter date (can be future-dated: Texas allows a delayed effective date).
tx_sos_status, tx_sos_status_codeSOS status as carried on the Comptroller roster (Active, Reinstated, Forfeited franchise tax, Merger, ...).
tx_record_typeTexas SOS entity, foreign entity with a Texas certificate of authority, or Comptroller-assigned number with no SOS record.
tx_sales_tax_permit_status, tx_sales_tax_outlets, tx_sales_tax_first_sales_dateActive sales-tax permits for the taxpayer, joined on taxpayer number: active_permit_on_file / no_active_permit_on_file / null (not checked), outlet count, earliest first-sales date.
tx_exact_match_count, tx_other_taxpayer_numbersHow many Texas taxpayers share the exact normalized name, and the other taxpayer numbers.
tx_status_basiscomptroller_franchise_tax_roster, or sales_tax_permit_only (found only on the sales-tax roster; status implied active).
tx_match_scopecomplete, or legal_suffix_variants_only for very common names.
tx_drift_gate_status, tx_drift_gate_detailverified / verified_degraded, and which live checks ran.
tx_data_flagsCaveats: future_dated_sos_charter, sales_tax_first_sales_date_in_future, sos_status_and_right_to_transact_disagree, registry_name_truncated_at_50_chars, not_on_franchise_tax_roster, unknown_right_to_transact_code:X, unknown_sos_status_code:X.

On US-TX rows the shared columns carry: entity_type (decoded Comptroller organization type), formation_date (SOS charter date), jurisdiction_of_formation (TX for a Texas SOS entity; null for a foreign entity, whose home state the roster does not publish), county (Texas addresses only), activity_code (NAICS) and address (taxpayer mailing address).

Sparse columns, with verified populating inputs

A dead-column audit over 22 live rows from the prefill (2026-08-01) found the Delaware licence block empty, because Danone holds no Delaware business licence. Each sparse column has an input recorded here so it can be re-verified:

ColumnInput that populates it (verified live 2026-08-01)
trade_name, license_category, license_valid_from, license_valid_to{"companyName":"Verizon","registries":["US-DE"]} returns VERIZON SERVICES CORP, category GENERAL SERVICES, valid 2026-01-01 to 2026-12-31
registry_error, registries_unavailable, registry_errorsany run where a registry does not answer, e.g. {"companyName":"Danone","registries":["US-CO","US-XX"]}
legal_form, registration_authority, other_names, entity_categoryGLEIF rows only: {"companyName":"Danone","registries":["GLEIF"]}
activity_code, activity_section, employee_rangeFR-INSEE rows only: {"companyName":"Danone","country":"FR"}
mailing_addressColorado and Connecticut rows
countyNew York and Pennsylvania rows (and US-TX rows with a Texas address)
tx_*US-TX rows only. Active with sales-tax permits: {"companyName":"Southwest Airlines Co.","registries":["US-TX"]}; forfeited: {"companyName":"Vydrotech, Inc.","registries":["US-TX"]} (verified live 2026-11-12)

Live drift assertions

The dangerous failure here is not an outage. It is a registry that answers HTTP 200 with rows that were never actually filtered - arbitrary companies that read as matches. Every run asserts, before any billable row:

  • the name filter was really applied: every row a Socrata registry returns must contain the queried substring in its name column. One that does not fails that registry, which is then reported as unavailable rather than letting unfiltered rows through as matches.
  • the dataset was not replaced: at least half the expected columns must still be present. An unknown Socrata column simply comes back absent, which is indistinguishable from an empty value.
  • fuzzy results are related to the query: FR-INSEE and GLEIF run their own search, so containment cannot be asserted (querying Danone legitimately returns OLIVIA DANON), but at least one returned record must share a name token with the query.
  • a negative control: the nonsense name Qzxjvbmpwl Kdfhrtynugs Holdings is queried once per run and must match nothing. This is what catches a filter that has started matching everything.
  • Texas has its own gate (predicate re-check, row floors, negative control, Southwest Airlines canary, code vocabulary, freshness) - see the Texas section.
  • not one registry answered fails the run and bills nothing.

Use from an AI agent: quickstart

The smallest input that returns a real answer. Verified live on 2026-10-06: the run SUCCEEDED in about 13 seconds with 7 rows: Colorado matched exactly, five other US registries answered no match, and GLEIF was reported unavailable rather than guessed.

{
"companyName": "Danone US, Inc.",
"country": "US"
}

Call it through the hosted MCP server (https://mcp.apify.com?tools=malonestar/kyb-company-verifier) or straight over HTTP:

POST https://api.apify.com/v2/acts/malonestar~kyb-company-verifier/run-sync-get-dataset-items
Authorization: Bearer YOUR_APIFY_TOKEN
Content-Type: application/json

with the JSON above as the body. The response is a JSON array of dataset rows.

What comes back: one row per registry candidate (plus a row per registry that found nothing). Abbreviated row from a live run (a full row has up to 73 fields, all described in the output schema):

{
"input_name": "Danone US, Inc.",
"registry": "US-CO",
"exists": true,
"matched_name": "Danone US, Inc.",
"status": "active",
"name_match_grade": "exact",
"verification_outcome": "verified_exact_name_match",
"registry_status": "ok",
"verification_complete": false,
"registries_unavailable": "GLEIF"
}

Read before you conclude anything: registry_status, name_match_grade, verification_outcome and registry_false_means (what exists: false does and does not prove for that registry).

Input notes for agents

  • country accepts US, FR, or their names ("United States", "USA", "France"). Any other country searches the global GLEIF register only.
  • Omit country to search every registry (France, GLEIF and seven US states, Texas included).
  • maxPerRegistry (default 5) bounds the candidates per registry; a broad name like "Acme" returns up to 40 rows.

Cost: $0.0100 per row at the Free-tier list price (paid plans get a discount), so the example above costs about $0.070, plus $0.010 for the US-TX row added on 2026-11-13. A run that cannot answer fails and bills no rows.

Use as an MCP tool

Callable by AI agents (Claude, Cursor, etc.) via mcp.apify.com. An agent can verify a company and read back verification_outcome, name_match_grade, verification_complete and registry_false_means, so it can distinguish "verified", "candidate", "checked and absent" and "not checked" without guessing.

Pricing

Pay-per-result: one dataset record per registry match, per no-match verdict, or per unavailable registry. A run where no registry answered emits nothing and bills nothing beyond the fractional actor start.

Price per result: $0.01 on the Free plan ($10 per 1,000 results), effective 2026-10-10; runs before that date bill at the previous $0.003. Paid plans are discounted per result: Bronze $0.008, Silver $0.007, Gold $0.0055, Platinum $0.0055, Diamond $0.0055 (the Store page shows the price your plan pays). The prefilled example (companyName: "Danone", all nine registries, up to 5 candidates each) returns about 28 rows, so a Free-plan run costs roughly $0.28 and completes well inside the free monthly credit. A typical single-company check against one or two registries is 1-10 rows.

Was this useful?

If a run answered your question, a short review on this Store page helps other buyers find the Actor; every published review is read. If a run gave a wrong or confusing answer, open an Issue on this page with the run ID and it will be treated as a defect, not feedback.

FAQ

Does a false mean the company does not exist? No, and the row tells you what it does mean. Read registry_false_means. Most companies have no LEI, and most Delaware corporations hold no Delaware business licence.

Why does an exact-looking name come back as a candidate? Because registry name search is not relevance-ranked. Siemens AG on GLEIF returns Siemens Energy AG first. Only a match that is exact after legal-form normalization is graded exact.

What if a registry is down? You get a row with exists: null, registry_status: "unavailable" and the error, and verification_complete is false on every row of that run. Nothing is reported as "not found" that was not actually checked.

Do I need an API key? No. All nine sources are keyless public registries.

Is tx_right_to_transact: true a certificate of good standing? No. It is the Texas Comptroller's published right-to-transact code, refreshed weekly - a screening signal. For a legal determination obtain a Certificate of Account Status from the Comptroller.

Lead feeds whose businesses this actor can verify, and the screening actors that come after verification. The Where both cover column lists only the places both actors actually serve (see each actor's own Coverage table).

ActorWhat it adds for youExample workflowWhere both cover
Secretary of State Business MonitorSearch and monitoring on the same state registries: formation dates, registered agents and new-formation alertsUse the monitor to find newly formed companies, then verify the ones you plan to onboard hereCO, CT, NY, OR, PA, DE, TX
Liquor License New Openings TrackerNew bar, restaurant and liquor-store licence applications naming the owner entityVerify a new licensee's owner entity before extending trade creditCO, CT, NY (Oregon rows carry a trade name only)
Childcare Provider LeadsLicensed childcare programs, with the legal entity (licensee_name) where the state publishes itVerify a daycare's legal entity before onboarding it as a customerNY, PA, CT; DE (business-licence list)
WARN Layoff AggregatorEmployers named in state layoff and closure noticesConfirm the registered entity behind a WARN noticeOR
License VerifierProfessional and occupational licences held by a business or its principalsVerify the company here and the licence it trades under there, for vendor onboardingCO, CT, DE, NY, OR
Sanctions Screening List Change MonitorOFAC / BIS / State denied-party screeningScreen the entity you just verifiedFederal (US) lists
Medicaid Exclusion ScreenerFederal and New York Medicaid exclusion screeningClinician and healthcare-vendor checks after entity verificationFederal; NY
GLEIF Ownership GraphParent and subsidiary structure for an entity with an LEITrace who owns an entity once you have its LEIGlobal

Telemetry

This actor can send one usage record per run to the publisher: the channel the run was started from (Console, API, MCP, scheduler, ...), a timestamp, the build number, a salted one-way hash of the account id (so repeat use can be counted without storing the id itself), and the NAMES of the input fields used. It never records input values, results or the account id, and it is used only to see how buyers reach the actor. It cannot slow the run by more than 3 seconds and can never affect your results or your bill.