Quick answer
Batch-verifying US company names against official state business registries sounds like a solved problem until you notice that two of the four state open-data feeds behind this Actor don't publish a status column at all. The OpenCorporates Alternative Scraper queries New York, Colorado, Connecticut, and Oregon's own free Secretary-of-State datasets and normalizes them into one 16-field schema, but it also tells you — honestly, per row — which states can and can't confirm whether a company is still alive. Result rows are $0.005 each plus a $0.005 run-start charge; 1,000 matched rows costs $5.005.
The status field that two states don't publish 🔍
Here's the trap. If you build a KYB (know-your-business) screen and filter on "active companies only," you're implicitly trusting that every row's status field means what it says. For half the jurisdictions this Actor covers, it can't.
New York's and Oregon's Secretary-of-State open-data portals — the actual government-published Socrata datasets, not opencorporates.com — do not expose a status/standing column. Not "sometimes blank," not "hidden behind auth." The dataset simply has no such field. Colorado and Connecticut do publish one, with real vocabularies: Colorado ships values like "Good Standing," "Delinquent," "Administratively Dissolved," and "Withdrawn"; Connecticut ships "Active," "Forfeited," "Dissolved," "Revoked," "Merged." Both get mapped through an explicit lookup table into a normalized active / inactive / unknown bucket.
NY and OR don't have that lookup because there's nothing to look up. So every row from those two states carries status_normalized: "active" — not because we verified the company is in good standing, but because that's the only honest default when the state itself doesn't say otherwise. If you run statusFilter: "active", NY and OR rows always pass, regardless of whether the underlying entity dissolved five years ago. We'd rather ship that plainly than fabricate a status column the states never gave us.
The knock-on effect: dissolution_date is only ever populated for Connecticut. NY and OR don't publish it, so it stays null there too — consistent with the same underlying data gap, not a separate bug.
Other quirks the per-state adapters absorb 🧩
Four state registries, four completely different field-naming conventions, one shared schema — that's most of what this Actor actually does.
Colorado's registered-agent name is assembled, not read. CO publishes either an organization name or a person's first/middle/last/suffix — never both, and never as one combined field. We build registered_agent_name by checking for the org name first, then joining the person-name parts when it's absent, so downstream consumers get one string instead of four columns to reconcile themselves.
New York's address has a documented fallback. Many small NY filers leave the standard location_* address columns entirely blank and only populate the dos_process_* (process-agent) address fields. When the primary address map comes back empty, principal_address falls back to those columns rather than emitting a null that a fuller record could have avoided.
Oregon's dataset is long-format, not one-row-per-entity. OR publishes multiple rows per business — one per associated-name type (principal address, mailing address, registered agent). We group by registry_number and merge the matching rows into a single result row, so you get one record per company like every other jurisdiction, not a set of fragments you'd have to join yourself.
Connecticut is the only state with officer data in v1, and even there we deliberately don't surface everything the raw dataset contains — home addresses are present in CT's principals dataset and are never read into the output. Only business addresses make it into officers[].address.
What we handle for you 🛡️
-
We rotate browser fingerprints via
curl-cffiimpersonation, so every request to the state's Socrata API looks like a real browser TLS handshake. -
We retry with exponential backoff on
408 / 429 / 5xx, up to 5 attempts, honoringRetry-After. - We degrade gracefully per state — if one state's SODA endpoint hiccups mid-batch, that state is skipped with a logged warning and the rest of your query batch keeps running instead of the whole run failing.
-
We keep the dataset clean — every row is Pydantic-validated with
extra="forbid", ISO-8601 timestamps, and a consistent cross-state schema despite the four source datasets sharing almost no field names in common. - You pay only for matched entity rows that land. No data, no charge, beyond the small run-start warm-up fee.
Full output schema 📦
Sixteen fields per matched (query, jurisdiction) row:
| Field | Type | Notes |
|---|---|---|
query |
string | The search_queries entry 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 |
enum | NY / CO / CT / OR |
entity_type |
string | null | As filed (e.g. DOMESTIC BUSINESS CORPORATION) |
status |
string | null | Raw state status label — null for NY, OR |
status_normalized |
enum |
active / inactive / unknown — see the caveat above for NY/OR |
formation_date |
string | null | ISO YYYY-MM-DD |
dissolution_date |
string | null | ISO YYYY-MM-DD, CT only in v1 |
principal_address |
string | null | Flattened single-line address |
registered_agent_name |
string | null | Assembled per-state (see CO note above) |
registered_agent_address |
string | null | Flattened single-line address |
officers |
list[Officer] | CT only, business address only, when fetchOfficers=true
|
source_record_url |
string | Direct SODA resource + row ID |
registry_url |
string | Human-readable state dataset landing page |
scraped_at |
string | ISO 8601 UTC |
Who this is for
Compliance and KYB teams doing first-pass entity verification before a deeper manual check — this Actor tells you what the state's own record says, and flags exactly where that record is silent.
Sales and lead-gen teams confirming a prospect's claimed company actually exists on file, at the address they gave you, before a rep spends time on it.
Fintech and lending underwriting pulling formation date and entity type as a first automated pass, paired with our Professional License Lookup Scraper or USPTO Trademark Scraper for a broader diligence picture.
Frequently asked questions
Does this replace OpenCorporates?
No — it's a self-serve alternative that queries the states' own free, keyless open-data APIs directly, not opencorporates.com. Coverage is 4 states in v1 (NY, CO, CT, OR), not the 18-state breadth some incumbents advertise.
Why is status_normalized always "active" for New York and Oregon?
Because those states' open-data datasets don't publish a status field. We default to active rather than guessing, and document the gap on every row rather than hiding it.
What does 5,000 matched rows cost?
$25.005 — 5,000 × $0.005, plus the $0.005 run-start charge.
Can I get officer/principal names for every state?
Only Connecticut publishes a principals dataset in v1. Set fetchOfficers: true to resolve it per matched CT row; other states return an empty officers list.
Try it
Live on the Apify Store: OpenCorporates Alternative Scraper.
Feed it a list of company names, pick your jurisdictions, and get back typed, dedupe-friendly rows — with the gaps in each state's own data labeled instead of papered over.
Built by Devil Scrapes — we build scrapers for the targets that fight back.
Top comments (0)