# Texas Electrician, HVAC & TDLR License Lookup — Bulk Search (`cblu/texas-license-records-scraper`) Actor

Search, look up & verify Texas TDLR licenses in bulk — electricians, HVAC, cosmetology, tow, massage & 50+ more trades. Status, expiration, address, phone. Official TDLR data. Export CSV/JSON/Excel.

- **URL**: https://apify.com/cblu/texas-license-records-scraper.md
- **Developed by:** [Steven Carleton](https://apify.com/cblu) (community)
- **Categories:** Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 license records

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Texas TDLR License Records Scraper — Electrician, HVAC & 50+ Trade License Data

Extract **official Texas professional license records** — electricians, HVAC/AC contractors and technicians, cosmetologists, barbers, tow truck companies, massage therapists, mold remediation contractors, property tax professionals, and 50+ more TDLR programs — straight from the Texas Department of Licensing and Regulation's public data files. Filter by **license type, county, city, ZIP, status, and expiration date** and download clean JSON, CSV, or Excel.

Because this Actor reads the state's **official public data files** (not a fragile search form), it is fast, complete, and does not miss records: a statewide pull of every master electrician takes about a minute. Several TDLR company files (electrical contractors, tow companies, appliance installation contractors...) include **business phone numbers and full addresses** — data most state license sources never publish.

### What data do you get?

One result per license record:

| Field | Example |
|---|---|
| `licenseNumber` | `241575` |
| `licenseType` / `licenseSubtype` | `Master Electrician` / `RAIC` |
| `licenseeName` | `SMITH, JOHN` |
| `businessName` | Business / DBA name |
| `phone` / `businessPhone` | `5124540550` |
| `addressLine1..2`, `city`, `state`, `zip` | Mailing address of record |
| `businessAddressLine1..2`, `businessCity`, `businessZip` | Business/site address |
| `county` / `businessCounty` / `businessCountyCode` | `TRAVIS` / `TRAVIS` / `0453` |
| `licenseStatus` | `Licensed` (trades) or `CURRENT` / `EXPIRED` (health professions) |
| `expirationDate` | `2027-02-28` |
| `continuingEducation` | `Y` / `N` |

Field availability varies by program and is decided by TDLR, not this Actor: **company/contractor files** (electrical contractors: 100% address + business phone; tow companies: site address + phone) are the contact-data-rich ones; TDLR blanks the address/phone columns in several **individual-practitioner files** (e.g. master electricians, A/C contractors), which still carry name, license type, county, status, and expiration; **health-profession files** carry status and county, plus address and phone for organizations (e.g. massage establishments, mold companies).

### Supported professions

- **Electrical** — all electricians, master, journeyman, apprentice, wiremen, electrical contractors, sign contractors
- **HVAC** — A/C & refrigeration contractors, registered and certified technicians
- **Barbering & cosmetology** — practitioners, operators, barbers, manicurists, estheticians, establishments, schools
- **Towing & vehicle storage** — tow truck operators, tow companies (with site address & phone), storage facilities
- **Mold** — assessment companies & consultants, remediation companies, contractors & workers
- **Massage** — therapists, establishments, schools
- **Property tax** — consultants and professionals (appraisers, collectors, assessors)
- **Health professions** — dietitians, athletic trainers, speech-language pathologists, audiologists, hearing instrument fitters, midwives, podiatrists, behavior analysts, sanitarians, laser hair removal
- **Other trades** — auctioneers, boiler inspectors, elevator inspectors & contractors, licensed breeders, accessibility specialists, water well drillers, used auto parts recyclers, PEOs, service contract providers, driver education, motor fuel metering
- **ALL TDLR licenses** — one statewide file covering every program

Note: Texas has **no state general-contractor license** (GC licensing is municipal), so a "Texas general contractor license list" does not exist in any state source. The licensed trades above — electrical, HVAC, and specialty programs — are the state-licensed construction workforce.

### Use cases

- **Lead generation** — build county- or city-level lists of electrical contractors or tow companies *with phone numbers* for insurance, building materials, SaaS, CE courses, or financial products. Combine with `expiresBefore` to target licensees whose **renewal is coming up**.
- **License verification at scale** — verify that subcontractors, vendors, or marketplace signups hold a current Texas license.
- **Market sizing & analytics** — count active A/C technicians per county, track new licensees, analyze trade density.
- **Compliance & risk** — flag partners whose license is expiring or (health professions) expired.
- **Recruiting** — source licensed professionals by trade and region.

### How to use it

```json
{
    "profession": "electricians-all",
    "licenseTypes": ["Master"],
    "counties": ["Travis"],
    "status": "current",
    "maxResults": 5000
}
```

Leave `licenseTypes`, `counties`, `cities`, and `zips` empty for statewide, all-type pulls. `maxResults` caps the run — **you are only charged for records actually returned**.

### Pricing

Pay per result: one charge per license record extracted — $4.00 per 1,000 records ($0.004/record). A 1,000-lead county list with phone numbers costs $4 versus hours of manual TDLR searching.

### Data source & freshness

Records come from the Texas Department of Licensing and Regulation's free public data files (tdlr.texas.gov), which TDLR regenerates **every morning** (~6 AM Central). This is public information published by the State of Texas. Trade listing files contain currently licensed people and firms only; health-profession files also include expired records (filter with `status`).

**Note on fairness:** phone numbers and addresses are included exactly where TDLR publishes them. TDLR blanks the contact columns in some programs (e.g. individual electricians, A/C contractors) — any actor claiming phone numbers for those licensees is scraping a different, slower source or fabricating data.

### FAQ

**How current is the data?** TDLR regenerates the files daily. Schedule the Actor weekly (or daily) to keep your lists fresh.

**Can I pull every TDLR license in Texas?** Yes — select "ALL TDLR licenses", set `maxResults` high, and let it stream. Runs are memory-safe because the file is processed as a stream, and downloads survive connection cuts via HTTP-Range resume.

**Why doesn't a "general contractor" option exist?** Texas does not license general contractors at the state level — that's municipal. Electricians, HVAC, and the other programs here are the state-licensed trades.

**A TDLR program you need is missing?** Open an issue on the Actor's Issues tab — adding another TDLR file is usually a same-week change.

# Actor input Schema

## `profession` (type: `string`):

Which TDLR-licensed profession to extract license records for. Trade files (electricians, A/C, tow, cosmetology...) include mailing + business address and phone numbers; health-profession files include status and county.

## `licenseTypes` (type: `array`):

Optional. Only return licenses whose type or subtype matches, e.g. <code>Master</code>, <code>Journeyman</code>, <code>ACR</code>, or a TDLR subtype code like <code>OP</code> (cosmetology operator). Case-insensitive; type names match as substrings, subtype codes match exactly. Leave empty for all types in the selected profession.

## `counties` (type: `array`):

Optional. Texas county names, e.g. <code>Harris</code>, <code>Dallas</code>, <code>Travis</code>, <code>Bexar</code>. Matches the licensee's county or the business county. Leave empty for statewide.

## `cities` (type: `array`):

Optional. Exact city names, e.g. <code>HOUSTON</code>, <code>AUSTIN</code>. Case-insensitive; matches the mailing or business city. Leave empty for all cities.

## `zips` (type: `array`):

Optional. 5-digit ZIP codes, e.g. <code>78701</code>. Matches the mailing or business ZIP. Leave empty for all ZIPs.

## `status` (type: `string`):

TDLR's trade listings contain only currently licensed people and firms. Health-profession listings also include expired records — "Currently licensed" (default) filters those out; "Any status" keeps them.

## `expiresBefore` (type: `string`):

Optional. Only return licenses expiring before this date (format <code>YYYY-MM-DD</code>). Great for renewal/CE marketing lists.

## `expiresAfter` (type: `string`):

Optional. Only return licenses expiring after this date (format <code>YYYY-MM-DD</code>).

## `nameContains` (type: `string`):

Optional. Case-insensitive substring match against the licensee name and business/DBA name.

## `maxResults` (type: `integer`):

Maximum number of license records to return. You are only charged for records actually returned.

## Actor input object example

```json
{
  "profession": "electricians-all",
  "licenseTypes": [],
  "counties": [],
  "cities": [],
  "zips": [],
  "status": "current",
  "maxResults": 500
}
```

# Actor output Schema

## `records` (type: `string`):

All extracted license records as JSON.

## `recordsCsv` (type: `string`):

All extracted license records as CSV.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "profession": "electricians-all",
    "maxResults": 500
};

// Run the Actor and wait for it to finish
const run = await client.actor("cblu/texas-license-records-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "profession": "electricians-all",
    "maxResults": 500,
}

# Run the Actor and wait for it to finish
run = client.actor("cblu/texas-license-records-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "profession": "electricians-all",
  "maxResults": 500
}' |
apify call cblu/texas-license-records-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,cblu/texas-license-records-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/WnzOJA0BfaENQq53z/builds/fWv3qCcaydXND1sWI/openapi.json
