← Guides

How-to

How to run HVAC Contractor Directory & Leads (State License Boards)

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

You want a list of licensed HVAC contractors to sell to, hire or check, and HVAC is licensed by a different board in every state. Doing it by hand for these five states means five sites in five formats: Texas’s open-data table of about a million TDLR licences, an Ohio roster CSV you have to request through a form, a West Virginia search that has no export, one spreadsheet per licence type from Idaho, and a Delaware dataset that mixes HVAC masters with every other profession. This actor reads all five and returns one table, active licences only.

What you’ll need

Nothing but an Apify account. The actor talks to each board directly.

No API key, no proxy and no CAPTCHA solving. Every board answered Apify’s own servers in the test run on 2026-10-15, so the proxy setting stays off.

Step 1 — Open the actor

Open HVAC Contractor Directory & Leads (State License Boards) on the Apify Store and press Try for free. The actor’s own page on this site lists its live health and pricing.

The HVAC Contractor Directory & Leads (State License Boards) 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 HVAC Contractor Directory & Leads (State License Boards) in the Apify Console
The input form, as it appears in the Apify Console.
FieldTypeRequiredWhat it does
statesarraynoWhich boards to export: TX, OH, WV, ID, DE (codes or names). Empty = all five. (default [])
statestringnoOne state, as a code or name. Kept for saved tasks; ‘States’ takes a list.
countystringnoA county name, matched in every selected state (so pick the state too: Franklin County exists in Ohio, Texas and Idaho). Delaware’s board publishes no county, so a county…
countiesarraynoSeveral counties in ONE run, e.g. Franklin, Delaware, Licking. (default [])
citystringnoBusiness or mailing city, exact match ignoring case and punctuation. Texas publishes no city for A/C Contractors, so a city filter returns no Texas rows.
citiesarraynoSeveral cities in ONE run. (default [])
zipstringnoA 5-digit ZIP (ZIP+4 accepted; the first 5 digits are matched). Texas publishes no ZIP for A/C Contractors.
zipsarraynoSeveral ZIP codes in ONE run. (default [])
maxResultsintegernoCap on licences for EACH selected state — your spend control. Every active HVAC licence across the five boards was 27,635 on 2026-10-15 (TX 18,660, OH 4,850, WV 1,637, ID… (default 100)

Two fields decide what comes back. maxResults caps each state, not the run: the default of 100 across all five states returns 500 rows, and 100000 takes everything (27,635 on 2026-10-15). A county, city or ZIP filter applies to every state you select, so name the state too. Franklin County exists in Ohio, Texas and Idaho; the input below asks for Ohio’s.

A filter can also rule a state out. Texas publishes no city or ZIP for A/C Contractors and Delaware publishes no county, so those states return nothing for that filter, and the run log says so.

A working input:

{
  "states": [
    "OH"
  ],
  "counties": [
    "Franklin"
  ],
  "maxResults": 1000
}

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 302 Franklin County licences in 4 seconds on 2026-10-15. A run across all five states with 2 rows each took under a minute on Apify.

An empty result arrives as one free row saying the boards answered and nothing matched, which usually means the filter was too narrow. A board that does not answer gets its own free row naming it, and the other states still deliver.

Step 4 — Read the output

Each run returns a labelled table, not raw JSON:

The output fields returned by HVAC Contractor Directory & Leads (State License Boards)
The output view — every field the actor returns, named and typed.

Every row looks like this — a real row from a real run:

{
  "state": "OH",
  "board": "OCILB",
  "license_number": "HV.10704",
  "license_type": "HVAC Contractor",
  "status": "ACTIVE IN RENEWAL",
  "business_name": "DOOLEY HEATING & AIR CONDITIONING",
  "person_name": "BRIAN P DOOLEY",
  "phone": "(614) 278-9944",
  "email": null,
  "address": "2010 Zettler Rd",
  "city": "Columbus",
  "address_state": "OH",
  "zip_code": "43232-3834",
  "county": "Franklin",
  "issue_date": "2026-01-01",
  "expiration_date": "2026-12-31",
  "trade": "hvac",
  "matched_by": "export",
  "source_url": "https://elicense4.com.ohio.gov/Lookup/GenerateRoster.aspx"
}
FieldExample valueMeaning
stateOHLicensing state: TX, OH, WV, ID or DE
boardOCILBLicensing board: TDLR, OCILB, WVCLB, DOPL or DPR
business_nameDOOLEY HEATING & AIR CONDITIONINGLicensed company, or the holder’s name where the board lists a person
person_nameBRIAN P DOOLEYLicensed individual or qualifying party, when published
phone(614) 278-9944Business phone, when the board publishes one
address2010 Zettler RdStreet or mailing address (OH, WV, ID)
cityColumbusCity (OH, WV, ID, DE)
zip_code43232-3834ZIP or ZIP+4

Most people come for phone, and coverage depends entirely on the board. Counted on 2026-10-15:

StateActive HVAC licencesWith phoneWith street address
Texas18,66000
Ohio4,8503,1254,819
West Virginia1,6371,6361,637
Idaho1,24946734
Delaware1,23900

If you need phones, export West Virginia and Ohio. Texas rows carry the county, the company and the licence holder’s name, which is enough to match against a list you already have but not to call. Ohio’s status is upper-case (ACTIVE, ACTIVE IN RENEWAL) because that is how the board writes it.

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.002 per licence returned. The default run (100 per state, all five states) is 500 rows, $1.00. Franklin County, Ohio was 302 rows, $0.60, and every active licence in the five states was 27,635 rows, $55.27, on 2026-10-15. Rows that explain an outage, a filter it did not recognise or an empty result are free. Apify’s platform usage is billed separately; the test run across all five boards used $0.0004 of it.

Where the data comes from

This reads five state licensing boards directly: TDLR’s open data in Texas, OCILB’s roster in Ohio, WVCLB’s public search in West Virginia, DOPL’s bulk list in Idaho and Delaware DPR’s open data. A canary runs this actor against all five live boards and checks every one returns rows — what “verified” means.

Each board needs a different trick. Ohio’s roster form defaults its state dropdown to Ohio, which silently drops every out-of-state licence holder unless it is cleared. Idaho’s export only works if every request echoes a version code from the previous answer. West Virginia’s search keeps its results in a server session and pages them out 1,000 at a time; ask for a bigger page and every field comes back blank.

See it used

Export Every Active HVAC Contractor in TX, OH, WV, ID and DE walks through taking all five states at once and comparing them month to month.

Need Ohio’s electrical and plumbing contractors as well? The Ohio Contractor License Lookup & Leads Scraper reads the same roster with every trade.

Last updated 2026-10-15