How-to
How to run Texas Contractor & Trade License Lookup (TDLR)
Step-by-step: the exact input, what each field does, and the rows that come back from TDLR (Socrata).
You have a Texas trade shop — an electrician, an A/C crew — and you need the licence on the record before they start work, or before you pay them. Start with the thing most people get wrong: Texas has no statewide general-contractor licence. The state licenses trades, through the Texas Department of Licensing & Regulation (TDLR). “Is this contractor licensed in Texas” is not a question the state can answer; “does this shop hold a current TDLR electrical or A/C licence” is. The manual way to answer it is TDLR’s own licence search: a box, a button, one record at a time. For a single lookup that’s a minute and it’s free — do that. What this actor is for is the twelfth lookup, and the one after renewal season, and the list of subs sitting in a spreadsheet that has to be re-checked every year: one search per name, no export, no schedule, all of it copied out by hand.
What you’ll need
Nothing but an Apify account. The actor talks to TDLR (Socrata) directly.
No API key, no proxy, no CAPTCHA credits, no login. Texas publishes the TDLR licensee file as an
official Socrata open-data dataset on data.texas.gov — public JSON, documented, free to query, and
filtered server-side with SoQL. Nothing is being worked around here, so there is no third-party cost
inside a run and nothing for you to sign up for. (A Socrata app token would raise the shared rate
limit, but the actor runs unauthenticated and doesn’t need one at this volume.)
Step 1 — Open the actor
Open Texas Contractor & Trade License Lookup (TDLR) on the Apify Store and press Try for free. The actor’s own page on this site lists its live health and pricing.
Step 2 — Fill in the input
| Field | Type | Required | What it does |
|---|---|---|---|
query | string | yes | A Texas TDLR license number or business name. Searches by exact license number and by business-name substring; owner names are returned on the row but are not searchable. |
maxResults | integer | no | Cap on matches returned (bounds cost). This is now honoured end to end - the Socrata query is issued for this many rows. (default 50) |
query is the field people get wrong, because it does two jobs at once. The actor runs your string
twice: once as an exact match against TDLR’s licence number, then once as a substring match
against the business/owner-name column. So 11484 verifies one specific licence, while ELECTRIC
returns every licensee whose registered name happens to contain that word — which in Texas is a lot
of them. A short, common word is a broad survey, not a verification. If you’re checking a specific
shop, paste the name as TDLR spelled it (many licensees are filed as a person, SEAY, DANIEL, not a
company), or better, paste the licence number.
maxResults is the spend cap, and it is the only thing standing between a one-word query and a bill:
you are charged per row returned. Leave it at the default of 50 while you find out how broad your
query really is, then widen it once you know.
A working input:
{
"query": "ELECTRIC",
"maxResults": 25
}
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.
A healthy run is dull and quick. There is no browser, no login and no CAPTCHA — it’s at most two HTTP
calls to Socrata (the licence-number match, then the name match), each requested at your maxResults,
deduplicated on licence number and then cut to it. A verify-one-licence run comes back with a single row
in a few seconds; a name search comes back with as many rows as your cap allows.
An empty run is nearly always the query, not the actor. A licence number has to match exactly, and a
name has to match the way Texas filed it — punctuation, & versus and, “SEAY, DANIEL” rather than
“Daniel Seay”. Before you conclude that someone is unlicensed, drop back to a shorter fragment of the
name and run it again. And remember the state-level caveat: if you’re looking for a general
contractor’s Texas licence, there isn’t one to find. That is Texas, not a failed run.
Step 4 — Read the output
Each run returns a labelled table, not raw JSON:
Every row looks like this — a real row from a real run:
{
"state": "TX",
"license_number": "11484",
"business_name": "SEAY, DANIEL",
"person_name": "SEAY, DANIEL",
"license_type": "A/C Technician",
"expiration_date": "09/02/2026",
"county": "GREGG",
"matched_by": "business_name",
"source_url": "https://www.tdlr.texas.gov/LicenseSearch/"
}
| Field | Example value | Meaning |
|---|---|---|
state | TX | Always ‘TX’ for this actor |
license_number | 11484 | TDLR license number |
business_name | SEAY, DANIEL | Licensed business or licensee name |
person_name | SEAY, DANIEL | Owner name |
license_type | A/C Technician | TDLR license type (e.g. A/C Technician, Master Electrician) |
expiration_date | 09/02/2026 | License expiration date |
county | GREGG | Business county |
matched_by | business_name | Which search surfaced this match: ‘license_number’ or ‘business_name’ |
Most people came for expiration_date and license_type, and both need reading with care.
expiration_date is the check you can actually make in Texas, because this dataset publishes no
status column. There is no “Active” / “Expired” / “Revoked” string to read; what you get is the
licence, its type and the date it runs out. An in-date licence present in the feed is your evidence
that TDLR holds a current record — it is not a statement that the licence is in good standing. If you
need a status determination, the licence number this actor hands you is what you take to TDLR’s own
search. The date arrives as TDLR formats it, 09/02/2026 (US month-first), not ISO — worth knowing
before you sort a spreadsheet on it.
license_type is the one people skip and shouldn’t. A name search matches names, not trades, so a
row coming back tells you TDLR licenses that name — it doesn’t tell you they hold the licence you
care about. Read the type (A/C Technician, Master Electrician, and so on) and make sure it’s the
trade you’re hiring for.
The other gap to plan for: there is no address in this dataset. county is the only location
field, and there’s no street, no city, no phone. business_name and person_name are frequently the
same string, because sole traders are filed under their own name. Anything TDLR doesn’t publish comes
back null rather than blank or guessed. matched_by tells you why a row is in your results —
license_number for an exact hit, business_name for a name match — which is worth keeping when
you’re reviewing a broad search.
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.004 per matched licence — 100 verified records is $0.40, 1,000 is $4.00. You pay per row returned,
so a search that finds nothing is free. Apify’s platform compute is billed separately on your plan,
and there is no third-party cost inside the run because the source is a free public API. In practice,
verifying one licence number costs a fraction of a cent; the run that costs money is a one-word name
search with maxResults left wide open.
Where the data comes from
This reads TDLR (Socrata) directly. The target is Socrata SODA JSON API (data.texas.gov, TDLR licensees) - filtered server-side with SoQL. Every night a canary runs this actor against that live source and diffs the result against a frozen fixture — what “verified” means.
Be straight about this one: it is the easiest tier there is. Texas puts the TDLR licensee file on
data.texas.gov deliberately, as a documented Socrata dataset with an open JSON API, no anti-bot and
no gate. If you’re comfortable writing a SoQL $where clause you can query it yourself, for free,
this afternoon. What you’d be paying for here isn’t access — it’s the shape of what comes out: two
searches (exact number, name substring) fired for you, TDLR’s column names mapped onto the same
licence record every other actor in this suite returns, nulls where Texas publishes nothing rather
than empty strings, and a nightly canary that notices when the state renames a column before your
pipeline does.
See it used
Find Texas Electricians by Company Name shortlists Texas electrical licences by company name.
Nothing in Texas is one-state forever. If a sub could be registered anywhere and you don’t want to guess the board, Multi-State Contractor & Trade License Lookup runs the same query across Washington, Oregon, Texas and Connecticut in a single run. If what you want is the other direction — not verifying a known shop but building the list of Texas contractors in the first place — reach for Texas Contractor Directory & Leads Scraper instead. And if the job is a Florida licence rather than a Texas one, Florida Contractor License Lookup hits DBPR, which (unlike TDLR’s open-data feed) does publish a status column.
Last updated 2026-07-13