Vitals.com Doctor [$1.99/1k] Scraper · NPI, Specialty & Reviews
Pricing
from $1.99 / 1,000 results
Vitals.com Doctor [$1.99/1k] Scraper · NPI, Specialty & Reviews
[$1.99/1k] Scrape Vitals.com US doctor & dentist profiles — by specialty/location browse or individual profile URLs. Returns name, NPI, specialty, education, licenses, practice locations, phone, ratings & review counts, languages, insurance and bio in clean JSON/CSV. Pure HTTP, no browser
Pricing
from $1.99 / 1,000 results
Rating
5.0
(2)
Developer
Muhamed Didovic
Maintained by CommunityActor stats
1
Bookmarked
39
Total users
7
Monthly active users
4.3 hours
Issues response
2 days ago
Last modified
Categories
Share
Vitals.com Doctor Scraper — NPI, Specialty, Reviews & More
Scrape Vitals.com — US doctor & dentist profiles — browse by specialty/location or pass individual profile URLs. Every provider comes back in one clean schema with name, NPI, specialty, education, medical licenses, practice locations, phone, ratings, every patient review (stars, comment, date, per-question scores), languages, insurance and bio. Pure HTTP, no browser.

Why use this scraper
- Provider-grade data — name, degree, National Provider Identifier (NPI), primary + all specialties, years of experience, gender, languages.
- Education & licensing — medical school / residency / fellowship history, and state licenses (type, state, expiry, status).
- Practice locations — practice name, address, city/state/zip, phone, lat/long for every office.
- Ratings & patient reviews — Vitals rating score, number of ratings, review count, and the full text of every patient review (star rating, comment, date, helpful votes, bedside manner / wait time / follow-up scores), plus telehealth, insurance, Medicare/Medicaid flags.
- Pure HTTP, no browser — reads Vitals' embedded
__INITIAL_STATE__directly. Fast and cheap.
Overview
Vitals embeds the full provider record in each profile page as a JSON island. The actor classifies each URL (browse / provider), walks specialty/location browse pages (~60 per page, ?page=N), fans out to each provider, and normalises everything into a consistent row. Ideal for healthcare data teams, recruiters, medical-device/pharma sales, and provider-directory builders.
Supported inputs
| Input URL shape | Example |
|---|---|
| Specialty browse | vitals.com/cardiologists |
| Specialty + location | vitals.com/cardiologists/ny/new-york |
| Individual provider | vitals.com/doctors/{slug} (or /dentists/{slug}) |
| Old-style or tab links | http://www.vitals.com/doctors/Dr_First_Last.html, vitals.com/doctors/{slug}/reviews |
Tip: browse a specialty + city on vitals.com, then copy the URL from your browser's address bar — it drops straight into
startUrls.
Use cases
- Healthcare data teams — build / enrich provider directories keyed on NPI.
- Medical-device & pharma sales — target specialists by specialty, location, affiliation.
- Recruiters — source physicians by specialty, experience, location, languages.
- Market research — analyse provider density, ratings, and acceptance of new patients by region.
How it works
- You provide one or more Vitals URLs (browse or provider).
- The actor classifies each URL and walks browse pages with
?page=Npagination. - Each provider's
__INITIAL_STATE__is parsed for the full structured record. - Patient reviews are paged in from the same review service the profile's "load more" button uses, newest first.
- Rows are normalised to one schema and streamed to your dataset — JSON or CSV.
Input configuration
| Field | Type | Default | Description |
|---|---|---|---|
startUrls | array | — | vitals.com URLs (browse or provider) |
includeReviews | boolean | true | Attach every patient review to the provider row |
maxReviewsPerProvider | integer | 100 | Newest-first cap on reviews per provider |
flatten | boolean | true | Flatten nested fields for CSV-friendly output |
maxItems | integer | 10000 | Hard cap on rows collected |
maxConcurrency | integer | 6 | Parallel profile fetches |
Output samples
Flattened (flatten: true, default):
{"portal": "vitals","npi": "1568632859","fullName": "Dmitriy N. Feldman","degree": "MD","gender": "M","yearsOfExperience": 24,"primarySpecialty": "Cardiovascular Disease","specialties_json": "[{\"name\":\"Cardiovascular Disease\",\"title\":\"Cardiologist\"}]","city": "New York","state": "NY","phone": "(212) 555-0143","ratingScore": 4.9,"reviewCount": 27,"education_json": "[{\"type\":\"Fellowship\",\"institution\":\"…\",\"year\":\"2016\"}]","licenses_json": "[{\"type\":\"Medical Doctor\",\"state\":\"New York\",\"status\":\"Active\"}]","languages_json": "[\"English\"]","reviews_json": "[{\"reviewId\":\"43520347\",\"rating\":5,\"comment\":\"Smart, compassionate, good referrals.…\",\"reviewDate\":\"2025-07-05T14:53:23Z\",\"helpfulCount\":1,\"criteria\":{\"Had a good bedside manner\":1,\"Spent time with me\":1}}]","isTelehealth": true,"acceptsNewPatients": true}
Key output fields
| Field | Description |
|---|---|
npi, providerId, entityId, vitalsGuid | Identity (incl. National Provider Identifier) |
fullName, firstName, lastName, suffix, degree | Name |
gender, yearsOfExperience | Demographics |
primarySpecialty, specialties[], expertise[] | Specialties |
education[] | School / residency / fellowship (type, institution, year) |
licenses[] | State licenses (type, state, expiry, status) |
practiceLocations[] | Practice name, address, city/state/zip, phone, lat/long |
phone | Primary phone |
city, state, postcode, latitude, longitude | Location |
ratingScore, numberOfRatings, reviewCount, vitalsScore | Ratings |
reviews[] | Patient reviews: reviewId, rating, comment, reviewDate, updatedAt, helpfulCount, source, criteria (per-question scores such as bedside manner, wait time in minutes) |
languages[], acceptsNewPatients, isTelehealth | Access |
hospitals[], insurances[], isMedicare, isMedicaid | Affiliations / coverage |
bio, photoUrl, videoUrl | Profile media |
FAQ
Does it include the NPI? Yes — the National Provider Identifier is on every provider row, plus state license details.
Does it include the patient reviews themselves?
Yes. Each provider row carries a reviews array with every written review (up to maxReviewsPerProvider, default 100), bundled into the row at no extra charge. Set includeReviews to false if you only need the profile.
Can I scrape dentists too?
Yes — /dentists/... browse and /dentists/{slug} profiles work the same as doctors.
How many providers per browse page?
Around 60, and the actor paginates with ?page=N until maxItems.
Support
Found a bug or need a field added? Open an issue on the actor's Apify Console page.
Explore more scrapers
- Avvo Scraper — US lawyer directory
- FindLaw Scraper — US legal directory
- Martindale Scraper — US attorney directory
Full portfolio: apify.com/memo23
🤖 For AI Agents & LLM Apps
Compact reference for AI agents calling this actor via the Apify MCP server or the Apify API (actor: memo23/vitals-scraper).
Purpose: Extract US doctor & dentist provider profiles from Vitals.com — by specialty/location browse or individual profile URLs — into one clean schema with NPI, specialties, education, licenses, practice locations, ratings and the full patient reviews.
Minimal input:
{"startUrls": ["https://www.vitals.com/cardiologists/ny/new-york"],"maxItems": 5}
startUrls accepts specialty browse (vitals.com/cardiologists), specialty+location (vitals.com/cardiologists/ny/new-york), or individual provider (vitals.com/doctors/{slug}, /dentists/{slug}, http:// and old Dr_First_Last.html links, profile tabs such as /reviews).
Output: one dataset row per provider — fields include portal, npi, providerId, entityId, vitalsGuid, fullName, firstName, lastName, degree, gender, yearsOfExperience, primarySpecialty, specialties[], expertise[], education[], licenses[], practiceLocations[], phone, city, state, postcode, latitude, longitude, ratingScore, numberOfRatings, reviewCount, reviews[] (reviewId, rating, comment, reviewDate, updatedAt, helpfulCount, source, criteria), vitalsScore, languages[], acceptsNewPatients, isTelehealth, hospitals[], insurances[], isMedicare, isMedicaid, bio, photoUrl, videoUrl.
Behaviors an agent should know:
- URLs are auto-classified; browse pages list ~60 providers each (sponsored cards are skipped) and paginate via
?page=NuntilmaxItems. - Always set
maxItems(default 10000) to bound rows and billing. flatten(default true) JSON-stringifies nested arrays into*_jsonfields for CSV; set false to keep nested JSON.includeReviews(default true) attaches every patient review, newest first, capped bymaxReviewsPerProvider(default 100); reviews do not add rows or charges.enrichEmailsis billed per email found — charged only when an email is returned.- Public data only, read from each page's embedded state. Pure HTTP, no browser.
⚠️ Disclaimer
This scraper accesses only publicly available data. Use the extracted data in compliance with Vitals.com's Terms of Use, US privacy laws (including state regulations), and all applicable laws. You are responsible for how you use scraped data — particularly personal information (provider names, contact details). This actor is not affiliated with, endorsed by, or connected to Vitals, WebMD, or Internet Brands.
SEO Keywords
vitals scraper, vitals.com scraper, doctor directory scraper, physician data scraper, NPI scraper, US healthcare provider data, doctor reviews scraper, medical provider scraper, healthcare lead generation, physician directory api, doctor contact data, dentist scraper, provider npi lookup, healthcare data extraction, medical sales leads