# Texas TDI Insurance License Scraper (`stackrelay/texas-tdi-insurance-license`) Actor

Scrapes insurance agent, adjuster, and agency license records from the Texas Department of Insurance (TDI) public portal.

- **URL**: https://apify.com/stackrelay/texas-tdi-insurance-license.md
- **Developed by:** [StackRelay](https://apify.com/stackrelay) (community)
- **Categories:** Lead generation
- **Stats:** 2 total users, 1 monthly users, 96.6% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $8.00 / 1,000 license\_basics

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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 TDI Insurance License Lookup

Extract insurance agent, adjuster, and agency license records from the **Texas Department of Insurance (TDI)** — powered by the [Texas Open Data Portal](https://data.texas.gov/) (Socrata API). **No browser, no CAPTCHA, no proxy required.**

> **Disclaimer — please read before running.** This actor is an independent data tool built by StackRelay. It is **not affiliated with, endorsed by, or operated by** the Texas Department of Insurance or the Texas Open Data Portal. Results are a **best-effort, point-in-time snapshot** of TDI's public datasets, provided **AS-IS with no warranty** of accuracy, completeness, or timeliness — license status, appointments, and addresses can change at any time after a record is fetched, and the portal's own refresh cadence is outside this actor's control. Every record carries a `sourceUrl` and a `scrapedAt` timestamp: **verify independently at the source before acting on any record.** Output includes personal data about individuals (names, city/state/ZIP); if you process data about EU/UK residents you may be an independent data controller under GDPR/UK GDPR. **This actor's output is not a consumer report and must not be used for FCRA-regulated purposes** — credit, insurance underwriting eligibility, employment, or tenant-screening decisions about an individual. By running this actor you agree to the [Developer Terms of Use](DEVELOPER_TERMS.md).

Search by **name** or **license number** for individual agents/adjusters, or by **name or license number** for agencies. Each result includes NPN, license type, lines of authority, expiration date, city, and state — with an option to fetch the full list of company appointments.

> **Pairs with** [TDLR Texas Contractor & Trade License Scraper](https://apify.com/ws_tony/tdlr-texas-contractor-license-scraper) — TDLR covers electricians, HVAC, and 80+ trade licenses; this actor covers insurance agents and adjusters licensed by TDI. Together they cover complete subcontractor due diligence for Texas-based contractors.

***

### Why this actor is fast and reliable

TDI publishes their license database — **957,000+ agents/adjusters** and **55,000+ agencies** — on the Texas Open Data Portal. This actor queries that API directly rather than scraping the web portal, which means:

- Runs complete in **seconds**, not minutes
- **No CAPTCHA or bot detection** to work around
- **No proxy cost** passed to you
- Results reflect the portal's published data as of each record's `scrapedAt` time — the portal's own refresh cadence is set by TDI, not this actor, so treat every record as a point-in-time snapshot and verify at its `sourceUrl` before relying on it

***

### Use cases

- **Insurance carriers** — onboarding validation, appointment verification, CE compliance checks
- **MGAs / wholesalers** — confirm producer license status before binding
- **Compliance teams** — bulk license monitoring for agent rosters
- **Background check services** — enriching professional license data
- **Real estate / mortgage** — verifying insurance agent credentials for transaction parties

***

### Input

| Field | Type | Description |
|---|---|---|
| `searchType` | select | `agentName`, `agentLicense`, `agencyName`, or `agencyLicense` |
| `lastName` | string | Required for `agentName` search |
| `firstName` | string | Optional — narrows `agentName` search |
| `agentLicenseNo` | string | Required for `agentLicense` search |
| `agencyName` | string | Required for `agencyName` search. Partial matches supported. |
| `agencyLicenseNo` | string | Required for `agencyLicense` search |
| `maxResults` | integer | Max records to return — default 500 |
| `includeAppointments` | boolean | Also fetch company appointments per record. Default `false`. |

#### Example inputs

Search all agents with the last name Smith:

```json
{
  "searchType": "agentName",
  "lastName": "Smith",
  "maxResults": 100
}
```

Narrow to a specific agent:

```json
{
  "searchType": "agentName",
  "lastName": "Smith",
  "firstName": "John",
  "includeAppointments": true,
  "maxResults": 25
}
```

Look up a specific license number:

```json
{
  "searchType": "agentLicense",
  "agentLicenseNo": "769759",
  "includeAppointments": true
}
```

Search agencies by name:

```json
{
  "searchType": "agencyName",
  "agencyName": "Allstate",
  "maxResults": 50
}
```

***

### Output

One JSON object per licensed producer in the Apify Dataset.

#### Agent / Adjuster record

```json
{
  "name": "JOHN SMITH",
  "firstName": "JOHN",
  "lastName": "SMITH",
  "npn": "1002703",
  "licenseNumber": "1933966",
  "licenseType": "General Lines Agent",
  "qualification": "General Lines - P&C; General Lines - Life, Accident, Health and HMO",
  "licenseIssueDate": "1996-05-01",
  "expirationDate": "2027-01-31",
  "city": "HOUSTON",
  "state": "TX",
  "postalCode": "77001",
  "appointments": [
    {
      "company": "Allstate Fire and Casualty Insurance Company",
      "naicId": "29688",
      "appointmentType": "General Lines - P&C",
      "activeDate": "2018-03-15"
    }
  ],
  "appointmentCount": 21,
  "sourceName": "Texas Department of Insurance (TDI) — public agent/agency/appointment datasets via the Texas Open Data Portal (Socrata, data.texas.gov)",
  "sourceUrl": "https://data.texas.gov/resource/kxv3-diwf.json?license_number=1933966",
  "scrapedAt": "2026-05-25T12:00:00.000Z"
}
```

`appointments` and `appointmentCount` are only present when `includeAppointments: true`.

When a person holds multiple license qualifications (e.g. both P\&C and Life), they are merged into a single record with a semicolon-separated `qualification` field.

#### Agency record

```json
{
  "orgName": "ALLSTATE INSURANCE SERVICES, INC.",
  "npn": "10031234",
  "agencyLicenseNo": "2786391",
  "agencyType": "Corporation",
  "licenseType": "General Lines Agency",
  "qualification": "General Lines - P&C",
  "licenseIssueDate": "2015-06-10",
  "expirationDate": "2028-01-13",
  "city": "NORTHBROOK",
  "state": "IL",
  "postalCode": "60062",
  "sourceName": "Texas Department of Insurance (TDI) — public agent/agency/appointment datasets via the Texas Open Data Portal (Socrata, data.texas.gov)",
  "sourceUrl": "https://data.texas.gov/resource/3yqc-fcdt.json?npn=10031234",
  "scrapedAt": "2026-05-25T12:00:00.000Z"
}
```

> Every record carries `sourceName`, `sourceUrl`, and `scrapedAt` provenance fields. `sourceUrl` is a citable query against the official Texas Open Data Portal dataset the record came from — click it to verify at the source.

***

### Pricing

This actor uses **pay-per-event** billing:

| Event | Price | What's included |
|---|---|---|
| `license_basic` | **$0.005 / record** | Name, NPN, license number, type, qualifications, dates, city, state, zip |
| `license_enriched` | **$0.008 / record** | Everything above + full company appointments list |

**Example cost:** 1,000 records without appointments ≈ **$5.00** · with appointments ≈ **$8.00**

***

### Bulk workflows

To verify a roster of agents, run the actor once per name using the [Apify API](https://docs.apify.com/api/v2) or [scheduled tasks](https://docs.apify.com/platform/schedules).

For broad sweeps — e.g. all licensed agents with last name "Garcia" in Texas — use `searchType: "agentName"` with `maxResults: 500`. For pinpoint lookups, use `searchType: "agentLicense"` with a specific license number.

***

### Notes

- **No setup required.** No proxy accounts, no CAPTCHA solver API keys — just fill in your search criteria and run.
- **Name format:** names are stored as FIRSTNAME LASTNAME in the TDI database (all caps). The actor parses and returns `firstName` and `lastName` as separate fields, handling generational suffixes (JR, SR, III, etc.) correctly.
- **Partial agency name matching** is supported — `"Allstate"` matches all agencies with Allstate in the name.
- **Adjuster licenses** (public adjusters, independent adjusters) are a distinct license class in Texas and are returned alongside agent licenses in name searches.
- Accessing public government data via an official open data API is legally permissible. All data is published by TDI under Texas Open Records / Public Information Act obligations.

***

### Data accuracy & legal notes

- **What this data is.** A best-effort, point-in-time snapshot of the public Texas Department of Insurance datasets on the Texas Open Data Portal (Socrata). The actor is a pipe, not an oracle: fields are passed through from the API with light normalization only (ISO date formatting, name parsing, qualification merging). Coverage and field completeness vary by record.
- **It can be wrong or stale.** License status, appointments, and addresses change continuously. A record is accurate only as of its `scrapedAt` timestamp, and the portal's own refresh cadence is controlled by TDI. Every record carries a `sourceUrl` back to the source dataset — **independently verify any record there before relying on it** for onboarding, binding, an audit finding, or any other action.
- **Derived fields are labeled as such.** `firstName`/`lastName` are parsed by this actor from the raw `name` string (handling JR/SR/III suffixes); `qualification` merges multiple source rows into a semicolon-separated string during dedup; `appointmentCount` is aggregated from the appointments query. Treat derived fields as conveniences, not source-of-truth.
- **Personal data / GDPR.** Output includes personal data about individuals (names, city/state/ZIP). If you process data about EU/UK residents you may act as an independent data controller under GDPR/UK GDPR and are solely responsible for having a lawful basis and honoring data-subject rights.
- **Prohibited uses (FCRA).** The output is **not a "consumer report"** and StackRelay is not a consumer reporting agency. **Do not use this data for FCRA-regulated purposes** — determining an individual's eligibility for credit, insurance coverage, employment, housing, or similar decisions. Verifying that an agent, adjuster, or agency holds an active Texas license or appointment for regulatory-compliance purposes is the intended use. Do not use the data to harass or profile individuals.
- **Not affiliated.** Independently developed by StackRelay; not affiliated with, endorsed by, or operated by the Texas Department of Insurance or the Texas Open Data Portal.
- **A disclaimer travels with every run** in the key-value store record `META`, and every dataset row carries `sourceName`, `sourceUrl`, and `scrapedAt` provenance fields.
- **Full terms:** see [DEVELOPER\_TERMS.md](DEVELOPER_TERMS.md) — provided AS-IS, no warranty, liability capped at fees paid, Kansas governing law. By running this actor you agree to those terms.

***

### Data source

**Texas Open Data Portal — Texas Department of Insurance**

- [Insurance agents, adjusters, and people approved to manage insurance-related products](https://data.texas.gov/dataset/Insurance-agents-adjusters-and-people-approved-to-/kxv3-diwf) (957k+ records)
- [Insurance agencies and businesses approved to manage insurance-related products](https://data.texas.gov/dataset/Insurance-agencies-and-businesses-approved-to-mana/3yqc-fcdt) (55k+ records)
- [Active company appointments for agents and adjusters](https://data.texas.gov/dataset/Active-insurance-company-appointments-for-agents-a/bupb-23s9) (4.3M+ records)

### Popular use cases

**Verify a single license**

- [Verify a Texas insurance agent's license](https://apify.com/stackrelay/texas-tdi-insurance-license/examples/verify-texas-insurance-agent-license)
- [Check if a license is active or expired](https://apify.com/stackrelay/texas-tdi-insurance-license/examples/check-texas-insurance-license-status)
- [Look up an agent by name](https://apify.com/stackrelay/texas-tdi-insurance-license/examples/texas-insurance-agent-lookup-by-name)
- [Find an agent's NPN](https://apify.com/stackrelay/texas-tdi-insurance-license/examples/find-texas-insurance-agent-npn)
- [Look up lines of authority](https://apify.com/stackrelay/texas-tdi-insurance-license/examples/texas-agent-lines-of-authority)

**Adjusters**

- [Adjuster license lookup](https://apify.com/stackrelay/texas-tdi-insurance-license/examples/texas-adjuster-license-lookup)
- [Public adjuster license lookup](https://apify.com/stackrelay/texas-tdi-insurance-license/examples/texas-public-adjuster-license-lookup)

**Agencies**

- [Agency license lookup](https://apify.com/stackrelay/texas-tdi-insurance-license/examples/texas-insurance-agency-license-lookup)
- [Verify an agency by FEIN](https://apify.com/stackrelay/texas-tdi-insurance-license/examples/verify-texas-insurance-agency-fein)
- [Find agencies by brand name](https://apify.com/stackrelay/texas-tdi-insurance-license/examples/find-texas-agencies-by-name)

**Appointments**

- [Which companies is an agent appointed with](https://apify.com/stackrelay/texas-tdi-insurance-license/examples/texas-agent-appointed-companies)
- [Verify an agency's carrier appointments](https://apify.com/stackrelay/texas-tdi-insurance-license/examples/verify-texas-agency-appointments)
- [Confirm appointment before binding](https://apify.com/stackrelay/texas-tdi-insurance-license/examples/confirm-producer-appointment-before-binding)

**Bulk / compliance / lead gen**

- [Bulk-verify an agent roster](https://apify.com/stackrelay/texas-tdi-insurance-license/examples/bulk-verify-texas-agent-roster)
- [Monitor license expirations](https://apify.com/stackrelay/texas-tdi-insurance-license/examples/monitor-texas-license-expirations)
- [Export agent records to CSV](https://apify.com/stackrelay/texas-tdi-insurance-license/examples/export-texas-insurance-agents-csv)
- [Build an agent list by last name](https://apify.com/stackrelay/texas-tdi-insurance-license/examples/texas-insurance-agents-by-last-name)

# Actor input Schema

## `searchType` (type: `string`):

Which TDI search form to use. Agents and adjusters share the same forms; agencies have separate forms.

## `lastName` (type: `string`):

Required for Agent/Adjuster Name search. Partial matches supported — enter 'Smit' to find Smith, Smithson, etc.

## `firstName` (type: `string`):

Optional. Used with Last Name search.

## `middleName` (type: `string`):

Optional. Used with Last Name search.

## `agentLicenseNo` (type: `string`):

Required when Search Type = Agent by License Number.

## `agencyName` (type: `string`):

Required when Search Type = Agency by Name. Partial matches supported (e.g. 'Allstate' matches all agencies with Allstate in the name).

## `agencyLicenseNo` (type: `string`):

Required when Search Type = Agency by License Number.

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

Maximum number of license records to return.

## `includeAppointments` (type: `boolean`):

Also fetch the list of insurance companies this producer is appointed with. Adds one API call per record. Leave off for status/expiration-only checks.

## Actor input object example

```json
{
  "searchType": "agentName",
  "lastName": "Smith",
  "maxResults": 500,
  "includeAppointments": 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 = {
    "lastName": "Smith"
};

// Run the Actor and wait for it to finish
const run = await client.actor("stackrelay/texas-tdi-insurance-license").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 = { "lastName": "Smith" }

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

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

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

```

## CLI example

```bash
echo '{
  "lastName": "Smith"
}' |
apify call stackrelay/texas-tdi-insurance-license --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=stackrelay/texas-tdi-insurance-license",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/QqW58nOQGYCeKhRzV/builds/wNcbCPn5ed5SnOfys/openapi.json
