← Guides

How-to

How to run Colorado Electrical & Plumbing License Lookup & List Scraper

Step-by-step: the exact input, what each field does, and the rows that come back from CO DORA.

You open this actor when you need to check Colorado electrical or plumbing licences in bulk: a list of subcontractors to verify before work starts, or every active contractor in a city screened for disciplinary actions. Colorado’s Department of Regulatory Agencies (DORA) licenses those two trades, eight licence types in all, with 38,495 active licences on 2026-10-12. DORA’s online lookup answers one licence per search in a browser, which is the right tool for a single check. Its free open-data file has everything, but as 95,109 rows for 94,281 licences, mixed in with every other profession DORA licenses.

What you’ll need

Nothing but an Apify account. The actor talks to CO DORA directly.

No API key, no proxy, no CAPTCHA solving. DORA’s open-data feed on data.colorado.gov is keyless, and every query in the build’s recon answered from Apify in 0.04 to 3.7 seconds.

Step 1 — Open the actor

Open Colorado Electrical & Plumbing License Lookup & List Scraper on the Apify Store and press Try for free. The actor’s own page on this site lists its live health and pricing.

The Colorado Electrical & Plumbing License Lookup & List Scraper listing on the Apify Store
The listing on the Apify Store. Pricing and the nightly health record are both public.

Step 2 — Fill in the input

The input form for Colorado Electrical & Plumbing License Lookup & List Scraper in the Apify Console
The input form, as it appears in the Apify Console.
FieldTypeRequiredWhat it does
querystringnoA 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…
queriesarraynoSeveral 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. (default [])
licenseTypestringnoWhich licences: a DORA code (EC Electrical Contractor, PC Plumbing Contractor, ME Master Electrician, JW Journeyman Electrician, RW Residential Wireman, MP Master Plumber, JP…
licenseTypesarraynoSeveral 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… (default [])
statusstringno’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.… (default active)
citystringnoMailing city on the licence, exact match ignoring case, e.g. ‘Denver’ or ‘Colorado Springs’.
citiesarraynoSeveral cities in ONE run. Combined with ‘City’ if you fill both. (default [])
zipstringnoMailing ZIP on the licence, 5 digits.
zipsarraynoSeveral ZIPs in ONE run. Combined with ‘ZIP code’ if you fill both. (default [])
coloradoAddressesOnlybooleannoDrop licences whose mailing address is outside Colorado (out-of-state firms hold Colorado licences).
maxResultsintegernoCap 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… (default 500)

The actor has two modes, and query/queries decides which one you get. Fill either and it is a lookup: each licence number or name is searched across all eight licence types, in every status, including expired and revoked. Leave both empty and it is an export, filtered by everything below them. Keep the two-letter prefix on licence numbers. Bare digits search every type, and 4176 alone returned four different licences on 2026-10-12.

In an export, licenseType and maxResults are the pair that trips people up. With no licence type you get contractor licences only, Electrical Contractor (EC) and Plumbing Contractor (PC), 7,841 of them active. Rows are sorted by licence type and then by number, so the default maxResults of 500 returns the first 500 electrical contractors and not a single plumbing contractor; we ran {} on 2026-10-12 and got 500 EC rows. To get both trades, raise maxResults past what you expect to match, narrow the export with a city or ZIP, or ask for one type at a time (EC, PC, electrical, plumbing). The run log states how many licences matched before the cap, so you can see what you left behind.

A working input:

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

Step 3 — Run it

Press Start. Rows are pushed to the dataset as they’re found, so the run log fills in as it works.

Runs are short. On Apify on 2026-10-12 the default 500-row export finished in 6 seconds and a Salida contractor export (26 licences) in 7; reading all 38,495 active licences took 23 seconds. The input above returned 593 Denver licences in 1.4 seconds when we ran it locally the same day. The log opens with a line such as Export: 593 licence(s) match; returning 593.

An empty result is usually a filter. city is an exact match on the mailing city, so “Colo Springs” finds nothing where “Colorado Springs” works. A lookup that matches nothing adds no licence row; it adds a free notice and a “no match” line in the log, and you are not charged for it. A filter value the actor does not recognise is dropped with a log line rather than silently widening the export.

Step 4 — Read the output

Each run returns a labelled table, not raw JSON:

The output fields returned by Colorado Electrical & Plumbing License Lookup & List Scraper
The output view — every field the actor returns, named and typed.

Every row looks like this — a real row from a real run:

{
  "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"
}
FieldExample valueMeaning
license_numberEC.0102804DORA licence number, e.g. EC.0102804
license_typeElectrical Contractore.g. Electrical Contractor, Master Plumber
license_type_codeECEC, PC, ME, JW, RW, MP, JP or RP
holder_typebusinessbusiness (contractor licence) or individual
tradeelectricalelectrical or plumbing
statusActiveActive, Expired, Revoked, Need Master Hire, …
business_nameLG Electrical, LLCFirm name on a contractor licence
person_name—Licensee name on an individual licence

People come for status and public_actions. status is DORA’s word, not ours: besides Active it can read “Active - With Conditions”, Expired, Revoked, Suspended or “Need Master Hire - Cannot Practice”, a contractor licence that exists but cannot be used until the firm hires a master. public_actions lists DORA’s public disciplinary actions on the licence, each with case number, action, effective date and completion date; 418 of the 7,841 active contractor licences had at least one on 2026-10-12. Three things to watch. business_name is filled on contractor licences and person_name on the six individual types, so expect one of them to be null. On 75 of Denver’s 593 active contractor licences, expiration_date read 2026-09-30, already past, while status still said Active; act on status and re-check the date. And verify_url opens DORA’s detail page, which makes a browser pass a human-verification check first.

There is no street address, phone or email in any row: DORA’s feed has no column for any of them across the 95,109 rows of these eight licence types. It publishes mailing city, state and ZIP only, so this is a verification dataset rather than a contact list.

Step 5 — Export it

Open the Dataset tab and export to CSV, JSON or Excel, or pull the same rows from the Apify API if this is going to run on a schedule. public_actions is a list, so in a CSV it arrives flattened into numbered columns; the JSON keeps each action whole. The Denver export above came to 593 rows, one per licence.

What it costs

$0.004 per licence returned. Rows that explain a source outage, an unrecognised filter or a lookup with no match are free. Checking 40 subcontractors by licence number costs $0.16; the Denver export above (593 licences) costs $2.37; the default 500-row export costs $2.00; every active contractor licence statewide (7,841) costs $31.36, and all eight types active (38,495, with maxResults at 100000) cost $153.98.

Where the data comes from

This reads CO DORA directly. Every night a canary runs this actor against that live source and diffs the result against a frozen fixture — what “verified” means.

The source is DORA’s dataset “Professional and Occupational Licenses in Colorado” (7s5z-vewr), which data.colorado.gov refreshes every day after midnight; its rows were last updated on 2026-10-12. It holds every profession DORA licenses and one row per disciplinary case, and the bare licence number is not unique (EC 4176 and ME 4176 are two licences), so the actor keys each licence on type plus number and folds the case rows into public_actions. Colorado has no state general-contractor licence, so general contractors, roofers and other trades licensed by cities and counties are not in this data.

See it used

Verify Colorado Electrical and Plumbing Contractor Licences runs a vendor list as one lookup batch and shows what “Need Master Hire” looks like in the output. Screen Denver’s Electrical and Plumbing Contractors for Disciplinary Actions exports Denver’s 593 active contractor licences and sorts out the 45 with a public action.

If you need phone numbers and principals rather than disciplinary history, and the work is in Arizona, Arizona Contractor License Lookup & Leads Scraper (ROC) exports ROC’s licences with both.

Last updated 2026-10-12