Use case
Build a Salt Lake County Roofing Contractor List
Roofing contractors in Salt Lake County, Utah, listed in DOPL's Construction Business Registry, with phone, email, licence number and address.
Suppose you run partner recruiting for a home-services marketplace, and next month it opens roof repair jobs in Salt Lake County. Before launch you want 30 licensed roofers signed up, which means a list of every roofing business in the county with a phone, an email and the name of the person to address. Utah’s Division of Professional Licensing (DOPL) keeps a public directory for exactly this, the Construction Business Registry (CBR). On 2026-10-06 it listed 63 roofing contractors in Salt Lake County.
Know what that list is before you plan around it. The CBR is opt-in: it shows only businesses with an active DOPL licence that chose to be listed, and DOPL licenses far more roofers than appear there. For a recruiter that is the useful half of the bargain. Every one of the 63 asked to be found by people looking for a contractor, so your first email is not landing on someone who never wanted contact. It also means the list is a floor, not a census of Salt Lake County roofing.
The manual way, and what it costs
The registry’s search at services.commerce.utah.gov/cbr is free and needs no login. Pick the Contractor category and the S280 Roofing classification and it returns a table of name, phone, email and city: 148 roofing listings statewide on 2026-10-06. There is no county filter. The City box matches any city containing your text, so “Salt Lake” pulls in North Salt Lake, which sits in Davis County, while missing West Valley City (14 of the county’s roofers), West Jordan (12) and Sandy (8). The licence number, expiry, street address and qualifier name are not in the table at all; each sits behind a Details pop-up, one listing at a time.
If all you need is names, phones and emails once, the free route is good enough. Copy the 148-row statewide table into a sheet and delete every row whose city is outside Salt Lake County. It stops being reasonable when you want the qualifier’s name for a personal greeting or the licence number for vetting, because that is 63 pop-ups, and again every month as new businesses opt in.
The faster way
Utah Contractor Directory & Leads Scraper (DOPL) does the same search once and hands back every row at once.
{
"county": "Salt Lake",
"trade": "Roofing"
}
“Roofing” resolves to DOPL’s S280 Roofing classification. “Salt Lake” is a county, not a text match: the actor reads all 148 statewide listings and keeps those whose city lies in Salt Lake County according to the US Census Bureau’s 2020 place-to-county table, so West Valley City is in and North Salt Lake is out. includeDetails is on by default, which is what fills in the licence and qualifier columns. The run took 9.2 seconds of scraping when we timed it outside Apify on 2026-10-06.
What comes back
{
"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/"
}
| Field | Example value | Meaning |
|---|---|---|
business_name | Imperial Custom Sheet Metal & Roofing LLC | Business (or, for electricians and plumbers, licensee) name as listed |
phone | (385) 227-7041 | Phone number the licensee gave the registry |
email | isagon1998@gmail.com | Email address the licensee gave the registry |
city | West Valley City | City the licensee listed |
county | Salt Lake | Utah county, worked out from the city (see county_method) |
county_method | city | city, city_primary (city spans two counties; the one most of it lies in), or null (city not recognised) |
For your recruiting email, email and person_name close the loop. All 63 roofers have a phone and 61 have an email, and 28 of those 61 are @gmail.com addresses rather than a company domain, which is worth knowing before you write a subject line that assumes an office manager. person_name is the licence qualifier, present on all 63, so the email can open with a name. license_number and expiration_date came back on every row too, and all 63 licences run to a date in 2027, so your onboarding team starts vetting with the licence number already in hand instead of opening 63 pop-ups.
What you’d do with it
Export the dataset as CSV and load it into your outreach tool with cbr_id as the external ID, so a re-run updates the same records instead of duplicating them. Send the first wave to the 61 with an email and phone the other 2. Put the run on a monthly Apify schedule to catch businesses that opt in after launch; at today’s count each run is 63 listings at $0.002, about $0.13. When you open HVAC jobs in Provo and Orem, the same input with "county": "Utah" and "trade": "HVAC" returned 81 firms on the same day.
Worth knowing
This is not every licensed roofer in the county, only the ones who opted in to the registry, and the contact details are whatever each business typed in. Only 43 of the 63 gave a street address, so do not plan a mailer off this list. County is derived from the city and is approximate: 4 of the 63 rows are in cities that straddle a county line and carry county_method: city_primary. The classifications column lists the qualifier’s DOPL classifications, which DOPL notes can cover a broader scope of work than the names suggest. Check a licence on DOPL’s Online License Verification before you rely on it.
Run it yourself: How to run Utah Contractor Directory & Leads Scraper (DOPL) walks the whole thing step by step.
Recruiting in Arkansas too? Arkansas Contractor Directory & Leads Scraper (ACLB) does the same trade-by-county pull from the state licensing board, which reads ACLB’s own licence records rather than an opt-in list.
Last updated 2026-10-06