← Use cases

Use case

Build a Cook County Roofing Contractor List

Pull every licensed Illinois roofing contractor in Cook County from IDFPR's open data - licence number, status, business name and city, ready for outreach.

Say you run a roofing supply yard on the south side of Chicago and you are deciding where to put a second location. The question is not “are there roofers in Cook County” — there are thousands. The question is which towns have enough licensed roofing contractors to keep a counter busy, how many of them are actually still trading, and whether the density you think you see from your existing delivery routes holds up across the whole county. Then, once the site is chosen, you want the same list again as a call sheet.

Illinois is unusually easy to answer this in, for an unusual reason: roofing is the only construction trade the state licenses centrally, so one dataset holds every one of them.

The manual way, and what it costs

The public search form on IDFPR (Socrata)
IDFPR (Socrata) — the official search. One record at a time.

IDFPR publishes its whole licence file as open data on data.illinois.gov, and the portal will filter and export it for you. No account, no fee, no CAPTCHA. For a one-off count, that is the right tool and this article is not worth your time.

What you get, though, is a raw regulatory table rather than a list of businesses. It carries every profession the department regulates, so step one is filtering to the roofing licence type. It carries every licence the department has ever issued, so step two is deciding what to do with the cancelled, not-renewed and deceased rows. It mixes firm licences with the individual “qualifying party” who stands behind them, so step three is working out which rows are companies. And the county column is dirty enough that a slice of historical rows carry a blank or an out-of-state value. None of that is hard. All of it has to be redone by hand the next time you want the file, because a filtered view in a portal is not something your Monday-morning report can call.

The faster way

Illinois Roofing Contractor Directory & Leads Scraper (IDFPR) does the same search once and hands back every row at once.

{
  "county": "COOK",
  "maxResults": 500
}

Two inputs, because the licence type is not a choice — the actor queries the roofing-contractor slice of the IDFPR dataset and nothing else. county is the whole targeting decision. The dataset spells its counties in capitals — COOK, DUPAGE, SAINT CLAIR — but case, spacing and a trailing “County” are folded before matching, so Cook County and St. Clair land where you expect. A name that matches nothing returns the county list, free, rather than failing or quietly returning nothing. If you would rather see that list first, run once with listCountiesOnly: true — it returns every Illinois county that has roofing records, in seconds, and is not charged, which also makes it a free way to sanity-check the county names before a batch of runs. maxResults: 500 caps the first pass; Cook alone runs to thousands of rows, so raise it once you have looked at what comes back.

What comes back

{
  "state": "IL",
  "license_number": "104012345",
  "business_name": "CHICAGO SKYLINE ROOFING INC",
  "license_type": "LICENSED ROOFING CONTRACTOR",
  "status": "ACTIVE",
  "issue_date": "03/15/2010",
  "expiration_date": "06/30/2025",
  "city": "CHICAGO",
  "county": "COOK",
  "address": null,
  "zip_code": "60601",
  "phone": null,
  "person_name": null,
  "bond_amount": null,
  "bond_company": null,
  "insurance_company": null,
  "matched_by": "county_directory",
  "source_url": "https://data.illinois.gov/d/pzzh-kp68"
}
FieldExample valueMeaning
stateILAlways ‘IL’
license_number104012345IDFPR license number (e.g. 104012345). May be null for historical/deceased records.
business_nameCHICAGO SKYLINE ROOFING INCLicensed business or individual licensee name
license_typeLICENSED ROOFING CONTRACTORIDFPR license description (e.g. LICENSED ROOFING CONTRACTOR or QUALIFYING PARTY ROOFING CONTRACTOR)
statusACTIVELicense status (ACTIVE, NOT RENEWED, CANCELLED, DECEASED)
issue_date03/15/2010Original issue date (MM/DD/YYYY)

For the siting question, zip_code and city are the entire analysis: a pivot of active licences per ZIP is a density map of your market, and it will tell you fairly bluntly whether the corridor you had in mind is thick or thin. license_type is the field that keeps that count honest — LICENSED ROOFING CONTRACTOR rows are firms, QUALIFYING PARTY ROOFING CONTRACTOR rows are the individuals who qualify them, and counting both double-counts your market. issue_date is a usefully unglamorous signal for the call sheet: a licence issued eighteen months ago is a young business that has not yet settled on a supplier, which is a better cold call than a fifty-year-old firm with an account somewhere else. What you will not find in the row is a street address or a phone number — both are null, always, because IDFPR does not publish them.

What you’d do with it

Export to CSV, keep only status = ACTIVE and license_type = LICENSED ROOFING CONTRACTOR, then pivot the survivors by zip_code. That table is the branch-siting argument, and it took one run. For the call sheet, take the same filtered rows and enrich them: business_name plus city and zip_code is enough to find a website, and a website is enough to get a phone number and an address. Key the whole thing on license_number so next quarter’s run tells you who is new and who stopped renewing.

Worth knowing

No street address, no phone. IDFPR publishes city, state, ZIP and county — nothing more granular. Both fields exist in the output for consistency with the rest of the suite and are always null. Every export from this actor needs an enrichment step before anyone can dial it.

Roofing only, and that is Illinois’s fault, not the actor’s. There is no statewide Illinois general-contractor, electrical or plumbing licence; those are issued municipally, city by city. Roofing contractor is the one construction trade IDFPR licences at state level, so it is the one trade this dataset can give you.

Person rows and blank licence numbers are in there. The dataset includes individual qualifying parties alongside firms, and some historical rows carry no licence number at all. Neither is a bug in the export; both are in the state’s file, and both will skew a naive row count.

There is no status filter. The county roster comes back complete — ACTIVE next to NOT RENEWED, CANCELLED and DECEASED. Filter after export, and do it before anyone mails anything.

Roughly one row in seven is unusable for county work. About 15% of historical records carry a blank or out-of-state county value; those are excluded from a county-scoped run, so a Cook County export is “everyone IDFPR files under Cook”, not everyone who roofs there.


Run it yourself: How to run Illinois Roofing Contractor Directory & Leads Scraper (IDFPR) walks the whole thing step by step.

The missing phone numbers: Find contact details for a list of company websites is the step that turns this export into something you can actually dial. And if you work the upper-Midwest roofing market as a whole, Minnesota Contractor License Lookup & Verify (DLI) covers the neighbouring state — where residential roofers are licensed, and enforcement actions are published with them.

Last updated 2026-07-22