# Contractor License Leads: TX, WA, OR, CT & CO (`waags/contractor-license-leads`) Actor

Export licensed contractors from official state license registers (Texas TDLR, Washington L\&I, Oregon CCB, Connecticut DCP, Colorado DORA) in one schema: business, owner, phone, address, trade, status and dates. Find new licensees for B2B leads.

- **URL**: https://apify.com/waags/contractor-license-leads.md
- **Developed by:** [Andres Garcia](https://apify.com/waags) (community)
- **Categories:** Lead generation, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$1.60 / 1,000 contractor licenses

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

## Contractor License Leads: Texas, Washington, Oregon, Connecticut & Colorado

Export **licensed contractors from five official state license registers** in **one unified schema**: business name, owner or principal, **phone (E.164)**, address, license type, **trade** (HVAC, electrical, plumbing, roofing, general…), status, **issue and expiration dates**, plus bond and insurance details for Oregon. Use it to find **newly licensed contractors** in a date window, the hottest B2B leads for insurance, bonding, software, suppliers and lenders.

**Official open data, no login, no API key, no proxies.** Each state publishes its full license register on a public Socrata API, so runs are fast and never blocked.

### Covered registers

| State | Agency | Licenses | Phone | Issue date | Extra |
| --- | --- | --- | --- | --- | --- |
| **Texas** | TDLR | A/C, electrical, sign, appliance, elevator, water-well contractors (+ masters/journeymen/techs with "All trade licenses") | ✅ | – | owner, county |
| **Washington** | Labor & Industries | All registered construction contractors with specialties (roofing, HVAC, plumbing, painting…) | ✅ | ✅ (effective date) | principal, UBI, business type |
| **Oregon** | Construction Contractors Board | Residential/commercial general & specialty contractors | ✅ | ✅ (original registration) | RMI, bond & insurance |
| **Connecticut** | Consumer Protection | Home improvement, electrical, plumbing, HVAC, fire, elevator… contractors | – | ✅ | |
| **Colorado** | DORA | Electrical and plumbing contractors (+ masters/journeymen) | – | ✅ (first issue) | verify link |

### Use cases

- 🆕 **New contractor leads:** `Licensed on or after = 7 days` lists every newly licensed contractor in WA, OR, CT and CO. They need insurance, bonds, trucks, tools, software, websites and financing right now.
- 📞 **Trade-specific call lists:** HVAC, electrical or plumbing contractors by city or ZIP, with phone numbers
- ✅ **Contractor verification:** check status and expiration by name for vendor onboarding and compliance
- 📊 **Market sizing:** count licensed contractors per trade and territory

### How to use it

1. Click **Try for free**. The input is prefilled with **licensed contractors with a phone number in Texas, Washington and Oregon**, so it works in one click.
2. Choose **states**, **trades**, **cities** or **ZIP prefixes**, and optionally **Licensed on or after** for new-licensee leads.
3. Click **Start** and export to **CSV, Excel, JSON**, or connect your CRM with Zapier, Make, HubSpot or Google Sheets.
4. **Schedule it weekly** with `Licensed on or after = 7 days` for a steady feed of new contractors.

#### Input example

```json
{
    "states": ["WA", "OR", "CT", "CO"],
    "licensedFrom": "7 days",
    "trades": ["general", "roofing", "hvac"],
    "activeOnly": true,
    "requirePhone": false,
    "maxItems": 500
}
```

| Field | Description |
| --- | --- |
| `states` | `TX`, `WA`, `OR`, `CT`, `CO` (empty = all) |
| `trades` | `general`, `electrical`, `plumbing`, `hvac`, `roofing`, `painting`, `landscaping`, `flooring`, `concrete`, `pool`, `fire`, `elevator`, `waterWell` |
| `cities`, `zipPrefixes` | Business city (prefix match) and ZIP prefixes |
| `scope` | `contractors` (companies, default) or `all` (adds master/journey-level and technician licenses) |
| `licensedFrom` | Newly issued since a date, `YYYY-MM-DD` or relative (`30 days`). Texas has no issue dates and is skipped. |
| `activeOnly` | Exclude expired/suspended licenses (default on) |
| `requirePhone` | Only rows with a phone (TX, WA, OR) |
| `nameContains` | Business or owner name filter |
| `maxItemsPerState`, `maxItems` | Result caps |

#### Output example

```json
{
    "state": "WA",
    "licenseNumber": "PRECIPW747OQ",
    "licenseType": "Plumbing Contractor",
    "trades": ["plumbing"],
    "specialties": ["Journey Level"],
    "businessName": "Precision Pipe & Weld LLC",
    "personName": "Askew, Christopher Allen",
    "phone": "+12067427972",
    "street": "1746 NE 136th St",
    "city": "Seattle",
    "addressState": "WA",
    "zip": "98125",
    "status": "Active",
    "issueDate": "2026-09-25",
    "daysSinceIssued": 6,
    "expirationDate": "2028-09-25",
    "businessType": "Limited Liability Company",
    "stateBusinessId": "606278900",
    "agency": "Washington Department of Labor & Industries (L&I)",
    "verifyUrl": "https://secure.lni.wa.gov/verify/Detail.aspx?LIC=PRECIPW747OQ",
    "source": "https://data.wa.gov/d/m8qx-ubtq"
}
```

The **Contractor leads** view shows state, business, owner, license, trades, phone, city, ZIP, status, dates and the verification link.

### Pricing

Pay-per-event: a fixed price per license returned, currently **about $1.60 per 1,000 contractors** (see the **Pricing** tab). There is no start fee and no compute charge on top. Cap any run with `maxItems`.

### Tips

- **Newly licensed contractors:** `licensedFrom = "7 days"`, `states = ["WA", "OR", "CT", "CO"]`.
- **Call-ready lists:** `requirePhone = true`, then run our [US Phone Number Validator](https://apify.com/waags/us-phone-number-validator) for time zone and calling hours.
- **Find their emails:** many contractors list a website. Run our [Website Contact Extractor](https://apify.com/waags/website-contact-extractor), then the [Bulk Email Validator](https://apify.com/waags/bulk-email-validator).
- **Pair with permits:** our [US Building Permits Scraper](https://apify.com/waags/building-permits-leads) shows which contractors are actively pulling permits.

### FAQ

**Where does the data come from?** The official open-data portals of each state agency (data.texas.gov, data.wa.gov, data.oregon.gov, data.ct.gov, data.colorado.gov). The `source` field links to the exact dataset and `verifyUrl` to the agency's lookup page.

**How fresh is it?** The agencies refresh these datasets daily to weekly, and each run queries them live.

**Why no California, Florida or Arizona?** Those boards don't publish their registers as open-data APIs (only web search forms). This actor sticks to stable, official APIs so it doesn't break. More open-data states will be added. Request one on the **Issues** tab.

**Why are some trades missing in some states?** Each state licenses different trades. For example, Colorado licenses only electrical and plumbing, Texas has no general-contractor license, and Oregon endorsements are general or specialty without a trade.

**Is this legal?** Yes. Professional licenses are public records published by the states for verification and reuse. Follow TCPA/CAN-SPAM rules when contacting businesses.

### Related actors by WAAGS

- [US Building Permits Scraper](https://apify.com/waags/building-permits-leads) · [FMCSA Trucking Carrier Leads](https://apify.com/waags/fmcsa-trucking-carrier-leads)
- [Website Contact Extractor](https://apify.com/waags/website-contact-extractor) · [US Phone Number Validator](https://apify.com/waags/us-phone-number-validator) · [Bulk Email Validator](https://apify.com/waags/bulk-email-validator)

# Actor input Schema

## `states` (type: `array`):

License registers to search. Leave empty for all five.

## `trades` (type: `array`):

Only licenses whose type or specialty matches one of these trades. Leave empty for all construction trades.

## `cities` (type: `array`):

Only contractors whose business city starts with one of these names, e.g. Houston, Seattle, Portland.

## `zipPrefixes` (type: `array`):

Only contractors whose ZIP starts with one of these prefixes, e.g. 787 (Austin) or 98101.

## `scope` (type: `string`):

"Contractor businesses" returns licensed contracting companies. "All trade licenses" adds master/journey-level electricians, plumbers and technicians (TX, CT, CO).

## `licensedFrom` (type: `string`):

Only licenses first issued on or after this date: newly licensed contractors are the hottest leads (insurance, bonding, software, suppliers). YYYY-MM-DD or relative such as "30 days". Washington uses the current license effective date; Texas does not publish issue dates and is skipped when this is set.

## `activeOnly` (type: `boolean`):

Exclude expired, suspended and inactive licenses.

## `requirePhone` (type: `boolean`):

Skip licenses without a phone number (TX, WA and OR publish phones; CT and CO do not and are skipped).

## `nameContains` (type: `string`):

Case-insensitive match on the business or person name.

## `maxItemsPerState` (type: `integer`):

Cap per state. Defaults to Max results divided by the number of states.

## `socrataAppToken` (type: `string`):

Optional free app token for higher rate limits on very large exports. Not needed for normal use.

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

Maximum number of licenses to return. You are charged per result, so this also caps your cost.

## Actor input object example

```json
{
  "states": [
    "TX",
    "WA",
    "OR"
  ],
  "scope": "contractors",
  "activeOnly": true,
  "requirePhone": true,
  "maxItems": 60
}
```

# 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": [
        "TX",
        "WA",
        "OR"
    ],
    "requirePhone": true,
    "maxItems": 60
};

// Run the Actor and wait for it to finish
const run = await client.actor("waags/contractor-license-leads").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": [
        "TX",
        "WA",
        "OR",
    ],
    "requirePhone": True,
    "maxItems": 60,
}

# Run the Actor and wait for it to finish
run = client.actor("waags/contractor-license-leads").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": [
    "TX",
    "WA",
    "OR"
  ],
  "requirePhone": true,
  "maxItems": 60
}' |
apify call waags/contractor-license-leads --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,waags/contractor-license-leads"
        }
    }
}
```

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/IXBJ0hOvPVFoz3NyX/builds/Ns3Nvxhsfmll2uqiX/openapi.json
