# Texas Department of Insurance Agent Lookup (`automation-lab/texas-insurance-license-lookup`) Actor

Search and export official Texas insurance agent, adjuster, agency, active appointment, and business relationship records.

- **URL**: https://apify.com/automation-lab/texas-insurance-license-lookup.md
- **Developed by:** [Stas Persiianenko](https://apify.com/automation-lab) (community)
- **Categories:** Business, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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 Department of Insurance Agent Lookup

Search and export official **Texas Department of Insurance agent lookup** data for producer verification, agency research, appointment due diligence, and recurring compliance checks.

This Actor reads the public datasets linked by the Texas Department of Insurance (TDI). It returns normalized person licenses, agency licenses, active agency appointments, and business relationships as JSON, CSV, Excel, or any other Apify dataset format.

### What this Texas insurance license lookup does

Use one input to search current official records by:

- agent, adjuster, or agency name;
- Texas license number;
- National Producer Number (NPN);
- city, state, or postal code;
- license type or qualification;
- appointing insurance company;
- record type.

The Actor applies filters at the Texas Open Data API, paginates automatically, removes duplicate rows, and stops at your `maxItems` limit.

It does not scrape search-engine snippets or resell a third-party directory.

### Who is it for?

#### Insurance compliance teams

Verify displayed license identity, qualification, and expiration before onboarding or periodic review.

#### Agencies and carriers

Check agency appointments and public business relationships by stable NPN.

#### Producer operations teams

Export repeatable license searches into a spreadsheet, CRM, warehouse, or audit workflow.

#### Researchers and developers

Use a consistent JSON contract instead of handling several Socrata datasets and field names independently.

### Official data sources

TDI links these datasets from its Agent Download Lists page.

| Record type | Official dataset | Typical use |
| --- | --- | --- |
| `personLicense` | Agents, adjusters, and other licensed people | Search a producer or verify a person license |
| `agencyLicense` | Agencies and approved insurance businesses | Verify an agency, business license, or qualification |
| `agencyAppointment` | Active company appointments for agencies | Check which insurers actively appoint an agency |
| `relationship` | Business relationships among licensees | Review sub-agent, owner, and related-entity links |

Every output row includes `sourceDatasetId` and `sourceUrl` for traceability.

### Data you can extract

Depending on the selected record type, records include:

- record type and official dataset ID;
- person, agency, or licensee name;
- National Producer Number;
- Texas license number;
- license or entity type;
- qualification;
- issue and expiration dates;
- expiration status derived from the displayed expiration date;
- city, state, postal code, province, or county when published;
- appointing company and NAIC ID;
- appointment type and active date;
- business association type, related name, NPN, and begin date;
- retrieval timestamp;
- official source link.

Fields that do not apply to a record type are `null`, so downstream integrations can use one stable schema.

### Get started

1. Open the Actor input page.
2. Choose one or more **Record types**.
3. Enter a name, NPN, license number, location, qualification, or company filter.
4. Set **Maximum records**.
5. Click **Start**.
6. Open the Dataset tab.
7. Download JSON, CSV, Excel, XML, or RSS, or connect the dataset API.

For a first test, search `personLicense` records for `JOHN SMITH` in `TX` with `maxItems` set to `25`.

### Input parameters

| Field | Type | Default | Description |
| --- | --- | --- | --- |
| `recordTypes` | string array | person and agency licenses | Datasets to search |
| `query` | string | none | Full-text search across selected datasets |
| `name` | string | none | Partial person or primary agency name |
| `npn` | string | none | Exact National Producer Number |
| `licenseNumber` | string | none | Exact Texas person or agency license number |
| `city` | string | none | Exact city, case-insensitive |
| `state` | string | none (`TX` is prefilled) | Exact displayed state |
| `postalCode` | string | none | Exact displayed postal code |
| `licenseType` | string | none | Partial official license type |
| `qualification` | string | none | Partial official qualification |
| `companyName` | string | none | Partial appointing company or associated entity |
| `maxItems` | integer | `100` | Overall result limit from 1 to 10,000 |

Filters that do not exist on a selected record type produce no rows for that type rather than returning an unfiltered list.

### Input examples

#### Find a Texas agent by name

```json
{
  "recordTypes": ["personLicense"],
  "name": "JOHN SMITH",
  "state": "TX",
  "maxItems": 25
}
```

#### Export licensed Austin agencies

```json
{
  "recordTypes": ["agencyLicense"],
  "city": "AUSTIN",
  "state": "TX",
  "maxItems": 100
}
```

#### Verify an agency's active appointments

```json
{
  "recordTypes": ["agencyAppointment"],
  "npn": "22142794",
  "maxItems": 50
}
```

### Output example

A current person-license search produces records shaped like this:

```json
{
  "recordType": "personLicense",
  "sourceDatasetId": "kxv3-diwf",
  "sourceUrl": "https://data.texas.gov/resource/kxv3-diwf",
  "npn": "1167317",
  "licenseNumber": "769759",
  "name": "JOHN SMITH",
  "entityType": "General Lines Agent",
  "qualification": "Life, Accident, Health & HMO",
  "licenseIssueDate": "1990-11-09T00:00:00Z",
  "expirationDate": "2027-01-31T00:00:00Z",
  "expirationStatus": "active",
  "city": "FORT WORTH",
  "state": "TX",
  "postalCode": "762447045",
  "companyName": null,
  "appointmentType": null,
  "retrievedAt": "2026-08-13T20:58:34.896Z"
}
```

The default dataset contains all selected record types. Use `recordType` to route rows in a data pipeline.

### How much does it cost to look up Texas insurance licenses?

Pricing uses one small start event and one item event for each unique dataset row returned.

The exact rate depends on your Apify pricing tier. The current pricing table is always visible before you start a run.

| Tier | Price per returned record |
| --- | ---: |
| Free | $0.00736 |
| Bronze | $0.00640 |
| Silver | $0.004992 |
| Gold | $0.00384 |
| Platinum | $0.00256 |
| Diamond | $0.001792 |

The one-time start event is $0.005 per run. At the Bronze rate:

- a 1-record run uses one $0.005 start event and one $0.0064 item event;
- a 25-record run uses one $0.005 start event and 25 item events at $0.0064 each;
- a 100-record run uses one $0.005 start event and 100 item events at $0.0064 each.

No event is charged for duplicate, rejected, empty, or failed records. Apify platform usage may be billed according to your plan.

### Export and integration workflows

#### Compliance spreadsheet

Schedule a name, NPN, or city search and export the dataset as CSV or Excel for reviewer sign-off.

#### Producer verification pipeline

Send NPN-based results to a webhook, compare `expirationDate` with the previous run, and flag changed records.

#### Appointment due diligence

Run `agencyAppointment` by NPN and compare company and NAIC ID pairs between scheduled runs.

#### Data warehouse

Fetch dataset items through the API and upsert by `recordType`, `npn`, `licenseNumber`, qualification, company NAIC ID, and association fields.

The Actor returns current snapshots. Change detection and alert delivery are downstream workflows, not separate Actor features.

### Run with the Apify API

Replace `YOUR_TOKEN` with an Apify API token.

#### cURL

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/automation-lab~texas-insurance-license-lookup/runs?token=YOUR_TOKEN&waitForFinish=120" \
  -H "Content-Type: application/json" \
  -d '{"recordTypes":["agencyLicense"],"city":"AUSTIN","state":"TX","maxItems":25}'
```

#### JavaScript

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

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/texas-insurance-license-lookup').call({
  recordTypes: ['personLicense'],
  name: 'JOHN SMITH',
  state: 'TX',
  maxItems: 25,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_TOKEN")
run = client.actor("automation-lab/texas-insurance-license-lookup").call(run_input={
    "recordTypes": ["agencyAppointment"],
    "npn": "22142794",
    "maxItems": 50,
})
items = client.dataset(run["defaultDatasetId"]).list_items().items
print(items)
```

### Use with Apify MCP

Add this Actor to Claude Code:

```bash
claude mcp add --transport http apify \
  "https://mcp.apify.com?tools=automation-lab/texas-insurance-license-lookup"
```

#### Claude Desktop

Add the following remote MCP server configuration in Claude Desktop:

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=automation-lab/texas-insurance-license-lookup"
    }
  }
}
```

#### Cursor

Use the same JSON under Cursor's MCP settings and keep the Actor slug in the `url` query.

#### VS Code

Add the same remote HTTP MCP URL to your VS Code MCP configuration.

Example prompts:

- "Search Texas person licenses for John Smith and return NPN, license number, qualification, and expiration."
- "Export up to 100 licensed insurance agencies in Austin, Texas."
- "Check active agency appointments for NPN 22142794 and group them by company."

### Scheduling and monitoring

Use an Apify Schedule to run the same stable query daily, weekly, or monthly.

For change monitoring:

1. use a precise NPN, license number, or location input;
2. retain each run's dataset ID and retrieval time;
3. compare stable identity and appointment fields;
4. send changes through an Apify webhook or your own integration.

The Actor does not maintain a private historical registry or send alerts by itself.

### Accuracy and limitations

- Results reflect the public Texas datasets when the run executes.
- TDI and Texas Open Data control update timing, field definitions, and availability.
- `expirationStatus` is derived from `expirationDate`; verify consequential decisions against the official source.
- The appointment mode currently covers the public **active agency appointments** dataset.
- TDI's linked person-appointment dataset currently requires authentication and is not included.
- Public records can contain abbreviations, uppercase text, missing fields, or multiple qualifications per license.
- A name is not a unique identity. Prefer NPN or license number for verification.
- `maxItems` applies across all selected record types in their selected order.
- This Actor does not access private accounts, non-public records, or historical report-generator data.

### Legality and responsible use

The Actor accesses public records linked by a Texas government agency.

You are responsible for complying with applicable laws, source terms, privacy obligations, and your organization's policies. Use public license data for legitimate verification, compliance, research, and operational purposes. Do not use it for harassment, unlawful discrimination, identity theft, or deceptive outreach.

For a licensing or enforcement decision, open the included official source URL and consult TDI when appropriate.

### Troubleshooting

#### Why did my search return no records?

Check the selected record type and filter compatibility. License numbers only apply to person and agency license datasets. Company filters apply to appointment and relationship datasets. Try an NPN or remove an overly narrow location filter.

#### Why are there several rows for one NPN?

A producer can have multiple license qualifications, appointments, or business relationships. These are distinct official rows and are intentionally preserved.

#### Why did a run fail with an upstream error?

Texas Open Data may be temporarily unavailable or rate-limited. The Actor retries transient responses with backoff and then fails clearly instead of returning an unlabelled partial result. Retry later or reduce the requested volume.

#### Is `expirationStatus` an official enforcement status?

No. It is a convenience value calculated from the source's displayed expiration date. Review the date, qualification, and official source before making a consequential decision.

### FAQ

#### Does this Actor require a TDI or Sircon login?

No. It uses anonymous public Texas Open Data endpoints linked by TDI.

#### Does it use a proxy or browser?

No. It makes lightweight direct HTTP requests to the official structured-data API.

#### Can I search by exact license number?

Yes. Set `recordTypes` to `personLicense` or `agencyLicense` and pass `licenseNumber`.

#### Can I retrieve agency appointments?

Yes. Select `agencyAppointment` and filter by an agency NPN, company name, or public location.

#### Can I export more than 500 records?

Yes. The Actor paginates in bounded batches up to `maxItems`, with a maximum of 10,000 records per run.

#### Are empty results charged as items?

No. Item events are emitted only for unique normalized rows pushed to the dataset.

### Related automation-lab Actors

- [Texas TREC License Holder Search Scraper](https://apify.com/automation-lab/texas-trec-license-holder-search-scraper) for Texas real-estate license holders.
- [Texas Comptroller Entity Scraper](https://apify.com/automation-lab/texas-comptroller-entity-scraper) for Texas taxable-entity identity and status checks.
- [California Contractor License Lookup](https://apify.com/automation-lab/california-contractor-license-lookup-v2) for CSLB contractor verification.

Choose this Actor when the primary record is a Texas insurance person, agency, appointment, or business relationship published by TDI.

# Actor input Schema

## `recordTypes` (type: `array`):

Official datasets to search. Person and agency licenses are searched by default.

## `query` (type: `string`):

Full-text search across the selected official datasets, such as a person, agency, or insurer name.

## `name` (type: `string`):

Case-insensitive partial match on the primary person or agency name.

## `npn` (type: `string`):

Exact NPN match. Useful for verification and appointment workflows.

## `licenseNumber` (type: `string`):

Exact person or agency license-number match.

## `city` (type: `string`):

Exact city match, case-insensitive.

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

Exact two-letter location state, such as TX.

## `postalCode` (type: `string`):

Exact displayed postal code match.

## `licenseType` (type: `string`):

Case-insensitive partial match on the official license type (license records only).

## `qualification` (type: `string`):

Case-insensitive partial match on the official qualification (license records only).

## `companyName` (type: `string`):

Case-insensitive partial match on appointment company or associated licensee name.

## `maxItems` (type: `integer`):

Stop after this many unique records across all selected record types.

## Actor input object example

```json
{
  "recordTypes": [
    "personLicense"
  ],
  "query": "JOHN SMITH",
  "state": "TX",
  "maxItems": 20
}
```

# Actor output Schema

## `dataset` (type: `string`):

Dataset containing normalized records from the selected official Texas Open Data datasets.

# 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 = {
    "recordTypes": [
        "personLicense"
    ],
    "query": "JOHN SMITH",
    "state": "TX",
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation-lab/texas-insurance-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 = {
    "recordTypes": ["personLicense"],
    "query": "JOHN SMITH",
    "state": "TX",
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("automation-lab/texas-insurance-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 '{
  "recordTypes": [
    "personLicense"
  ],
  "query": "JOHN SMITH",
  "state": "TX",
  "maxItems": 20
}' |
apify call automation-lab/texas-insurance-license-lookup --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,automation-lab/texas-insurance-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/w623y4xJRbcNyOXa8/builds/FBIfB03faoIz261KQ/openapi.json
