# Practo Doctors Scraper — Healthcare & Clinic Listings (`muhammadafzal/practo-doctors-scraper`) Actor

Extract verified doctor profiles from Practo with clinic addresses, consultation fees, specialties, experience, and patient review ratings.

- **URL**: https://apify.com/muhammadafzal/practo-doctors-scraper.md
- **Developed by:** [Muhammad Afzal](https://apify.com/muhammadafzal) (community)
- **Categories:** Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.60 / 1,000 doctor results

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

## Practo Doctors Scraper

Extract verified doctor profiles, medical specialties, clinic addresses, consultation fees, overall experience, and patient ratings across cities in India from [Practo](https://www.practo.com).

### What it extracts

| Field | Type | Description | Example |
|---|---|---|---|
| `id` | String | Unique Practo identifier | `"149529"` |
| `doctorId` | String | Practo internal doctor ID | `"258255"` |
| `name` | String | Full doctor name with salutation | `"Dr. Mallayya R. Pujari"` |
| `specialization` | String | Primary medical category | `"Dentist"` |
| `specialties` | Array | Sub-specialties and focus areas | `["Dentist", "Dental Surgeon"]` |
| `qualifications` | String | Academic medical degrees | `"BDS, MDS - Oral Medicine and Radiology"` |
| `experienceYears` | Number | Overall clinical experience (years) | `20` |
| `clinicName` | String | Name of clinic or hospital | `"32 Smiles Multispeciality Dental Clinic"` |
| `locality` | String | Clinic neighborhood / area | `"Marathahalli"` |
| `city` | String | Practice city | `"Bangalore"` |
| `country` | String | Practice country | `"India"` |
| `address` | String | Full clinic street address | `"130, Green Garden Layout, Kundalahalli Gate..."` |
| `postalCode` | String | Postal / PIN code | `"560037"` |
| `latitude` | Number | Clinic latitude coordinate | `12.954464` |
| `longitude` | Number | Clinic longitude coordinate | `77.714866` |
| `consultationFees` | Number | Consultation fee amount | `200` |
| `currency` | String | Currency of consultation fee | `"INR"` |
| `recommendationPercent` | Number | Patient recommendation rate (%) | `96` |
| `reviewsCount` | Number | Total patient reviews count | `4039` |
| `patientsCount` | Number | Patients count / feedback count | `4039` |
| `services` | Array | Medical procedures and treatments | `["Root Canal Treatment", "Teeth Whitening"]` |
| `summary` | String | Biography / profile summary | `"Dr. Mallayya R. Pujari is a Dentist..."` |
| `isPractoPrime` | Boolean | Practo Prime verified status | `true` |
| `profileUrl` | String | Canonical Practo doctor profile link | `"https://www.practo.com/bangalore/doctor/..."` |
| `sourceUrl` | String | URL from which record was scraped | `"https://www.practo.com/bangalore/dentist"` |
| `scrapedAt` | String | ISO 8601 scrape timestamp | `"2026-09-30T12:00:00.000Z"` |

*Note: Enabling `scrapeDoctorDetails` or supplying direct profile URLs additionally populates `experiences`, `awards`, `memberships`, `registrations`, and `clinics`.*

### When to use this Actor

- **Healthcare directory building:** Aggregate listings of dentists, cardiologists, dermatologists, pediatricians, or general physicians.
- **Clinic and market intelligence:** Compare consultation fees, patient feedback scores, and healthcare accessibility across localities.
- **Provider research & recruitment:** Research specialist medical qualifications, clinical experience, and medical council registrations.
- **Local search & telehealth lead generation:** Connect healthcare software or services to active dental clinics and private practices.

#### When not to use it

- Do not use for patient medical record retrieval (Practo does not expose patient data).
- Do not use for automated booking or appointment scheduling (this Actor is purely an extraction tool).

### Input parameters

| Field | Type | Default | Description |
|---|---|---|---|
| `startUrls` | Array | `[]` | List of Practo search listing or doctor profile URLs. Example: `https://www.practo.com/bangalore/dentist`. |
| `city` | String | `"bangalore"` | City in India when `startUrls` is omitted (e.g., `delhi`, `mumbai`, `hyderabad`, `chennai`, `pune`). |
| `specialty` | String | `"dentist"` | Medical specialty to search (e.g., `dentist`, `dermatologist`, `cardiologist`, `gynecologist`). |
| `locality` | String | `""` | Optional neighborhood/locality (e.g., `indiranagar`, `koramangala`, `whitefield`, `marathahalli`). |
| `maxItems` | Integer | `20` | Maximum doctor records to extract (1–200). Free-plan runs deliver up to 5 records. |
| `maxPages` | Integer | `2` | Maximum pagination pages per search URL (1–10). Each page contains up to 10 doctors. |
| `scrapeDoctorDetails` | Boolean | `false` | When true, fetches individual doctor profile pages for full registrations, awards, and clinic locations. |

### Examples

#### Search by city and specialty

```json
{
  "city": "delhi",
  "specialty": "dermatologist",
  "maxItems": 20
}
```

#### Direct search URL with locality

```json
{
  "startUrls": [
    { "url": "https://www.practo.com/bangalore/dentist/koramangala" }
  ],
  "maxItems": 30
}
```

#### Direct doctor profile extraction

```json
{
  "startUrls": [
    { "url": "https://www.practo.com/bangalore/doctor/dr-mallayya-pujari-dentist" }
  ]
}
```

### Output example

```json
{
  "id": "149529",
  "doctorId": "258255",
  "name": "Dr. Mallayya R. Pujari",
  "profileUrl": "https://www.practo.com/bangalore/doctor/dr-mallayya-pujari-dentist",
  "imageUrl": "https://images1-fabric.practo.com/doctor/258255/dr-mallayya-r-pujari.jpg",
  "specialization": "Dentist",
  "specialties": [
    "Dentist",
    "Dental Surgeon"
  ],
  "qualifications": "BDS, MBA - Hospital Management, MDS - Oral Medicine and Radiology",
  "experienceYears": 20,
  "clinicName": "32 Smiles Multispeciality Dental Clinic",
  "locality": "Marathahalli",
  "city": "Bangalore",
  "country": "India",
  "address": "130, Green Garden Layout, Kundalahalli Gate, Sai Baba Temple Road",
  "postalCode": "560037",
  "latitude": 12.954464,
  "longitude": 77.714866,
  "consultationFees": 200,
  "currency": "INR",
  "recommendationPercent": 96,
  "reviewsCount": 4039,
  "patientsCount": 4039,
  "services": [
    "Artificial Teeth",
    "Conservative Dentistry",
    "Cosmetic/ Aesthetic Dentistry"
  ],
  "summary": "Dr. Mallayya R. Pujari is a Dentist in Marathahalli, Bangalore...",
  "isPractoPrime": true,
  "sourceUrl": "https://www.practo.com/bangalore/dentist",
  "scrapedAt": "2026-09-30T07:47:00.000Z"
}
```

### Pay-per-event pricing

This Actor is billed under the Pay per event model. Platform usage pass-through is disabled (`isPPEPlatformUsagePaidByUser: false`), meaning the tiered event price covers compute, memory, and proxy costs.

| Event | Free tier | Bronze tier | Silver tier | Gold tier | Platinum tier | Diamond tier |
|---|---|---|---|---|---|---|
| `apify-actor-start` | $0.00625 | $0.006094 | $0.005938 | $0.005000 | $0.005000 | $0.005000 |
| `apify-default-dataset-item` | $0.00200 | $0.001950 | $0.001900 | $0.001600 | $0.001600 | $0.001600 |

#### Representative run totals

- **10 doctor records:** $0.00625 start + (10 × $0.002) = **$0.026**
- **50 doctor records:** $0.00625 start + (50 × $0.002) = **$0.106**
- **100 doctor records:** $0.00625 start + (100 × $0.002) = **$0.206**

*Free-plan accounts are capped at 5 records per run.*

### Reliability & Anti-blocking

- **Scrape-first architecture:** Extracts clean, structured doctor records directly from page-embedded state and semantic HTML cards without heavy browser overhead.
- **Low memory consumption:** Runs smoothly on 256 MB memory allocation.
- **Akamai & Cloudflare resilience:** Includes browser TLS-fingerprinting headers and automatic residential proxy escalation when access challenges are encountered.
- **Defensive extraction:** Redux state parsing with Cheerio DOM fallbacks ensures data continuity even during frontend UI updates.

### Legal and compliance

This Actor extracts publicly available directory information for medical practitioners listed on Practo. Scraping must comply with local privacy regulations and Practo's terms of service. You are responsible for lawful use of extracted business contact details.

# Actor input Schema

## `startUrls` (type: `array`):

Direct Practo listing or doctor profile URLs to scrape. Example: https://www.practo.com/bangalore/dentist or https://www.practo.com/delhi/doctor/dr-example. When left empty, city and specialty fields are used.

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

Target city in India for doctor search when startUrls is omitted. Examples: bangalore, delhi, mumbai, hyderabad, chennai, pune, kolkata, ahmedabad.

## `specialty` (type: `string`):

Medical specialty or category to search for. Examples: dentist, dermatologist, cardiologist, gynecologist, pediatrician, orthopedist, general-physician, neurologist.

## `locality` (type: `string`):

Optional neighborhood or locality within the city to narrow the search. Examples: indiranagar, koramangala, whitefield, marathahalli, bandra.

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

Maximum number of doctor records to extract. Minimum 1, maximum 200. Free-plan accounts deliver up to 5 records.

## `maxPages` (type: `integer`):

Maximum listing pagination pages to visit per search URL. Each page typically contains up to 10 doctor profiles. Minimum 1, maximum 10.

## `scrapeDoctorDetails` (type: `boolean`):

When enabled, visits each doctor's individual profile page to extract detailed clinic locations, registrations, awards, memberships, and comprehensive qualification histories. When disabled, extracts all fields directly from search listings for maximum speed.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.practo.com/bangalore/dentist"
    }
  ],
  "city": "bangalore",
  "specialty": "dentist",
  "maxItems": 20,
  "maxPages": 2,
  "scrapeDoctorDetails": false
}
```

# Actor output Schema

## `results` (type: `string`):

Schema-validated doctor records stored in the default dataset.

# 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 = {
    "startUrls": [
        {
            "url": "https://www.practo.com/bangalore/dentist"
        }
    ],
    "city": "bangalore",
    "specialty": "dentist",
    "maxItems": 20,
    "maxPages": 2,
    "scrapeDoctorDetails": false
};

// Run the Actor and wait for it to finish
const run = await client.actor("muhammadafzal/practo-doctors-scraper").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 = {
    "startUrls": [{ "url": "https://www.practo.com/bangalore/dentist" }],
    "city": "bangalore",
    "specialty": "dentist",
    "maxItems": 20,
    "maxPages": 2,
    "scrapeDoctorDetails": False,
}

# Run the Actor and wait for it to finish
run = client.actor("muhammadafzal/practo-doctors-scraper").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 '{
  "startUrls": [
    {
      "url": "https://www.practo.com/bangalore/dentist"
    }
  ],
  "city": "bangalore",
  "specialty": "dentist",
  "maxItems": 20,
  "maxPages": 2,
  "scrapeDoctorDetails": false
}' |
apify call muhammadafzal/practo-doctors-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,muhammadafzal/practo-doctors-scraper"
        }
    }
}
```

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/9pFgpRFn6lMoPd1hC/builds/mquMfUPUUhGaUiMCf/openapi.json
