# Connecticut Business Registry Scraper (`automation-lab/connecticut-sots-concord-business-search`) Actor

Search and export official Connecticut business entities with IDs, status, dates, addresses, ownership flags, NAICS fields, and source provenance.

- **URL**: https://apify.com/automation-lab/connecticut-sots-concord-business-search.md
- **Developed by:** [Stas Persiianenko](https://apify.com/automation-lab) (community)
- **Categories:** Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.44 / 1,000 item extracteds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#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

## Connecticut Business Registry Scraper

Search and export official **Connecticut business registry** records for onboarding, KYB checks, compliance research, and scheduled status refreshes.

The Actor reads Connecticut's public Business Master dataset and returns normalized entity identity, Connecticut business ID, registration status, important dates, business and mailing addresses, NAICS classification, ownership flags, and source provenance.

No Connecticut account, API key, browser, or proxy is required.

### What can you do with this Actor?

- Verify that a Connecticut entity exists under a supplied name or business ID.
- Check current registration and annual-report status during onboarding.
- Export active, dissolved, cancelled, and other official status records.
- Find entities by city, business type, or registration date window.
- Refresh rows updated since a chosen date in a scheduled KYB workflow.
- Feed normalized records into spreadsheets, databases, CRMs, and compliance pipelines.

### Who is it for?

**KYB and onboarding teams** can resolve a company name or Connecticut business ID against an official state record.

**Compliance analysts** can retain status, registration dates, dissolution dates, addresses, ownership indicators, and retrieval provenance.

**Researchers and data teams** can export bounded entity sets without maintaining Socrata queries and pagination.

**Operations teams** can schedule `updatedSince` runs and compare the resulting dataset with an earlier export.

### Why use it?

The public registry data is available as a large government dataset, but production use still requires filter construction, pagination, retries, normalization, limits, and stable output fields.

This Actor provides:

- exact business-ID lookup;
- case-insensitive partial business-name lookup;
- full-text search;
- composable status, entity-type, city, and date filters;
- bounded deterministic pagination;
- normalized nullable fields;
- official source URL and retrieval timestamp on every row;
- pay-per-result billing with no separate proxy charge.

### Data source

Records come from the State of Connecticut Open Data **Connecticut Business Registry – Business Master** dataset (`n7gp-d28j`).

The source is an official public-data representation of registry master records. It is not the interactive filing portal and cannot submit filings, order certificates, or guarantee that a just-filed change already appears in the open dataset.

The Actor does not scrape search-result HTML. It calls the official structured SODA endpoint directly.

### What data is extracted?

| Group | Fields |
| --- | --- |
| Identity | `businessName`, `accountNumber`, `sourceRecordId`, `businessType` |
| Status | `status`, `subStatus`, `administrativeDissolutionReason` |
| Dates | `registrationDate`, `annualReportDueDate`, `dissolutionDate`, `beganTransactingInConnecticut`, `organizationMeetingDate` |
| Business address | combined address plus street, unit, city, state, postal code, and country |
| Other addresses | `mailingAddress`, `recordAddress` |
| Formation | citizenship, place, state or territory, country, and name in formation jurisdiction |
| Classification | `naicsCode`, `naicsSubCode` |
| Ownership flags | woman-, veteran-, minority-, disability-, and LGBTQI-owned indicators |
| Capital | `totalAuthorizedShares` when supplied |
| Provenance | `sourceUpdatedAt`, `sourceDatasetId`, `sourceUrl`, `retrievedAt` |

A missing source value is returned as `null`. An ownership value of `false` means the source flag is false; it should not be interpreted as an independent certification investigation.

### Getting started

1. Open the Actor input page.
2. Enter a business name, Connecticut business ID, or another supported filter.
3. Set `maxItems` to the maximum number of entity rows you need.
4. Click **Start**.
5. Review the **Overview** table or export the dataset as JSON, CSV, Excel, XML, or another Apify-supported format.

Try this name search:

```json
{
  "businessName": "Yale",
  "maxItems": 10
}
```

### Input parameters

| Input | Type | Description |
| --- | --- | --- |
| `query` | string | Full-text search across the official dataset |
| `businessName` | string | Case-insensitive partial registered-name match |
| `accountNumber` | string | Exact Connecticut business ID; preserve leading zeros |
| `status` | string | Exact official registration status, case-insensitive |
| `businessType` | string | Exact official entity type, case-insensitive |
| `city` | string | Case-insensitive partial business-city match |
| `registeredFrom` | date | Registration date on or after `YYYY-MM-DD` |
| `registeredTo` | date | Registration date on or before `YYYY-MM-DD` |
| `updatedSince` | date | Source row refreshed on or after `YYYY-MM-DD` |
| `maxItems` | integer | Maximum saved records, from 1 to 50,000; default 100 |

Filters are combined with AND. For example, `status: "Active"` and `city: "New Haven"` return matching active entities in that city.

You may run without search filters to export the first bounded slice of the dataset. Increase `maxItems` deliberately for larger exports.

### Search by Connecticut business ID

Use `accountNumber` when you already have the state's public business identifier:

```json
{
  "accountNumber": "3309410",
  "maxItems": 1
}
```

This is an exact lookup. If there is no matching master row, the run succeeds with an empty dataset and no item charge.

### Refresh records for recurring KYB checks

Schedule the Actor and move `updatedSince` forward for each collection window:

```json
{
  "status": "Active",
  "updatedSince": "2026-09-01",
  "maxItems": 1000
}
```

`updatedSince` uses the source dataset's row-refresh timestamp. It does not assert that every field changed on that date. Store prior results in your own system and compare by `sourceRecordId` or `accountNumber`.

### Output example

A current result has this shape:

```json
{
  "sourceRecordId": "001xx00000AbCdEAAZ",
  "businessName": "SAMPLE SERVICES LLC",
  "accountNumber": "3000123",
  "businessType": "LLC",
  "status": "Active",
  "subStatus": "Annual report due",
  "registrationDate": "2025-10-20T00:00:00.000",
  "annualReportDueDate": "2027-01-16T00:00:00.000",
  "businessAddress": "100 SAMPLE ST, HARTFORD, CT, 06103, United States",
  "mailingAddress": "100 SAMPLE ST, HARTFORD, CT, United States, 06103",
  "naicsCode": "Management Consulting Services (541611)",
  "womanOwned": false,
  "veteranOwned": false,
  "minorityOwned": false,
  "sourceDatasetId": "n7gp-d28j",
  "sourceUrl": "https://data.ct.gov/resource/n7gp-d28j.json",
  "retrievedAt": "2026-09-04T06:00:00.000Z"
}
```

The complete dataset schema documents every field and its nullability.

### How much does it cost to export Connecticut business records?

Pricing has one **$0.003 start fee** per run plus a tiered fee per saved entity record.

| Plan | Price per entity record |
| --- | ---: |
| Free | $0.00276 |
| Bronze | $0.00240 |
| Silver | $0.001872 |
| Gold | $0.00144 |
| Platinum | $0.00144 |
| Diamond | $0.00144 |

At Bronze rates, 10 records cost about **$0.027**, 100 records about **$0.243**, and 1,000 records about **$2.403**, including one start fee. Empty or rejected rows are not charged as items. Apify may separately bill platform usage according to your plan when applicable.

### Limits and reliability

- A run can save from 1 to 50,000 records.
- The Actor requests up to 1,000 records per source page.
- Temporary network, HTTP 429, and temporary 5xx failures receive bounded retries.
- Stable source errors fail the run rather than returning a misleading empty success.
- No browser or residential proxy fallback is enabled.
- Source fields can be incomplete, inconsistently capitalized, or changed by Connecticut.
- The open dataset can lag the transactional filing system.

For very large exports, begin with a narrow filter and verify the output before increasing `maxItems`.

### Integrations and automation

Use an Apify schedule for daily or weekly refreshes. Connect the dataset to:

- Google Sheets for analyst review;
- webhooks for completed-run notifications;
- Make or Zapier for onboarding workflows;
- cloud storage or a warehouse for longitudinal comparisons;
- a CRM to enrich an organization record with official state identity;
- Python or JavaScript applications through the Apify API client.

Use `accountNumber` as the public registry identifier and retain `retrievedAt` to show when your system observed the row.

### Run with the Apify API using cURL

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/automation-lab~connecticut-sots-concord-business-search/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"businessName":"Yale","maxItems":10}'
```

To wait for completion and read dataset items, use the synchronous dataset endpoint supported by the Apify API.

### Run with JavaScript

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/connecticut-sots-concord-business-search').call({
  accountNumber: '3309410',
  maxItems: 1,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

### Run with Python

```python
import os
from apify_client import ApifyClient

client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("automation-lab/connecticut-sots-concord-business-search").call(
    run_input={"status": "Active", "city": "New Haven", "maxItems": 100}
)
items = client.dataset(run["defaultDatasetId"]).list_items().items
print(items)
```

### Use with MCP and AI assistants

Add this Actor to Claude Code through Apify MCP:

```bash
claude mcp add --transport http apify \
  "https://mcp.apify.com?tools=automation-lab/connecticut-sots-concord-business-search"
```

#### Claude Desktop setup

#### Cursor setup

#### VS Code setup

Claude Desktop, Cursor, and VS Code can use this equivalent HTTP MCP configuration:

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=automation-lab/connecticut-sots-concord-business-search"
    }
  }
}
```

Example prompts:

- “Look up Connecticut business ID 3309410 and summarize its official status.”
- “Export up to 50 active Connecticut entities matching Yale.”
- “Collect active registry rows refreshed since 2026-09-01 for comparison.”

### Responsible use and legality

The Actor accesses public government open data. You are responsible for your purpose, retention, downstream decisions, and compliance with applicable laws and source terms.

Do not treat an ownership flag, address, status, or missing value as a substitute for risk-based review. Verify material decisions against the current official registry or obtain appropriate documentation from the entity.

Avoid using the data for harassment, discrimination, identity theft, or decisions that require notices, consent, or a legally mandated verification process.

### Troubleshooting

#### Why did my exact business-ID lookup return no rows?

Confirm that you supplied the Connecticut account number exactly, including leading zeros. The open-data master dataset may also lag a recent filing.

#### Why did a name search return unexpected records?

`businessName` is a partial match. Add `status`, `businessType`, or `city`, or use the exact `accountNumber` when available.

#### Why is a date or address null?

The Actor preserves source absence as `null`. Older, reserved, dissolved, and foreign records often contain different subsets of fields.

#### Why did the run fail instead of returning an empty dataset?

A valid no-match query returns zero rows successfully. A malformed input or exhausted upstream error fails deliberately so automation does not confuse source failure with “no entity found.”

### FAQ

#### Does it search every US state?

No. This Actor is specific to the official Connecticut Business Registry Business Master dataset.

#### Does it return registered agents or principals?

Not in this version. It returns master entity records and ownership flags, not related agent or principal datasets.

#### Can it file an annual report or order a certificate?

No. The Actor is read-only and does not perform registry transactions.

#### Is the data real time?

No real-time guarantee is made. `sourceUpdatedAt` records the source row timestamp, while `retrievedAt` records when the Actor fetched it.

#### Can I schedule it?

Yes. Apify schedules can run the Actor repeatedly. Use `updatedSince` and compare stable identifiers in your downstream system.

#### Are records deduplicated?

Yes, within each run, using the source row ID or account number.

### Related automation-lab Actors

For another state-specific company-verification workflow, use [Florida Sunbiz Business Search](https://apify.com/automation-lab/florida-sunbiz-business-search).

For domain ownership and registration context, use [Domain Registration & RDAP Lookup](https://apify.com/automation-lab/domain-rdap-lookup).

For City of Chicago licensing data, use [Chicago Business Licenses Scraper](https://apify.com/automation-lab/chicago-business-licenses).

### Support

If a source field changes or a valid query fails, open an issue from the Actor page with the input, run ID, expected behavior, and observed behavior. Do not include confidential customer data.

# Actor input Schema

## `query` (type: `string`):

Full-text search across the official registry dataset, such as a business name, address, or NAICS description.

## `businessName` (type: `string`):

Case-insensitive partial match against the registered entity name.

## `accountNumber` (type: `string`):

Exact Connecticut registry account number, including leading zeros when present.

## `status` (type: `string`):

Exact official status, such as Active, Dissolved, or Cancelled.

## `businessType` (type: `string`):

Exact official entity type, such as LLC, Stock, or Non-Stock.

## `city` (type: `string`):

Case-insensitive partial match against the business-address city.

## `registeredFrom` (type: `string`):

Include entities registered on or after this date (YYYY-MM-DD).

## `registeredTo` (type: `string`):

Include entities registered on or before this date (YYYY-MM-DD).

## `updatedSince` (type: `string`):

Include rows whose official open-data record was refreshed on or after this date (YYYY-MM-DD). Useful for scheduled KYB refreshes.

## `maxItems` (type: `integer`):

Stop after saving this many matching registry entities.

## Actor input object example

```json
{
  "businessName": "Yale",
  "maxItems": 10
}
```

# Actor output Schema

## `dataset` (type: `string`):

Dataset containing all matched entity records.

# 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 = {
    "businessName": "Yale",
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation-lab/connecticut-sots-concord-business-search").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 = {
    "businessName": "Yale",
    "maxItems": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("automation-lab/connecticut-sots-concord-business-search").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "businessName": "Yale",
  "maxItems": 10
}' |
apify call automation-lab/connecticut-sots-concord-business-search --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,automation-lab/connecticut-sots-concord-business-search"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/CoHU5m5xGf934Rbvw/builds/xdEFFSsfVXVmMtZtm/openapi.json
