← Health board

TDLR

Texas Contractor Directory & Leads Scraper (TDLR)

Pull every TDLR-licensed contractor in any Texas county, or look one up by number or name — 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
43canary 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

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
mode string no "auto" auto (default): licence numbers or names below run a lookup; a county alone runs the county directory; any export filter (licence types, city, ZIP, expiry, exclude expired) runs the statewide export. lookup: names / numbers only. export: the statewide export, names ignored.
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 — 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). Unset: 500 per county or per export run; 50 per lookup value.
query string no — A Texas TDLR license number, business name, or owner name. Searches all three: exact license number, business-name substring, and owner-name substring — results are unioned and deduped by license #. TDLR keeps owner and business as separate columns and they disagree on 19,774 of its 983,494 records, so an owner search finds people a business-name search cannot. Leave this and the batch list empty to run a statewide export by licence type instead (see the statewide fields below).
queries array no [] Look up many in ONE run instead of starting a run per lookup. Takes the same values as 'Search query'. Combined with 'Search query' if you fill both, and duplicates are removed. Billing is unchanged: you are charged per record returned, not per entry submitted.
licenseTypes array no [] Several TDLR licence types in one export. Combined with 'Licence type'. Note: TDLR publishes address, city, ZIP and phone only for company/establishment types — Electrical Contractor, Appliance Installation Contractor, Electrical Sign Contractor and Elevator Contractor have them on ~99.8% of rows; A/C Contractor and every individually held licence (A/C Technician, Master Electrician, ...) have none.
city string no — Statewide mode only: keep licences whose business city is this, e.g. 'Austin'. Only company/establishment types carry a city, so A/C Contractor rows never match.
cities array no [] Statewide mode only: several cities (OR). Combined with 'City'.
zip string no — Statewide mode only: 5-digit business ZIP, e.g. '78701'. Same coverage caveat as City.
zips array no [] Statewide mode only: several ZIPs (OR). Combined with 'ZIP'. Values that are not 5 digits are dropped with a log line.
excludeExpired boolean no — Statewide mode only: keep only licences whose expiration date is today or later. TDLR publishes no status column, so expiry is the only currency signal.
expiresAfter string no — Statewide mode only: keep licences expiring on or after this date.
expiresBefore string no — Statewide mode only: keep licences expiring on or before this date — with 'Expires on or after' this gives a renewal-window list.
proxyConfiguration object no {"useApifyProxy":false} Optional. The Texas TDLR open-data API is reachable directly; a proxy is not needed.

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.

Lookup, county list or statewide export — which do I use?

Lookup when you have TDLR licence numbers, business or owner names: put them in 'Search query'. County list when you want one county's licensees: give the county (and optionally a licence type). Statewide export when you want a licence type across the state, filtered by city, ZIP or expiry: set mode to export, or just give those filters. 'Mode' forces one; auto decides from what you gave.

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