← Health board

DOPL

Utah Contractor Directory & Leads Scraper (DOPL)

Utah contractors, electricians and plumbers listed in DOPL's Construction Business Registry, by trade and county or city: phone, email, licence number, address and qualifier.

100%golden-diff pass
Run it on Apify → verified nightly

Verification

100%golden-diff success
41canary runs
0days since last canary run

Output fields

Authoritative field set from the dataset schema.

FieldType
business_namestring|null
phonestring|null
emailstring|null
citystring|null
countystring|null
county_methodstring|null
addressstring|null
zip_codestring|null
statestring|null
license_numberstring|null
license_typestring|null
expiration_datestring|null
statusstring|null
issue_datestring|null
person_namestring|null
classificationsstring|null
qualifiersstring|null
categorystring|null
cbr_idstring|null
bond_amountstring|null
bond_companystring|null
insurance_companystring|null
requested_categorystring|null
requested_tradestring|null
requested_countystring|null
requested_citystring|null
matched_bystring|null
county_namestring|null
tradestring|null
trade_codestring|null
noticestring|null
notice_typestring|null
source_urlstring|null

Sample row

{
  "business_name": "Imperial Custom Sheet Metal & Roofing LLC",
  "phone": "(385) 227-7041",
  "email": "isagon1998@gmail.com",
  "city": "West Valley City",
  "county": "Salt Lake",
  "county_method": "city",
  "address": "5279 Woodstep Avenue",
  "zip_code": "84120",
  "state": "UT",
  "license_number": "14229585-5501",
  "license_type": "Contractor",
  "expiration_date": "11/30/2027",
  "person_name": "Isabel Gonzalez",
  "classifications": "S280 - Roofing Qualifier; S220 - Carpentry and Flooring Qualifier",
  "category": "Contractor",
  "cbr_id": "7499119",
  "requested_trade": "S280 - Roofing Contractor",
  "requested_county": "Salt Lake",
  "source_url": "https://services.commerce.utah.gov/cbr/"
}

Inputs

FieldTypeReqDefaultDescription
listOptionsOnly boolean no false If true, skip the scrape and return Utah's 29 counties plus every category and classification the Construction Business Registry (CBR) searches by, with its code. Free, not charged.
trade string no "Roofing" A DOPL classification by name or code, e.g. 'Roofing', 'S280', 'HVAC', 'General Building', 'B100'. A word from the name works too: 'roof' finds S280 Roofing. For electricians and plumbers use the licence level: 'Master', 'Journeyman', 'Apprentice'. Leave empty for every classification.
trades array no ["Roofing","HVAC"] Several classifications in ONE run, e.g. Roofing and HVAC. Combined with 'Trade' if you fill both. A business listed under two of them is returned (and billed) once.
category string no — Which part of the registry: 'contractor' (default), 'handyman', 'electrician', 'plumber', 'burglar alarm' or 'elevator mechanic'. Electricians and plumbers are mostly individual licensees.
categories array no [] Several categories in ONE run. Combined with 'Category' if you fill both.
county string no "Salt Lake" Utah county, e.g. 'Salt Lake', 'Utah County', 'washington'. The registry has no county field, so county is worked out from each listing's city (see county_method). Leave empty for all of Utah. If it is not a Utah county, the run returns the free county and classification lists instead of failing.
counties array no ["Salt Lake","Utah"] Several counties in ONE run, e.g. Salt Lake and Utah and Davis. Combined with 'County' if you fill both.
city string no — A Utah city or town, e.g. 'Provo', 'St. George'. Exact city match ('Salt Lake City' does not include North Salt Lake). Use instead of, or as well as, a county.
cities array no [] Several cities in ONE run. Combined with 'City' if you fill both.
includeDetails boolean no true Fetch each listing's detail record: licence number, licence type, expiry, street address, ZIP and qualifier names. One extra request per listing; turn off for a faster run with name, phone, email and city only.
maxResults integer no — Cap on the listings returned PER search (each classification x each county or city), not per run, so adding places can never silently truncate the later ones. Leave empty to return every match.
proxyConfiguration object no {"useApifyProxy":false} Optional. The registry answers direct requests; enable a proxy only if runs come back with a 'blocked' notice.

Pricing

Pay per result (dataset-item) — no charge for empty runs.
Example: 63 Salt Lake County roofing contractors at $0.002/result ≈ $0.13.

FAQ

Is this every licensed contractor in Utah?

No. The Construction Business Registry lists only licensees with an active licence who voluntarily opted in, and the registry says so itself. DOPL licenses far more contractors than it lists. To verify any licence, use DOPL's Online License Verification.

How many listings are there?

Counted on the live registry 2026-10-06: 5,032 contractors (162 of them also under Handyman), 604 electricians, 191 plumbers, 21 burglar alarm licensees and 1 elevator mechanic. Contractors by county: Salt Lake 1,579, Utah 972, Washington 494, Davis 414, Weber 370. Salt Lake County roofers alone are 63.

How is the county worked out?

The registry has no county field, so each listing's city is looked up in the US Census Bureau's 2020 place-to-county table for Utah. That resolved 4,930 of 5,032 contractor listings (98.0%); 69 of the rest list no city at all. Draper, Bluffdale, Park City and Santaquin straddle two counties and are assigned to the one most of the city lies in (county_method = city_primary). Treat county as approximate.

How do I name a trade?

By DOPL class code ('S280'), by name ('Roofing', 'General Building'), or by a word from the name ('roof' finds S280 Roofing). For electricians and plumbers use the licence level: Master, Journeyman or Apprentice. Turn on Discovery Mode to get every classification with its code, free.

Why is the street address empty on some rows?

Contact details in the registry are self-provided, and many licensees give only a city and ZIP. In a test run of 286 listings, 160 had a street address and 285 a ZIP. When a listing's detail record does not answer, only the list fields ship and the licence and address fields are null.

How am I charged?

One event per listing returned ($0.002). A listing that matches two of your searches is returned and charged once. The county and classification lists, and any row explaining a source problem, are free.

Guides & use cases

Related actors