# Texas Trade License Lookup & Verify (TDLR) (`helenium/texas-contractor-license-lookup`) Actor

Verify a Texas TDLR trade licence by number or business name — electricians, HVAC, irrigators and the other regulated trades. Texas does not license general contractors.

- **URL**: https://apify.com/helenium/texas-contractor-license-lookup.md
- **Developed by:** [Bio Verse](https://apify.com/helenium) (community)
- **Categories:** Lead generation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

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

## 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 Trade License Lookup & Verify (TDLR)

Verify a Texas TDLR trade licence by number or business name — electricians, HVAC, irrigators and the other regulated trades. Texas does not license general contractors.

Look up by licence number, or search by business name. Every record comes back in the
same normalized shape, so Texas results parse identically to any other state's.

### Before you run it

Texas licenses trades at state level but not general contracting. TDLR covers electricians, HVAC, irrigators, elevator and similar regulated trades; it does not license general contractors, and plumbers are licensed by a separate board that publishes no open extract. A Texas general contractor has no state licence to verify. TDLR also issues numbers per licence type rather than per licensee, so one number can belong to several unrelated holders: a lookup returns the licence that is currently in force, and a name search shows every holder. The number as printed on an A/C licence (TACLA00000299C) and the bare number (299) both resolve, and the printed form's letters pick the right holder out of a shared number.

### What TDLR publishes

- Licence status, derived from the expiration date
- Trade and licence type
- Expiration date
- Business address on the roughly one licence in eight that carries one
- County

### What it does not

– A status column of its own
– Issue date
– Surety bond
– Workers' compensation
– Disciplinary actions (TDLR publishes enforcement elsewhere, not in this extract)

A field the source does not publish comes back `null`, and every record carries a
`data_completeness` map saying which fields TDLR supplies at all — so a
`null` you can act on is never confused with one you cannot.

### Input

```json
{
  "licenseNumbers": ["612"],
  "names": ["IRRI*TECH CONSTRUCTION"],
  "limit": 25
}
```

Give licence numbers, names, or both. A name search pages until the register says
there are no more matches.

### Output

One dataset row per licence, carrying the query that found it:

```json
{
  "query": "612",
  "query_type": "license_number",
  "state": "TX",
  "license_number": "612",
  "status": "ACTIVE",
  "status_raw": "Active",
  "business_name": "IRRI*TECH CONSTRUCTION",
  "classifications": [{ "code": "B", "description": "GENERAL BUILDING" }],
  "expiration_date": "2027-02-28",
  "source_url": "https://…",
  "data_as_of": "2026-08-04T00:00:00Z"
}
```

`data_as_of` is the age of the underlying register extract — not when this run
happened. Use it before concluding the API disagrees with the board.

### Billing

Pay per licence record delivered. A query that matches nothing costs nothing.

### Other states

This actor covers Texas. The same data for the other states, and one API
call that spans all of them, is at
[swanum.com](https://swanum.com) — also on
[RapidAPI](https://rapidapi.com/kriptkor/api/contractor-license-verification2).

### Data source

Department of Licensing and Regulation (TDLR), the official Texas register. This actor
adds no data of its own: it normalizes what the board publishes and says plainly
where the board is silent.

# Actor input Schema

## `state` (type: `string`):

Texas — Department of Licensing and Regulation (TDLR). This actor covers Texas only.

## `licenseNumbers` (type: `array`):

Exact licence numbers to look up. Dashes and spaces are ignored.

## `names` (type: `array`):

Business or qualifier names to search. Partial, case-insensitive match.

## `limit` (type: `integer`):

How many licences to return for each name search. Results are paged from the API 100 at a time, so a larger number means more requests and a longer run.

## `includeNotFound` (type: `boolean`):

Add a row for each query that matched nothing. You are never charged for these.

## Actor input object example

```json
{
  "state": "TX",
  "licenseNumbers": [
    "612"
  ],
  "names": [],
  "limit": 25,
  "includeNotFound": false
}
```

# 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 = {
    "licenseNumbers": [
        "612"
    ],
    "names": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("helenium/texas-contractor-license-lookup").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 = {
    "licenseNumbers": ["612"],
    "names": [],
}

# Run the Actor and wait for it to finish
run = client.actor("helenium/texas-contractor-license-lookup").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 '{
  "licenseNumbers": [
    "612"
  ],
  "names": []
}' |
apify call helenium/texas-contractor-license-lookup --silent --output-dataset

```

## MCP server setup

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

```

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/4bqXQaKB1E64REDsU/builds/1p45HWhS5PHnGRJZW/openapi.json
