# OpenCorporates Alternative — US Business Registry Scraper (`devilscrapes/opencorporates-alternative-scraper`) Actor

Batch-verify US company names against official state Secretary-of-State business registries (NY, CO, CT, OR) — get status, incorporation date, entity type, registered agent, and officer data (CT) as structured KYB / lead-gen rows. No API key, no login.

- **URL**: https://apify.com/devilscrapes/opencorporates-alternative-scraper.md
- **Developed by:** [DevilScrapes](https://apify.com/devilscrapes) (community)
- **Categories:** Lead generation
- **Stats:** 3 total users, 2 monthly users, 76.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 results

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

<div align="center">
  <img src=".actor/icon.svg" width="160" alt="Devil Scrapes mark" />

## OpenCorporates Alternative Scraper

**💰 $5.00 / 1 000 results**  ·  pay only for results  ·  no credit card to try

*We do the dirty work so your dataset stays clean.* 😈

Batch-verify US company names against official state Secretary-of-State business registries (NY, CO, CT, OR) — get status, incorporation date, entity type, registered agent, and officer data (CT) as structured KYB / lead-gen rows. No API key, no login.

</div>

***

### 🎯 What this scrapes

This Actor batch-verifies company names against **official state
Secretary-of-State open-data registries** — New York, Colorado,
Connecticut, and Oregon in v1 — and returns one structured row per
matched entity per state. Each row carries the state's on-file entity
name, status, entity type, formation date, principal address,
registered agent, and (Connecticut only) officer/principal names.

We built this as a self-serve alternative to subscription KYB/registry
tools: feed it a list of company names, get back structured,
Pydantic-validated rows you can pipe straight into a CRM, a
compliance workflow, or a spreadsheet. It queries the states' own
free, keyless Socrata open-data APIs directly — not
opencorporates.com, and not a scrape of any paywalled search UI.

### 🔥 What we handle for you

- 🛡️ **Browser fingerprint rotation** — `curl-cffi` impersonates real Chrome / Firefox / Safari TLS handshakes so every request looks like a browser, not Python.
- 🔁 **Retries with exponential backoff** on `408 / 429 / 5xx` — up to 5 attempts per request, `Retry-After` honoured.
- 🧱 **Graceful degradation per state** — if one state's dataset hiccups, that state is skipped with a warning; your batch keeps running.
- 🧊 **Clean, typed dataset rows** — Pydantic-validated, ISO-8601 timestamps, a shared cross-state schema despite each state publishing wildly different raw field names.
- 🔒 **Privacy-conscious by design** — Connecticut's principals dataset also publishes home addresses; we never surface them, only business addresses.
- 💰 **Pay-Per-Event pricing** — you only pay for matched entity rows that land in your dataset. No data, no charge (beyond the small warm-up fee).

### 💡 Use cases

- **KYB / onboarding checks** — batch-verify a list of business names before onboarding a new customer or vendor.
- **Sales & lead-gen prospecting** — confirm a prospect list is made of real, active, on-file entities before outreach.
- **Due-diligence research** — pull incorporation date, entity type, and registered-agent data for a target list of companies.
- **Journalism & investigations** — cross-check company names against official state filings, batch-style.
- **List hygiene** — drop companies whose `status_normalized` comes back `inactive` before you spend outreach budget on them.

### ⚙️ How to use it

1. Click **Try for free** at the top of the page.
2. Paste your company names into **Search queries** — one name per line (up to 500).
3. Optionally narrow **Jurisdictions** to just the states you care about, and adjust **Max results per query** / **Status filter**.
4. Click **Start**. Rows stream into the run's dataset as each name is resolved.
5. Export from **Storage → Dataset** as JSON, CSV, or Excel — or fetch via the API.

### 📥 Input

| Field | Type | Required | Default | Notes |
|---|---|:--:|---|---|
| `searchQueries` | `array` | **yes** | — | Company names to verify (1-500 entries, 1-200 chars each). |
| `jurisdictions` | `array` | no | `["NY","CO","CT","OR"]` | Which state registries to query per name. |
| `fetchOfficers` | `boolean` | no | `true` | Resolve officer/principal data (CT only in v1; 1 extra request per matched CT row). |
| `maxResultsPerQuery` | `integer` | no | `5` | Cap on matches returned per name, summed across jurisdictions (1-50). |
| `statusFilter` | `string` | no | `"any"` | Post-filter on normalized status: `any`, `active`, or `inactive`. |
| `proxyConfiguration` | `object` | no | `{"useApifyProxy": false}` | Optional — these are public open-data APIs, not known to fingerprint clients. |

#### Example input

```json
{
  "searchQueries": ["Acme Robotics LLC"],
  "jurisdictions": ["NY", "CO", "CT", "OR"],
  "fetchOfficers": true,
  "maxResultsPerQuery": 5,
  "statusFilter": "any",
  "proxyConfiguration": {"useApifyProxy": false}
}
```

### 📤 Output

Every row is one matched entity for one `(query, jurisdiction)` pair.

| Field | Type | Notes |
|---|---|---|
| `query` | `string` | The input name this row matched. |
| `entity_id` | `string` | State's internal id (`dos_id` / `entityid` / `id` / `registry_number`). |
| `entity_name` | `string` | State's on-file entity name. |
| `jurisdiction` | `string` | `NY`, `CO`, `CT`, or `OR`. |
| `entity_type` | `string \| null` | e.g. `DOMESTIC BUSINESS CORPORATION`, `DLLC`. |
| `status` | `string \| null` | Raw state status label (e.g. `Good Standing`). |
| `status_normalized` | `string` | `active`, `inactive`, or `unknown` — derived per-state. |
| `formation_date` | `string \| null` | ISO `YYYY-MM-DD`. |
| `dissolution_date` | `string \| null` | ISO `YYYY-MM-DD`, when the state publishes it. |
| `principal_address` | `string \| null` | Flattened single-line address. |
| `registered_agent_name` | `string \| null` | When published. |
| `registered_agent_address` | `string \| null` | Flattened single-line address. |
| `officers` | `array` | Officer/principal list — CT rows only, when `fetchOfficers=true`. |
| `source_record_url` | `string` | Direct link to the raw SODA record. |
| `registry_url` | `string` | The state's open-data dataset landing page. |
| `scraped_at` | `string` | ISO 8601 UTC timestamp this row was written. |

#### Example output

```json
{
  "query": "Acme Robotics LLC",
  "entity_id": "20251664337",
  "entity_name": "ACME ROBOTICS LLC",
  "jurisdiction": "CO",
  "entity_type": "DLLC",
  "status": "Good Standing",
  "status_normalized": "active",
  "formation_date": "2025-06-15",
  "dissolution_date": null,
  "principal_address": "9159 Anasazi Indian Trl, Highlands Ranch, CO 80129",
  "registered_agent_name": "ACME ROBOTICS LLC",
  "registered_agent_address": "9159 Anasazi Indian Trl, Highlands Ranch, CO 80129",
  "officers": [],
  "source_record_url": "https://data.colorado.gov/resource/4ykn-tg5h.json?entityid=20251664337",
  "registry_url": "https://data.colorado.gov/d/4ykn-tg5h",
  "scraped_at": "2026-07-18T12:00:00+00:00"
}
```

### 💰 Pricing

Pay-Per-Event — you pay only when these events fire:

| Event | USD | What it is |
|---|---:|---|
| `actor-start` | $0.005 | One-off warm-up charge per run |
| `result-row` | $0.005 | Per matched entity row written to the dataset |

Example: 1 000 matched rows ≈ **$5.00**. No subscription, no minimum,
no card to start — Apify gives every new account $5 of free credit.

### 🚧 Limitations

This is a **v1 with 4 confirmed states** (NY, CO, CT, OR) — not the
18-state coverage some incumbents advertise. We picked these four
because each publishes a free, keyless, machine-readable dataset
sourced from the state's own Secretary of State; adding a state is a
per-state adapter, not a schema break, so more are on the roadmap.
Officer/principal data is genuinely sparse: only Connecticut publishes
a separate principals dataset in v1, so `officers` is `[]` for
NY/CO/OR rows by design, not a bug. Dataset freshness varies by state
(New York's snapshot is explicitly "as of the last business day of the
month," not real-time). This Actor has no relationship with, and is
not affiliated with, opencorporates.com — it queries the states'
official open-data portals directly.

### 🔗 Use with n8n

Wire this Actor into your [n8n](https://n8n.io) automations with the official [Apify node](https://www.npmjs.com/package/@apify/n8n-nodes-apify):

1. Add the **Apify** node and pick the **Run Actor** operation.
2. Set the Actor to `devilscrapes/opencorporates-alternative-scraper` and pass your input as JSON.
3. Chain a **Get Dataset Items** step to read the structured rows into the rest of your workflow (Sheets, Slack, your CRM, an AI agent, …).

Because n8n runs on a schedule or trigger, you get fresh company registry records on autopilot — for example, KYB onboarding checks that automatically flag dissolved or delinquent entities before you sign a customer.

### ❓ FAQ

**Is this the same data as OpenCorporates?**

No. We query each state's own free, keyless Secretary-of-State
open-data API directly — not opencorporates.com. Same category of
buyer, different (and, for these four states, more current) data
source.

**Why only 4 states in v1?**

Those are the states we've confirmed publish a genuinely free, keyless
Socrata dataset sourced from their own Secretary of State — not a
scrape of a login-gated or Cloudflare-protected search UI. Adding a
5th state is a contained code change, not a rewrite; more states are
on the roadmap.

**Why is `officers` empty for most rows?**

Only Connecticut's registry publishes a separate officer/principal
dataset in v1. For NY, CO, and OR, `officers` is always `[]` — that's
documented behaviour, not a missed field.

**Can I search by entity ID instead of company name?**

Not in v1 — this release is name-search only. Direct ID lookup is a
straightforward addition without a schema break; let us know if you
need it.

**How current is the data?**

It's exactly as current as each state's own open-data snapshot. New
York's is explicitly monthly; Colorado, Connecticut, and Oregon appear
to update more frequently based on observed timestamps, but none of
these are real-time transactional lookups.

### 💬 Your feedback

Spotted a bug, hit a weird edge case, or need a 5th state added? Open
an issue on the Actor's **Issues** tab on Apify Console — we ship
fixes weekly and we read every report.

***

<div align="center">

Built by **[Devil Scrapes](https://apify.com/DevilScrapes)** 😈 — a small fleet of
opinionated public-data Actors. Honest pricing, real engineering, zero fine print.

</div>

# Actor input Schema

## `searchQueries` (type: `array`):

Company names to verify against state business registries (1-500 entries, 1-200 chars each).

## `jurisdictions` (type: `array`):

Which state Secretary-of-State registries to query per name.

## `fetchOfficers` (type: `boolean`):

Resolve the companion officer/principal dataset per matched entity. Only Connecticut publishes one in v1 (1 extra request per matched CT row).

## `maxResultsPerQuery` (type: `integer`):

Cap on candidate matches returned per input name, summed across jurisdictions.

## `statusFilter` (type: `string`):

Client-side post-filter on the normalized status\_normalized field.

## `proxyConfiguration` (type: `object`):

Optional — state open-data portals are public REST APIs and aren't known to fingerprint clients. Leave off unless you see 403/429.

## Actor input object example

```json
{
  "searchQueries": [
    "Blue Sky Consulting LLC"
  ],
  "jurisdictions": [
    "NY",
    "CO",
    "CT",
    "OR"
  ],
  "fetchOfficers": true,
  "maxResultsPerQuery": 5,
  "statusFilter": "any",
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `datasetItems` (type: `string`):

All dataset items as JSON.

## `datasetItemsCsv` (type: `string`):

Same data exported to CSV.

## `datasetView` (type: `string`):

Open the run dataset in the Console.

# 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 = {
    "searchQueries": [
        "Blue Sky Consulting LLC"
    ],
    "jurisdictions": [
        "NY",
        "CO",
        "CT",
        "OR"
    ],
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("devilscrapes/opencorporates-alternative-scraper").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 = {
    "searchQueries": ["Blue Sky Consulting LLC"],
    "jurisdictions": [
        "NY",
        "CO",
        "CT",
        "OR",
    ],
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("devilscrapes/opencorporates-alternative-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchQueries": [
    "Blue Sky Consulting LLC"
  ],
  "jurisdictions": [
    "NY",
    "CO",
    "CT",
    "OR"
  ],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call devilscrapes/opencorporates-alternative-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=devilscrapes/opencorporates-alternative-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/1Obmsfmc2Hf6CInJQ/builds/MLOIIUc24SgOQTTFf/openapi.json
