---
title: "Healthcare provider data"
description: "Collect healthcare provider data from payer directories, hospital find-a-doctor pages and NPI-linked listings: specialty, location and accepted insurance."
canonical: https://www.zenrows.com/use-cases/healthcare-provider-data
updated: 2026-10-18
---

# Healthcare provider data

Healthcare provider data is the directory record for each clinician and facility, with name, NPI, specialty, practice locations, phone and accepted insurance plans. Zenrows collects it from payer directories, hospital find-a-doctor pages and public listings, including search forms that need a real browser, and returns structured records you can match on NPI and re-verify on a schedule.

## Sample output: one provider record

```json
{
  "source": "payer_directory",
  "source_url": "https://www.example-health-plan.com/find-care/provider/88213",
  "npi": "1234567893",
  "name": "Example Provider, MD",
  "specialties": ["Family Medicine"],
  "accepting_new_patients": true,
  "locations": [
    {
      "address": "200 Main St, Suite 4, Columbus, OH 43215",
      "phone": "+1-555-0142",
      "hours": "Mon-Fri 8:00-17:00"
    }
  ],
  "networks": ["Example PPO", "Example HMO Select"],
  "languages": ["English", "Spanish"],
  "hospital_affiliations": ["Example General Hospital"],
  "fetched_at": "2026-10-16T06:12:00Z"
}
```

An illustrative directory record. The NPI is the key that joins it to the NPPES registry and to the same provider in other directories.

## What provider data teams collect

A provider record is only useful if it is right today: the right address, the right phone, the right networks. Teams collect the same clinician from several sources and compare them, because no single directory is complete.

| Job | Data you collect | Typical sources |
|---|---|---|
| Payer directory aggregation | Provider, specialty, location, network, accepting new patients | UnitedHealthcare, Aetna, Cigna, Humana and Blue Cross plan directories |
| Directory accuracy audits | Address, phone and network status compared field by field | Payer directories against practice websites and NPPES |
| NPI enrichment | Taxonomy code, practice address, enumeration and update dates | NPPES NPI Registry, CMS Care Compare |
| Health system rosters | Affiliated physicians, departments, clinic locations | Find-a-doctor pages on hospital and health system sites |
| Ratings and profile data | Star rating, review count, listed specialties, photos | Healthgrades, Zocdoc, Vitals, Google Maps |
| Facility and lab locations | Facility type, services, hours, booking links | Urgent care chains, imaging centres, lab locators |

## Why provider directories are hard to scrape

Directories are built for one patient searching one ZIP code. Collecting a whole network means running that search thousands of times against sites that watch for exactly that.

| What breaks | What it looks like | How Zenrows handles it |
|---|---|---|
| Search forms instead of URLs | Results appear only after choosing a plan, specialty and ZIP code from dropdowns | Browser runs the form in a real Chromium session you drive with Playwright or Puppeteer |
| Insurer bot protection | 403s or challenge pages from protections such as Akamai, and repeated dropdown scripts get flagged | Zenrows' stealth gets through Akamai and similar protections on every session |
| One provider, many records | The same clinician at five addresses, under three networks, spelled two ways | Collect the NPI and source URL on every record and match on NPI |
| Stale or conflicting entries | A directory still lists a closed office or an old phone number | Re-fetch on a cycle and compare the payer record with the practice site and NPPES |
| Search grid size | Plans times specialties times ZIP codes runs into tens of thousands of searches | Batch sends every profile URL as one job once the searches have produced them |

## How to collect provider directory data with Zenrows

1. **Define the search grid.** List the plans, specialties and ZIP codes you need to cover for each directory.
2. **Run the searches in Browser.** Drive the directory form over Playwright and save every profile URL from the results.
3. **Fetch each profile.** Request profile pages and name the fields with CSS selectors to return name, NPI, specialty, address, phone and networks as JSON.
4. **Match on NPI.** Join each record to NPPES and to the same provider in other sources, and flag every field that disagrees.
5. **Re-verify on a cycle.** Send the profile URL list to Batch from the CLI and compare the new run with the last one.

```javascript Node.js
// npm install playwright
import { chromium } from "playwright";

const browser = await chromium.connectOverCDP(
  "wss://browser.zenrows.com?apikey=YOUR_ZENROWS_API_KEY"
);
const page = await browser.newPage();
await page.goto(DIRECTORY_SEARCH_URL);

// Choose plan and specialty, enter a ZIP code, then search
await page.selectOption("#plan", "PPO");
await page.selectOption("#specialty", "Family Medicine");
await page.fill("#zip", "43215");
await page.click("button[type=submit]");
await page.waitForSelector(".provider-card");

const providers = await page.$$eval(".provider-card", (cards) =>
  cards.map((card) => ({
    name: card.querySelector(".name")?.textContent.trim(),
    profile_url: card.querySelector("a")?.href,
  }))
);
console.log(providers);
await browser.close();
```

```python Python
# pip install requests
import json
import requests

fields = {
    "name": "h1",
    "npi": ".npi",
    "specialty": ".specialty",
    "address": ".address",
    "phone": ".phone",
    "networks": ".plans li",
}
params = {
    "apikey": "YOUR_ZENROWS_API_KEY",
    "url": PROFILE_URL,
    "mode": "auto",  # Adaptive Stealth Mode
    "css_extractor": json.dumps(fields),
}
response = requests.get("https://api.zenrows.com/v1/", params=params)
print(response.json())
```

```bash CLI
npx -y @zenrows/cli init
# jobs.jsonl: one {"url": "PROFILE_URL"} per line, the profiles to re-verify this cycle
zenrows batch create jobs.jsonl --output markdown --wait
zenrows batch results JOB_ID --out profiles.jsonl
```

```text Claude Code (MCP)
# Connect once
claude mcp add zenrows -e ZENROWS_API_KEY=YOUR_ZENROWS_API_KEY -- npx -y @zenrows/mcp

# Then ask:
Use Zenrows to open this health plan's find-a-doctor search, choose the PPO plan and Family Medicine, search ZIP code 43215, and return every provider on the first two result pages with name, NPI, address, phone and whether they accept new patients.
```

## Which Zenrows product fits

| If you need to | Use | Why |
|---|---|---|
| Run a directory search with dropdowns and a ZIP field | [Browser](/products/browser) | A real browser session you script with Playwright or Puppeteer |
| Read provider profile pages as fields | [Fetch](/products/fetch) | Name the fields with CSS selectors and get them back as JSON |
| Re-verify every provider in a network each cycle | [Batch](/products/batch) | The whole profile list runs as one job, with results by webhook |
| Start a re-verification run from a terminal or a cron job | [CLI](/cli) | One command submits a JSONL file and waits for the job to finish |

## What success looks like

| Measure | What good looks like | How to check it |
|---|---|---|
| NPI match rate | Nearly every record carries an NPI that resolves in NPPES | Count records without a valid NPI after each run |
| Field agreement | Address, phone and network agree across payer directory, practice site and NPPES | Report disagreements per field and per source |
| Verification age | Every record was checked inside your cycle, for example 90 days | Track the date of the last successful fetch per record |
| Network coverage | Your set holds every provider the directory returns for each search | Compare your count with the result count the directory shows |
| Duplicates | One record per NPI and practice location | Run a duplicate report on NPI plus normalised address |

## Healthcare provider data FAQ

### What is healthcare provider data?

It is the descriptive record of a clinician or facility: legal name, NPI, specialty and taxonomy, practice locations, phone numbers, hours, languages, hospital affiliations, the insurance networks they accept and whether they take new patients. Payers, provider-search apps, referral tools and health system marketing teams all depend on it being accurate.

### Where does NPI data come from, and is it enough?

NPI data comes from NPPES, the CMS registry that assigns every US provider a National Provider Identifier. It is free to search and download. It is self-reported and providers update it irregularly, and it holds no network participation or new-patient status. Use NPPES as the identity spine and fill the rest from payer directories and practice websites.

### What is provider data management, and where does web data fit?

Provider data management is the work of keeping provider records correct across credentialing, directories, claims and referrals. Web data supplies the outside check: what the practice website, the hospital roster and other payers say today. Comparing those sources field by field shows which records need a call or an update.

### Is it legal to scrape provider directories?

Provider directories are published so patients can find care, and they hold professional details, not patient health information covered by HIPAA. Names and contact details are still personal data under GDPR and similar laws, so outside the US check your basis for processing. Respect each directory's terms, and check the project with your legal team before you collect.

### How often should provider directories be checked?

In the US, the No Surprises Act requires health plans to verify their directory information at least every 90 days, which makes 90 days a sensible default cycle for any provider dataset. Practices with high turnover, such as urgent care and multi-site groups, are worth checking more often.

### Can Zenrows handle insurer directory search forms?

Yes. Browser gives you a real Chromium session over Playwright or Puppeteer, so your script can pick a plan from a dropdown, type a ZIP code, page through results and open each profile. Where the directory exposes plain profile URLs, Fetch and Batch read them faster.

### How do I combine payer directory data with Healthgrades or Zocdoc profiles?

Collect profiles from each source with the NPI where the page shows one, and the name, specialty and practice address where it does not. Match on NPI first, then on normalised name plus address. Keep ratings, review counts and booking links from the review sites next to the network and new-patient fields from the payer, each with its own source URL and fetch date.

### Can I collect provider data outside the US?

Yes. Use geotargeting to send the request from the market's country, for example Brazil for a Brazilian health insurer's network search, so the directory loads as it does for local patients. Outside the US there is no NPI, so match on the national registration number or on name plus address.

## Related use cases

- [Healthcare data scraping](https://www.zenrows.com/use-cases/healthcare-data-scraping.md): Clinical trials, recalls, hospital prices and research papers from public registries and agency sites, kept current.
- [Insurance data scraping](https://www.zenrows.com/use-cases/insurance-data.md): Competitor quotes, policy terms, rate filings and property risk data, captured per test profile.
- [Public records API](https://www.zenrows.com/use-cases/public-records-api.md): Permits, violations, licenses and registry filings from city, county and state portals, returned as JSON on demand.
- [Pharmaceutical data scraping](https://www.zenrows.com/use-cases/pharmaceutical-data.md): Drug prices by pharmacy, formulary tiers, FDA and EMA approvals and patient-reported signals, tracked over time.
- [Lead enrichment](https://www.zenrows.com/use-cases/lead-enrichment.md): A domain in, an account record out: pricing, hiring, product and review signals from the company's own web.

Start free: https://app.zenrows.com/register. Docs: https://docs.zenrows.com
