# Colorado Electrical & Plumbing License Lookup & List Scraper (`scrapebench/colorado-contractor-license-lookup`) Actor

Verify Colorado electrical and plumbing licences by number or name, or export them statewide: 7,841 active contractor licences and 30,654 active masters, journeymen and residential licensees (2026-10-12), with status, dates and public disciplinary actions.

- **URL**: https://apify.com/scrapebench/colorado-contractor-license-lookup.md
- **Developed by:** [ScrapeBench](https://apify.com/scrapebench) (community)
- **Categories:** Lead generation
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.004 / license record

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

## Colorado Electrical & Plumbing License Lookup & List Scraper

### Pain points

- Colorado has no state general-contractor licence: the state (DORA) licenses only electrical and plumbing work, so those are the only trade licences you can check at state level.
- DORA's licence-detail pages answer an automated client with a human-verification check (HTTP 405, measured 2026-10-12), so a vendor list cannot be verified against them by script.
- The state's open-data copy mixes every DORA profession (nurses, accountants, barbers...) in one dataset with one row per disciplinary action, so a raw download repeats licences and buries the trades.

### What we solve

- Verify in bulk: a list of licence numbers (EC.0102804, or just the digits) or business and person names returns each licence's current status, expiry and public disciplinary actions — every status, not just active.
- Export the trade licences only, one row per licence: electrical and plumbing contractors (EC, PC) by default, or masters, journeymen and residential licensees, filtered by status, city, ZIP or Colorado-only addresses.
- Each licence's disciplinary actions (case number, action, dates) are folded into one public_actions list instead of repeating the licence once per case.

### Summary

Colorado's state electrical and plumbing licences from the Department of Regulatory Agencies (DORA), read fresh from DORA's open-data feed on data.colorado.gov on every run. Lookup mode takes licence numbers or business/person names and returns each licence with its status, first-issue, renewal and expiry dates, mailing city/state/ZIP and public disciplinary actions. Export mode lists licences statewide by type (contractor, master, journeyman, residential), status, city or ZIP. This is a verification and compliance dataset: DORA publishes no street address, phone or email. Pay per licence returned.

### Who it's for

- General contractors, property managers and facilities teams verifying electrical and plumbing subcontractors
- Insurance, surety and lending teams checking licence status and disciplinary history in bulk
- Compliance and vendor-management teams re-verifying a vendor list on a schedule
- Suppliers and software vendors sizing the Colorado electrical and plumbing contractor market by city

### How to use

Set the input, run the actor, and collect results from the run's dataset (export to JSON/CSV/Excel, or pull via the Apify API). Example input:

```json
{
  "licenseType": "contractors",
  "city": "Denver",
  "maxResults": 1000
}
```

See **Inputs** below for every available field.

### What you get

One row per record:

| Field | Description |
|---|---|
| `license_number` | DORA licence number, e.g. EC.0102804 |
| `license_type` | e.g. Electrical Contractor, Master Plumber |
| `license_type_code` | EC, PC, ME, JW, RW, MP, JP or RP |
| `holder_type` | business (contractor licence) or individual |
| `trade` | electrical or plumbing |
| `status` | Active, Expired, Revoked, Need Master Hire, ... |
| `business_name` | Firm name on a contractor licence |
| `person_name` | Licensee name on an individual licence |
| `issue_date` | First issued |
| `last_renewed_date` | Start of the current term |
| `expiration_date` | End of the current term |
| `city` | Mailing city |
| `address_state` | Mailing state |
| `zip_code` | Mailing ZIP |
| `public_actions` | Disciplinary actions: case number, action, dates |
| `verify_url` | DORA's licence-detail page (browser) |
| `source_url` | The open-data query for this licence |

Sample:

```json
{
  "license_number": "EC.0102804",
  "license_type": "Electrical Contractor",
  "license_type_code": "EC",
  "holder_type": "business",
  "trade": "electrical",
  "status": "Active",
  "business_name": "LG Electrical, LLC",
  "person_name": null,
  "issue_date": "2023-08-16",
  "last_renewed_date": "2026-10-01",
  "expiration_date": "2029-09-30",
  "city": "Littleton",
  "address_state": "CO",
  "zip_code": "80125",
  "public_actions": [],
  "matched_by": "license_number",
  "verify_url": "https://www.colorado.gov/dora/licensing/Lookup/PrintLicenseDetails.aspx?cred=1530795&contact=1641517",
  "state": "CO",
  "source_url": "https://data.colorado.gov/resource/7s5z-vewr.json?licensetype=EC&licensenumber=102804"
}
```

### Inputs

| Field | Required | Type | Default | Description |
|---|---|---|---|---|
| `query` | no | string | — | A DORA licence number ('EC.0102804', 'EC 102804', or just '102804' to search every type), a business name ('LG Electrical'), or a person's name as 'LAST, FIRST' or 'FIRST LAST'. Lookups return every status (active, expired, revoked...). Leave empty to run an export instead. |
| `queries` | no | array | `[]` | Several lookups in ONE run, one per line. Combined with the field above if you fill both. The run log says how many licences each one matched. |
| `licenseType` | no | string | — | Which licences: a DORA code (EC Electrical Contractor, PC Plumbing Contractor, ME Master Electrician, JW Journeyman Electrician, RW Residential Wireman, MP Master Plumber, JP Journeyworker Plumber, RP Residential Plumber), its name, or a group: 'contractors' (EC + PC, the firms), 'individuals', 'electrical', 'plumbing' or 'all'. Empty = contractors (EC + PC) in an export, all eight in a lookup. |
| `licenseTypes` | no | array | `[]` | Several licence types or groups in ONE run, e.g. EC and ME. Combined with 'Licence type' if you fill both. An unrecognised value is dropped with a log line; if nothing you gave is recognised, the run returns a free row saying so instead of the whole state. |
| `status` | no | string | `"active"` | 'active' (default) keeps Active, Active - With Conditions and Active - Restricted. 'need_master_hire' is a contractor licence that cannot practise until it hires a master. Lookups always return every status. |
| `city` | no | string | — | Mailing city on the licence, exact match ignoring case, e.g. 'Denver' or 'Colorado Springs'. |
| `cities` | no | array | `[]` | Several cities in ONE run. Combined with 'City' if you fill both. |
| `zip` | no | string | — | Mailing ZIP on the licence, 5 digits. |
| `zips` | no | array | `[]` | Several ZIPs in ONE run. Combined with 'ZIP code' if you fill both. |
| `coloradoAddressesOnly` | no | boolean | `false` | Drop licences whose mailing address is outside Colorado (out-of-state firms hold Colorado licences). |
| `maxResults` | no | integer | `500` | Cap on licences returned — for the whole export, or per name/number in a lookup (a spend control). 100000 returns everything that matches: the eight types hold about 38,500 active licences. The run log states how many matched when the cap cuts it short. |
| `proxyConfiguration` | no | object | `{"useApifyProxy": false}` | Optional. data.colorado.gov answers direct requests; enable a proxy only if runs come back with a 'blocked' notice. |

### Pricing (Pay Per Event)

You pay per result (`dataset-item`) — **no charge for empty runs**. Example: **593 active electrical and plumbing contractor licences in Denver** at *$0.004/result* ≈ **$2.37**.

The default export (500 licences) costs $2.00. Every active contractor licence (7,841 on 2026-10-12) costs $31.36; all eight licence types active (38,495) cost $153.98 at maxResults 100000.

### Use cases

- Vendor compliance: run your subcontractors' DORA licence numbers as a lookup batch and flag any that are expired, revoked or 'Need Master Hire - Cannot Practice'.
- Disciplinary screening: export active contractor licences and keep the ones with public actions before awarding work.
- Expiry tracking: export a city's active licences monthly and sort by expiration_date to see renewals coming due.
- Market sizing: count active electrical vs plumbing contractors by city or ZIP across Colorado.

### Why this actor

- One row per licence: DORA's open data repeats a licence once per disciplinary case (95,109 rows for 94,281 licences across these eight types); here the cases are one public_actions list.
- Straight from DORA's own open-data feed on data.colorado.gov, read fresh on every run (rows last refreshed 2026-10-12).
- Reading and folding all 38,495 active licences took 23 s in one Apify run; the default 500-row export finished in 6 s (measured 2026-10-12).
- A filter value it does not recognise is dropped and logged, never silently widened to the whole state. Pay per licence; outage, bad-input and no-match notices are free.

### Limitations & updates

Covers only the licences the State of Colorado issues for electrical and plumbing work; general contractors are licensed locally and are not here. No street address, phone or email: DORA publishes mailing city, state and ZIP only, and a city or ZIP filter matches where the licensee's mail goes, not where they work (834 of the 7,841 active contractor licences have a mailing address outside Colorado). verify_url opens DORA's licence-detail page, which asks a browser to pass a human-verification check first. The data is as current as DORA's daily open-data refresh, not DORA's live lookup.

### FAQ

**Where does the data come from?**

From the Colorado Department of Regulatory Agencies (DORA), Division of Professions and Occupations, through its public dataset 'Professional and Occupational Licenses in Colorado' on data.colorado.gov (7s5z-vewr). It is read on every run; its rows were last refreshed on 2026-10-12.

**Which licences are covered?**

The eight state electrical and plumbing licence types. Active on 2026-10-12: EC Electrical Contractor 4,751, PC Plumbing Contractor 3,090, ME Master Electrician 7,448, JW Journeyman Electrician 12,664, RW Residential Wireman 2,072, MP Master Plumber 4,956, JP Journeyworker Plumber 2,952, RP Residential Plumber 562. Apprentice registrations and work permits are not included. Colorado has no state general-contractor licence; general contractors are licensed by cities and counties, not by DORA.

**Contractor licence or individual licence — which do I want?**

EC and PC are contractor licences held by a business (a firm name). ME, JW, RW, MP, JP and RP are held by people. An export with no licence type returns contractor licences only; set 'Licence type' to individuals, electrical, plumbing, all, or a code to change that. Lookups search all eight types.

**Does it include phone numbers, emails or street addresses?**

No. DORA's open data publishes only the mailing city, state and ZIP, so this is a verification and compliance dataset rather than a contact list.

**How do I look up a licence number?**

Type it as DORA prints it (EC.0102804), with a space (EC 102804), or as bare digits (102804). Bare digits search every type, and the same digits can belong to different licences — EC 4176 and ME 4176 are two licences — so you may get more than one row.

**What are public_actions?**

Public disciplinary actions DORA lists on the licence: case number, action (for example 'CLS Letter of Admonition', 'CLS Stipulation', 'CLS Revocation'), effective date and completion date. On 2026-10-12, 418 of the 7,841 active contractor licences carried at least one.

**How am I charged?**

$0.004 per licence returned. The default export returns 500 licences ($2.00); Denver's active electrical and plumbing contractor licences were 593 ($2.37) on 2026-10-12. Rows explaining an outage, an unrecognised filter or no match are free.

### Which actor to choose

Part of the contractor-data suite — pick the one that fits your goal:

- **Arizona Contractor License Lookup & Leads Scraper (ROC)** — You need Arizona contractors — the ROC statewide export with phone and principals, or a licence lookup.
- **Iowa Contractor Registration Lookup & Leads Scraper (DIAL)** — You need Iowa contractors — the active DIAL roster with phone and email, by trade and county.
- **Delaware Contractor License Lookup & List Scraper (DOR + DPR)** — You need Delaware contractor business licences and electrical, plumbing and HVACR licences in one export.
- **DC Contractor License Lookup & List Scraper (DLCP)** — You need Washington, DC contractor licences — general contractor, home improvement and asbestos firms with address.
- **Mississippi Contractor License Lookup & Leads Scraper (MSBOC)** — You need Mississippi contractors — the active MSBOC roster with phone, street address and classifications, by county or class.
- **Ohio Contractor License Lookup & Leads Scraper (OCILB)** — You need Ohio electrical, HVAC, plumbing, hydronics or refrigeration contractors — the full OCILB roster, by trade and county.
- **Nebraska Contractor Registration Lookup & Leads Scraper (NDOL)** — You need Nebraska contractors — every current NDOL registration, by service and county, with phone on request.
- **West Virginia Contractor License Lookup & Leads Scraper (WVCLB)** — You need West Virginia contractors — every current WVCLB licence with phone and mailing address, by county or classification.
- **Maryland Contractor License Lookup & List Scraper (MHIC)** — You need Maryland home improvement contractors — every active MHIC licence with street address and expiry, by city or ZIP.
- **New Jersey Contractor License Lookup & Export (DCA)** — You need New Jersey contractors — active DCA home improvement, electrical, master plumber and HVACR licences statewide or by city, with street address and owner for home improvement firms.

### Guides & use cases

Written up on **[scrapebench.dev](https://scrapebench.dev)** — the bench that runs and verifies this actor against the live source every night:

- **How-to:** [How to run Colorado Electrical & Plumbing License Lookup & List Scraper](https://scrapebench.dev/guides/how-to-colorado-contractor-license-lookup/)
- **Use case:** [Screen Denver's Electrical and Plumbing Contractors for Disciplinary Actions](https://scrapebench.dev/use-cases/denver-electrical-plumbing-contractor-licences/)
- **Use case:** [Verify Colorado Electrical and Plumbing Contractor Licences](https://scrapebench.dev/use-cases/colorado-electrical-plumbing-license-verification/)

More actors, coverage and nightly verification results: **[scrapebench.dev](https://scrapebench.dev)**

### Works with AI assistants (MCP)

Callable as an MCP tool, so Claude, Cursor, VS Code Copilot and other MCP clients can run it directly. Grab the config from the [MCP tab](https://apify.com/scrapebench/colorado-contractor-license-lookup/api/mcp) on this page — Apify hosts the server and keeps that snippet current, and OAuth signs you in on first connect, so no API token goes in your config file.

Then just ask:

> "List the active electrical and plumbing contractor licences with a Denver mailing address, with expiry dates and any disciplinary actions."

That input returned 593 licences on 2026-10-12. With no name, number or filters it exports the active contractor licences statewide (7,841), so set a city or ZIP before running it from an agent. Runs started this way bill exactly like any other run.

# Changelog

This Actor's version history is a separate document: https://apify.com/scrapebench/colorado-contractor-license-lookup/changelog.md

# Actor input Schema

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

A DORA licence number ('EC.0102804', 'EC 102804', or just '102804' to search every type), a business name ('LG Electrical'), or a person's name as 'LAST, FIRST' or 'FIRST LAST'. Lookups return every status (active, expired, revoked...). Leave empty to run an export instead.

## `queries` (type: `array`):

Several lookups in ONE run, one per line. Combined with the field above if you fill both. The run log says how many licences each one matched.

## `licenseType` (type: `string`):

Which licences: a DORA code (EC Electrical Contractor, PC Plumbing Contractor, ME Master Electrician, JW Journeyman Electrician, RW Residential Wireman, MP Master Plumber, JP Journeyworker Plumber, RP Residential Plumber), its name, or a group: 'contractors' (EC + PC, the firms), 'individuals', 'electrical', 'plumbing' or 'all'. Empty = contractors (EC + PC) in an export, all eight in a lookup.

## `licenseTypes` (type: `array`):

Several licence types or groups in ONE run, e.g. EC and ME. Combined with 'Licence type' if you fill both. An unrecognised value is dropped with a log line; if nothing you gave is recognised, the run returns a free row saying so instead of the whole state.

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

'active' (default) keeps Active, Active - With Conditions and Active - Restricted. 'need_master_hire' is a contractor licence that cannot practise until it hires a master. Lookups always return every status.

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

Mailing city on the licence, exact match ignoring case, e.g. 'Denver' or 'Colorado Springs'.

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

Several cities in ONE run. Combined with 'City' if you fill both.

## `zip` (type: `string`):

Mailing ZIP on the licence, 5 digits.

## `zips` (type: `array`):

Several ZIPs in ONE run. Combined with 'ZIP code' if you fill both.

## `coloradoAddressesOnly` (type: `boolean`):

Drop licences whose mailing address is outside Colorado (out-of-state firms hold Colorado licences).

## `maxResults` (type: `integer`):

Cap on licences returned — for the whole export, or per name/number in a lookup (a spend control). 100000 returns everything that matches: the eight types hold about 38,500 active licences. The run log states how many matched when the cap cuts it short.

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

Optional. data.colorado.gov answers direct requests; enable a proxy only if runs come back with a 'blocked' notice.

## Actor input object example

```json
{
  "query": "EC.0102804",
  "queries": [],
  "licenseType": "contractors",
  "licenseTypes": [],
  "status": "active",
  "cities": [],
  "zips": [],
  "coloradoAddressesOnly": false,
  "maxResults": 500,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

Each row is one licence: number, type, status, dates, business or licensee name, mailing city/state/ZIP and public disciplinary actions.

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapebench/colorado-contractor-license-lookup").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("scrapebench/colorado-contractor-license-lookup").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 '{}' |
apify call scrapebench/colorado-contractor-license-lookup --silent --output-dataset

```

## MCP server setup

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

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/7NrPeg5S6yyuBChbD/builds/IKjrf1mg0fMlVvj4u/openapi.json
