# Doctoralia Docplanner Doctor Directory Scraper (`jungle_synthesizer/doctoralia-docplanner-doctor-directory-scraper`) Actor

Scrape doctor and specialist profiles across the Doctoralia/Docplanner network across Brazil, Spain, Mexico, Colombia, Chile, Peru, Poland, Italy, Germany (Jameda), Turkey and Czechia. Get names, specialties, license numbers, service prices, insurance, languages, ratings and addresses.

- **URL**: https://apify.com/jungle\_synthesizer/doctoralia-docplanner-doctor-directory-scraper.md
- **Developed by:** [BowTiedRaccoon](https://apify.com/jungle_synthesizer) (community)
- **Categories:** Business, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.80 / 1,000 record scrapeds

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

## Doctoralia & Docplanner Doctor Directory Scraper

Scrape doctor profiles across the [Doctoralia](https://www.doctoralia.com.br) / Docplanner network — Brazil, Spain, Mexico, Colombia, Chile, Peru, Poland (Znanylekarz), Italy (MioDottore), Germany (Jameda), Turkey (Doktortakvimi) and Czechia (ZnamyLekar). Returns names, specialties, license numbers, per-service prices, accepted insurance plans, languages, ratings, and clinic addresses from one dataset, one input schema, across all 11 country brands.

***

### Doctoralia & Docplanner Scraper Features

- Crawls all 11 Docplanner-network country domains from a single run — pick one country or all of them.
- Extracts per-service prices, not just specialty and rating. Most directory scrapers stop at name and address.
- Returns accepted insurance plans per doctor, where the profile publishes them.
- Collects academic education and professional experience history alongside the basic profile fields.
- Normalizes ratings, review counts, and languages spoken into consistent fields across every country's locale.
- Flags likely telehealth/online-consultation doctors by parsing the published service list.
- Resumes automatically from a `resumeCursor` if a large run stops partway through.

***

### Who Uses Doctoralia and Docplanner Doctor Data?

- **Healthcare marketing agencies** — build prospect lists of practices by specialty and city, then pitch website or ad services.
- **Payer and insurtech analysts** — cross-reference which insurance plans a given specialty or region's doctors actually accept.
- **Medtech and pharma commercial teams** — segment prescribers and specialists by geography and treatment focus for territory planning.
- **Market researchers** — size a country's specialist supply per capita, or compare service pricing across cities.
- **Directory and comparison sites** — license structured doctor data instead of maintaining their own listings.

***

### How the Doctoralia & Docplanner Scraper Works

1. Pick one or more countries (or leave the field empty to cover all 11).
2. The scraper reads each selected country's public sitemap to find every doctor profile URL — no search-page pagination involved.
3. Each profile page is parsed for name, specialties, license number, services and prices, insurance, languages, addresses, and ratings.
4. Results land in your dataset as the run progresses; a large crawl can be resumed later without re-paying for records you already have.

***

### Input

```json
{
  "countries": ["br", "de"],
  "maxItems": 500
}
```

| Field          | Type            | Default | Description |
|----------------|-----------------|---------|-------------------------------------------------------------------------------|
| `countries`    | array of string | all 11  | Country domains to crawl: `br`, `es`, `mx`, `co`, `cl`, `pe`, `pl`, `it`, `de`, `tr`, `cz`. Leave empty to crawl every country. |
| `maxItems`     | integer         | 10      | Maximum number of doctor profiles to return, across all selected countries. |
| `resumeCursor` | string          | —       | Continue a previous run from where it stopped. See "Resuming a large crawl" below. |

***

### Doctoralia & Docplanner Scraper Output Fields

```json
{
  "country": "br",
  "domain": "doctoralia.com.br",
  "profile_url": "https://www.doctoralia.com.br/alline-gomes-goncalves-fagundes/medico-de-familia-geriatra/belo-horizonte",
  "doctor_id": "747722",
  "full_name": "Alline Gomes Gonçalves Fagundes",
  "title_prefix": "Dra.",
  "specialties": ["Médico de família", "Geriatra"],
  "subspecialties": [],
  "license_number": "",
  "profile_photo_url": "https://s3-sa-east-1.amazonaws.com/doctoralia.com.br/doctor/d5f6f8/d5f6f8f1e7ca2a3d952f88a0290ef977_220_square.jpg",
  "about_text": "",
  "services": ["Consulta geriatria — Sob consulta", "Teleconsulta — Sob consulta"],
  "insurances_accepted": [],
  "languages": [],
  "addresses": ["CDC - Centro de Diagnóstico Cardiológico BH, Avenida Carandaí 149, Santa Efigênia, Belo Horizonte, Minas Gerais MG, 30130-064"],
  "facility_ids": ["989425"],
  "phone": "",
  "online_consultation": true,
  "rating_average": 5,
  "rating_count": 2,
  "opinion_count": 2,
  "education": ["Faculdade Ciências Médicas de Minas Gerais"],
  "experience": ["Hospital Odilon Behrens"],
  "awards": [],
  "scraped_at": "2026-09-20T15:21:35.255Z"
}
```

| Field                 | Type    | Description                                                                            |
|-----------------------|---------|----------------------------------------------------------------------------------------|
| `country`             | string  | ISO-2 country code the profile was crawled from                                        |
| `domain`              | string  | Docplanner-network host the row came from                                              |
| `profile_url`         | string  | Canonical profile URL                                                                  |
| `doctor_id`           | string  | Internal doctor id where available, else the profile URL's slug                        |
| `full_name`           | string  | Doctor's full name                                                                     |
| `title_prefix`        | string  | Professional title (Dr. / Dra. / Prof.) where Docplanner renders it separately         |
| `specialties`         | array   | Medical specialties listed on the profile                                              |
| `subspecialties`      | array   | Additional areas of focus, where published                                             |
| `license_number`      | string  | Medical license / registration number, where published                                 |
| `profile_photo_url`   | string  | Doctor's profile photo URL                                                             |
| `about_text`          | string  | Doctor's self-written bio, where published                                             |
| `services`            | array   | Services offered, formatted as "Service name — price or price note"                    |
| `insurances_accepted` | array   | Health insurance plans the doctor accepts, where published                             |
| `languages`           | array   | Languages the doctor consults in                                                       |
| `addresses`           | array   | Practice addresses, formatted as facility, street, district, city, region, postal code |
| `facility_ids`        | array   | Internal facility ids referenced on the profile                                        |
| `phone`               | string  | Practice phone number, where published directly on the page                            |
| `online_consultation` | boolean | True when a listed service indicates online/telehealth consultations                   |
| `rating_average`      | number  | Average patient rating (1-5), where the profile has published reviews                  |
| `rating_count`        | integer | Number of ratings behind `rating_average`                                              |
| `opinion_count`       | integer | Number of written patient reviews                                                      |
| `education`           | array   | Academic education entries, where published                                            |
| `experience`          | array   | Professional experience entries, where published                                       |
| `awards`              | array   | Docplanner quality badges shown on the profile                                         |
| `scraped_at`          | string  | ISO-8601 timestamp when the record was scraped                                         |

Many of the richer fields — services, addresses, insurance, education, experience, ratings — are only as complete as the doctor's own profile. A doctor who hasn't filled in a bio or a price list will return an empty array for that field rather than a guess.

***

### Resuming a large crawl

Every run emits a `resumeCursor` in its Output. If a large crawl stops before it finishes — because it hit `maxItems`, your spend cap (`maxTotalChargeUsd`), or was aborted — start a new run with **the same input** plus that `resumeCursor` to continue from where it left off. The crawl resumes from the queued work the previous run didn't reach.

- You are **not re-charged** for records the earlier run already delivered.
- Resume within your account's run-retention window — on the free tier, roughly your 10 most recent runs. Once the source run is pruned, its `resumeCursor` is no longer valid.
- `resumeCursor` is opaque — supply it unmodified.

***

### FAQ

#### Which countries does this scraper cover?

Brazil, Spain, Mexico, Colombia, Chile, and Peru (all Doctoralia brands), plus Poland (Znanylekarz), Italy (MioDottore), Germany (Jameda), Turkey (Doktortakvimi), and Czechia (ZnamyLekar) — the full Docplanner network as published today.

#### Does this include clinic/facility profiles, or only individual doctors?

Individual doctor profiles only. Clinic and facility listings use a different page structure on the Docplanner network and aren't covered by this actor.

#### Why are some fields empty for certain doctors?

Docplanner profiles are self-published by each doctor. A doctor who hasn't listed a price, an insurance plan, or a bio will show an empty field rather than a fabricated value.

#### Can I search by specialty or city?

Not directly as an input filter — the scraper crawls entire country sitemaps. Filter the resulting dataset by the `specialties` or `addresses` fields after the run completes.

***

### Need More Features?

Need clinic/facility profiles, specialty filtering, or a country not listed above? [File an issue](https://console.apify.com/actors/issues) or get in touch.

### Why Use This Scraper Instead of a Single-Country One?

- **Covers the whole network, not one brand.** Doctoralia, Jameda, MioDottore, and Znanylekarz all run on the same underlying platform — one input schema replaces stitching together several single-country scrapers.
- **Pulls fields the commodity scrapers skip.** Per-service prices and accepted insurance plans live on the profile page, not the search listing — most directory scrapers never fetch that far.
- **One schema across every country.** Field names and types stay identical whether the row came from Brazil or Germany, so downstream pipelines don't need per-country branches.

# Actor input Schema

## `sp_intended_usage` (type: `string`):

What will this data feed? E.g. lead lists, KYB checks, price tracking.

## `sp_improvement_suggestions` (type: `string`):

Provide any feedback or suggestions for improvements.

## `sp_contact` (type: `string`):

We'll personally help with your use case. No spam.

## `resumeCursor` (type: `string`):

Leave empty for a fresh crawl. To CONTINUE a previous run where it stopped — without paying again for records you already received — paste the `resumeCursor` value from that run's Output (the run's OUTPUT key). Resume promptly: the previous run's data expires with your account's retention window (free tier: your ~10 most recent runs).

## `countries` (type: `array`):

Which Docplanner-network country domains to crawl. Leave empty to crawl all 11.

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

Maximum number of doctor profiles to scrape, across all selected countries.

## Actor input object example

```json
{
  "sp_intended_usage": "Describe your intended use...",
  "sp_improvement_suggestions": "Share your suggestions here...",
  "sp_contact": "Share your email here...",
  "maxItems": 10
}
```

# Actor output Schema

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

No description

# 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 = {
    "sp_intended_usage": "Describe your intended use...",
    "sp_improvement_suggestions": "Share your suggestions here...",
    "sp_contact": "Share your email here...",
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("jungle_synthesizer/doctoralia-docplanner-doctor-directory-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 = {
    "sp_intended_usage": "Describe your intended use...",
    "sp_improvement_suggestions": "Share your suggestions here...",
    "sp_contact": "Share your email here...",
    "maxItems": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("jungle_synthesizer/doctoralia-docplanner-doctor-directory-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 '{
  "sp_intended_usage": "Describe your intended use...",
  "sp_improvement_suggestions": "Share your suggestions here...",
  "sp_contact": "Share your email here...",
  "maxItems": 10
}' |
apify call jungle_synthesizer/doctoralia-docplanner-doctor-directory-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,jungle_synthesizer/doctoralia-docplanner-doctor-directory-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/IiHTcdtdskIzTvrVl/builds/svDM3xohzRZizWZZJ/openapi.json
