← Health board

TDLR

Texas Contractor Directory & Leads Scraper (TDLR)

Pull every TDLR-licensed contractor in any Texas county — licence number, type, expiry, owner — plus street address, suite and phone on the licence types TDLR publishes contact data for.

100%golden-diff pass
Run it on Apify verified nightly

Verification

100%golden-diff success
304canary runs
0days since last canary run

Output fields

Authoritative field set from the dataset schema.

FieldType
statestring|null
license_numberstring|null
business_namestring|null
person_namestring|null
license_typestring|null
license_subtypestring|null
expiration_datestring|null
countystring|null
addressstring|null
address_line2string|null
city_state_zipstring|null
phonestring|null
source_urlstring|null
scraped_atstring|null

Sample row

{
  "state": "TX",
  "license_number": "18028",
  "business_name": "DEAN JOHNSTON, INC",
  "person_name": "DEAN JOHNSTON, INC",
  "license_type": "Electrical Contractor",
  "license_subtype": "EC",
  "expiration_date": "08/04/2026",
  "county": "TRAVIS",
  "address": "515 S CONGRESS AVE",
  "address_line2": "SUITE 106",
  "city_state_zip": "AUSTIN TX 78704",
  "phone": "5124773747",
  "source_url": "https://data.texas.gov/dataset/Texas-Department-of-Licensing-and-Regulation/7358-krk7"
}

Inputs

FieldTypeReqDefaultDescription
county string no "TRAVIS" Texas county name to browse (e.g. TRAVIS, 'Harris County', DALLAS). Case, spacing and a trailing 'County' do not matter. If it is missing or is not a Texas county, the run returns the free county list instead of failing, so you can see the exact names.
counties array no ["TRAVIS"] Look up many in ONE run instead of starting a run per lookup. Takes the same values as 'County'. Combined with 'County' if you fill both, and duplicates are removed. Billing is unchanged: you are charged per record returned, not per entry submitted.
licenseType string no Optional substring filter on TDLR's license-type text (e.g. 'Electrical Contractor', 'A/C Contractor', 'Establishment'). Note TDLR does not use the word 'HVAC' — the type is 'A/C Contractor'. IF YOU WANT PHONE NUMBERS AND ADDRESSES, pick an establishment/company type: 'Electrical Contractor', 'Appliance Installation Contractor', 'Water Well Driller', 'Full Service Establishment' and ~35 others carry contact data on effectively every row. Individually held licences (A/C Contractor, A/C Technician, all electrician grades, cosmetology operators) are roster-only — the state publishes no address or phone for them, so those columns come back null. Leave blank for every license type in the county.
maxResults integer no 500 Cap on the number of records returned PER ENTRY, not per run — so a batch cannot silently return only the first 500 rows overall and read as 'the rest don't exist'. Default 500; raise to pull an entire county roster (the biggest, Harris, holds 161,937 rows across all trades).

Pricing

Pay per result (dataset-item) — no charge for empty runs.
Example: 500 contractor records at $0.002/result ≈ $1.00.

FAQ

Where does the data come from?

The official Texas Department of Licensing & Regulation (TDLR) open-data registry, published on data.texas.gov. TDLR does not publish a refresh schedule for it.

What trades does TDLR license?

TDLR licenses electricians, HVAC/AC contractors and technicians, appliance installers, boiler operators, cosmetologists, behavior analysts, and dozens of other trades — but NOT general contractors (Texas has no statewide GC license) and NOT plumbers (licensed by the separate TSBPE board).

How do I find the right county name to use?

Texas county names in the TDLR dataset are in ALL CAPS (e.g. TRAVIS, HARRIS, DALLAS). The actor accepts any case and normalizes it for you.

How many records can I pull?

As many as the county holds — measured 2026-08-21, Harris has 161,937 TDLR licensees across all trades and Travis has 36,652. maxResults is a cap PER county entry, not per run, and the actor pages through the state's API automatically until it hits your cap or runs out of rows. Narrow with licenseType first unless you really want the whole roster: a county pull is billed per record.

Which license types actually come with a phone number and address?

The establishment and company ones. TDLR publishes contact details for about 40 of its licence types — Electrical Contractor, Full Service Establishment, Mini Establishment, Appliance Installation Contractor, Water Well Driller/Pump Installer, Elevator Contractor, Electrical Sign Contractor and similar — and on those it is present on effectively every row (Electrical Contractor: 13,911 of 13,917 statewide, measured 2026-08-21). Individually held licences do not carry contact data at all: A/C Contractor, A/C Technician, Apprentice/Journeyman/Master Electrician, cosmetology operators and the rest come back with address, city/ZIP and phone null on every row, statewide, by design — that is what the state publishes, not a gap in the scrape. Across the whole dataset it works out at 99,720 of 983,494 rows (10.1%). If you need a dialling list, filter to an establishment or contractor licence type; if you need a roster or a compliance sweep, every type works.

Can I map the results?

Not directly from this output, and that is deliberate. The state's file does carry a coordinate pair, but it is a city centroid rather than a street geocode — across Travis County's Electrical Contractors, 432 distinct addresses share just 17 distinct points, with 347 of them stacked on one. Passing that through would put a whole city's contractors on a single pin, so it is left out; city_state_zip carries the same information with more precision. Geocode the address column yourself if you need pins.

Can I filter by license type?

Yes — pass a partial string in licenseType (e.g. 'A/C Contractor', 'Electrician') to restrict results to that trade type within the county.

How am I charged?

Pay-per-record — one PPE event per dataset item returned. Runs with no results incur no charge.

Is this personal data?

It's public professional-license data (business and license records as TDLR publishes them); we add no personal/PII enrichment beyond what the state publishes.

How current is the data?

TDLR publishes no refresh schedule and the export is not daily. Checked again on 2026-08-21, the dataset's last row update was still 2026-07-16 — 36 days earlier, and the same date reported at the 2026-07-28 check. Records reflect the most recent published snapshot, which can be weeks old; data.texas.gov shows the exact date, and the actor's source_url links straight to it.

Guides & use cases

Related actors