Vitals.com Doctor [$1.99/1k] Scraper · NPI, Specialty & Reviews avatar

Vitals.com Doctor [$1.99/1k] Scraper · NPI, Specialty & Reviews

Pricing

from $1.99 / 1,000 results

Go to Apify Store
Vitals.com Doctor [$1.99/1k] Scraper · NPI, Specialty & Reviews

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

Muhamed Didovic

Maintained by Community

Actor stats

1

Bookmarked

39

Total users

7

Monthly active users

4.3 hours

Issues response

2 days ago

Last modified

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.

How it works

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 shapeExample
Specialty browsevitals.com/cardiologists
Specialty + locationvitals.com/cardiologists/ny/new-york
Individual providervitals.com/doctors/{slug} (or /dentists/{slug})
Old-style or tab linkshttp://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

  1. You provide one or more Vitals URLs (browse or provider).
  2. The actor classifies each URL and walks browse pages with ?page=N pagination.
  3. Each provider's __INITIAL_STATE__ is parsed for the full structured record.
  4. Patient reviews are paged in from the same review service the profile's "load more" button uses, newest first.
  5. Rows are normalised to one schema and streamed to your dataset — JSON or CSV.

Input configuration

FieldTypeDefaultDescription
startUrlsarray—vitals.com URLs (browse or provider)
includeReviewsbooleantrueAttach every patient review to the provider row
maxReviewsPerProviderinteger100Newest-first cap on reviews per provider
flattenbooleantrueFlatten nested fields for CSV-friendly output
maxItemsinteger10000Hard cap on rows collected
maxConcurrencyinteger6Parallel 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

FieldDescription
npi, providerId, entityId, vitalsGuidIdentity (incl. National Provider Identifier)
fullName, firstName, lastName, suffix, degreeName
gender, yearsOfExperienceDemographics
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
phonePrimary phone
city, state, postcode, latitude, longitudeLocation
ratingScore, numberOfRatings, reviewCount, vitalsScoreRatings
reviews[]Patient reviews: reviewId, rating, comment, reviewDate, updatedAt, helpfulCount, source, criteria (per-question scores such as bedside manner, wait time in minutes)
languages[], acceptsNewPatients, isTelehealthAccess
hospitals[], insurances[], isMedicare, isMedicaidAffiliations / coverage
bio, photoUrl, videoUrlProfile 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

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=N until maxItems.
  • Always set maxItems (default 10000) to bound rows and billing.
  • flatten (default true) JSON-stringifies nested arrays into *_json fields for CSV; set false to keep nested JSON.
  • includeReviews (default true) attaches every patient review, newest first, capped by maxReviewsPerProvider (default 100); reviews do not add rows or charges.
  • enrichEmails is 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