If you sell to brand-new companies (business banking, bookkeeping, payroll, insurance, signage, POS, web design), the best leads are businesses that registered with the state in the last few days. New York and Connecticut both publish their business registries as free, daily-updated open data. You don't need an API key or a login, and you don't have to scrape anything.
When I ran the script below on Oct 23, 2026, the last 7 days returned 5,249 new New York LLCs and corporations and 1,100 new active Connecticut businesses. Connecticut's file also carries the NAICS industry code the owner picked at registration, so you can ask for "new construction companies" (95 that week) or "new restaurants" directly.
The sources
| State | Dataset | Updated | Key fields |
|---|---|---|---|
| New York | Department of State "Active Corporations: Beginning 1800" (data.ny.gov n9v6-gdp6) | Daily | name, DOS ID, filing date, county, entity type |
| Connecticut | Secretary of the State "Business Registry - Business Master" (data.ct.gov n7gp-d28j), public domain | Daily | name, type, registration date, NAICS code, city/ZIP |
Both are Socrata portals, so they share one query language (SoQL) over plain HTTP.
The script
import requests, collections
from datetime import date, timedelta
since = (date.today() - timedelta(days=7)).isoformat()
# New York: Department of State "Active Corporations" (updated daily)
ny = requests.get("https://data.ny.gov/resource/n9v6-gdp6.json", params={
"$select": "dos_id,current_entity_name,initial_dos_filing_date,county,entity_type",
"$where": f"initial_dos_filing_date >= '{since}'",
"$order": "initial_dos_filing_date DESC", "$limit": 50000}, timeout=60).json()
print("NY new entities:", len(ny))
print(collections.Counter(r.get("county") for r in ny).most_common(5))
# Connecticut: Secretary of the State Business Registry (updated daily, has NAICS)
ct = requests.get("https://data.ct.gov/resource/n7gp-d28j.json", params={
"$select": "accountnumber,name,business_type,date_registration,naics_code,billingcity",
"$where": f"date_registration >= '{since}' AND starts_with(status, 'Active')",
"$order": "date_registration DESC", "$limit": 50000}, timeout=60).json()
print("CT new businesses:", len(ct))
sectors = collections.Counter((r.get("naics_code") or "(none)").rsplit("(", 1)[-1][:2] for r in ct)
print(sectors.most_common(6))
build = [r for r in ct if "(23" in (r.get("naics_code") or "")]
print("CT construction:", len(build), [r["name"] for r in build[:3]])
Output on Oct 23, 2026:
NY new entities: 5249
[('Kings', 754), ('Albany', 695), ('New York', 585), ('Queens', 550), ('Nassau', 487)]
CT new businesses: 1100
[('53', 173), ('54', 159), ('23', 95), ('45', 92), ('81', 85), ('56', 64)]
CT construction: 95 ['DD Ventures LLC', 'Elite Contracting LLC', 'Keystone Property Investments LLC']
In Connecticut, real estate (NAICS 53) and professional services (54) lead, with construction (23) close behind.
Gotchas I hit
-
Albany County is inflated in New York. Many filers list a registered-agent service in Albany, so "county" there often means the agent's county, not where the business operates. For local targeting, filter on ZIP (
dos_process_zip) or on thelocation_*fields when they're filled in. -
Connecticut NAICS is one text field, e.g.
"Coin-Operated Laundries and Drycleaners (812310)". Match the prefix withcontains(naics_code, '(23')in SoQL, or parse the digits in Python. -
Filter out rejected filings. Connecticut includes
Rejectedregistrations. Usestarts_with(status, 'Active'). - Treat person-related fields carefully. New York has CEO and registered-agent name fields, and Connecticut has a business email field that is often a personal address. For B2B outreach I leave those out and keep to the company name, industry, city and ZIP.
-
Use
$limitexplicitly. Socrata returns 1,000 rows by default. For larger pulls, page with$offset.
Turning it into a lead list
Run it daily or weekly, write the rows to CSV, and de-duplicate on dos_id / accountnumber. If you sell to one industry, the Connecticut NAICS filter does most of the qualifying for you. For New York, keyword filters on the name (contains(lower(current_entity_name), 'construction')) work surprisingly well.
Optional: if you'd rather not maintain the script, I publish these as hosted, scheduled tools: New York New Business Filings and Connecticut New Business Leads (paid per result, with personal fields stripped). Disclosure: they're my tools. The code above does the same job for free.
Free sample data
See the fields before you run anything:
- New York new business leads list: free sample CSV
- Connecticut new business leads list: free sample CSV
- All public-data lead lists <!-- /loomwise-data-links -->
Top comments (0)