Texas Pharmacy License Scraper - TSBP Daily Data avatar

Texas Pharmacy License Scraper - TSBP Daily Data

Pricing

from $1.50 / 1,000 results

Go to Apify Store
Texas Pharmacy License Scraper - TSBP Daily Data

Texas Pharmacy License Scraper - TSBP Daily Data

Extract pharmacist, pharmacy, intern & technician license records from Texas State Board of Pharmacy (TSBP). Daily-updated CSV data with license status, expiration, disciplinary actions & location.

Pricing

from $1.50 / 1,000 results

Rating

0.0

(0)

Developer

Haketa

Haketa

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

11 days ago

Last modified

Share

Texas Pharmacy License Scraper — TSBP Data Extractor for Pharmacists, Pharmacies, Interns & Technicians

The most complete Texas State Board of Pharmacy (TSBP) data extraction tool on Apify. Download daily-updated license records for every pharmacist, pharmacy, intern, and technician registered in Texas — structured, filtered, and ready for compliance, sales, recruiting, credentialing, and analytics workflows.

Apify Actor


What This Actor Does

The Texas Pharmacy License Scraper is a production-ready Apify Actor that extracts the complete public licensing database from the Texas State Board of Pharmacy (TSBP) — the state regulator that licenses every pharmacist, pharmacy facility, pharmacy intern, and pharmacy technician practicing in Texas.

In a single run (typically 30–60 seconds), the actor returns 100,000+ structured records covering:

  • 🧑‍⚕️ Pharmacists — every individual pharmacist licensed to practice in Texas
  • 🏥 Pharmacies — every licensed pharmacy facility (community, hospital, mail-order, nuclear, sterile compounding, central fill, and more)
  • 📚 Interns — every registered pharmacy intern (pharmacy students completing supervised practice hours)
  • ⚙️ Technicians — every registered pharmacy technician

Each record includes license number, status, issue and expiration dates, full mailing address, disciplinary action flag, and source metadata — making this the fastest way to populate or refresh a Texas pharmacy dataset for compliance, sales, credentialing, or research use cases.

Why scrape TSBP yourself when this exists?

TSBP publishes the raw data as four separate CSV files updated every business day. Most teams discover this and immediately hit the same pain points:

  • ❌ CSV headers change without notice (TSBP has reformatted fields multiple times since 2020)
  • ❌ Inconsistent column counts across files require per-file parsing logic
  • ❌ Mixed-case status values (Active vs ACTIVE vs active) break naive filters
  • ❌ Address fields combine street, city, state and ZIP in non-standard ways
  • ❌ Disciplinary action flags appear in different columns per file
  • ❌ No incremental update API — you must redownload everything every time
  • ❌ Manual cron + S3 + parsing pipeline is 4–8 hours of one-off dev work that nobody wants to maintain

This actor solves all of that: it downloads, normalizes, deduplicates, filters, and outputs ready-to-use JSON — no parsing scripts, no schema babysitting, no Python pandas glue code.


Quick Start

One-Click Run

  1. Click "Try for free" on the Apify Store page
  2. Leave inputs at default to scrape all four license types
  3. Hit Start — your dataset is ready in under a minute
  4. Download as JSON, CSV, Excel, or HTML directly from the Apify dataset view

API Run (Python)

from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("haketa/tsbp-license-scraper").call(run_input={
"licenseTypes": ["pharmacist", "pharmacy"],
"statusFilter": "active_only",
"cities": ["Houston", "Dallas", "Austin"]
})
for record in client.dataset(run["defaultDatasetId"]).iterate_items():
print(record["licenseNumber"], record["lastName"], record["city"])

API Run (Node.js / TypeScript)

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('haketa/tsbp-license-scraper').call({
licenseTypes: ['pharmacy'],
statusFilter: 'active_only',
cities: ['Houston']
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Got ${items.length} active Houston pharmacies`);

API Run (cURL)

curl -X POST "https://api.apify.com/v2/acts/haketa~tsbp-license-scraper/runs?token=YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"licenseTypes":["pharmacist"],"statusFilter":"active_only"}'

How It Works

TSBP publishes four CSV downloads on its public website — refreshed every business day around 6:00 AM Central Time. This actor downloads all four directly (no browser, no login, no API key), parses each with category-specific logic, applies your filters, and pushes structured JSON records to the Apify dataset.

Source FileURLRecordsUpdated
phtdsk.csvpharmacy.texas.gov/downloads/phtdsk.csv~30,000 individual pharmacistsDaily
phydsk.csvpharmacy.texas.gov/downloads/phydsk.csv~7,500 pharmacy facilitiesDaily
intdsk.csvpharmacy.texas.gov/downloads/intdsk.csv~5,000 pharmacy internsDaily
techdsk.csvpharmacy.texas.gov/downloads/techdsk.csv~60,000 pharmacy techniciansDaily

Engineering details

  • Direct HTTPS GET — no headless browser, no Puppeteer, no Playwright
  • Streaming CSV parser — handles 100MB+ files without loading the entire file into memory
  • Schema normalization — column-name fuzzy matching survives TSBP's occasional header reformats
  • Status normalization — every status string lowercased and mapped to canonical values
  • Address parsing — splits raw address strings into street, city, state, ZIP components
  • Disciplinary inference — checks status codes AND dedicated disciplinary columns
  • Deterministic output — same input always produces the same dataset shape

Input Parameters

{
"licenseTypes": ["pharmacist", "pharmacy", "intern", "technician"],
"statusFilter": "all",
"cities": [],
"states": [],
"disciplinaryFilter": "all",
"maxRecords": 0
}

Parameter reference

ParameterTypeDefaultDescription
licenseTypesarray<string>all fourCategories to scrape: pharmacist, pharmacy, intern, technician. Choose one or any combination.
statusFilterstringallall returns every record. active_only returns only currently practicing licensees. inactive_only returns suspended, revoked, surrendered, cancelled, expired, and closed records.
citiesarray<string>[]Case-insensitive city filter. Example: ["Houston", "Dallas", "San Antonio"]. Empty array = no city filter.
statesarray<string>[]State abbreviation filter — useful because mail-order pharmacy facilities licensed in Texas may be physically located out of state. Example: ["TX"]. Empty = no state filter.
disciplinaryFilterstringallall ignores discipline. clean_only returns only records with no disciplinary action. disciplined_only returns only records with Board action on file.
maxRecordsinteger0Cap total output. 0 means unlimited. Useful for testing or sampling.
proxyConfigurationobjectnoneOptional Apify proxy settings. Rarely needed — TSBP does not rate-limit public CSV downloads.

Output Schema

Every record — regardless of license category — uses the same flat JSON schema so downstream consumers (databases, CRMs, analytics tools) can ingest the entire dataset without per-category branching.

Common fields (all categories)

FieldTypeAlways PresentDescription
licenseCategorystringOne of Pharmacist, Pharmacy, Intern, Technician
licenseNumberstringTSBP-issued license or registration number
licenseStatusstringNormalized status — see status reference below
issueDatestringOriginal license issue date in YYYY-MM-DD format
expirationDatestringCurrent expiration date in YYYY-MM-DD format
addressstringusuallyStreet address as reported to TSBP
citystringusuallyCity
statestringusuallyTwo-letter US state abbreviation
zipstringusuallyZIP code (5 or 9 digits)
disciplinaryActionbooleantrue if Board disciplinary action exists
sourceFilestringCSV filename this record came from
scrapedAtstringISO-8601 timestamp of extraction

Individual-only fields (Pharmacist, Intern, Technician)

FieldDescription
firstNameGiven name
middleNameMiddle name or initial
lastNameFamily name

Facility-only fields (Pharmacy)

FieldDescription
pharmacyNameDBA / facility name (e.g., WALGREENS #5432)
pharmacyTypeCommunity, Hospital, Mail Order, Nuclear, Sterile Compounding, Non-Sterile Compounding, Central Fill, Class A/B/C/D/E/F
phoneFacility phone number
pharmacistInChargeResponsible PIC pharmacist name

Example: Pharmacist record

{
"licenseCategory": "Pharmacist",
"licenseNumber": "45123",
"lastName": "MARTINEZ",
"firstName": "CARLOS",
"middleName": "A",
"pharmacyName": null,
"pharmacyType": null,
"licenseStatus": "Active",
"issueDate": "2016-08-15",
"expirationDate": "2027-03-31",
"address": "1234 MAIN ST",
"city": "Houston",
"state": "TX",
"zip": "77001",
"phone": null,
"pharmacistInCharge": null,
"disciplinaryAction": false,
"sourceFile": "phtdsk.csv",
"scrapedAt": "2026-05-06T09:00:00.000Z"
}

Example: Pharmacy facility record

{
"licenseCategory": "Pharmacy",
"licenseNumber": "18765",
"lastName": null,
"firstName": null,
"middleName": null,
"pharmacyName": "WALGREENS #5432",
"pharmacyType": "Community",
"licenseStatus": "Active",
"issueDate": "2005-01-10",
"expirationDate": "2027-01-31",
"address": "9876 WESTHEIMER RD",
"city": "Houston",
"state": "TX",
"zip": "77042",
"phone": "713-555-0100",
"pharmacistInCharge": "SMITH, JANE R",
"disciplinaryAction": false,
"sourceFile": "phydsk.csv",
"scrapedAt": "2026-05-06T09:00:00.000Z"
}

License Status Reference

✅ Active statuses — may legally practice or operate

StatusMeaning
ActiveLicense current and in good standing
ProbationActive but subject to Board-imposed conditions
RestrictedLimited scope of practice — contact TSBP for details

🚫 Inactive statuses — may NOT practice or operate

StatusMeaning
SuspendedTemporarily barred from practice
RevokedPermanently terminated by Board action
CancelledLicense cancelled
SurrenderVoluntarily surrendered (often pre-disciplinary)
RetiredRetired status — no longer practicing
ExpiredFailed to renew by deadline
ClosedPharmacy facility closed (facility records only)

Tip: Use statusFilter: "active_only" to receive only the first group, inactive_only for the second, or all for both.


Use Cases

🏥 Healthcare Staffing & Travel Pharmacy

Travel pharmacy and locum agencies use this dataset to:

  • Verify Texas licenses before placing pharmacists on assignment
  • Source candidates by city — get every active pharmacist in Houston, Dallas, Austin, or any Texas metro
  • Monitor expirations with daily-refreshed expiration dates so credentials never lapse mid-assignment
  • Filter out disciplinary issues automatically using the clean_only disciplinary filter

✅ Compliance & Credentialing Automation

Pharmacy chains, hospital systems, and PBMs use TSBP data to:

  • Automate monthly license verification for every pharmacist on payroll
  • Catch status changes within 24 hours — ActiveSuspended triggers immediate review
  • Maintain audit-ready logs with timestamped scrapedAt fields proving when verification ran
  • Replace expensive third-party verification subscriptions that charge per-lookup fees
  • Document due diligence for Joint Commission, URAC, and state inspector audits

💼 B2B Sales & Lead Generation

Pharmaceutical reps, medical device vendors, pharmacy software companies, and POS providers use the dataset to:

  • Build targeted Texas pharmacy lead lists filtered by city, type, or facility size
  • Identify net-new pharmacy openings by diffing this week's run against last week's
  • Route territory assignments based on pharmacy density per ZIP or metro area
  • Enrich CRM records (Salesforce, HubSpot, Pipedrive) with current license status
  • Power direct mail campaigns with verified, current pharmacy mailing addresses

📈 Workforce & Market Research

Academic researchers, healthcare policy analysts, and management consultants use TSBP data to:

  • Map pharmacist supply and demand across rural vs. urban Texas
  • Track demographic trends in license issuance over time
  • Analyze pharmacy type evolution (e.g., growth of mail-order vs. community pharmacy)
  • Quantify Board disciplinary patterns — what percentage of pharmacists face action annually?
  • Benchmark technician-to-pharmacist ratios across metropolitan statistical areas

Attorneys, M&A advisors, and investigators use the dataset to:

  • Verify pharmacist credentials in malpractice or licensing disputes
  • Build chronologies of an individual pharmacist's license history (when combined with archived runs)
  • Conduct pre-acquisition due diligence on pharmacy chain acquisitions
  • Identify all PICs (Pharmacist-in-Charge) at a facility for litigation discovery
  • Validate expert witness credentials before engagement

🛡️ Insurance Underwriting

Insurers writing pharmacist professional liability or pharmacy facility policies use this data to:

  • Verify license validity at policy bind and renewal
  • Adjust pricing for disciplinary history automatically
  • Monitor portfolio risk — flag insureds whose status changes mid-policy
  • Process claims faster with pre-verified licensee information

🏘️ Real Estate & Location Intelligence

Commercial real estate teams and retail site selection analysts use pharmacy density as a proxy for neighborhood healthcare access:

  • Identify pharmacy deserts — ZIP codes with low pharmacist-per-capita ratios
  • Evaluate retail site competition before opening a new pharmacy
  • Support healthcare facility planning with current pharmacy distribution
  • Inform investor pitch decks with hard demographic data

📊 Government & Public Health Research

State health departments, academic public health programs, and journalists use TSBP data to:

  • Study healthcare workforce shortages by region
  • Investigate pharmacy access disparities along racial, economic, or geographic lines
  • Cover regulatory enforcement — disciplinary trends, board action patterns
  • Inform health policy proposals with current empirical data

🎓 Academic & Career Research

Pharmacy schools, career counselors, and CE providers use TSBP data to:

  • Identify graduating intern pipelines by year and metro
  • Target CE marketing to active Texas pharmacists by license expiration date
  • Build alumni outreach lists for fundraising and engagement
  • Track program graduate outcomes longitudinally

Sample Queries & Recipes

Recipe 1: All active pharmacies in Houston with current PIC

{
"licenseTypes": ["pharmacy"],
"statusFilter": "active_only",
"cities": ["Houston"]
}

Recipe 2: Every disciplined pharmacist statewide (for compliance dashboards)

{
"licenseTypes": ["pharmacist"],
"statusFilter": "all",
"disciplinaryFilter": "disciplined_only"
}

Recipe 3: All licensees expiring in the next 90 days (post-filter in your stack)

{
"licenseTypes": ["pharmacist", "technician"],
"statusFilter": "active_only"
}

Then filter downstream:

from datetime import date, timedelta
cutoff = (date.today() + timedelta(days=90)).isoformat()
expiring_soon = [r for r in records if r["expirationDate"] <= cutoff]

Recipe 4: Build a 4-city sales territory file

{
"licenseTypes": ["pharmacy"],
"statusFilter": "active_only",
"cities": ["Houston", "Dallas", "Austin", "San Antonio"]
}

Recipe 5: Test run — sample 50 records before committing to a full scrape

{
"licenseTypes": ["pharmacist"],
"maxRecords": 50
}

Recipe 6: Texas-only pharmacy facilities (exclude out-of-state mail-order)

{
"licenseTypes": ["pharmacy"],
"statusFilter": "active_only",
"states": ["TX"]
}

Integration Examples

Google Sheets (via Apify Integration)

  1. Set up an Apify schedule running this actor daily at 8:00 AM Central
  2. Add the "Export to Google Sheets" integration to the schedule
  3. Receive a fresh Texas pharmacy CSV in your Sheet every morning

Make.com / Zapier / n8n

Use the Apify connector on any major automation platform. Trigger downstream workflows on:

  • New records (latest run minus previous run)
  • Status changes (ActiveSuspended)
  • Address changes (pharmacy relocations)
  • New disciplinary actions

Power BI / Tableau / Looker

Connect Apify's REST API as a data source. Refresh on Apify schedule. Build dashboards covering:

  • Active pharmacist count by metro
  • Disciplinary action rates by year
  • Pharmacy facility growth by type
  • Geographic heat maps of pharmacy density

Postgres / Snowflake / BigQuery

Use the Apify webhook integration to POST run results directly to your data warehouse ingestion endpoint after every scheduled run.

Salesforce / HubSpot CRM Enrichment

Trigger an Apify run nightly, then upsert against Account records keyed on license number. Status change events can create Tasks or open Cases automatically.


Major Texas Markets at a Glance

Metro AreaPopulationHealthcare Significance
Houston7.1MTexas Medical Center — world's largest medical complex; ~1,500 pharmacies
Dallas–Fort Worth7.6MBaylor Scott & White, UT Southwestern, HCA networks
San Antonio2.6MMilitary medical hub (BAMC, Brooke Army Medical Center)
Austin2.3MFastest-growing major metro, expanding pharmacy networks
Fort Worth1.0MCook Children's, JPS Health Network, independent pharmacies
El Paso0.9MBorder healthcare, bilingual pharmacy workforce
Corpus Christi0.5MCoastal Bend healthcare hub
Lubbock0.3MWest Texas medical center, Texas Tech HSC
Amarillo0.3MTexas Panhandle healthcare anchor
McAllen0.9MRio Grande Valley pharmacy network

Cost & Performance

MetricValue
EngineDirect CSV download — no browser overhead
Runtime (all four files, unfiltered)30–60 seconds
Runtime (single category)5–15 seconds
Cost per full run~0.001 Compute Units (typically less than $0.01)
Pricing modelPay-per-event (transparent per-record pricing)
Data freshnessDaily — previous business day
Auth requiredNone
Proxy requiredNone
ConcurrencySafe to run multiple parallel filtered configurations
Memory footprint256 MB sufficient for full unfiltered run

  • Public data only — every field in this dataset is published by TSBP at pharmacy.texas.gov under the Texas Public Information Act
  • No PHI — the dataset contains no patient health information
  • No SSNs, DOBs, or financial data — only license-related public information
  • Address data is the business/practice address on file with TSBP — not personal residence (in most cases)
  • HIPAA does not apply — this is licensing data, not patient data
  • No emails are included; TSBP does not publish licensee email addresses
  • Compliance with CAN-SPAM, TCPA, GDPR/CCPA is the responsibility of the data consumer

Important: TSBP data may not be used for unlawful purposes including but not limited to identity fraud, stalking, or harassment. Read TSBP's Open Records policy for full guidance.


Frequently Asked Questions

How fresh is the data?

TSBP refreshes the public CSV files every business day, typically by 6:00 AM Central Time. The actor downloads the latest version on each run, so data is at most one business day old.

How many records will I get?

Approximately 100,000+ total records across all four files: ~30,000 pharmacists, ~7,500 pharmacy facilities, ~5,000 interns, and ~60,000 technicians. Numbers shift slightly with new licenses, expirations, and renewals.

Does this scraper require login or API keys to TSBP?

No. TSBP publishes the CSVs as public downloads with no authentication. You only need an Apify account to run the actor.

Does this work for other states (California, Florida, New York)?

Not this actor — TSBP is Texas-specific. We maintain separate Apify actors for other state licensing boards. See the Related Actors section below for the current catalog.

Can I use this for license verification at scale?

Yes. Many compliance teams run this actor daily, diff against the previous day, and trigger alerts on status changes. Apify schedules make this fully automated.

Are pharmacist or pharmacy emails included?

No. TSBP does not publish licensee email addresses in the public files. Pharmacy phone numbers and mailing addresses are included.

Can I filter by license expiration date or issue date?

The actor returns the dates as fields — apply expiration/issue-date filters in your downstream pipeline (SQL WHERE, Python list comprehension, Sheets filter, etc.).

Does the actor deduplicate?

The TSBP files are already deduplicated by license number — each license appears once. The actor preserves this.

What's the difference between an intern and a technician?

A pharmacy intern is a pharmacy school student gaining supervised practice hours toward licensure as a pharmacist. A pharmacy technician is a non-pharmacist support role registered with TSBP, not on the licensure track.

Is residential or proxy access required?

No. TSBP does not block or rate-limit public CSV downloads. The actor runs without proxies by default.

Is there a historical snapshot version of the data?

Not from TSBP directly. To build a history, schedule this actor daily and archive each dataset run — Apify stores all run datasets indefinitely on most plans.

Can I get pharmacist NPI numbers?

NPI numbers are issued federally (CMS), not by TSBP, so they are not in this dataset. Cross-reference TSBP license numbers with the NPPES NPI Registry for NPI enrichment.

Does this actor work with the Apify Free Plan?

Yes — full functionality on the free tier. A full unfiltered run costs ~0.001 CU.

How do I report a bug or request a feature?

Open an issue on the Apify Store actor page or contact the developer directly through the Apify Console.

Can I run this on a schedule automatically?

Yes — Apify's built-in Scheduler lets you trigger this actor hourly, daily, weekly, or on any cron expression. Combine with webhook or integration outputs for a fully automated pipeline.

What formats can I export the data in?

JSON, CSV, Excel (XLSX), HTML, XML, and RSS — directly from the Apify dataset view. The API also supports JSON Lines for streaming consumers.

Does this dataset include closed pharmacies?

Yes, when you set statusFilter: "all" or statusFilter: "inactive_only", closed facilities are included. Use this for historical analysis or to study pharmacy churn.

How does pay-per-event pricing work?

You're charged a small amount for the actor start and per dataset item delivered. Typical full runs cost under $0.01. There are no monthly minimums — you only pay when you run.


If you need licensing data from other US states or related healthcare regulatory bodies, check these additional actors:


Comparison vs. Alternatives

ApproachSetup timeData freshnessCost (10K records)Schema normalizationCompliance audit log
This actor< 1 minuteDaily< $0.01✅ Built-in✅ Automatic
Manual CSV download5–10 min/dayDailyFree❌ None❌ None
Custom Python script4–8 hours devDailyFree + infraDIYDIY
Paid verification APIHours setupReal-time$100–500+/mo
TSBP records requestDaysStaleVariable

Why Pay-Per-Event Pricing?

Most data scrapers either charge a flat monthly subscription (you pay even if you don't use it) or per-Compute-Unit (unpredictable). This actor uses pay-per-event pricing, which means:

  • ✅ You only pay when the actor runs
  • ✅ Charges scale with how much data you actually consume
  • ✅ Transparent, line-item billing inside Apify
  • ✅ No monthly minimums
  • ✅ Free to evaluate — sample with maxRecords: 50 for pennies

Changelog

VersionDateNotes
1.0.02026-05-06Initial release — direct CSV download, four license categories, full filtering, pay-per-event pricing

Keywords

Texas Pharmacy License Scraper · TSBP scraper · Texas State Board of Pharmacy data · Texas pharmacist database · Texas pharmacy license lookup · pharmacy.texas.gov scraper · Texas pharmacist verification API · TSBP CSV download · Texas pharmacy compliance · Texas pharmacy lead generation · Texas pharmacy B2B leads · Texas pharmacist directory · Texas pharmacy technician registry · Texas pharmacy intern data · Texas pharmacist credentialing automation · pharmacist license verification Texas · pharmacy disciplinary action lookup Texas · Texas pharmacy data extraction · Apify pharmacy actor · healthcare licensing data Texas · Texas pharmacy chain locations · Houston pharmacy database · Dallas pharmacy database · Austin pharmacy database · San Antonio pharmacy database · Texas mail order pharmacy data · pharmacy facility licensing Texas · pharmacist license number lookup · pharmacy CSV API · TSBP license verification · Texas pharmacy schedule automation · pharmacy compliance monitoring Texas


Support

  • 🐛 Bug reports: Use the Issues tab on the Apify Store page
  • 💡 Feature requests: Same place, please describe your use case
  • 📧 Direct contact: Through the Apify developer profile

If this actor saves you time, a 5-star rating on the Apify Store helps other healthcare and compliance teams discover it. Thank you!