← Guides

How-to

How to run Iowa Contractor Registration Lookup & Leads Scraper (DIAL)

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

You want a list of working contractors in Iowa, or you want to check that one firm is on it. The first surprise is that Iowa has no state general-contractor licence at all. What it has is a registration: anyone earning $2,000 or more a year from construction in Iowa must register with the Department of Inspections, Appeals, and Licensing (DIAL) and renew every year. DIAL publishes the active roster as one ZIP file holding one CSV, 18,000 rows when we downloaded it on 2026-10-07. The free route is to download that file, unzip it and filter it in a spreadsheet. This actor does the download on every run and returns only the rows you ask for, with a NAICS code added beside each trade label. One more thing changed on 2026-11-03: DIAL dropped the phone and email columns from that file. The actor still returns both, matched by registration number from DIAL’s 2026-10-14 file, the last edition that carried them.

What you’ll need

Nothing but an Apify account. The actor talks to IA DIAL directly.

No API key, no proxy and no CAPTCHA. The file comes from Iowa’s open-data hub with one plain GET, which took under 2 seconds to fetch and parse in each of our local runs on 2026-10-07. The only charge is $0.004 per registration returned, plus Apify’s own platform usage.

Step 1: Open the actor

Open Iowa Contractor Registration Lookup & Leads Scraper (DIAL) on the Apify Store and press Try for free. The actor’s own page on this site lists its live health and pricing.

The Iowa Contractor Registration Lookup & Leads Scraper (DIAL) 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 Iowa Contractor Registration Lookup & Leads Scraper (DIAL) in the Apify Console
The input form, as it appears in the Apify Console.
FieldTypeRequiredWhat it does
tradestringnoA word from DIAL’s primary-activity label (‘roofing’, ‘electrical’, ‘plumbing’, ‘remodelers’) — matches at the start of a word — or a NAICS code (‘238160’) or code prefix…
tradesarraynoSeveral trades in ONE run, e.g. roofing and siding. Combined with ‘Trade’ if you fill both. (default [])
countystringnoIowa county, e.g. ‘Polk’, ‘Linn County’, ‘obrien’. DIAL fills county for Iowa addresses only. An unrecognised county is dropped and logged.
countiesarraynoSeveral counties in ONE run. Combined with ‘County’ if you fill both. (default [])
citystringnoMailing city, exact match ignoring case and punctuation, e.g. ‘Des Moines’.
citiesarraynoSeveral cities in ONE run. (default [])
zipCodestringno5-digit mailing ZIP, e.g. ‘50309’.
zipCodesarraynoSeveral ZIP codes in ONE run. (default [])
nameFilterstringnoCase-insensitive text found in the business name or the registrant’s first/last name, e.g. ‘roofing llc’ or ‘smith’.
nameFiltersarraynoSeveral names in ONE run; a registration matching any of them is returned once. (default [])
iowaAddressesOnlybooleannoRegistrants from any state can work in Iowa: 4,057 of 18,000 (22.5%, 2026-10-07) have an out-of-state mailing address. Tick to drop them.
maxResultsintegernoCap on registrations returned for the WHOLE run (this is an export; the cap is your spend control). The full roster was 18,000 on 2026-10-07 — set 100000 to take everything… (default 500)

The field first-time users get wrong is maxResults. It caps the whole run, not each filter, and it defaults to 500. Leave every filter empty and you get the first 500 of the 18,000 registrations sorted by business name, not the state. Set it to 100000 when you really want everything, and remember that the cap is also your spend limit.

trade takes either a word or a number. A word matches the start of a word in DIAL’s 32 activity labels, so “roofing” finds Roofing Contractors (880 registrations statewide) and “siding” finds Siding Contractors (194). A number matches the NAICS code as a prefix, so “238220” is plumbing and HVAC alone while “2382” takes every building-equipment trade at once. A word that matches none of the 32 labels is refused rather than ignored: “rofing” with “Polk” returned one free row saying the trade was not recognised, not the whole of Polk County.

A working input:

{
  "county": "Polk",
  "trade": "roofing",
  "maxResults": 500
}

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.

The input above returned 115 registrations on 2026-10-07, and the log shows the arithmetic: 880 roofing registrations statewide, 2,437 registrations in Polk County, 115 in both. The whole run is one download, so it takes about as long for one county as for the whole state; our local runs took 1.7 to 2.0 seconds before Apify’s container start-up. A run that returns zero rows means your filters matched nothing in that week’s file. A run that returns one row with a notice either means a filter value was not recognised or that data.iowa.gov did not serve the file; both rows are free and say which.

Step 4: Read the output

Each run returns a labelled table, not raw JSON:

The output fields returned by Iowa Contractor Registration Lookup & Leads Scraper (DIAL)
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": "C153532",
  "business_name": "515 PAINTING & HOME SERVICES LLC",
  "person_name": "MARLON NAZRALA DELCID",
  "phone": "(515) 205-3017",
  "email": "mjnazrala@gmail.com",
  "address": "2910 WOOD STREET",
  "city": "AMES",
  "address_state": "IA",
  "zip_code": "50014",
  "county": "Story",
  "naics_code": "238320",
  "primary_activity": "Painting & Wall Covering Contractors",
  "status": "Registered",
  "issue_date": "2026-09-29",
  "expiration_date": "2027-09-29",
  "license_type": "Construction Contractor Registration",
  "state": "IA",
  "source_url": "https://data.iowa.gov/catalog/dataset/1052"
}
FieldExample valueMeaning
license_numberC153532DIAL registration number (e.g. C153532), unique per registration
business_name515 PAINTING & HOME SERVICES LLCRegistered business name
person_nameMARLON NAZRALA DELCIDRegistrant’s first and last name
phone(515) 205-3017Phone on file, formatted (XXX) XXX-XXXX
emailmjnazrala@gmail.comEmail on file with DIAL
address2910 WOOD STREETMailing street address
cityAMESMailing city
address_stateIAMailing state (out-of-state firms can register)

People come for the contact columns. DIAL’s public file has carried neither since 2026-11-03, so the actor fills them from DIAL’s 2026-10-14 edition, matched on the registration number only, never on a name. Across the 18,257 active registrations on 2026-11-05, 17,804 (97.5%) came back with a phone and 17,438 (95.5%) with an email; in the Polk County roofing run it was 112 of 115 for both. The ones without are mostly firms that registered after 2026-10-14. If DIAL ever puts the columns back, the actor uses its current values automatically. Expect personal webmail, though: 9,890 of the statewide emails are Gmail, Yahoo, Hotmail, AOL, Outlook or similar addresses.

Two columns need care. license_number is a registration number, not a licence, and it is unique (18,000 distinct on 18,000 rows), so it is the key to deduplicate on. county is DIAL’s own, and it is blank on 4,269 rows: most of those are the 4,057 out-of-state registrants, but 255 Iowa addresses lack one too, so a county filter quietly leaves those 255 out. If you need them, filter on city or zipCode instead. Last, issue_date behaves like the start of the current registration year: 15,394 of the 18,000 carry a 2026 issue date, so do not read it as the year a firm was founded.

Step 5: Export it

Open the Dataset tab and export to CSV, JSON or Excel, or pull the same rows from the API, which is what you want if this is going to run on a schedule.

What it costs

$0.004 per registration returned, plus Apify’s own platform usage. The Polk County roofing run above is 115 rows, so $0.46. Adding siding to the same county brought it to 165 rows, $0.66. The default cap of 500 rows is $2.00, and the whole statewide roster at 18,257 rows (2026-11-05) is $73.03. That last number is worth weighing honestly: the roster itself is a free download, so if you only need names, addresses and trades for all of Iowa once, take it from data.iowa.gov yourself. What the free file no longer gives you is the phone and email. Notice rows, for an outage or an unrecognised filter, cost nothing.

Where the data comes from

This reads IA DIAL directly. The target is a CSV the state publishes itself (DIAL construction contractor registrations on the Iowa open-data hub, CC BY 4.0, refreshed weekly), one GET, filtered in memory. Phone and email come from DIAL’s 2026-10-14 edition of the same file, joined on the registration number. Every night a canary runs this actor against that live source and checks that the Polk County roofing input still returns at least 80 rows, with a phone and an email on at least 90% of them: what “verified” means.

The dataset is number 1052 on data.iowa.gov, and its Download button gives you the same ZIP the actor reads, minus phone and email since 2026-11-03. What makes it awkward is not access but shape: the trade is a text label with no NAICS code to join on, the second address line usually just repeats “CITY ST ZIP”, and the file holds only active registrations, so a firm that lapses simply disappears from the next weekly refresh. It is published under CC BY 4.0, which means that if you republish the rows you must credit Iowa DIAL as the source.

See it used

Export Polk County, Iowa Roofing Contractors builds a Des Moines-area roofing and siding call list: 165 registrations, every one with a phone.

For a state that licenses contractors and publishes the roster as a file in the same way, Virginia Contractor License Lookup exports DPOR’s licences, with email but no phone. If you need to verify a Minnesota residential contractor instead, use Minnesota Contractor License Lookup & Leads Scraper (DLI).

Last updated 2026-11-05