KYB Company Verification — Business Registry & LEI Check
Pricing
from $5.50 / 1,000 results
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
Maintained by CommunityActor stats
0
Bookmarked
4
Total users
2
Monthly active users
9 hours ago
Last modified
Categories
Features
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.
- 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. - A near name was presented as a match. Registry name search is not relevance-ranked.
Live: querying GLEIF for
Siemens AGreturns 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. WithmaxPerRegistry: 1that wrong company was the answer. Every row now carriesname_match_gradeandverification_outcome, and only an exact normalized name match is ever calledverified_exact_name_match. - A negative was over-read.
US-DEis the Delaware business licence list, not the Delaware corporate registry. Danone US, Inc. is a Delaware entity - Colorado publishesjurisdictonofformation: "DE"for it - andUS-DEreturnedexists: false. Every row now carriesregistry_scopeandregistry_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
| Registry | What was wrong | Now |
|---|---|---|
| US-CO | Registered Agent Resigned (663 live entities) matched the word "registered" and was reported active. | unknown, with the registry's own words in status_raw. |
| US-DE | Status 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-PA | typeofbusinessregistration 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-OR | Active 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
| Code | Registry | What a negative means here |
|---|---|---|
FR-INSEE | French national register (INSEE SIRENE + RNE) | No French entity matched. Says nothing about entities outside France. |
GLEIF | Global LEI register | No LEI matched. Most companies worldwide have no LEI, so this is not evidence the company does not exist. |
US-CO | Colorado SoS business entities (all statuses) | No Colorado-registered entity matched. |
US-CT | Connecticut SoS registrations (all statuses) | No Connecticut registration matched. |
US-NY | New York DOS, "Active Corporations: Beginning 1800" | No active New York corporation matched. A dissolved NY entity also returns false. |
US-OR | Oregon SoS, "Active Businesses - ALL" | No active Oregon registration matched. |
US-PA | Pennsylvania DOS, current registered businesses | No current Pennsylvania registration matched. |
US-DE | Delaware business licence list | No Delaware licence matched. Not evidence the company is not a Delaware-incorporated entity - the Delaware Division of Corporations publishes no open bulk dataset. |
US-TX | Texas 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_transact | Code | What the Comptroller publishes |
|---|---|---|
true | A | Active - the right to transact business is intact. |
true | D | Active - eligible for termination / withdrawal. |
false | N | Forfeited - typically for not filing a franchise-tax report or not paying the tax (471,180 taxpayers on 2026-11-12). |
false | I | Franchise tax involuntarily ended. |
null | U | Franchise 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.
truemeans 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.statuscombines them conservatively (an SOS ending or forfeiture wins; otherwise the right to transact decides) andstatus_rawshows 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
| Field | Meaning |
|---|---|
input_name | The company name you queried. |
registry | Registry code this row came from. |
verification_outcome | verified_exact_name_match, candidate_match_review_required, no_match_on_registry, or registry_unavailable_not_checked. |
outcome_reason | Plain-language explanation, including what a negative does and does not prove here. |
exists | Tri-state: true matched, false checked and no match, null not checked. |
name_match_grade | exact, strong, partial, weak, none. Only exact is a name verification. |
match_confidence | 0-1 token similarity after legal-form tokens are normalized away. null when not checked. |
matched_name | The registry's record name. |
entity_id | Registry identifier: SIREN, LEI, entity id, filing number, licence number. |
Status
| Field | Meaning |
|---|---|
status | Normalized active, inactive, dissolved, unknown. null when not checked. |
status_raw | The registry's own status string, before normalization. |
status_basis | fetched, implied_by_dataset_scope, or not_published_by_registry. |
Per-registry outcome contract (on every row)
| Field | Meaning |
|---|---|
registry_status | ok or unavailable for the registry this row came from. |
registry_error | Why it did not answer, when unavailable. |
registry_scope | What this registry actually covers. |
registry_false_means | What exists: false does and does not prove here. |
verification_complete | true only when every requested registry answered and passed its drift assertions. |
registries_requested | Every registry this run attempted. |
registries_checked | The ones that answered. The result is valid only against these. |
registries_unavailable | The ones that did not. null on a complete run. |
registry_errors | Per-registry failure detail. |
registries_expected_count, registries_checked_count | Coverage 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_status | ok / unavailable / not_requested per registry. |
The registry record
| Field | Meaning |
|---|---|
jurisdiction | Registry jurisdiction, e.g. US-CO, FR, GLOBAL. |
entity_type | Legal entity type as published. |
formation_date | Formation or first-registration date, YYYY-MM-DD. |
jurisdiction_of_formation | Where the entity was originally formed - often the key KYB fact. |
address | Principal or legal address. |
mailing_address | Mailing or agent address, where published separately. |
registered_agent | Registered agent or entity of record. |
officers | Directors, officers or agent name, where published. |
county | County of record (New York, Pennsylvania). |
legal_form, registration_authority, entity_category, other_names | GLEIF LEI attributes. |
trade_name, license_category, license_valid_from, license_valid_to | Delaware business-licence detail. |
activity_code, activity_section, employee_range | INSEE activity and size data for French entities. The INSEE API publishes no human-readable activity label, only the NAF code and section letter. |
source_url | Link to the registry record or search page. |
retrieved_at | ISO 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)
| Field | Meaning |
|---|---|
tx_taxpayer_number | 11-digit Comptroller taxpayer number (also entity_id). |
tx_right_to_transact | Tax 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_status | Raw code (A, D, N, I, U) and its Comptroller label. |
tx_sos_file_number, tx_sos_charter_date | Texas 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_code | SOS status as carried on the Comptroller roster (Active, Reinstated, Forfeited franchise tax, Merger, ...). |
tx_record_type | Texas 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_date | Active 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_numbers | How many Texas taxpayers share the exact normalized name, and the other taxpayer numbers. |
tx_status_basis | comptroller_franchise_tax_roster, or sales_tax_permit_only (found only on the sales-tax roster; status implied active). |
tx_match_scope | complete, or legal_suffix_variants_only for very common names. |
tx_drift_gate_status, tx_drift_gate_detail | verified / verified_degraded, and which live checks ran. |
tx_data_flags | Caveats: 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:
| Column | Input 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_errors | any run where a registry does not answer, e.g. {"companyName":"Danone","registries":["US-CO","US-XX"]} |
legal_form, registration_authority, other_names, entity_category | GLEIF rows only: {"companyName":"Danone","registries":["GLEIF"]} |
activity_code, activity_section, employee_range | FR-INSEE rows only: {"companyName":"Danone","country":"FR"} |
mailing_address | Colorado and Connecticut rows |
county | New 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
unavailablerather 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
Danonelegitimately returnsOLIVIA DANON), but at least one returned record must share a name token with the query. - a negative control: the nonsense name
Qzxjvbmpwl Kdfhrtynugs Holdingsis 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-itemsAuthorization: Bearer YOUR_APIFY_TOKENContent-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
countryacceptsUS,FR, or their names ("United States","USA","France"). Any other country searches the global GLEIF register only.- Omit
countryto 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.
Related actors
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).
| Actor | What it adds for you | Example workflow | Where both cover |
|---|---|---|---|
| Secretary of State Business Monitor | Search and monitoring on the same state registries: formation dates, registered agents and new-formation alerts | Use the monitor to find newly formed companies, then verify the ones you plan to onboard here | CO, CT, NY, OR, PA, DE, TX |
| Liquor License New Openings Tracker | New bar, restaurant and liquor-store licence applications naming the owner entity | Verify a new licensee's owner entity before extending trade credit | CO, CT, NY (Oregon rows carry a trade name only) |
| Childcare Provider Leads | Licensed childcare programs, with the legal entity (licensee_name) where the state publishes it | Verify a daycare's legal entity before onboarding it as a customer | NY, PA, CT; DE (business-licence list) |
| WARN Layoff Aggregator | Employers named in state layoff and closure notices | Confirm the registered entity behind a WARN notice | OR |
| License Verifier | Professional and occupational licences held by a business or its principals | Verify the company here and the licence it trades under there, for vendor onboarding | CO, CT, DE, NY, OR |
| Sanctions Screening List Change Monitor | OFAC / BIS / State denied-party screening | Screen the entity you just verified | Federal (US) lists |
| Medicaid Exclusion Screener | Federal and New York Medicaid exclusion screening | Clinician and healthcare-vendor checks after entity verification | Federal; NY |
| GLEIF Ownership Graph | Parent and subsidiary structure for an entity with an LEI | Trace who owns an entity once you have its LEI | Global |
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.