# US Business Entity Search (Secretary of State) (`memo23/us-business-entity-search`) Actor

Verify any US company in official state registries in one run. Bulk company names in, one normalized record per entity out: status, type, formation date, registered agent, officers, addresses, source link. 13 states incl. FL Sunbiz, TX, NY, NJ. For KYB, vendor checks, due diligence.

- **URL**: https://apify.com/memo23/us-business-entity-search.md
- **Developed by:** [Muhamed Didovic](https://apify.com/memo23) (community)
- **Categories:** Lead generation, Developer tools
- **Stats:** 2 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.50 / 1,000 business records

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

## US Business Entity Search (Secretary of State)

**Look up any company in official US state business registries, several states in one run.** Give it company names and get back one normalized record per entity: legal name, state file number, entity type, status, formation date, home jurisdiction, registered agent with address, officers and managers, principal and mailing addresses, and a link to the official source. 19 states with no key: Florida (Sunbiz), Texas, New York, New Jersey, Colorado, Connecticut, Oregon, Minnesota, Kentucky, Alabama, Idaho, West Virginia, North Dakota, Iowa, Wisconsin, Pennsylvania, Arkansas, Rhode Island and Missouri. California is the 20th, and it uses your own free CALICO key. JSON or CSV out, billed per record.

### How it works

![How US Business Entity Search works](https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/how-it-works-us-business-entity.png)

### ✨ Why use this scraper?

- **One schema for every state.** Each registry publishes different fields under different names. You get the same columns whether the record came from Sunbiz HTML, the Texas Comptroller API or a Socrata open-data feed.
- **Florida included.** Sunbiz is the registry most KYB checks need and the one most multi-state tools skip. This actor reads it, officers and authorized persons included.
- **Officers, not only names.** Florida, Texas, West Virginia, Connecticut, Minnesota and New York return directors, managers, members or the CEO with addresses where the state publishes them.
- **Bulk input.** Paste a list of company names. Every name runs against every selected state, in parallel.
- **Three match modes.** `contains`, `startsWith`, and `exact`, which ignores punctuation and legal-form words, so "Goldman Sachs" matches "GOLDMAN SACHS & CO. LLC".
- **Fails loudly.** A registry that is down shows up in `FAILED_SEARCHES` and in the run status, instead of a silent empty result.

### Overview

The actor queries each state's official source directly: public open-data APIs where the state publishes one, the state's own JSON endpoint where it exists, and the public search pages otherwise. No login and no browser. California is the only state that asks for a key, the free CALICO subscription key from [calicodev.sos.ca.gov](https://calicodev.sos.ca.gov). Leave states empty and that key out, and the run covers the other 19.

### Supported inputs

| State | Source | Match modes | Detail fields |
|---|---|---|---|
| **Florida** | Division of Corporations (Sunbiz) | starts with, exact | status, type, FEIN, filing date, last event, principal + mailing address, registered agent, officers / authorized persons |
| **Texas** | Comptroller of Public Accounts (franchise tax + SOS data) | all | SOS file number, SOS status, right to transact, formation state and date, registered agent, officers / managers, FEIN, DBA |
| **New York** | Department of State (data.ny.gov) | all | DOS ID, type, county, jurisdiction, filing date, registered agent, service-of-process address, chairman / CEO, principal location |
| **Colorado** | Secretary of State (data.colorado.gov) | all | entity ID, type, status, jurisdiction, formation date, principal + mailing address, registered agent |
| **Connecticut** | Secretary of the State (data.ct.gov) | all | account number, type, status, formation place and date, principal + mailing address, registered agent, principals, NAICS, business email |
| **Oregon** | Secretary of State (data.oregon.gov) | all | registry number, type, registry date, principal + mailing address, registered agent, authorized representative |
| **Minnesota** | Secretary of State (Business Filings) | all | file number, type, status, home jurisdiction, filing date, registered agent and office, CEO / manager, renewal due date |
| **Kentucky** | Secretary of State (Business Entity Search) | all | organization number, type, status, standing, home state, file date, last annual report, principal office, registered agent, industry, employees |
| **Alabama** | Secretary of State (Business Entity Records) | all | entity ID, type, status, place and date of formation, qualify date, principal + mailing address, registered agent and office |
| **Idaho** | Secretary of State (SOSbiz) | all | record number, type, status, standing, formed in, filing date, principal + mailing address, registered agent, annual report due date |
| **West Virginia** | Secretary of State (Business Organizations) | all | org ID, charter and class, charter state, filing date, termination, notice-of-process agent, principal + mailing address, officers, DBAs, business purpose |
| **New Jersey** | Division of Revenue & Enterprise Services | all | entity ID, type, city, incorporation date |
| **North Dakota** | Secretary of State (FirstStop) | all | record number, type, status, standing, filing date |
| **Iowa** | Secretary of State (Business Entities Search) | starts with (contains is filtered after a prefix search) | business number, type, status, filing date, registered agent, principal office, officers |
| **Wisconsin** | Department of Financial Institutions (Corporate Records) | all | entity ID, type, effective date, status. Detail adds the registered agent and principal office when the page publishes them |
| **Pennsylvania** | Department of State (data.pa.gov, current registrations) | all | filing number, type, formation date, address, county, parties (directors, officers, members) |
| **Arkansas** | Secretary of State (Corporation Search) | all | filing number, type, status, filing date, registered agent, officers, fictitious names, state of origin |
| **Rhode Island** | Department of State (Business Portal) | all | ID number, type, qualification date, NAICS, principal and mailing address, registered agent, officers |
| **Missouri** | Secretary of State (Business Entity Search) | all | charter number, type, status, formed date, home state, registered agent, principal office |
| **California** | Secretary of State CALICO API (your key) | contains, starts with | entity number, type, status, filing date, jurisdiction, agent, principal and mailing address, SOS/FTB standing |

**Not supported yet:**

- Other states. More registries are in progress; ask in the Issues tab if you need a specific one first.
- California without `caApiKey`. An all-states run skips California until you paste a key. Selecting California with no key fails that state and leaves the others running.
- Florida "contains" search. Sunbiz only searches by the start of the name, so `contains` behaves like `startsWith` there.
- New Jersey status, agent and officers. New Jersey sells these as paid business records; its free search lists name, ID, type, city and incorporation date only, so `status` and `isActive` are `null` for NJ rows and `activeOnly` cannot filter them.
- Kentucky officers. Kentucky loads them through a separate script call; the rest of the profile is returned.
- North Dakota officers and addresses. FirstStop's detail service returns an error for every record right now, so ND rows carry search-level fields only (`detailLevel: "listing"`).
- New York, Oregon and Pennsylvania inactive entities. Those open-data extracts publish current registrations only, so a dissolved company is absent rather than returned as inactive.
- Iowa prefix search. The registry matches the start of the name, so `contains` cannot find a word in the middle of an Iowa name.
- Pennsylvania registered agent. The open-data rows are parties (Governor, President, member), not a separate agent field, so `registeredAgent` is empty and those people are `officers`.
- Missouri officers. The free detail page publishes the registered agent and principal office, not the officer list.
- California officers. The CALICO search returns the agent and addresses, not directors.

### 🎯 Use cases

| Team | What they build |
|------|-----------------|
| **KYB / compliance** | Verify that a merchant, vendor or counterparty legally exists, is in good standing, and who its officers are |
| **Sales & lead generation** | Find where a company is registered, its registered agent and its decision makers |
| **Due diligence & M\&A** | Cross-check one company's filings across states: formation dates, foreign registrations, status changes |
| **Legal & collections** | Locate the registered agent and service-of-process address before serving papers |
| **Data enrichment** | Append official status, entity type and formation date to CRM or onboarding records |

### Under the hood

1. Each company name is paired with each selected state, and the searches run in parallel.
2. The adapter for each state queries that registry's own source and maps the answer onto the shared schema.
3. Names are matched in the chosen mode after normalizing punctuation, `&` and legal-form words.
4. With `includeDetails` on, the detail record is fetched for each match (officers, agent, addresses).
5. One dataset row is pushed per unique entity per state. An entity that matches two of your names is returned and billed once.

### Input configuration

| Field | Type | Default | Description |
|---|---|---|---|
| `companyNames` | array | — | Business names to look up. Required. |
| `states` | array | all no-key states | State codes: `FL`, `TX`, `NY`, `NJ`, `CO`, `CT`, `OR`, `MN`, `KY`, `AL`, `ID`, `WV`, `ND`, `IA`, `WI`, `PA`, `AR`, `RI`, `MO`, `CA` |
| `caApiKey` | string | — | Free California CALICO key. Required for `CA`. Stored as a secret. |
| `matchMode` | string | `contains` | `contains`, `startsWith` or `exact` |
| `maxResultsPerState` | integer | `10` | Records per name per state (max 200) |
| `includeDetails` | boolean | `true` | Fetch officers, agent and addresses |
| `activeOnly` | boolean | `false` | Skip dissolved, withdrawn, revoked and other inactive entities |
| `maxItems` | integer | `1000` | Cap on records for the whole run |
| `maxConcurrency` | integer | `4` | Parallel registry searches |
| `proxy` | object | none | Optional; the registries work without one |

#### Example input

```json
{
    "companyNames": ["Starbucks", "Goldman Sachs"],
    "states": ["FL", "TX", "NY", "CO"],
    "matchMode": "exact",
    "maxResultsPerState": 5,
    "includeDetails": true
}
```

### Output overview

One row per entity. Addresses share one shape (`street`, `city`, `state`, `zip`, `country`, `full`), and officers are a list of `{ name, title, address }`. Fields a registry does not publish are `null` (or `[]` for officers), never invented. `stateSpecific` holds extras only some states have: FEIN, DBA, NAICS, standing, last event, renewal dates.

### Output sample

```json
{
    "searchQuery": "Starbucks",
    "state": "FL",
    "stateName": "Florida",
    "entityName": "STARBUCKS CORPORATION",
    "entityId": "F94000004842",
    "entityType": "Foreign Profit Corporation",
    "status": "ACTIVE",
    "isActive": true,
    "jurisdiction": "WA",
    "formationDate": "1994-09-20",
    "principalAddress": {
        "street": "2401 Utah Avenue S.MS: S-LA1, Suite 800",
        "city": "Seattle",
        "state": "WA",
        "zip": "98134-1435",
        "country": null,
        "full": "2401 Utah Avenue S.MS: S-LA1, Suite 800, Seattle, WA 98134-1435"
    },
    "mailingAddress": {
        "street": "P.O. Box 34110",
        "city": "Seattle",
        "state": "WA",
        "zip": "98124-1110",
        "country": null,
        "full": "P.O. Box 34110, Seattle, WA 98124-1110"
    },
    "registeredAgent": {
        "name": "THE PRENTICE-HALL CORPORATION SYSTEM, INC.",
        "address": {
            "street": "1201 HAYS STREET",
            "city": "TALLAHASSEE",
            "state": "FL",
            "zip": "32301",
            "country": null,
            "full": "1201 HAYS STREET, TALLAHASSEE, FL 32301"
        }
    },
    "officers": [
        {
            "name": "Ford, Beth",
            "title": "Director",
            "address": {
                "street": "2401 Utah Avenue S.MS: S-LA1, Suite 800",
                "city": "Seattle",
                "state": "WA",
                "zip": "98134-1435",
                "country": null,
                "full": "2401 Utah Avenue S.MS: S-LA1, Suite 800, Seattle, WA 98134-1435"
            }
        }
    ],
    "stateSpecific": {
        "fein": "91-1325671",
        "lastEvent": "NAME CHANGE AMENDMENT",
        "lastEventDate": "2024-02-14"
    },
    "detailLevel": "full",
    "sourceUrl": "https://search.sunbiz.org/Inquiry/CorporationSearch/SearchResultDetail?inquirytype=EntityName&directionType=Initial&searchNameOrder=STARBUCKS%20F940000048420&aggregateId=forp-f94000004842-98da992f-f634-4270-af0f-16cbcac4df4c&searchTerm=STARBUCKS&listNameOrder=STARBUCKS%20F940000048420",
    "dataSource": "Florida Division of Corporations (Sunbiz)",
    "scrapedAt": "2026-10-02T06:08:15.041Z"
}
```

### Key output fields

| Field | Description |
|---|---|
| `entityName` | Legal name as the registry holds it |
| `entityId` | The state's own identifier: document number (FL), SOS file number (TX), DOS ID (NY), entity ID (NJ, CO, AL, CA), account number (CT), registry number (OR), file number (MN, AR), organization number (KY), org ID (WV), record number (ID, ND), business number (IA), DFI ID (WI), filing number (PA), identification number (RI), charter number (MO) |
| `entityType` | Entity type as the state words it, e.g. "Foreign Limited Liability Company" |
| `status` / `isActive` | Status text from the registry, plus a normalized `true` / `false` / `null` |
| `jurisdiction` | State or country of formation |
| `formationDate` | Formation or registration date in that state, `YYYY-MM-DD` |
| `registeredAgent` | `{ name, address }` |
| `officers` | `[{ name, title, address }]`: directors, officers, managers, members, authorized persons |
| `principalAddress` / `mailingAddress` | Address objects |
| `stateSpecific` | Extra fields by state (FEIN, DBA, NAICS, standing, last event, renewal date) |
| `detailLevel` | `full` when the detail record was read, `listing` when only the search row was |
| `sourceUrl` | Link to the record at the official source |
| `searchQuery` | The input name that produced this row |

### FAQ

**Is this data official?**
Yes. Every record comes from the state's own registry or the state's own open-data portal, and `sourceUrl` points back to it. Registries update on their own schedule (open-data feeds are refreshed daily to weekly).

**Why are some fields empty for one state and filled for another?**
States publish different things. Colorado's feed has no officers, Texas has no entity-type wording, New York names a registered agent only when the entity appointed one (otherwise the Secretary of State is the statutory agent and the service-of-process address is in `stateSpecific`).

**Why did a Florida search return names that only start with my query?**
Sunbiz only searches by the beginning of a name. Use `startsWith` or `exact` for predictable Florida results.

**Am I charged for searches that find nothing?**
No. Billing is per record in the dataset. A name that matches nothing in a state costs nothing.

**What happens when a state registry is down?**
The other states still run. The failed name/state pairs are saved to the `FAILED_SEARCHES` record and named in the run status. A run where every search fails ends as FAILED.

**Can I search by officer or registered agent name?**
Not yet. Searches are by business name.

### Your feedback

If this actor saves you time, a **short review on this page** helps other people find it. If a state, field or search mode is missing, open an issue first: requests usually ship within days.

### Support

- For issues or feature requests, please use the **Issues** tab of this actor on Apify Console.
- For further assistance, contact the author:
  - Author's website: <https://muhamed-didovic.github.io/>
  - Email: <muhamed.didovic@gmail.com>

### Additional services

- Request another state, a custom field set, or a private build: <muhamed.didovic@gmail.com>
- Need scheduled monitoring of a company portfolio (status, agent or officer changes) delivered to your database? Contact <muhamed.didovic@gmail.com>
- For API services of this actor, reach out to <muhamed.didovic@gmail.com>
- Explore other scrapers at [memo23's Apify profile](https://apify.com/memo23)

### Explore More Scrapers

- [**Handelsregister Scraper**](https://apify.com/memo23/handelsregister-scraper): the official German company register with officers, representation rules and name history
- [**Italy Company Registry Scraper**](https://apify.com/memo23/italy-company-registry-scraper): Registro Imprese records with VAT, REA, ATECO, financials and PEC email

### 🤖 For AI Agents & LLM Apps

Compact reference for AI agents calling this actor via the [Apify MCP server](https://mcp.apify.com) or the Apify API (actor: `memo23/us-business-entity-search`).

**Purpose:** Looks up US companies by name in official state business registries (FL, TX, NY, NJ, CO, CT, OR, MN, KY, AL, ID, WV, ND, IA, WI, PA, AR, RI, MO, and CA when `caApiKey` is set) and returns one normalized record per entity with status, type, formation date, registered agent, officers and addresses.

**Minimal input:**

```json
{ "companyNames": ["Acme Corp"], "matchMode": "exact" }
```

**Output:** searchQuery, state, stateName, entityName, entityId, entityType, status, isActive, jurisdiction, formationDate, principalAddress, mailingAddress, registeredAgent {name, address}, officers \[{name, title, address}], stateSpecific, detailLevel, sourceUrl, dataSource, scrapedAt. Address objects: street, city, state, zip, country, full.

**Behaviors an agent should know:**

- `states` empty means every no-key state. California is included only when `caApiKey` is set. Unsupported codes are skipped with a warning, never an error.
- Use `matchMode: "exact"` for verification (punctuation and LLC/Inc/Corp are ignored); `contains` for discovery.
- Florida and Iowa only support prefix search; `contains` cannot find a word in the middle of those names.
- `isActive` is `null` when the status text is ambiguous; check `status`.
- `includeDetails: false` returns name, ID, type and status faster, without officers and addresses.
- Failed registries are listed in the `FAILED_SEARCHES` key-value record; a run fails only if every search fails.
- Pay-per-event billing: a small actor-start fee plus one charge per record; see the Pricing tab.

### ⚠️ Disclaimer

This actor reads public business registration records that US state governments publish for anyone to search. It does not log in, bypass authentication, or access non-public data. You are responsible for using the data in line with each registry's terms of use and with laws that apply to you, including the FCRA, which does not allow this data to be used as a consumer report. The actor and its author are not affiliated with, endorsed by, or sponsored by any state government or Secretary of State office; agency names are used only to describe the sources the actor reads. Registry data can be out of date or incomplete; confirm critical facts with the issuing state before acting on them.

The author provides this actor "as is", without warranty of any kind, and disclaims any liability for damages arising from its use.

### SEO Keywords

secretary of state business search, business entity search, us business entity lookup, sunbiz scraper, florida business search, texas business entity search, new york dos entity search, colorado business search, connecticut business registry, oregon business registry, minnesota business search, north dakota business search, new jersey business search, kentucky business search, alabama business entity search, idaho business search, west virginia business search, kyb api, kyb verification, company registration lookup, registered agent lookup, llc lookup, corporation search, company officers lookup, business verification api, state business registry scraper, company formation date lookup, entity status check, vendor due diligence, merchant onboarding verification

# Actor input Schema

## `companyNames` (type: `array`):

Business names to look up. Each name is searched in every selected state. Blank and duplicate names are ignored. Legal-form words (LLC, Inc, Corp) are optional.

## `states` (type: `array`):

Registries to search. Leave empty to search every state that needs no key. California is included in that default only when a California API key is set.

## `matchMode` (type: `string`):

How a registry name must match your input. 'Contains' finds the name anywhere, 'Starts with' only at the beginning, 'Exact' ignores punctuation and legal-form words (Goldman Sachs matches GOLDMAN SACHS & CO. LLC). Florida and Iowa only search by the start of the name, so 'Contains' acts like 'Starts with' there.

## `maxResultsPerState` (type: `integer`):

Upper limit of records returned for each company name in each state.

## `includeDetails` (type: `boolean`):

Fetch each entity's detail record: officers, registered agent and addresses. Turn off for a faster name, ID and status check.

## `activeOnly` (type: `boolean`):

Skip dissolved, withdrawn, revoked and otherwise inactive entities.

## `maxItems` (type: `integer`):

Hard cap on records in the whole run, across all names and states.

## `maxConcurrency` (type: `integer`):

How many registry searches run at the same time.

## `caApiKey` (type: `string`):

Free California Secretary of State CALICO key. Required only when California is selected, or when you want California included in an all-states run. Get one at https://calicodev.sos.ca.gov.

## `proxy` (type: `object`):

Optional. The registries are public and usually work without a proxy. Set one only if a state starts refusing requests.

## Actor input object example

```json
{
  "companyNames": [
    "Starbucks"
  ],
  "states": [
    "FL",
    "TX",
    "NY"
  ],
  "matchMode": "contains",
  "maxResultsPerState": 5,
  "includeDetails": true,
  "activeOnly": false,
  "maxItems": 1000,
  "maxConcurrency": 4
}
```

# Actor output Schema

## `entities` (type: `string`):

Normalized Secretary of State records for every name and state searched.

## `failedSearches` (type: `string`):

Name and state pairs whose registry could not be reached in this run, with the error. Absent when every search worked.

# 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 = {
    "companyNames": [
        "Starbucks"
    ],
    "states": [
        "FL",
        "TX",
        "NY"
    ],
    "maxResultsPerState": 5
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/us-business-entity-search").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 = {
    "companyNames": ["Starbucks"],
    "states": [
        "FL",
        "TX",
        "NY",
    ],
    "maxResultsPerState": 5,
}

# Run the Actor and wait for it to finish
run = client.actor("memo23/us-business-entity-search").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 '{
  "companyNames": [
    "Starbucks"
  ],
  "states": [
    "FL",
    "TX",
    "NY"
  ],
  "maxResultsPerState": 5
}' |
apify call memo23/us-business-entity-search --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,memo23/us-business-entity-search"
        }
    }
}
```

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/NlOA7qw4D3XqCPbv5/builds/vqksH34AzuklarwpO/openapi.json
