Use case
Export Every Active Oklahoma Roofing Contractor
Every In Good Standing roofer on Oklahoma's CIB registry, statewide: company, registration number, phone, address and insurer.
Suppose you’re an insurance agent in Oklahoma City who writes general liability and workers’ comp for contractors, and you want a book of roofers. Oklahoma’s Construction Industries Board keeps a roofing contractor registry, and each registration carries the insurer and the policy expiry date the roofer filed. That makes the registry a renewal calendar: whoever’s liability policy lapses in the next 90 days is the call to make this week.
The registry will tell you all of that, one roofer at a time. You want all 1,924 of them in good standing, sorted by expiry.
The manual way, and what it costs
CIB’s roofing search at verify.cib.hbesystems.com is free and needs no account. Type a company name and you get its registration and status on screen. If you’re checking the three roofers a client named, use it and stop reading.
For a book of business it doesn’t scale. The results come 10 to a page with no export, so the 1,924 active registrations on 2026-10-14 are about 190 pages, each row retyped into a sheet before you can sort a single date. Expired, pending and not-in-good-standing records are mixed into the same registry (6,069 records in all), and some registration numbers appear on two different firms, so a hand-built list double-counts unless you notice. And the list is stale the next time CIB processes a renewal.
The faster way
Oklahoma Roofing Contractor Directory & Leads (CIB) does the same search once and hands back every row at once.
{
"statuses": [
"In Good Standing"
],
"maxResults": 5000
}
In Good Standing keeps the 1,924 current registrations and leaves out the 3,129 that expired for
non-renewal; add that status later if lapsed roofers become a campaign of their own. No cities filter, because a renewal calendar is
statewide and CIB publishes no county to narrow by anyway. maxResults of 5,000 sits well above the
1,924 active rows, so the cap never cuts the list short; at $0.002 a row the run costs $3.85.
What comes back
{
"state": "OK",
"registration_id": 47591,
"license_number": "80000002",
"business_name": "S & CM, LLC",
"trade_name": "MCROOF.US",
"license_type": "Roofing Contractor Registration",
"status": "In Good Standing",
"commercial_endorsement": true,
"expiration_date": "2027-11-30",
"processed_date": "2026-09-29",
"phone": "(405) 877-7663",
"address": "722 ENTERPRISE DR #150",
"city": "EDMOND",
"address_state": "OK",
"zip_code": "73013",
"fax": null,
"person_name": "SCOTT A MCCOLLUM,SR",
"company_type": "LLC",
"state_of_formation": "OK",
"insurance_company": "WESTERN WORLD IN CO",
"insurance_expiration_date": "2027-06-26",
"workers_comp_company": "TRAVELERS CAS & SURETY CO",
"workers_comp_expiration_date": "2027-07-01",
"workers_comp_exempt": false,
"county": null,
"matched_by": "statewide_export",
"source_url": "https://verify.cib.hbesystems.com/roofing/search"
}
| Field | Example value | Meaning |
|---|---|---|
business_name | S & CM, LLC | Registered company name |
trade_name | MCROOF.US | Trade name / DBA the company filed (on 398 of 1,924 active rows) |
license_number | 80000002 | CIB roofing registration number (e.g. 80000002). Not unique on its own: some numbers appear on two firms’ records |
registration_id | 47591 | CIB’s own record id; unique per row and the dedupe key |
license_type | Roofing Contractor Registration | ’Roofing Contractor Registration’, or ‘Roofing Contractor Application’ for pending ones |
status | In Good Standing | In Good Standing, Not In Good Standing, Expired, Expired - for non-renewal, or Pending |
The fields that close the loop are further down the row: insurance_company with
insurance_expiration_date, and workers_comp_company with workers_comp_expiration_date. In the
sample, S & CM’s liability policy with Western World ends 2027-06-26 and its comp with Travelers on
2027-07-01, so it belongs on next summer’s list. workers_comp_exempt flags the registrants who
filed an exemption instead of a policy, which is a different conversation. phone is on all 1,924
active rows, so every name on the calendar has a number next to it.
What you’d do with it
Export the dataset to CSV, sort on insurance_expiration_date, and cut it into monthly call lists.
Import into your CRM keyed on registration_id, not license_number: CIB’s own id is unique per
record, while 18 active registration numbers were shared by two companies on 2026-10-14. Run it again
next quarter and compare ids to see who registered, who lapsed, and whose insurer or expiry date
changed since the last pull.
Worth knowing
This is the CIB roofing registry and nothing else. Oklahoma licenses electrical, plumbing and
mechanical contractors separately, and none of them are in it. There is no county and no email in
the source, so county is always null and there’s no address to send a quote to except a postal
one. That address is the business address as filed, and 246 of the 1,924 active rows give a PO box.
Not every row is local either: 1,565 of the active registrants have an Oklahoma address, and the
rest are out-of-state firms registered to work in Oklahoma. City filtering is exact, so OKC does
not match Oklahoma City. And the insurer on the row is what the roofer filed with CIB, not a live
check with the carrier.
Run it yourself: How to run Oklahoma Roofing Contractor Directory & Leads (CIB) walks the whole thing step by step.
When you only want one metro: the guide’s example input pulls Tulsa and Broken Arrow alone, 240
registrations for about $0.48 on 2026-10-14. Same actor, same page, with cities filled in.
When your territory crosses into Illinois: the Illinois Roofing Contractor Directory & Leads Scraper (IDFPR) exports IDFPR’s roofing licences by county, with city and ZIP but no phone.
Last updated 2026-10-14