# Bookimed.com Medical Tourism Scraper — Clinics & Prices (`haketa/bookimed-scraper`) Actor

Scrape medical tourism clinics and hospitals from Bookimed.com across 50+ countries and 13 languages. Extract treatment prices, star ratings, verified patient reviews, doctor rosters, success rates and certifications by country, city and procedure. Export to JSON, CSV, Excel or API.

- **URL**: https://apify.com/haketa/bookimed-scraper.md
- **Developed by:** [Haketa](https://apify.com/haketa) (community)
- **Categories:** Lead generation, Business, Automation
- **Features:** Limited permissions
- **Stats:** 7 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 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

## Bookimed Scraper 🏥🌍 — Medical Tourism Clinics, Treatment Prices, Doctors & Reviews

**Extract structured medical tourism clinic and hospital data from [Bookimed.com](https://www.bookimed.com) across 45+ destination countries and 13 languages — with zero login and zero coding.** This **Bookimed scraper** pulls normalized records for **1,600+ accredited international clinics and hospitals** — including **clinic name, profile URL, country, city, itemized treatment prices (USD / EUR), star ratings, verified review counts, hospital certifications (JCI, ISO, TEMOS, NABH, ISQua), featured surgeons, and (in profile mode) full patient reviews, doctor rosters, success rates, facility metrics, and contact details**.

Export your **Bookimed data** in bulk to **JSON, CSV, Excel, XML, or via the Apify API** for healthcare price benchmarking, medical tourism agency operations, and B2B healthcare lead generation.

> **Built for** medical tourism facilitators and patient coordinators, cross-border procedure price-comparison teams, international insurers and self-funded health plans, health-content and SEO publishers, healthcare PE/VC analysts, medical-device and pharma sales teams, and public-health researchers.

[![Apify Actor](https://img.shields.io/badge/Apify-Actor-00b04f?style=flat-square\&logo=apify)](https://apify.com/haketa/bookimed-scraper)
[![Clinics](https://img.shields.io/badge/Directory-1%2C600%2B%20Clinics%20%7C%2050%2B%20Countries-6f42c1?style=flat-square)](https://apify.com/haketa/bookimed-scraper)
[![Prices](https://img.shields.io/badge/Treatment%20Prices-USD%20%26%20EUR%20Ranges-e4002b?style=flat-square)](https://apify.com/haketa/bookimed-scraper)
[![Reviews](https://img.shields.io/badge/Doctors%20%26%20Reviews-Included-brightgreen?style=flat-square)](https://apify.com/haketa/bookimed-scraper)
[![Languages](https://img.shields.io/badge/Languages-13%20Regional%20Editions-ff9900?style=flat-square)](https://apify.com/haketa/bookimed-scraper)
[![Pagination](https://img.shields.io/badge/Pagination-1%2C000%2B%20Auto--Expanded-blue?style=flat-square)](https://apify.com/haketa/bookimed-scraper)
[![Output](https://img.shields.io/badge/Output-JSON%20%7C%20CSV%20%7C%20Excel-2b7489?style=flat-square)](https://apify.com/haketa/bookimed-scraper)

***

### ⚡ At a glance

| Feature | Details |
| --- | --- |
| **Target directory** | [Bookimed.com](https://www.bookimed.com) — global medical tourism directory covering 1,600+ clinics & hospitals across 50+ countries |
| **Targeting modes** | 45-country dropdown + 18-city dropdown + custom cities + 15-procedure dropdown, or direct listing/clinic URLs (`startUrls`) |
| **Supported languages** | 13 editions (`us-uk`, `de`, `ru`, `es`, `fr`, `it`, `pt`, `ar`, `ja`, `tr`, `pl`, `ro`, `hu`) |
| **Listing-mode fields** | Clinic name, profile URL, country, city, itemized `treatmentPrices` (`{treatment, min, max, currency}`), `certifications`, `rating`, `reviewCount`, search provenance |
| **Profile-mode enrichment** | `scrapeDetails: true` adds full patient `reviews` array, `ratingBreakdown`, `doctors` roster, `specialties`, `accreditations`, `successRates`, `description`, `address`, `phone`, `email`, `foundedYear`, `beds`, `languages`, `patientOrigins`, `patientsPerYear`, `photos` |
| **Pagination & 1,000+ scale** | Automatic "Load More" expansion (`maxLoadMore: 0` auto-scales with `maxClinics`) + automatic procedure & multi-country expansion for **1,000+ clinic runs** |
| **De-duplication** | 100% unique clinics per run — deduplicated globally by canonical `clinicUrl` |
| **Export formats** | JSON, CSV, Excel (XLSX), HTML, XML, RSS, JSON Lines, and live REST API / webhooks |

***

### 🔎 Why scrape Bookimed?

Bookimed is one of the world's largest medical tourism platforms, connecting international patients with **1,600+ accredited hospitals and specialized clinics across 50+ countries** — including major medical hubs in Turkey, Thailand, India, Mexico, South Korea, Germany, Spain, Hungary, Poland, the Czech Republic, and the UAE. Every listing combines hard-to-find cross-border healthcare data:

- **Itemized procedure pricing** (`min` and `max` price ranges in USD or EUR for hair transplants, dental implants, veneers, rhinoplasty, breast augmentation, liposuction, knee/hip replacement, CABG, IVF, oncology, and stem-cell therapy).
- **Quality & accreditation signals** (international hospital accreditations like `JCI`, `ISO 9001`, `TEMOS`, `NABH`, `ISQua`, and `Gold Seal`, plus verified patient review counts and star ratings).
- **Deep clinical profiles** (surgeon rosters with years of experience and specializations, procedure success rates, annual international patient volumes, and full patient testimonials).

Collecting this intelligence manually requires clicking "Load More" dozens of times per country and copying nested price tables one clinic at a time. This **Bookimed data extractor** automates the entire workflow: it expands dynamic listings automatically, normalizes procedure prices into structured objects, deduplicates across overlapping country/procedure searches, and optionally enriches every record from its full hospital profile page.

***

### ✨ What this Bookimed scraper does

- ✅ **No-code dropdown targeting + URL escape hatch:** Pick any combination of **45 countries**, **18 popular medical-tourism cities** (plus unlimited custom cities via `citiesCustom`), and **15 top procedures** — or paste any Bookimed listing or clinic profile URL into `startUrls` (for IVF, bariatric surgery, LASIK, oncology, etc.).
- ✅ **Unlocked 1,000+ clinic pagination:** With `maxLoadMore: 0` (the default), the scraper automatically expands "Load More" pagination as deep as needed to reach your `maxClinics` target, and when `maxClinics > 150` (or `0` for unlimited), it automatically fans out across procedures and destination countries so single-run extractions scale cleanly past **1,000+ unique clinics**.
- ✅ **Normalized multi-currency treatment pricing:** Parses USD (`$`) and EUR (`€`) price tables into clean `{ treatment, min, max, currency }` objects, filtering out marketing teaser noise.
- ✅ **Hospital accreditation detection:** Captures `JCI`, `ISO 9001`, `TEMOS`, `NABH`, `ISQua`, and `Gold Seal` badges directly on listing cards and profile pages.
- ✅ **Full profile enrichment (`scrapeDetails: true`):** Opens each clinic's profile page to extract individual patient `reviews` (author, star rating, full text, date, procedure, patient country, attending doctor), 5-star `ratingBreakdown`, full `doctors` roster, `specialties`, `successRates`, `description`, `address`, `phone`, `email`, `foundedYear`, `beds`, `languages`, `patientOrigins`, `patientsPerYear`, and `photos`.
- ✅ **13 regional language editions:** Scrape localized clinic names, treatment labels, and reviews in English (`us-uk`), German (`de`), Russian (`ru`), Spanish (`es`), French (`fr`), Italian (`it`), Portuguese (`pt`), Arabic (`ar`), Japanese (`ja`), Turkish (`tr`), Polish (`pl`), Romanian (`ro`), or Hungarian (`hu`).

***

### 🎯 Use cases

| Persona | How they use Bookimed Scraper |
| --- | --- |
| **Medical Tourism Agencies & Facilitators** | Build instant clinic shortlists per inbound patient inquiry, compare min/max treatment quotes across countries, and keep CRM partner catalogs updated. |
| **Procedure Price Benchmarking Teams** | Compare FUE hair transplant, All-on-4 dental implant, rhinoplasty, and orthopedic surgery pricing across Istanbul, Bangkok, Tijuana, Budapest, and Mumbai. |
| **Insurers & Self-Funded Health Plans** | Evaluate cross-border and center-of-excellence referral savings by benchmarking domestic surgery costs against JCI-accredited international hospitals. |
| **B2B Medical Device & SaaS Sales** | Generate qualified hospital and specialty-clinic lead lists segmented by country, city, accreditation status, and surgical specialty. |
| **Healthcare Content & SEO Publishers** | Power "Best Hair Transplant Clinics in Turkey" and "Dental Implant Cost by Country" comparison pages with live ratings, review counts, and price ranges. |
| **Healthcare PE/VC & Market Researchers** | Map private clinic density, international patient origin flows (`patientOrigins`), and accreditation penetration across emerging medical-tourism corridors. |

***

### 📥 Input parameters

All fields are optional. Clicking **Start** with the prefill (`countries: ["turkey"]`, `maxClinics: 30`) finishes in under a minute and delivers a ready-to-inspect dataset. Running with completely empty inputs returns a 100-clinic multi-country sample.

| Parameter | Type | Default / Prefill | Description |
| --- | --- | --- | --- |
| `countries` | `array<string>` | Prefill: `["turkey"]` | Select one or more of 45 medical tourism destination countries (`turkey`, `thailand`, `india`, `mexico`, `germany`, `spain`, `republic-of-korea`, `hungary`, `poland`, `united-arab-emirates`, etc.). Leave empty for a multi-country sample. |
| `procedures` | `array<string>` | `[]` | Optional procedure filter (`hair-transplant`, `dental-implant`, `rhinoplasty-nose-job`, `breast-augmentation`, `liposuction`, `knee-replacement`, `hip-replacement`, `coronary-artery-bypass-grafting`, `kidney-transplant`, `treatment-with-stem-cells`, etc.). |
| `cities` | `array<string>` | `[]` | Optional city filter (`istanbul`, `antalya`, `izmir`, `ankara`, `bangkok`, `phuket`, `mumbai`, `delhi`, `chennai`, `berlin`, `munich`, `barcelona`, `madrid`, `cancun`, `tijuana`, `budapest`, `prague`, `warsaw`). |
| `citiesCustom` | `array<string>` | `[]` | Advanced: add any additional city slugs not listed in `cities` (e.g. `adana`, `goa`, `seoul`). Combined with `cities`. |
| `language` | `string` (select) | `"us-uk"` | Regional language edition (`us-uk`, `de`, `ru`, `es`, `fr`, `it`, `pt`, `ar`, `ja`, `tr`, `pl`, `ro`, `hu`). |
| `scrapeDetails` | `boolean` | `false` | Open each clinic's full profile page to extract patient `reviews`, `doctors`, `description`, `address`, `phone`, `beds`, `foundedYear`, `languages`, and `photos`. Leave `false` for fast listing collection. |
| `maxClinics` | `integer` | `100` (Prefill: `30`) | Maximum total unique clinics to collect across all searches. Set `0` for unlimited collection, or `1000+` for deep global extraction. |
| `maxLoadMore` | `integer` | `0` | Maximum "Load more" expansions per listing page. `0` = automatic/unlimited expansion governed by `maxClinics`. |
| `startUrls` | `array<object>` | `[]` | Optional direct Bookimed listing or clinic profile URLs (`[{ "url": "https://..." }]`). Scraped in addition to dropdown selections. |
| `proxyConfiguration` | `object` | `{ "useApifyProxy": true }` | Apify Proxy configuration. Default works out of the box. |
| `requestDelay` | `integer` | `1500` | Delay in milliseconds between profile detail requests (`0`–`30000`). |

#### Example 1 — Fast multi-country clinic & price comparison

```json
{
  "countries": ["turkey", "thailand", "mexico", "hungary"],
  "procedures": ["dental-implant", "hair-transplant"],
  "language": "us-uk",
  "scrapeDetails": false,
  "maxClinics": 250,
  "maxLoadMore": 0,
  "proxyConfiguration": { "useApifyProxy": true }
}
```

#### Example 2 — Deep 1,000+ global clinic directory extraction

```json
{
  "countries": ["turkey", "india", "thailand", "germany", "spain", "mexico", "republic-of-korea", "poland"],
  "scrapeDetails": false,
  "maxClinics": 1000,
  "maxLoadMore": 0,
  "proxyConfiguration": { "useApifyProxy": true }
}
```

#### Example 3 — Full profile enrichment (`scrapeDetails: true`) with reviews & doctors

```json
{
  "countries": ["turkey"],
  "cities": ["istanbul"],
  "procedures": ["rhinoplasty-nose-job"],
  "scrapeDetails": true,
  "maxClinics": 25,
  "requestDelay": 1500
}
```

***

### 📤 Output & field reference

Every clinic is emitted as a clean JSON object. Below is a real listing-mode record (`scrapeDetails: false`), followed by a profile-enriched record (`scrapeDetails: true`).

#### Sample JSON (Listing mode — fast)

```json
{
  "clinicName": "Lokman Hekim Istanbul",
  "clinicUrl": "https://us-uk.bookimed.com/clinic/lokman-hekim-istanbul/",
  "country": "Turkey",
  "city": "Istanbul",
  "rating": 4.7,
  "reviewCount": 296,
  "certifications": ["JCI", "ISO 9001"],
  "treatmentPrices": [
    { "treatment": "Blood test for hormonal profile", "min": 219, "max": 328, "currency": "USD" },
    { "treatment": "Consultation with a neurosurgeon", "min": 112, "max": null, "currency": "USD" },
    { "treatment": "Knee Arthroscopy", "min": 1820, "max": 2870, "currency": "USD" },
    { "treatment": "Breast lift", "min": 2440, "max": 2700, "currency": "USD" }
  ],
  "patientsPerYear": null,
  "specialties": null,
  "featuredDoctor": null,
  "description": null,
  "successRates": null,
  "patientOrigins": null,
  "doctors": null,
  "address": null,
  "photos": null,
  "verified": null,
  "searchCountry": "turkey",
  "searchCity": null,
  "searchProcedure": null,
  "scrapedAt": "2026-11-02T00:24:17.306Z"
}
```

#### Sample JSON (`scrapeDetails: true` — full profile enrichment)

```json
{
  "clinicName": "Memorial Şişli Hospital",
  "clinicUrl": "https://us-uk.bookimed.com/clinic/memorial-sisli-hospital/",
  "country": "Turkey",
  "city": "Istanbul",
  "rating": 4.8,
  "reviewCount": 520,
  "certifications": ["JCI", "ISO 9001"],
  "accreditations": ["JCI"],
  "specialties": ["Oncology", "Cardiology", "Orthopedics", "Organ Transplant"],
  "treatmentPrices": [
    { "treatment": "Bone marrow transplant", "min": 45000, "max": 60000, "currency": "USD" }
  ],
  "doctors": [
    {
      "name": "Prof. Dr. Serkan Keskin",
      "specialization": "Medical Oncology",
      "qualifications": "24 years of experience",
      "photo": "https://...",
      "rating": 4.9,
      "reviewCount": 42
    }
  ],
  "reviews": [
    {
      "author": "Maria K.",
      "rating": 5,
      "text": "The international patient department coordinated every step from airport pickup to consultation...",
      "date": "2026-08-14",
      "treatment": "Oncology consultation",
      "country": "Romania",
      "doctor": "Prof. Dr. Serkan Keskin"
    }
  ],
  "ratingBreakdown": { "5": 420, "4": 60, "3": 20, "2": 10, "1": 10 },
  "description": "Memorial Şişli Hospital is a JCI-accredited multi-specialty medical center in Istanbul...",
  "patientOrigins": ["Germany", "United Kingdom", "Bulgaria", "United States"],
  "patientsPerYear": 15000,
  "address": "Kaptanpaşa Mah. Darülaceze Cad. No:14, Şişli, Istanbul",
  "phone": "+90 212 314 66 66",
  "email": null,
  "foundedYear": 2000,
  "beds": 252,
  "languages": ["English", "German", "Russian", "Arabic", "Turkish"],
  "photos": ["https://..."],
  "searchCountry": "turkey",
  "searchCity": "istanbul",
  "searchProcedure": null,
  "scrapedAt": "2026-11-02T00:25:00.000Z"
}
```

#### 🏥 Core clinic identity & pricing fields (Listing + Profile modes)

| Field | Type | Coverage | Description |
| --- | --- | --- | --- |
| `clinicName` | `string` | 🟢 High (100%) | Official display name of the clinic or hospital. |
| `clinicUrl` | `string` | 🟢 High (100%) | Canonical Bookimed clinic profile URL. Used as the global de-duplication key. |
| `country` | `string` | 🟢 High (100%) | Destination country name (e.g. `Turkey`, `Thailand`, `Mexico`). |
| `city` | `string` | 🟢 High (~80%) | City name extracted from the search filter, listing card, or structured profile data. |
| `treatmentPrices` | `array<object>` | 🟢 High (~65–85%) | Array of procedure price objects `{ treatment, min, max, currency }` (`USD` or `EUR`). |
| `certifications` | `array<string>` | 🟡 Conditional (~35%) | International hospital accreditations (`JCI`, `ISO 9001`, `TEMOS`, `NABH`, `ISQua`, `Gold Seal`) when held by the clinic. |
| `rating` | `number` | 🟡 Conditional (🟢 High in profile mode) | Aggregate Bookimed rating on a 0–5 scale. |
| `reviewCount` | `integer` | 🟡 Conditional (🟢 High in profile mode) | Total count of verified patient reviews. |
| `featuredDoctor` | `object` | 🟡 Conditional | Lead physician highlighted on the listing card (`{ name, yearsExperience }`). |
| `searchCountry` / `searchCity` / `searchProcedure` | `string` | 🟢 High (100%) | Search filter provenance showing which query matched the clinic. |
| `scrapedAt` | `string` | 🟢 High (100%) | ISO-8601 UTC extraction timestamp. |

#### 🩺 Deep profile enrichment fields (`scrapeDetails: true`)

| Field | Type | Coverage | Description |
| --- | --- | --- | --- |
| `reviews` | `array<object>` | 🟡 Conditional (`scrapeDetails`) | Detailed patient reviews `{ author, rating, text, date, treatment, country, doctor }`. |
| `ratingBreakdown` | `object` | 🟡 Conditional (`scrapeDetails`) | 5-star rating distribution `{ "5": n, "4": n, "3": n, "2": n, "1": n }`. |
| `doctors` | `array<object>` | 🟡 Conditional (`scrapeDetails`) | Full physician roster `{ name, specialization, qualifications, photo, rating, reviewCount }`. |
| `specialties` | `array<string>` | 🟡 Conditional (`scrapeDetails`) | Hospital departments and medical specialties. |
| `accreditations` | `array<string>` | 🟡 Conditional (`scrapeDetails`) | Detailed accreditation list from the clinic profile. |
| `description` | `string` | 🟡 Conditional (`scrapeDetails`) | Full hospital overview and clinical capabilities description. |
| `successRates` | `object` | 🟡 Conditional (`scrapeDetails`) | Procedure success rate percentages when published by the facility. |
| `patientOrigins` | `array<string>` | 🟡 Conditional (`scrapeDetails`) | Top countries from which international patients travel to this clinic. |
| `patientsPerYear` | `integer` | 🟡 Conditional (`scrapeDetails`) | Annual patient volume when reported by the hospital. |
| `address` / `phone` / `email` | `string` | 🟡 Conditional (`scrapeDetails`) | Facility street address and contact details when published on the profile. |
| `foundedYear` / `beds` | `integer` | 🟡 Conditional (`scrapeDetails`) | Year founded and total hospital bed capacity. |
| `languages` | `array<string>` | 🟡 Conditional (`scrapeDetails`) | Languages spoken by the international patient coordination staff. |
| `photos` | `array<string>` | 🟡 Conditional (`scrapeDetails`) | Up to 10 high-resolution facility gallery image URLs. |

***

### 🔁 Pagination & 1,000+ clinic scale

Bookimed paginates its directory behind a dynamic **"Load More"** button (each click reveals ~5–10 additional clinics), and individual country pages typically contain 50–350 clinics. This scraper unlocks **1,000+ clinic extraction** automatically:

1. **Automatic Load More scaling (`maxLoadMore: 0`):** By default (`maxLoadMore: 0`), you never have to calculate how many button clicks are needed — the scraper automatically clicks "Load More" as many times as required to satisfy your `maxClinics` target (or until the page is exhausted).
2. **Automatic procedure & multi-country fan-out (`maxClinics > 150` or `0`):** When you request a large dataset (`maxClinics: 1000` or `0` for unlimited), once your primary country/procedure selections are exhausted, the scraper automatically expands across 15 procedure verticals and 40+ destination countries so you can harvest **1,000+ unique clinics** across Bookimed's global catalog in a single run.
3. **Global URL deduplication:** Every clinic is deduplicated against a global `Set` of canonical `clinicUrl` links, guaranteeing **0 duplicates** even when a hospital appears under multiple procedures and cities.

***

### ⚙️ How to use

1. Open **Bookimed.com Medical Tourism Scraper** in the Apify Console.
2. Pick one or more **Destination countries** (and optionally **Procedures** or **Cities**), or paste specific URLs into **Start URLs**.
3. Choose whether to keep **Scrape full clinic profiles** (`scrapeDetails`) off for fast catalog/price collection, or turn it on for full patient reviews and doctor rosters.
4. Set **Max clinics** (`maxClinics`) — e.g. `30` for a quick test, `500`–`1000+` for deep market mapping, or `0` for unlimited.
5. Click **Start** and export your results from the **Dataset** tab as **JSON, CSV, Excel, HTML, or XML**.

#### Run via API (Python, Node.js & cURL)

**Python**

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("haketa/bookimed-scraper").call(run_input={
    "countries": ["turkey", "thailand", "mexico"],
    "procedures": ["hair-transplant", "dental-implant"],
    "language": "us-uk",
    "scrapeDetails": False,
    "maxClinics": 500,
})
for clinic in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(clinic["clinicName"], clinic.get("country"), len(clinic.get("treatmentPrices") or []))
```

**JavaScript (Node.js)**

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('haketa/bookimed-scraper').call({
    countries: ['turkey'],
    cities: ['istanbul'],
    scrapeDetails: true,
    maxClinics: 50,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Extracted ${items.length} enriched Istanbul clinics`);
```

**cURL**

```bash
curl -X POST "https://api.apify.com/v2/acts/haketa~bookimed-scraper/runs?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "countries": ["india", "turkey", "thailand"],
    "maxClinics": 1000,
    "maxLoadMore": 0
  }'
```

***

### 💡 Pro tips

- **Two-stage workflow for large projects:** Run listing mode (`scrapeDetails: false`, `maxClinics: 1000`) first to rapidly map all clinics, prices, and JCI/ISO certifications across countries. Then pass the top clinic URLs into `startUrls` with `scrapeDetails: true` to pull full doctor rosters and patient reviews for your shortlist.
- **Target niche procedures via `startUrls`:** Need clinics for IVF, gastric sleeve, LASIK, or Car-T therapy that aren't in the 15-item quick dropdown? Copy the Bookimed category URL (e.g. `https://us-uk.bookimed.com/clinics/country=spain/procedure=ivf/`) into `startUrls`.
- **Switch `language` for localized market research:** Set `language: "de"` or `"ru"` to extract German- or Russian-language patient reviews and localized procedure names.

***

### ⚠️ Limitations & notes

- **Listing vs. profile fields:** In fast listing mode (`scrapeDetails: false`), profile-exclusive fields (`reviews`, `doctors`, `ratingBreakdown`, `description`, `address`, `phone`, `beds`, `foundedYear`, `languages`, `photos`) are intentionally `null` so runs finish 5–10× faster. Enable `scrapeDetails: true` whenever you need those fields populated.
- **Published price teasers:** `treatmentPrices` reflects the procedures and price ranges published by each clinic on Bookimed; facilities that list "Price on request" without numeric figures will have `treatmentPrices: null` in listing mode.

***

### ❓ FAQ

**Do I need a Bookimed account or API key?**
No. All data is collected from publicly accessible Bookimed directory and hospital profile pages.

**How many clinics can I extract in a single run?**
Bookimed lists **1,600+ clinics across 50+ countries**. By setting `maxClinics: 1000` (or `0` for unlimited) and leaving `maxLoadMore: 0`, the scraper automatically expands pagination and fans out across procedures and countries to collect **1,000+ unique clinics**.

**How fast is the scraper?**
A 30-clinic prefill run finishes in **~25–45 seconds**. Collecting 100 clinics in listing mode takes **~1–2 minutes**, and 500 clinics takes **~4–5 minutes**.

**Why was `maxLoadMore` changed to `0` by default in v1.2?**
Previously, `maxLoadMore: 10` stopped each listing page after 10 clicks (~55 clinics). Setting `maxLoadMore: 0` lets the scraper automatically calculate the exact number of "Load More" expansions required to reach your `maxClinics` target without premature cutoffs.

**Can I extract individual patient reviews and doctor lists?**
Yes — set `scrapeDetails: true`. Each clinic record will include the `reviews` array (author, rating, full review text, date, procedure, patient country, doctor) and the `doctors` array (name, specialty, qualifications, rating, review count).

**Are duplicate clinics removed when searching multiple procedures or cities?**
Yes. Every clinic is deduplicated by its canonical `clinicUrl`, guaranteeing **0 duplicates** across overlapping searches.

***

### 🔗 Related scrapers

Pair **Bookimed Scraper** with these healthcare, licensing, and B2B directory scrapers by **haketa**:

- [WhatClinic.com Clinic Scraper](https://apify.com/haketa/whatclinic-scraper) — Global directory of dental, cosmetic, fertility, and aesthetic clinics.
- [California DCA License Scraper](https://apify.com/haketa/california-dca-license-scraper) — 3.3M+ licensed physicians, nurses, pharmacists, dentists, and healthcare facilities in California.
- [Texas Pharmacy License Scraper — TSBP](https://apify.com/haketa/tsbp-license-scraper) — Official Texas pharmacist and pharmacy license registry.
- [BBB Business Scraper](https://apify.com/haketa/bbb-scraper) — Better Business Bureau ratings, accreditations, and business contacts.

***

### 📋 Changelog

#### v1.2 (2026-11)

- **Unlocked 1,000+ clinic pagination:** Changed `maxLoadMore` default/prefill to `0` (auto-governed by `maxClinics`) and added automatic procedure + multi-country task expansion when `maxClinics > 150` or `0` (unlimited).
- **Faster prefill experience:** Tuned prefill to `maxClinics: 30` so initial test runs complete in ~30 seconds.
- **Live status reporting:** Added real-time `Actor.setStatusMessage` progress updates after each listing task and on run completion.
- **Documentation upgrade:** Added `⚡ At a glance` summary table, emoji-grouped field tables with coverage indicators, and updated API snippets.

#### v1.1 (2026-10)

- **Enhanced profile enrichment:** Improved extraction of `reviews`, `ratingBreakdown`, `doctors`, `treatmentPrices`, `beds`, `foundedYear`, and `languages` on clinic detail pages.
- **Cleaned treatment names:** Added filtering to strip promotional prefix text from `treatmentPrices` labels.

#### v1.0 (2026-07)

- Initial release supporting 45 destination countries, 18 cities, 15 procedures, 13 language editions, and optional profile detail scraping.

***

⭐ **Ready to pull live medical-tourism data?** Click **Start** and export Bookimed clinic prices, ratings, certifications, and reviews to JSON, CSV, or Excel in minutes!

# Changelog

This Actor's version history is a separate document: https://apify.com/haketa/bookimed-scraper/changelog.md

# Actor input Schema

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

Pick one or more medical tourism destinations. Leave empty to get a ready mixed sample of the most popular destinations.

## `procedures` (type: `array`):

Narrow results to specific treatments. Leave empty to include every procedure available in the selected countries.

## `cities` (type: `array`):

Focus on specific cities inside the chosen countries. Leave empty to search the entire country.

## `citiesCustom` (type: `array`):

Power users: add extra city names not in the dropdown above (for example 'adana' or 'goa'). Combined with the cities picked above.

## `language` (type: `string`):

Language and regional version of Bookimed content to read.

## `scrapeDetails` (type: `boolean`):

Open each clinic profile for rich data: full description, all doctors, patient reviews, success rates, patient origins and complete treatment list. Slower but much more complete.

## `maxClinics` (type: `integer`):

Maximum total clinics to collect across all searches. Set 0 for unlimited collection.

## `maxLoadMore` (type: `integer`):

How many times to expand each listing page (each click loads ~5–10 more clinics). Set 0 for automatic/unlimited expansion governed by Max clinics.

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

Power users: paste direct Bookimed listing or clinic-profile URLs. When provided, these are scraped in addition to the selections above.

## `proxyConfiguration` (type: `object`):

Proxy settings used to load Bookimed pages reliably. The default works out of the box.

## `requestDelay` (type: `integer`):

Pause between page loads in milliseconds. Higher values are gentler on the source site.

## Actor input object example

```json
{
  "countries": [
    "turkey"
  ],
  "procedures": [],
  "cities": [],
  "citiesCustom": [],
  "language": "us-uk",
  "scrapeDetails": false,
  "maxClinics": 30,
  "maxLoadMore": 0,
  "startUrls": [],
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "requestDelay": 1500
}
```

# Actor output Schema

## `clinics` (type: `string`):

All clinic records collected during the run (download / API).

## `runUrl` (type: `string`):

Open this run in the Apify Console.

## `clinicName` (type: `string`):

Clinic display name

## `clinicUrl` (type: `string`):

Full Bookimed profile URL

## `country` (type: `string`):

Country name

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

City name

## `rating` (type: `string`):

Average rating (0-5)

## `reviewCount` (type: `string`):

Number of verified reviews

## `certifications` (type: `string`):

JCI, ISO and other accreditations

## `patientsPerYear` (type: `string`):

Annual patient volume

## `specialties` (type: `string`):

Medical specialties array

## `treatmentPrices` (type: `string`):

Treatment price list with ranges

## `featuredDoctor` (type: `string`):

Primary doctor name and experience

## `description` (type: `string`):

Clinic description text

## `successRates` (type: `string`):

Procedure success rates

## `patientOrigins` (type: `string`):

Countries patients come from

## `doctors` (type: `string`):

Doctor list with specialties

## `address` (type: `string`):

Clinic address

## `photos` (type: `string`):

Clinic photo URLs

## `reviews` (type: `string`):

Individual patient reviews array

## `ratingBreakdown` (type: `string`):

Star distribution (5/4/3/2/1)

## `foundedYear` (type: `string`):

Year the clinic was founded

## `beds` (type: `string`):

Number of hospital beds

## `languages` (type: `string`):

Languages spoken by staff

## `accreditations` (type: `string`):

Hospital accreditations

## `phone` (type: `string`):

Clinic phone number

## `email` (type: `string`):

Clinic contact email

## `searchCountry` (type: `string`):

Country used to find this clinic

## `searchCity` (type: `string`):

City used to find this clinic

## `searchProcedure` (type: `string`):

Procedure used to find this clinic

## `scrapedAt` (type: `string`):

ISO timestamp when scraped

# 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 = {
    "countries": [
        "turkey"
    ],
    "procedures": [],
    "cities": [],
    "citiesCustom": [],
    "maxClinics": 30,
    "maxLoadMore": 0,
    "startUrls": [],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("haketa/bookimed-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 = {
    "countries": ["turkey"],
    "procedures": [],
    "cities": [],
    "citiesCustom": [],
    "maxClinics": 30,
    "maxLoadMore": 0,
    "startUrls": [],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("haketa/bookimed-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 '{
  "countries": [
    "turkey"
  ],
  "procedures": [],
  "cities": [],
  "citiesCustom": [],
  "maxClinics": 30,
  "maxLoadMore": 0,
  "startUrls": [],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call haketa/bookimed-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,haketa/bookimed-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/juBRp5qvhbJQO5ELg/builds/9qYJiVRlGuurefgDW/openapi.json
