Connecticut Business Registry Scraper — SOTS avatar

Connecticut Business Registry Scraper — SOTS

Pricing

from $1.80 / 1,000 company scrapeds

Go to Apify Store
Connecticut Business Registry Scraper — SOTS

Connecticut Business Registry Scraper — SOTS

Search Connecticut's full business registry by name or account number, or stream new registrations since a date. Normalized records from data.ct.gov: status, account number, registration date, mailing address, ownership certifications. Complete registry, not only active companies. No proxy needed.

Pricing

from $1.80 / 1,000 company scrapeds

Rating

0.0

(0)

Developer

Vladimir Chernykh

Vladimir Chernykh

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

15 minutes ago

Last modified

Share

Search Connecticut's complete business registry by name or account number, filter by status, or stream new registrations since a date.

The source is Connecticut's own public Socrata publication of the Secretary of the State business registry (data.ct.gov, dataset n7gp-d28j): 1 305 785 rows, a plain JSON API, no cookies, no captcha, no proxy.

What you get

One row per company, in a stable shape — every field is always present, and what Connecticut does not publish is null rather than missing.

FieldSourceNotes
name, legalNamenameas registered
sourceIdaccountnumber, falling back to idConnecticut's own business account number
documentNumberaccountnumbersame value, null when no account exists
statusstatus27 real statuses, see the caveat below
formationDatedate_registrationISO 8601; null for the 361 064 rows carrying a placeholder
mailingAddressmailing_addresssplit into street1, street2, city, state, zip, country; null for the 16.2 % of rows with no address
ownershipFlagsfive certification columnswomanOwned, minorityOwned, veteranOwned, disabilityOwned, lgbtqiOwned
filingHistorydate_registrationa single "registered with the SOTS" event; no document history

Always null / empty because Connecticut does not publish them in this dataset: ein, dbaName, statusDate, jurisdiction, dissolutionDate, principalAddress, registeredAgent, officers, annualReports, lastEvent.

entityType is derived from the name (LLC / Corp / Trust …). Connecticut publishes no entity-type column, so this is a guess, not a published value — it is not used for anything, and you should not treat it as authoritative.

Ownership certifications — unique to Connecticut

The registry carries five self-reported ownership certifications. Each is a real boolean on every record, measured on the full dataset:

Flagtrue rows
womanOwned107 005
minorityOwned84 476
veteranOwned12 810
disabilityOwned8 017
lgbtqiOwned6 322

This is the field that makes Connecticut different from Texas, New York and Oregon: a supplier-diversity list straight from the state, without a separate third-party vendor.

Three modes

{ "mode": "search", "searchTerms": ["TESLA"], "maxResults": 100 }
{ "mode": "search", "accountNumbers": ["0123456"] }
{ "mode": "new", "sinceDays": 7, "maxResults": 500 }

mode: "new" is the one worth scheduling: it returns only companies registered after the previous run and skips everything already delivered, using a cursor in the key-value store. Connecticut published 4 808 registrations in the last 30 days when measured, so a daily run is a real feed, not an empty one. Put the actor on a daily schedule and you stop paying for the same companies every day.

Caveat: this is the full registry, not a list of active businesses

Connecticut keeps closed entities in the same dataset, so the status filter is not cosmetic. Of 1 305 785 rows:

StatusRows
Active464 136 (35 %)
Forfeited359 318
Dissolved320 733
Withdrawn54 113
Revoked46 636
Cancelled18 823
Merged12 716
Expired Reservation12 279
Rejected9 652

19 further statuses make up the rest. Set "status": "Active" to get only currently registered companies; leave it empty and you also get every entity that was ever registered and later dissolved or forfeited. The value is matched exactly and case-sensitively, because the API is — a guessed spelling returns zero rows rather than a wrong answer.

Caveat: one address, and not for every company

Connecticut publishes a single composed mailing_address string, six positions: [street, line2, city, state, country, zip].

The separator is a space followed by a comma (" ,"), not a comma on its own. Commas that belong to the street line itself are written without the preceding space, so splitting on "," shifts every field after the street one position to the left and turns the country column into a state:

"80 N. MAIN ST., APT 5B3 , ,KENT ,CT ,United States ,06757"

The comma after ST. is part of the street; the fields are separated by " ,". This actor splits on " ,", so the row above yields street1: "80 N. MAIN ST., APT 5B3", city: "KENT", state: "Connecticut", zip: "06757". Measured on 600 sampled rows: splitting on "," produced 25 broken rows out of 600, splitting on " ," produced none.

"621 Terryville Ave , ,Bristol ,CT ,United States ,06010-4078"
"47 Stephen St ,2 ,Stamford ,CT ,United States ,06902-4803" ← 2nd position = apartment
"15 E. PUTNAM AVE. PMB 119 , ,GREENWICH ,CT , ,06830" ← country empty
"916 Southern Blvd , ,Bronx ,NY ,United States ,10459-4545" ← out-of-state organisation

The actor splits it positionally, not by guessing: a naive split would take ",2," for the city. street2 therefore holds an apartment or care-of line, never a city. A state position is only accepted when it holds a two-letter code, a ZIP only when it matches NNNNN or NNNNN-NNNN. ZIP+4 is trimmed to the 5-digit ZIP. A row whose city, state and ZIP are all blank is dropped rather than kept as a street name with three empty fields.

Three things follow from the source format, and all three are reported honestly:

  • 16.2 % of rows have no address at all (211 214 of 1 305 785). There are two encodings, and the second one does not look empty:

    Published valueRows
    ", , , , ,"116 791
    "No information provided , , , , ,"94 423

    Neither is null in the source, so a filter on "not empty" in the state's own API cannot find either one. Both come back with mailingAddress: null here.

  • In about 6 of 600 sampled rows the ZIP is missing while the street, city and state are real ("106 MAIN STREET , ,DERBY ,CT , ,"). Those are kept with zip: null — the rest of the address is genuine.

  • A company physically located in another state shows that state in mailingAddress.state — this is a mailing address, not necessarily a Connecticut place of business. Measured over a 3 000-row sample: 1 553 addresses in Connecticut, then New York (72), Massachusetts (30), New Jersey (22), California (18), Florida (16), Texas (10).

principalAddress is left null rather than copied from the mailing address: one address is one fact, and inventing a second is worse than admitting it is missing.

Caveat: no officers, no filing history

The registry splits principals and filed documents into separate datasets. This actor reads only the companies dataset, so officers is always [] and filingHistory holds only the registration event. If you need directors or annual reports, this actor does not answer that question yet.

Cost and speed

$2.00 per 1 000 companies ($0.002 per company record). You are charged per company saved to the dataset — not per request, not per page, not per source row.

A source page is 1000 rows and 236 bytes per row on the Apify platform, which is less than half of the Oregon dataset. There is no proxy cost: data.ct.gov is a public JSON endpoint that answers directly from Apify. For mode: "new" a scheduled run typically costs one request and nothing at all when no company was registered since the last run — the run summary reports charged per run.

Input reference

InputDefaultMeaning
modesearchsearch uses the terms/account numbers; new returns the incremental feed
searchTerms—case-insensitive substring match on the business name, min 2 chars
accountNumbers—exact Connecticut account numbers, one request each
status—exact, case-sensitive status filter (Active, Forfeited, …)
maxResults100cap on saved companies (this is what you pay for)
sinceDays7first-run lookback for mode: "new"
sinceDate—explicit YYYY-MM-DD start for mode: "new"
maxPagesPerTerm10caps paging per term (1000 rows per page)
includeRawfalseattach the untouched source row, including the composed address string
maxConcurrency3parallel requests
requestTimeoutSecs30per-request timeout
proxyConfigurationoffnot needed; kept for unusual network setups

Output

Company records go to the default dataset (see the Companies tab). Run counters — pushed, skippedSeen, companies, sourceRows, duplicateRows, rowsWithoutId, status, mode, sinceDate, cursor, sourceTotalRows, requestFailures, truncated, charged — are stored in the key-value store under SUMMARY.

sourceRows against companies shows what the de-duplication did; duplicateRows counts source rows folded into an existing company, and rowsWithoutId counts rows that carried neither an account number nor a row id and could not be identified.