# Business Entity Check: CO, CT, NY, OR, TX registries (`pelicanlabs/business-entity-check`) Actor

Enrich lead lists with registered-entity status and formation date from the states' own open-data files. Feed it names, entity IDs, or a Google Maps / lead scraper dataset; no cap on rows. $0.004 per matched row, unmatched rows are free.

- **URL**: https://apify.com/pelicanlabs/business-entity-check.md
- **Developed by:** [Jacob](https://apify.com/pelicanlabs) (community)
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 1,000 matched businesses

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

## Business Entity Check: LLC status and age from official state registries

Is this business a real, active registered entity, and how old is it? This actor appends registry status and formation date to every row of a lead list, read from the states' own open-data entity files:

| State | Source | What you get |
|---|---|---|
| Colorado | Department of State, Business Entities (data.colorado.gov) | every status since 1864 (good standing, delinquent, dissolved, withdrawn...), type, formation date, registered agent, principal address |
| Connecticut | Secretary of the State, Business Registry master and agents (data.ct.gov) | every status, including annual report past due and administrative dissolution started; formation date, registered agent |
| New York | Department of State, Active Corporations (data.ny.gov) | active entities only; type, initial filing date, registered agent where filed, location |
| Oregon | Secretary of State, Active Businesses (data.oregon.gov) | active entities and assumed business names only; type, registry date, registered agent, principal place of business |
| Texas | Comptroller, Active Franchise Taxpayers (data.texas.gov) | right to transact (active / forfeited), SOS status, charter date, type, address; no registered agent in this file |

No live Secretary of State search pages are queried and no CAPTCHAs are touched. Every row carries `source_as_of` (the date of the state's file) and `source_url`.

### Input

- `queries`: a list of `{"state": "CO", "entity_name": "Acme Roofing LLC", "city": "Denver"}` or `{"state": "TX", "entity_id": "0802687829"}`. Full state names work too. City or ZIP is optional and only re-ranks name matches.
- `datasetId`: the ID of a dataset from a Google Maps or other lead scraper. Each item's `title` (or `name`, `companyName`, `company`, `businessName`) is checked as the business name in its `state`; `city` and `postalCode` re-rank matches; the item's address, phone, website and URL are copied to the output row. Use `nameField` / `stateField` if your scraper names them differently.
- **No row cap.** The dataset is read 1,000 items at a time and every row is checked. `maxItems` is an optional stop.

### Output (one row per input row)

`matched`, `status` (`active`, `delinquent`, `inactive`, `other`, `not_found`), `status_raw` (the state's own wording), `entity_name`, `entity_id`, `state`, `entity_type`, `formation_date`, `age_years`, `age_days`, `registered_agent`, `principal_address` {city, state, zip}, `match_confidence`, `location_match`, `source_url`, `dataset_url`, `source_as_of`, `possible_matches`, `coverage_note`.

`null` means the state does not publish that field. Name matches scoring under 0.8 are listed in `possible_matches` with `matched: false`.

### Pricing

$0.004 per matched row. Unmatched and invalid rows are free.

### Integrations

Use this actor from n8n, Make, Google Sheets, Clay or Zapier with your own Apify token (Apify Console > API & Integrations). Every integration makes the same call:

```
POST https://api.apify.com/v2/acts/pelicanlabs~business-entity-check/run-sync-get-dataset-items?memory=256
Authorization: Bearer <your Apify token>
Content-Type: application/json

{"queries":[{"state":"CO","entity_name":"Advisory House"},{"state":"TX","entity_name":"Example Roofing LLC"}]}
```

The response is a JSON array with one item per input row. The main fields are `status`, `matched`, `entity_name`, `entity_id`, `entity_type`, `formation_date`, `age_years`, `registered_agent`, `principal_address`, `match_confidence`, `source_url`, `source_as_of`.

**Send a list in one request.** Each request is one actor run, and each run has a start-up time of several seconds and a small Apify start fee. A batch of 500 rows costs the same start-up as a batch of 1. The n8n workflow and the Google Sheets menu send batches. Clay, Zapier and the Sheets formula send one row per run, which suits small volumes.

| Tool | What you get | Download |
|---|---|---|
| n8n | Workflow to import: reads a Google Sheet, sends up to 500 unchecked rows in one run, writes the results back | [business-entity-check.json](https://business-entity-check.pages.dev/integrations/n8n/business-entity-check.json) |
| Make | Blueprint (HTTP module, one run per batch); setup steps for the new HTTP app are below | [business-entity-check.blueprint.json](https://business-entity-check.pages.dev/integrations/make/business-entity-check.blueprint.json) |
| Google Sheets | Apps Script: `=ENTITY_CHECK("Advisory House", "CO")` for single cells, and a menu item that checks a selected range in batches of 200 | [pelican-checks.gs](https://business-entity-check.pages.dev/integrations/google-sheets/pelican-checks.gs) |
| Clay | HTTP API enrichment column (steps below) | - |
| Zapier | Webhooks by Zapier, Custom Request (steps below) | - |

**n8n:** in the workflow menu (three dots), choose Import from File, or Import from URL with the link above. Open *Run actor (run-sync)* and create a **Header Auth** credential with Name `Authorization` and Value `Bearer <your token>`. In *Read rows* and *Write results*, choose your sheet. Row 1 needs the columns `Company Name`, `State` plus the result columns listed in the workflow's note.

**Make:** create a scenario, open the three-dots menu, choose Import Blueprint and select the file. In the HTTP module, add an API key keychain that sends `Authorization: Bearer <your token>` in the header. Edit `input_json` in the first module, or map it from your sheet. Then add an Iterator on the HTTP module's `Data` to get one bundle per row. To build the same flow on the new HTTP app (version 4) instead, use the *Make a request* module with the method, URL, header and body shown above.

**Google Sheets:** in your sheet, open Extensions > Apps Script, paste the file and save, then reload the sheet. Choose *Pelican checks > Set Apify token*. Then either type the formula, or select your rows and choose *Check selected rows: business entity* (select two columns: name, state). Results are written to the columns to the right of your selection. Rows that already have a result are skipped, so you can run it again to continue. A formula must finish within Google's 30-second limit for custom functions, so use the menu for anything more than a few rows.

**Clay:** Add enrichment > HTTP API > Configure.

- Method: `POST`
- Endpoint: `https://api.apify.com/v2/acts/pelicanlabs~business-entity-check/run-sync-get-dataset-items?memory=256&timeout=60`
- Headers: `Authorization` = `Bearer <your token>`. You can save this as a header account so the token is not shown in the table.
- Body: `{"queries": [{"state": "/State", "entity_name": "/Company Name"}]}`. Replace the `/Column Name` parts with your own columns: type `/` to insert one.
- Clay sends one request, and so one actor run, per row. The response is an array with one item. Run a single row first, then add the fields you want (`status` first) as columns.

**Zapier:** use the *Webhooks by Zapier* action *Custom Request*.

- Method: `POST`
- URL: `https://api.apify.com/v2/acts/pelicanlabs~business-entity-check/run-sync-get-dataset-items?memory=256&timeout=25`
- Data: the JSON body above, with your Zap's fields mapped in.
- Headers: `Authorization` = `Bearer <your token>` and `Content-Type` = `application/json`.
- Zapier stops a step after about 30 seconds, so send one row per Zap run. Apify's own Zapier app also has *Run Actor and Fetch Results*, which works if you prefer it.

Pricing: $0.004 per matched business (unmatched rows are free), billed by Apify to the account that owns the token.

### Limits

- Five states. A business registered in another state comes back with an error row (free).
- New York, Oregon and Texas publish active entities only, so a dissolved business there returns `not_found`, not `inactive`.
- Matching is by normalized name (LLC, Inc, punctuation removed) with token overlap. A Google Maps title that is a trade name, not the registered name, may not match.
- Not a certificate of good standing. The files lag the registries by days to weeks; confirm with the state before relying on a result.

# Actor input Schema

## `queries` (type: `array`):

Each item: {"state": "CO" | "CT" | "NY" | "OR" | "TX", "entity_name": "..."} or {"state": ..., "entity_id": "..."}. Optional "city" and "zip" re-rank name matches. Full state names work too.

## `datasetId` (type: `string`):

ID of a dataset from a Google Maps or other lead scraper run. Each item's title / name / companyName is checked as the business name in its state; city and postal code re-rank matches. Every row is checked, there is no row cap.

## `nameField` (type: `string`):

Dataset field holding the business name, if it is not title, name, companyName, company or businessName.

## `stateField` (type: `string`):

Dataset field holding the state, if it is not state or region.

## `defaultState` (type: `string`):

Used when a query or dataset item has no state.

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

Stop after this many rows. Leave empty to check every row.

## Actor input object example

```json
{
  "queries": [
    {
      "state": "CT",
      "entity_name": "Numisma Bank"
    },
    {
      "state": "CO",
      "entity_name": "Denver Gas Company"
    },
    {
      "state": "TX",
      "entity_id": "32063342011"
    }
  ]
}
```

# Actor output Schema

## `results` (type: `string`):

One row per query: matched entity, status, age, registered agent, source link.

## `resultsTable` (type: `string`):

No description

# 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 = {
    "queries": [
        {
            "state": "CT",
            "entity_name": "Numisma Bank"
        },
        {
            "state": "CO",
            "entity_name": "Denver Gas Company"
        },
        {
            "state": "TX",
            "entity_id": "32063342011"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("pelicanlabs/business-entity-check").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 = { "queries": [
        {
            "state": "CT",
            "entity_name": "Numisma Bank",
        },
        {
            "state": "CO",
            "entity_name": "Denver Gas Company",
        },
        {
            "state": "TX",
            "entity_id": "32063342011",
        },
    ] }

# Run the Actor and wait for it to finish
run = client.actor("pelicanlabs/business-entity-check").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 '{
  "queries": [
    {
      "state": "CT",
      "entity_name": "Numisma Bank"
    },
    {
      "state": "CO",
      "entity_name": "Denver Gas Company"
    },
    {
      "state": "TX",
      "entity_id": "32063342011"
    }
  ]
}' |
apify call pelicanlabs/business-entity-check --silent --output-dataset

```

## MCP server setup

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

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/jD5tv7wj778akSF39/builds/gSoG5iIStqlMXCpgn/openapi.json
