# Texas BHEC Behavioral Health Licenses (`automation-lab/texas-bhec-behavioral-health-license-search`) Actor

Download and filter official Texas BHEC license rosters for psychologists, counselors, social workers, and marriage and family therapists.

- **URL**: https://apify.com/automation-lab/texas-bhec-behavioral-health-license-search.md
- **Developed by:** [Automation Lab](https://apify.com/automation-lab) (community)
- **Categories:** Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.54 / 1,000 license-record extracteds

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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Texas BHEC Behavioral Health Licenses

Download and filter **Texas BHEC behavioral health licenses** from the four official rosters published by the Texas Behavioral Health Executive Council.

Search psychologists, professional counselors, social workers, and marriage and family therapists by name or credential. Export normalized license identity, number, status, expiration, current-rank date, disciplinary-action flag, public location, source file, and retrieval timestamp.

### What can you do with this Actor?

- Verify a Texas behavioral-health credential by exact license number.
- Search licensees by name across one or all four professions.
- Export active counselor, psychologist, therapist, or social-worker rosters.
- Identify records carrying BHEC's public disciplinary-action flag.
- Filter public roster rows by city or county.
- Create recurring credential snapshots with Apify Tasks and Schedules.
- Feed source-linked records into a compliance, staffing, or vendor-review pipeline.

The Actor returns a current snapshot. It does not calculate changes or send alerts itself. Schedule repeated runs and compare datasets downstream when you need monitoring.

### Who is it for?

- **Credentialing and compliance teams** checking practitioners before onboarding or renewal.
- **Behavioral-health organizations** reviewing workforce license status and expiry dates.
- **Staffing and recruiting teams** validating supplied license numbers.
- **Insurers and provider networks** preparing focused credential-review queues.
- **Researchers and analysts** working with official Texas behavioral-health rosters.
- **Developers** integrating BHEC public records into internal tools.

This Actor is limited to the four licensing programs overseen by BHEC. It is not a search for physicians, nurses, pharmacists, insurance agents, or other Texas professions.

### Why use it?

BHEC publishes four separate CSV files with source field names and formats. This Actor turns them into one stable dataset contract and adds:

- selection of one or multiple professions;
- case-insensitive name and credential search;
- exact license, status, city, and county filters;
- a normalized boolean disciplinary-action field;
- ISO-formatted expiration and rank-effective dates;
- interleaving across professions so a capped multi-roster export is not filled by the first file;
- bounded retries and header validation;
- provenance on every row.

The implementation uses direct HTTPS downloads from BHEC. It needs no browser, account, API key, or proxy.

### Official data sources

The official BHEC verification page publishes these files and states that they are updated every 24 hours:

| Profession | Source file |
| --- | --- |
| Psychology | `PSY.csv` |
| Marriage and family therapy | `MFT.csv` |
| Professional counseling | `LPC.csv` |
| Social work | `SW.csv` |

Every output row contains `sourceFile`, `sourceUrl`, `sourcePageUrl`, and `retrievedAt`.

### What data is extracted?

| Field | Description |
| --- | --- |
| `profession` | Normalized profession key |
| `professionLabel` | Human-readable profession |
| `licenseTypeCode` | BHEC `LIC_TYPE` code |
| `licenseRank` | Credential rank such as LPC, LCSW, MFT, or LSP |
| `licenseNumber` | Official BHEC license number |
| `entityNumber` | BHEC entity identifier |
| `fullName` | Name assembled from the roster fields |
| `firstName`, `middleName`, `lastName`, `suffix` | Published name components |
| `status` | Status text published by BHEC |
| `expirationDate` | Expiration date normalized to `YYYY-MM-DD` |
| `rankEffectiveDate` | Date the current rank was obtained, normalized to `YYYY-MM-DD` |
| `disciplinaryAction` | `true` when BHEC's `DISCPL_ACTN` field is Yes |
| `addressLine1`–`addressLine3` | Public address lines when not withheld |
| `city`, `state`, `postalCode`, `county` | Public location fields when available |
| `phone` | Public phone number when available |
| `sourceFile`, `sourceUrl`, `sourcePageUrl` | Official provenance |
| `retrievedAt` | UTC roster retrieval timestamp |

BHEC allows licensees to withhold some address and phone information. Those values remain `null`; the Actor does not infer them.

### How to search Texas BHEC licenses

1. Open the Actor in Apify Console.
2. Select one or more professions.
3. Enter a name, exact license number, or optional roster filters.
4. Set the maximum number of records.
5. Start the run.
6. Open the default dataset.
7. Export JSON, CSV, Excel, XML, or another Apify-supported format.

A precise credential check looks like this:

```json
{
  "professions": ["psychologist"],
  "licenseNumber": "31154",
  "disciplinaryAction": "any",
  "maxItems": 5
}
```

### Input parameters

| Input | Type | Purpose |
| --- | --- | --- |
| `professions` | array | One or more of `psychologist`, `marriage_and_family_therapist`, `professional_counselor`, and `social_worker` |
| `searchQuery` | string | Words matched across name, license number, and entity number; every word must match |
| `licenseNumber` | string | Exact license-number filter |
| `status` | string | Case-insensitive exact status filter, such as `Active` or `Suspended` |
| `disciplinaryAction` | enum | `any`, `yes`, or `no` |
| `city` | string | Case-insensitive exact public city |
| `county` | string | Case-insensitive exact public county |
| `maxItems` | integer | Maximum saved records, from 1 to 10,000 |

Filters combine with AND logic. For example, a record must match both `status: "Active"` and `county: "TRAVIS"` when both are supplied.

An empty set of optional filters exports the first matching records from the selected rosters, interleaved by profession up to `maxItems`.

### Output example

The output below is anonymized, but its field names and formats reflect current Actor behavior:

```json
{
  "profession": "professional_counselor",
  "professionLabel": "Professional counseling",
  "licenseTypeCode": "5261",
  "licenseRank": "LPC",
  "licenseNumber": "12345",
  "entityNumber": "1234567",
  "fullName": "ALEX LEE MORGAN",
  "firstName": "ALEX",
  "middleName": "LEE",
  "lastName": "MORGAN",
  "suffix": null,
  "status": "Active",
  "expirationDate": "2027-12-31",
  "rankEffectiveDate": "2020-06-15",
  "disciplinaryAction": false,
  "addressLine1": null,
  "addressLine2": null,
  "addressLine3": null,
  "city": null,
  "state": null,
  "postalCode": null,
  "county": null,
  "phone": null,
  "sourceFile": "LPC.csv",
  "sourceUrl": "https://www.bhec.texas.gov/csv/LPC.csv",
  "sourcePageUrl": "https://bhec.texas.gov/tbhec/verify-a-license/",
  "retrievedAt": "2026-09-19T04:15:11.222Z"
}
```

### How much does it cost to verify Texas BHEC license records?

Pay-per-event pricing includes a **$0.005 start fee** and a tiered charge for each license record saved. The current BRONZE price is **$0.00256 per record**:

- 1 record: about **$0.00756**;
- 10 records: about **$0.0306**;
- 100 records: about **$0.261**.

Higher Apify subscription tiers receive the lower per-record prices shown in Console. No license-record event is charged for rejected source rows, a no-result search, or an upstream failure. Apify billing may be affected by refunds, fraud, disputes, taxes, corrections, or clawbacks.

### Recurring credential verification

Save a Task containing the profession, license number, or name you need to recheck. Run it on an Apify Schedule weekly or monthly. Send the resulting dataset to your warehouse, spreadsheet, or webhook consumer.

Compare these stable fields between snapshots:

- `licenseNumber`;
- `status`;
- `expirationDate`;
- `rankEffectiveDate`;
- `disciplinaryAction`;
- `retrievedAt`.

A changed field can enter a human review queue. The Actor does not decide whether a person may practice or whether a record satisfies your policy.

### Disciplinary-action review workflow

Set `disciplinaryAction` to `yes` and select the professions relevant to your organization. BHEC's roster flag indicates that a disciplinary action exists; it is not the disciplinary order itself.

The downloadable rosters do not contain order details. Open the official BHEC verification system and follow any available report links before making a consequential decision.

### Integrations

- **Apify Tasks:** save repeatable license searches.
- **Apify Schedules:** collect periodic snapshots.
- **Webhooks:** trigger your review process after a run completes.
- **Google Sheets and Excel:** export the dataset as CSV or XLSX.
- **Zapier and Make:** route matched records to workflow tools.
- **Warehouses and BI tools:** retrieve datasets through the Apify API.
- **MCP clients:** let an assistant run bounded credential searches.

### API usage

#### cURL

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/automation-lab~texas-bhec-behavioral-health-license-search/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"professions":["psychologist"],"licenseNumber":"31154","maxItems":5}'
```

#### JavaScript

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

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/texas-bhec-behavioral-health-license-search').call({
  professions: ['professional_counselor'],
  searchQuery: 'Garcia',
  status: 'Active',
  maxItems: 25,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

#### Python

```python
import os
from apify_client import ApifyClient

client = ApifyClient(os.environ['APIFY_TOKEN'])
run = client.actor('automation-lab/texas-bhec-behavioral-health-license-search').call(run_input={
    'professions': ['social_worker'],
    'county': 'TRAVIS',
    'status': 'Active',
    'maxItems': 100,
})
items = client.dataset(run['defaultDatasetId']).list_items().items
print(items)
```

### Use with MCP and AI assistants

Add the Apify MCP server to Claude Code:

```bash
claude mcp add --transport http apify \
  "https://mcp.apify.com?tools=automation-lab/texas-bhec-behavioral-health-license-search"
```

#### Claude Desktop

Add this server to the `mcpServers` object in Claude Desktop's configuration:

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=automation-lab/texas-bhec-behavioral-health-license-search"
    }
  }
}
```

#### Cursor

Use the same `mcpServers.apify.url` value in Cursor's MCP settings.

#### VS Code

Add the same HTTP MCP URL through VS Code's MCP server configuration.

Example prompts:

- “Verify Texas BHEC psychology license 31154 and show the official status and expiration date.”
- “Export 20 professional-counselor records matching Garcia.”
- “Collect 50 BHEC records carrying the disciplinary-action flag for a review queue.”

AI assistants should treat output as public source data, not as legal or clinical advice.

### Tips for reliable results

- Use `licenseNumber` for an exact credential check.
- Select one profession when you know the licensing board.
- Use `searchQuery` for names; every whitespace-separated word must appear in the combined name or identifiers.
- Use uppercase or lowercase freely; matching is case-insensitive.
- Remember that `city` and `county` match only publicly disclosed address data.
- Use a focused `maxItems` during development, then increase it for exports.
- Keep `sourceUrl` and `retrievedAt` with stored snapshots.

### Limits and failure behavior

- The source is a current roster snapshot, not a historical database.
- BHEC can change the source files, columns, availability, or update schedule.
- First licensure date is not present in these downloadable files.
- `rankEffectiveDate` is the date BHEC says the current rank was obtained; it is not presented as first licensure date.
- The discipline field is only a Yes/No roster indicator.
- Some address and phone fields are blank because holders may withhold them.
- The Actor retries each selected source up to three times.
- If a selected roster is unavailable or structurally unexpected, the run fails rather than returning a silently incomplete dataset.
- A valid no-result search succeeds with an empty dataset.

### Responsible use and legality

The Actor processes records made publicly downloadable by a Texas licensing authority. Public availability does not remove your obligations under employment, privacy, anti-discrimination, record-retention, or professional-regulation rules.

Use the data for legitimate verification, research, and compliance purposes. Verify important decisions against the official source. Give affected people an appropriate review or correction path. Do not use the Actor for harassment, identity theft, spam, or decisions prohibited by law.

This product is independent and is not affiliated with, endorsed by, or operated by the Texas Behavioral Health Executive Council.

The Actor does not send input or output to an AI provider. It retains no separate external copy. Run input, dataset output, and logs follow your Apify account's storage and retention settings.

### FAQ

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

Check the selected profession and remove optional filters one at a time. An exact city or county matches only records where BHEC publishes that location. For a credential check, enter only the roster's numeric license number.

#### Why is an address or phone number missing?

BHEC states that holders may withhold address and phone information. The Actor returns `null` rather than guessing a missing value.

#### Why did the run fail instead of returning partial data?

For credential workflows, a silent missing roster would be misleading. If any selected CSV cannot be retrieved or validated after bounded retries, the Actor fails the run. Retry later or select only the profession you need.

#### Does the Actor show disciplinary orders?

No. It exports BHEC's public `DISCPL_ACTN` flag. Use the official verification system to review any linked reports or orders.

#### Can I monitor changes?

Yes. Schedule the same Task and compare datasets using `licenseNumber` as the stable key. The Actor supplies snapshots and timestamps; your downstream workflow performs the comparison or alert.

### Related Actors

- [Texas Pharmacy License Lookup](https://apify.com/automation-lab/texas-pharmacy-license-lookup) for official Texas pharmacy-board credentials.
- [Texas Insurance License Lookup](https://apify.com/automation-lab/texas-insurance-license-lookup) for Texas insurance producers and adjusters.
- [NPI Registry Provider Search](https://apify.com/automation-lab/npi-registry-provider-search) for federal healthcare provider identifiers.

These sources answer different verification questions and should not be treated as substitutes for a BHEC credential.

### Support

If a source format changes or a documented input no longer works, open an issue from the Actor page. Include the run URL and a redacted input. Do not include private credentials or confidential case details.

# Changelog

This Actor's version history is a separate document: https://apify.com/automation-lab/texas-bhec-behavioral-health-license-search/changelog.md

# Actor input Schema

## `professions` (type: `array`):

Official BHEC rosters to search. By default, all four professions are included.

## `searchQuery` (type: `string`):

Case-insensitive words to match across licensee name, license number, or BHEC entity number. Every word must match.

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

Return only the exact BHEC license number, without adding a profession prefix.

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

Optional case-insensitive exact status, such as Active or Suspended.

## `disciplinaryAction` (type: `string`):

Include all records, only records with a BHEC disciplinary-action flag, or only records without that flag.

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

Optional case-insensitive exact city match. Blank public address fields do not match.

## `county` (type: `string`):

Optional case-insensitive exact county match. Blank public address fields do not match.

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

Maximum number of matching license records to save. Results are interleaved across selected professions.

## Actor input object example

```json
{
  "professions": [
    "professional_counselor"
  ],
  "searchQuery": "GARCIA",
  "disciplinaryAction": "any",
  "maxItems": 20
}
```

# Actor output Schema

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

Dataset containing normalized Texas BHEC license records.

# 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 = {
    "professions": [
        "professional_counselor"
    ],
    "searchQuery": "GARCIA",
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation-lab/texas-bhec-behavioral-health-license-search").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 = {
    "professions": ["professional_counselor"],
    "searchQuery": "GARCIA",
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("automation-lab/texas-bhec-behavioral-health-license-search").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 '{
  "professions": [
    "professional_counselor"
  ],
  "searchQuery": "GARCIA",
  "maxItems": 20
}' |
apify call automation-lab/texas-bhec-behavioral-health-license-search --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,automation-lab/texas-bhec-behavioral-health-license-search"
        }
    }
}
```

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/CM0hbayczUqAwyQfe/builds/2pU0dNqCakJccYRMc/openapi.json
