DEV Community

Loomwise
Loomwise

Posted on Edited on

New Business Leads in New York and Connecticut: Pull This Week's New LLCs (with NAICS Codes) from State Open Data

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]])
Enter fullscreen mode Exit fullscreen mode

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']
Enter fullscreen mode Exit fullscreen mode

In Connecticut, real estate (NAICS 53) and professional services (54) lead, with construction (23) close behind.

Gotchas I hit

  1. 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 the location_* fields when they're filled in.
  2. Connecticut NAICS is one text field, e.g. "Coin-Operated Laundries and Drycleaners (812310)". Match the prefix with contains(naics_code, '(23') in SoQL, or parse the digits in Python.
  3. Filter out rejected filings. Connecticut includes Rejected registrations. Use starts_with(status, 'Active').
  4. 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.
  5. Use $limit explicitly. 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:

Top comments (0)