# US Contractor License Registry Scraper (`moving_beacon-owner1/us-contractor-license-registry-scraper`) Actor

Scrapes US government contractor licensing registries in 12 states, capturing business names, license numbers, types, specialties, status, addresses, phone numbers, and dates. Features filters for state, city, and license status, including Oregon bond info and New York compliance records.

- **URL**: https://apify.com/moving_beacon-owner1/us-contractor-license-registry-scraper.md
- **Developed by:** [Jamshaid Arif](https://apify.com/moving_beacon-owner1) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $9.99 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## US Contractor License Registry Scraper

Collects licensed contractors and building-trade businesses straight from the
official government registries that license them — Washington, Oregon, New York,
Colorado, Connecticut, California, Louisiana, Missouri, Texas, Illinois,
Maryland and Delaware. Every record is a real registered licensee with its
license number, license status, registered address and, in many registries, a
phone number and trade specialty. Search by state, city, business name, trade
and status to build a verified contractor list: for example every roofing
contractor registered in Seattle, every active electrical contractor in Denver,
every active home-improvement contractor in Connecticut, or every licensed
home-improvement contractor in Brooklyn.

Because this is the licensing authority's own record, each row carries something
a directory listing cannot: proof the business is licensed, when that license
expires, and — for Oregon — the bond and liability insurance behind it, or — for
New York State — whether the state has debarred the business or found against it
for labor, tax or safety violations.

No API key or account is needed.

### Input

| Field | Default | Description |
|---|---|---|
| States | `WA` | Comma-separated two-letter states to search. Supported: `WA`, `OR`, `NY`, `CT`, `CA`, `CO`, `TX`, `IL`, `LA`, `MO`, `MD`, `DE`. |
| City | *(empty)* | City to filter on, e.g. `Seattle`. Case-insensitive substring match. |
| Business name contains | *(empty)* | Text the registered business name must contain — `roofing` to find roofing companies, or a company name to look one up. |
| Trade specialty contains | *(empty)* | Trade or license-type text, e.g. `plumbing`, `electrical`, `roofing`, `home improvement`, `general contractor`. |
| License status contains | *(empty)* | e.g. `Active` or `Expired`. |
| Max results | `25` | Maximum number of license records to return across all selected states. |
| Socrata app token | *(empty)* | Optional. The registries answer without one; a free token only raises the rate limit on very large runs. |
| Proxy configuration | Off | Optional. These are US government open-data portals and normally need no proxy. |

A registry that publishes no trade field, or no status field, is skipped when you
set that filter — it is never returned with the filter silently ignored. If none
of the registries for the states you chose can answer the filters you set, the
run stops with a message saying so instead of returning unfiltered rows.

### Output

One row per license. The examples below are real records; fields that registry
leaves empty are omitted from them for brevity.

```json
{
  "source": "CO-DORA",
  "source_label": "Colorado Department of Regulatory Agencies",
  "business_name": "Sechler Electric Co., Inc.",
  "license_number": "100",
  "license_type": "Electrical Contractor",
  "specialty": "Electrical",
  "status": "Active",
  "city": "Denver",
  "state": "CO",
  "zip_code": "80227",
  "effective_date": "1965-07-15",
  "expiration_date": "2026-09-30",
  "record_url": "https://www.colorado.gov/dora/licensing/Lookup/PrintLicenseDetails.aspx?cred=324734&contact=409722"
}
```

```json
{
  "source": "NY-NYC-DCWP",
  "source_label": "New York City Department of Consumer and Worker Protection",
  "business_name": "M & F ROOFING, INC.",
  "license_number": "0674344-DCA",
  "license_type": "Premises",
  "specialty": "Home Improvement Contractor",
  "status": "Active",
  "address": "730 AVENUE Z",
  "city": "BROOKLYN",
  "state": "NY",
  "zip_code": "11223",
  "county": "Brooklyn",
  "phone": "7187431621",
  "effective_date": "2002-12-06",
  "expiration_date": "2027-02-28",
  "state_registry_id": "BA-1428596-2022",
  "record_url": "https://data.cityofnewyork.us/resource/w7w3-xahh.json"
}
```

```json
{
  "source": "CT-DCP",
  "source_label": "Connecticut Department of Consumer Protection",
  "business_name": "PANZO CARPENTRY & REMODELING",
  "license_number": "548707",
  "license_type": "HOME IMPROVEMENT CONTRACTOR",
  "specialty": "HOME IMPROVEMENT CONTRACTOR",
  "status": "ACTIVE",
  "address": "12 ALTIERI RD",
  "city": "NORTH BRANFORD",
  "state": "CT",
  "zip_code": "06471",
  "principal_name": "LOUIS F PANZO JR",
  "business_type": "Individual",
  "effective_date": "2026-04-01",
  "expiration_date": "2027-03-31",
  "state_registry_id": "HIC.0548707",
  "record_url": "https://www.elicense.ct.gov/"
}
```

```json
{
  "source": "WA-SEATTLE",
  "source_label": "City of Seattle — licensed construction and trade businesses",
  "business_name": "MEHRER DRYWALL CO INC",
  "license_number": "0000042140006207",
  "license_type": "Drywall and Insulation Contractors",
  "specialty": "Drywall and Insulation Contractors",
  "status": "Active",
  "address": "2657 20TH AVE W",
  "city": "SEATTLE",
  "state": "WA",
  "zip_code": "98199-2907",
  "phone": "2062823422",
  "business_type": "Corporation",
  "effective_date": "1963-08-01",
  "state_registry_id": "5780641220010001",
  "record_url": "https://data.seattle.gov/resource/wnbq-64tb.json"
}
```

Fields a given registry does not publish come back as an empty string rather than
being dropped, so every row has the same shape and spreadsheets stay aligned.

Registry-specific extras:

| Fields | Available for |
|---|---|
| `bond_amount`, `bond_company`, `insurance_amount`, `insurance_company` | Oregon CCB |
| `debarred`, `labor_law_violation`, `safety_violation`, `outstanding_wage_assessments`, `workers_comp_insurance`, `minority_or_women_owned`, `apprenticeship_program` | New York State DOL contractor registry |
| `specialty`, `principal_name`, `business_type`, `state_registry_id` | Washington |
| `county` | Oregon, Illinois (asbestos), New York City (borough) |
| `business_type` | Washington, Seattle (ownership type), New York State DOL (legal structure), Connecticut (business or individual), Chicago (licensed business activity) |

### Sources

| Code | Registry | What it covers |
|---|---|---|
| `WA-LNI` | Washington State Dept. of Labor & Industries | Registered construction contractors statewide |
| `OR-CCB` | Oregon Construction Contractors Board | Active contractor licenses statewide |
| `OR-BCD` | Oregon Building Codes Division | Active electrical, plumbing and boiler contractors and individuals |
| `NY-DOL` | New York State Dept. of Labor | Contractor registry certificates statewide |
| `NY-DOL-MOLD` | New York State Dept. of Labor | Mold assessment and remediation contractors statewide |
| `NY-DOL-ELEVATOR` | New York State Dept. of Labor | Elevator contractors statewide |
| `NY-NYC-DOB` | New York City Dept. of Buildings | General contractors, electrical contractors and firms, master plumbers, fire-suppression contractors, riggers, welders and other licensed NYC trades |
| `NY-NYC-DCWP` | New York City Dept. of Consumer and Worker Protection | Home improvement contractors, construction labor providers, home-appliance service dealers, locksmiths |
| `CO-DORA` | Colorado Dept. of Regulatory Agencies | Electrical and plumbing contractors, master electricians and plumbers, journeyworkers, residential wiremen, water-conditioning licensees |
| `TX-TDLR` | Texas Department of Licensing and Regulation | Statewide building-trade licence holders — electrical contractors, master, journeyman, apprentice, sign and residential electricians, A/C contractors and technicians, appliance installers, water-well drillers and pump installers, elevator contractors |
| `TX-DALLAS` | City of Dallas | Contractors currently registered with the city, by trade (building, roofing, electrical, mechanical and others) |
| `CT-DCP` | Connecticut Dept. of Consumer Protection | Statewide home-improvement and new-home-construction contractors, plus electrical, plumbing, heating/cooling, sheet-metal, fire-protection, elevator, solar-thermal, well and glazing contractors and journeypersons |
| `CA-LOS-ANGELES` | City of Los Angeles Office of Finance | Businesses registered with the city under a construction or specialty-trade classification |
| `WA-SEATTLE` | City of Seattle | Businesses holding a Seattle licence under a construction or specialty-trade classification — includes a phone number |
| `LA-NEW-ORLEANS` | City of New Orleans | Occupational licences held by building and home-service trades — includes a phone number |
| `MO-KANSAS-CITY` | City of Kansas City | Business licences held by building and home-service trades |
| `IL-CHICAGO` | City of Chicago Dept. of Business Affairs and Consumer Protection | Home-repair contractor licences — a historical register: its newest licence began in January 2013 and every licence in it had expired by May 2016 |
| `IL-IDPH-ASBESTOS` | Illinois Dept. of Public Health | Licensed asbestos abatement contractors |
| `IL-IDPH-LEAD` | Illinois Dept. of Public Health | Registered lead abatement contractors |
| `MD-MONTGOMERY-ELECTRICAL` | Montgomery County, Maryland | Limited electrical business licenses |
| `MD-MONTGOMERY-ELECTRICAL-BUSINESS` | Montgomery County, Maryland | Electrical business licenses |
| `MD-MONTGOMERY-JOURNEYMAN-ELECTRICIAN` | Montgomery County, Maryland | Journeyman electrician licenses |
| `MD-MONTGOMERY-MASTER-ELECTRICIAN` | Montgomery County, Maryland | Master electrician licenses |
| `MD-MONTGOMERY-FIRE-SYSTEM` | Montgomery County, Maryland | Fire-system installer licenses |
| `DE-DNREC` | Delaware Dept. of Natural Resources and Environmental Control | Water-well and pump-installer contractors |
| `DE-DPR` | Delaware Division of Professional Regulation | Electrical, plumbing and HVACR, elevator, home-inspection and manufactured-home-installation licensees statewide |

### Coverage — read this before you plan a run

Contractor licensing in the US is not uniform, and neither is what each authority
publishes. The coverage you get differs a lot by state:

- **Statewide and comprehensive:** Washington, Oregon, New York State,
  Connecticut. Connecticut is the widest of them for home-services work — the
  state registers home-improvement and new-home-construction contractors by
  name, so a search there returns general remodellers and builders, not only
  regulated single trades.
- **Statewide but trade-specific:** Colorado (electrical and plumbing only —
  Colorado does not license general contractors at state level), Illinois
  (asbestos and lead abatement statewide), Delaware (electrical, plumbing and
  HVACR, elevator, home inspection, manufactured-home installation, plus
  water-well and pump installers).
- **Statewide but trade-specific (continued):** Texas covers the building trades
  its state regulator licenses — electrical, air conditioning, appliance
  installation, water-well drilling and elevator contracting — but not general
  contracting, which Texas does not license at state level. The other
  occupations TDLR licenses (cosmetology, barbering, towing and so on) are left
  out. The City of Dallas register is included as well and does cover
  general building and roofing, for Dallas only.
- **City or county only:** California is the City of Los Angeles. Louisiana is
  the City of New Orleans. Missouri is the City of Kansas City. Maryland is
  Montgomery County. Illinois adds the City of Chicago's home-repair licence on
  top of the statewide abatement registers, and Washington adds the City of
  Seattle on top of the statewide L\&I register. New York City's two registers
  are in addition to the statewide New York ones.

California, Louisiana, Missouri, and the Chicago and Seattle registers come from
a city business-licence roll rather than a trade board, so what they identify is
the business's registered line of work — "Electrical Contractors", "Roofing,
Siding and Sheet Metal Contractors", "Drywall and Insulation Contractors" and so
on. Builders' merchants and trade retailers are filtered out, and the register
is the city's own, so it covers businesses licensed in that city only. California
has a statewide contractor board as well, but it does not publish an open
machine-readable register, so this actor does not claim statewide California
coverage.

### Notes on the data

- Values are returned as the authority publishes them, with two exceptions:
  `effective_date` and `expiration_date` are always `YYYY-MM-DD` whatever format
  the registry uses, and where a registry typed the state and ZIP into its city
  column (`schenectady, ny 12306`) only the city is kept. New York City's
  Buildings register abbreviates some city names. Washington records the business's
  mailing address, which for a border-town contractor may sit in a neighbouring
  state.
- `state` is therefore the business's registered mailing state, not necessarily
  the state that issued the license. The `source` field always tells you which
  registry the license came from.
- Registries that publish only their current licensees (Oregon CCB, the Dallas
  register, the Los Angeles active-business roll, the Seattle licence roll) are
  reported with status `Active`.
- Chicago publishes one row per licence term, so a long-standing business appears
  once per renewal. Only its most recent matching term is returned, and the
  address is blank for licensees who registered a home address, which the city
  withholds. Chicago marks a licence only as issued, cancelled or revoked, so an
  issued licence is reported `Active` while its term runs and `Expired` after.
  No Chicago home-repair licence is current today, so a search for `Active`
  returns none from this register.
- Connecticut publishes both firms and individual tradespeople. Where the
  licensee trades under a company name that name is the `business_name` and the
  person is in `principal_name`; where there is no company name the person's name
  is used.
- Kansas City's and New Orleans's rolls include businesses with an address in a
  neighbouring state that hold a licence in the city, so `state` can read `KS`
  on a Kansas City row.
- Colorado publishes the licensee's city and ZIP but no street address or phone.
  Its `record_url` links to the state's own license-verification page for that
  exact license.
- Both current and lapsed licenses are included, so filter on status when you
  only want businesses that can legally work today.
- Searching more than one state returns the registries in order and stops once
  **Max results** is reached, so raise it when you want full coverage of each.

# Actor input Schema

## `states` (type: `string`):

Comma-separated two-letter states to search. Supported: WA (Washington L\&I plus the City of Seattle), OR (Oregon CCB and Building Codes Division), NY (New York State DOL contractor, elevator and mold registries, plus NYC Buildings and Consumer & Worker Protection), CT (Connecticut Dept. of Consumer Protection — home improvement, new home construction, electrical, plumbing, heating and cooling, sheet metal, fire protection, elevator and more), CA (City of Los Angeles registered construction and specialty-trade businesses), CO (Colorado DORA electrical and plumbing), TX (Texas Department of Licensing and Regulation statewide, plus the City of Dallas register), IL (Illinois DPH asbestos and lead, plus City of Chicago home repair), LA (City of New Orleans occupational licences held by building trades), MO (City of Kansas City business licences held by building trades), MD (Montgomery County electrical, journeyman electrician and fire systems), DE (Delaware DNREC water-well contractors and Delaware Division of Professional Regulation trades).

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

Optional city to filter on, e.g. 'Seattle'. Matched as a case-insensitive substring against the city the business registered with the licensing authority.

## `business_name` (type: `string`):

Optional text that the registered business name must contain, e.g. 'roofing' to find roofing companies, or a specific company name to look one up.

## `specialty` (type: `string`):

Optional trade or endorsement text to filter on, e.g. 'plumbing', 'electrical', 'residential', 'roofing'. Available wherever the authority publishes a trade field; registries that do not publish one are skipped for this filter rather than returning nothing.

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

Optional license status filter, e.g. 'Active' or 'Expired'. Matched on whole words, so 'Active' never returns 'Inactive'. Registries that publish only current licences (Oregon CCB, City of Dallas, Los Angeles, Seattle) are treated as Active. Registries that publish no status at all are skipped for this filter rather than returning rows it was never applied to.

## `max_results` (type: `integer`):

Maximum number of license records to return across all selected states.

## `app_token` (type: `string`):

Optional free Socrata app token. Not required — the registries answer without one. Supplying a token only raises the shared rate limit on very large runs.

## `proxyConfiguration` (type: `object`):

Optional proxy. These are US government open-data portals and normally need no proxy; enable one only for very large runs.

## Actor input object example

```json
{
  "states": "WA",
  "city": "Seattle",
  "business_name": "roofing",
  "specialty": "",
  "status": "Active",
  "max_results": 25,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# 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 = {
    "states": "WA",
    "city": "Seattle",
    "business_name": "roofing",
    "specialty": "",
    "status": "Active",
    "max_results": 25
};

// Run the Actor and wait for it to finish
const run = await client.actor("moving_beacon-owner1/us-contractor-license-registry-scraper").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 = {
    "states": "WA",
    "city": "Seattle",
    "business_name": "roofing",
    "specialty": "",
    "status": "Active",
    "max_results": 25,
}

# Run the Actor and wait for it to finish
run = client.actor("moving_beacon-owner1/us-contractor-license-registry-scraper").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 '{
  "states": "WA",
  "city": "Seattle",
  "business_name": "roofing",
  "specialty": "",
  "status": "Active",
  "max_results": 25
}' |
apify call moving_beacon-owner1/us-contractor-license-registry-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,moving_beacon-owner1/us-contractor-license-registry-scraper"
        }
    }
}
```

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/CHAtf036ygukIxh6k/builds/eUxDxQJOw0Bcg2J4g/openapi.json
