# Bookimed Clinic & Price Scraper (`unfenced-group/bookimed-scraper`) Actor

Scrape Bookimed.com medical tourism clinics. Extract treatment prices, ratings, reviews, doctors, certifications from 1600+ clinics in 50+ countries.

- **URL**: https://apify.com/unfenced-group/bookimed-scraper.md
- **Developed by:** [Unfenced Group](https://apify.com/unfenced-group) (community)
- **Categories:** Other, Automation, Developer tools
- **Stats:** 3 total users, 1 monthly users, 96.6% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.47 / 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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Bookimed Clinic & Price Scraper

![bookimed-scraper](https://api.apify.com/v2/key-value-stores/ClElVyZWvQgPQIuDL/records/bookimed-scraper)

Scrape **Bookimed.com** — the world's largest medical tourism marketplace — for structured clinic profiles, treatment prices, doctor rosters, certifications, and patient reviews. Covers 1,600+ accredited clinics across 50+ countries including Turkey, India, Thailand, Mexico, Hungary, Germany, South Korea, and the UAE. No API key required.

***

### Why this scraper?

#### 🏥 Complete clinic profiles

Full clinic data including name, location, specialties, founding year, bed count, annual patient volume, and gallery images.

#### 💰 Itemised treatment prices

Structured price tables with category, procedure name, min/max prices, and currency — across Dental, Plastic Surgery, Hair Transplant, Oncology, IVF, and 30+ other specialties.

#### ⭐ Rich reviews & ratings

Verified patient reviews with author, rating, review text, date, treatment received, and country of origin. Plus star-breakdown by Doctor, Facilities, Staff, Language Assistance, and Support.

#### 🩺 Doctor rosters

Full doctor lists per clinic with name, specialty, experience years, and profile URLs.

#### 🏆 Certifications & accreditations

JCI, ISO, TEMOS, NABH, ISQua, Gold Seal — parsed from every clinic card and detail page.

#### 🌍 Multi-country, multi-procedure coverage

Filter by any combination of country slug, city slug, and procedure/direction slug to build a precise dataset. Supports 14 language subdomains.

***

### Input parameters

| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `countries` | array | `["turkey"]` | Country slugs to scrape (e.g. `turkey`, `india`, `thailand`, `germany`). Leave empty for all. |
| `cities` | array | `[]` | City slugs to filter (e.g. `istanbul`, `antalya`, `bangkok`). Combines with countries. |
| `procedures` | array | `[]` | Procedure/direction slugs (e.g. `hair-transplant`, `dental-implant`, `rhinoplasty-nose-job`). |
| `startUrls` | array | `[]` | Direct clinic or list-page URLs. Overrides countries/cities/procedures when provided. |
| `maxResults` | integer | `100` | Max clinics to return. Use `0` for unlimited. |
| `fetchDetails` | boolean | `true` | Fetch each clinic's detail page for full prices, doctors, reviews, contact info. |
| `maxReviews` | integer | `10` | Max patient reviews per clinic (requires `fetchDetails: true`). Use `0` for unlimited. |
| `language` | string | `us-uk` | Bookimed language subdomain: `us-uk` (EN), `de`, `fr`, `es`, `it`, `pl`, `ru`, `ar`, `pt`, etc. |

***

### Output schema

#### Always present

| Field | Type | Description |
|-------|------|-------------|
| `slug` | string | Bookimed URL slug — unique clinic identifier |
| `url` | string | Full Bookimed clinic URL |
| `source` | string | Always `"bookimed.com"` |
| `scrapedAt` | string | ISO-8601 timestamp of extraction |
| `contentHash` | string | MD5 fingerprint of slug+name for change detection |
| `clinicName` | string | Clinic display name |
| `country` | string|null | Country name |
| `city` | string|null | City name |
| `rating` | number|null | Overall Bookimed rating (0–5) |
| `reviewCount` | integer|null | Total verified patient review count |
| `certifications` | array | Certification badges visible on list card (e.g. `["JCI", "ISO 9001"]`) |
| `specialties` | array | Medical specialties and directions |
| `samplePrices` | array | Raw price strings from list card (e.g. `["$450 – $880", "$1,800"]`) |
| `featuredDoctor` | object|null | Featured doctor name and experience string from list card |

#### With `fetchDetails: true`

| Field | Type | Description |
|-------|------|-------------|
| `descriptionHtml` | string|null | About-the-clinic HTML |
| `descriptionText` | string|null | Plain-text version |
| `descriptionMarkdown` | string|null | Markdown version |
| `address` | string|null | Full street address |
| `latitude` | number|null | Geo latitude (from JSON-LD) |
| `longitude` | number|null | Geo longitude (from JSON-LD) |
| `foundedYear` | integer|null | Year the clinic was established |
| `beds` | integer|null | Inpatient bed count |
| `patientsPerYear` | integer|null | Annual international patient volume |
| `successRates` | array|null | Success rate strings (e.g. `["97.4% for rhinoplasty"]`) |
| `accreditations` | array | Full accreditation list from detail page |
| `languages` | array | Staff-spoken languages |
| `treatmentPrices` | array | Full price table — objects with `category`, `procedure`, `priceMin`, `priceMax`, `currency`, `priceRaw` |
| `packages` | array | Special offers with `title`, `originalPrice`, `discountedPrice`, `offerUrl` |
| `doctors` | array | Doctor list — objects with `name`, `slug`, `doctorUrl`, `specialty`, `experienceYears` |
| `ratingBreakdown` | object|null | Sub-scores by Doctor, Facilities, Staff, Language Assistance, Support |
| `reviews` | array | Patient reviews — objects with `author`, `rating`, `text`, `date`, `treatment`, `country`, `verified` |
| `phones` | array | Phone numbers |
| `emails` | array | Email addresses |
| `galleryImages` | array | Clinic photo URLs |

#### Sample output record

```json
{
  "slug": "quartz-clinique",
  "url": "https://us-uk.bookimed.com/clinic/quartz-clinique/",
  "source": "bookimed.com",
  "scrapedAt": "2026-06-01T10:23:45.000Z",
  "contentHash": "a3f9c2b1d4e0fa12",
  "clinicName": "Quartz Hospital",
  "country": "Turkey",
  "city": "Istanbul",
  "rating": 4.7,
  "reviewCount": 134,
  "certifications": ["ISO 9001", "Ministry of Health"],
  "specialties": ["Plastic Surgery", "Dental Treatment", "Urology", "Weight Loss Surgery"],
  "samplePrices": ["$2,950 – $3,100", "$880 – $1,090"],
  "featuredDoctor": { "name": "Nur Afsar", "experience": "7 years" },
  "descriptionText": "Quartz Hospital is a private multi-specialty medical center in Istanbul, Turkey...",
  "address": "Istanbul, Turkey",
  "latitude": 41.0082,
  "longitude": 28.9784,
  "foundedYear": 2015,
  "patientsPerYear": 6500,
  "successRates": ["97.4% for rhinoplasty", "96.3% for breast augmentation"],
  "accreditations": ["ISO 9001", "Ministry of Health", "EBOPRAS"],
  "languages": ["English", "Turkish", "Arabic"],
  "treatmentPrices": [
    { "category": "Plastic Surgery", "procedure": "Rhinoplasty (nose job)", "priceMin": 2950, "priceMax": 3100, "currency": "USD", "priceRaw": "$2,950 - $3,100" },
    { "category": "Dental Treatment", "procedure": "Dental Implant", "priceMin": 880, "priceMax": 1090, "currency": "USD", "priceRaw": "$880 - $1,090" },
    { "category": "Aesthetic Medicine", "procedure": "Ultherapy", "priceMin": 1000, "priceMax": 2700, "currency": "USD", "priceRaw": "$1,000 - $2,700" }
  ],
  "packages": [
    { "title": "Lip Lift — 6-Night Hotel Stay & Transfer Included", "originalPrice": { "priceMin": 3250, "priceMax": 3250, "currency": "USD" }, "discountedPrice": { "priceMin": 2740, "priceMax": 2740, "currency": "USD" }, "offerUrl": "https://us-uk.bookimed.com/offer-procedure/..." }
  ],
  "doctors": [
    { "name": "Nur Afsar", "slug": "nur-afsar", "doctorUrl": "https://us-uk.bookimed.com/doctor/nur-afsar/", "specialty": "Dermatologist", "experienceYears": 7 },
    { "name": "Leyla Arvas", "slug": "leyla-arvas", "doctorUrl": "https://us-uk.bookimed.com/doctor/leyla-arvas/", "specialty": "Plastic surgeon", "experienceYears": 25 }
  ],
  "ratingBreakdown": { "Doctor": 4.7, "Facilities": 4.8, "Staff": 4.7, "Language assistance": 4.6, "Support": 4.8 },
  "reviews": [
    { "author": "Maria S.", "rating": 5, "text": "Excellent experience, highly recommend.", "date": "2026-03-15", "treatment": "Rhinoplasty", "country": "UK", "verified": true }
  ],
  "phones": ["+13153164110"],
  "emails": [],
  "galleryImages": ["https://img.bookimed.com/clinic_webp/6220aed6eb750.webp"]
}
```

***

### Examples

**Scrape top clinics in Turkey (English, with full detail):**

```json
{
  "countries": ["turkey"],
  "maxResults": 50,
  "fetchDetails": true,
  "maxReviews": 5,
  "language": "us-uk"
}
```

**Scrape Istanbul hair-transplant clinics only:**

```json
{
  "countries": ["turkey"],
  "cities": ["istanbul"],
  "procedures": ["hair-transplant"],
  "maxResults": 30,
  "fetchDetails": true,
  "language": "us-uk"
}
```

**Scrape multiple countries for IVF/fertility clinics:**

```json
{
  "countries": ["czech-republic", "spain", "greece", "cyprus"],
  "procedures": ["ivf"],
  "maxResults": 100,
  "fetchDetails": true,
  "maxReviews": 10,
  "language": "us-uk"
}
```

**Scrape specific clinic detail pages directly:**

```json
{
  "startUrls": [
    { "url": "https://us-uk.bookimed.com/clinic/quartz-clinique/" },
    { "url": "https://us-uk.bookimed.com/clinic/hisar-intercontinental-hospital/" },
    { "url": "https://us-uk.bookimed.com/clinic/memorial-healthcare-group/" }
  ],
  "fetchDetails": true,
  "maxReviews": 20
}
```

**Daily feed — list page without detail enrichment (fast, low cost):**

```json
{
  "countries": ["india"],
  "maxResults": 200,
  "fetchDetails": false,
  "language": "us-uk"
}
```

***

### 💰 Pricing

**$1.50 per 1,000 results** — you only pay for successfully retrieved clinic records.
Failed retries and duplicate clinics are never charged.

| Results | Cost |
|---------|------|
| 100     | ~$0.15 |
| 1,000   | ~$1.50 |
| 10,000  | ~$15.00 |
| 100,000 | ~$150.00 |

> Flat-rate alternatives typically charge $29–$49/month regardless of usage.

Use the **Max results** cap in the input to control your spend exactly.

***

### Performance

| Run size | `fetchDetails` | Approx. time | Memory |
|----------|---------------|--------------|--------|
| 50 clinics | false | ~1 min | 512 MB |
| 50 clinics | true  | ~5 min | 512 MB |
| 200 clinics | true | ~20 min | 512 MB |
| 500 clinics | true | ~50 min | 512 MB |

***

### Known limitations

- **"Load More" pagination** — Bookimed renders 5 clinics per page server-side; full crawls of large countries (Turkey: 388+ clinics) require many page fetches.
- **JavaScript-rendered reviews** — some review pages require JS interaction to load all reviews; the actor captures reviews from SSR markup only.
- **Price on request** — some procedures show "Price on request" with no numeric value; these are captured as `priceMin: null`.
- **Language variants** — price amounts and field availability vary by subdomain; `us-uk` returns the most complete English data.

***

### Technical details

- **Source:** us-uk.bookimed.com — global medical tourism marketplace
- **Memory:** 512 MB
- **Proxy:** None required — site serves SSR content to standard requests
- **Retry:** Automatic retry on network errors, exponential backoff, 3 attempts per request
- **Rate limit:** Gaussian-distributed pacing between requests to respect server resources

***

### Additional services

Need a custom actor, additional filters, scheduled runs, or integration support?.nl]\(mailto:info@unfencedgroup.nl) — we build on request.

***

***

### Run it on a schedule

This actor is built for repeat use. Set it to run daily, weekly, or hourly, and the data keeps flowing without you touching it.

- **Schedule runs** — open the actor, go to Schedules, and pick a cadence. Each run only charges you for the results it returns.
- **Connect it to your stack** — push results straight to Google Sheets, Slack, a webhook, or your database using Apify Integrations. No glue code needed.
- **Pull results via API** — every run writes a clean dataset you can fetch with one API call, ready for whatever you build on top of it.

Set it once and it runs on its own.

***

### Need a custom scraper?

**[Unfenced Group](https://www.unfencedgroup.nl)** builds Apify actors for any website — for free.

If the site you need isn't in our portfolio yet, just ask. We scope, build, and publish it at no cost to you. You only pay for results — we absorb the compute and proxy costs ourselves. Same pay-per-result pricing, same quality, same standards as every actor in this portfolio.

**Get in touch:** [www.unfencedgroup.nl](https://www.unfencedgroup.nl)

# Actor input Schema

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

Pick one or more countries to scrape. Results include all matching clinics from Bookimed.

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

Filter by procedure type. Leave empty to get all clinics in the selected country. Each selected procedure is scraped as a separate search.

## `cities` (type: `string`):

Narrow results to a specific city. Enter the city name as it appears on Bookimed — e.g. istanbul, antalya, bangkok, delhi, budapest. Leave blank for all cities in the selected country.

## `maxResults` (type: `integer`):

Stop after this many clinic records. Useful for quick tests or cost control. Set to 0 for no limit.

## `fetchDetails` (type: `boolean`):

ON (recommended): each clinic includes full treatment price tables, all doctors, patient reviews, certifications, contact details, and photos. OFF: returns basic info only (name, location, rating) — much faster and cheaper.

## `maxReviews` (type: `integer`):

How many verified patient reviews to include per clinic. Only applies when 'Include prices, doctors & reviews' is ON. Set to 0 for all available reviews.

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

Language of clinic descriptions, procedure names, and review text. English returns the most complete data and is recommended for most use cases.

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

Paste direct Bookimed URLs to scrape specific clinics or search pages. When provided, Country / Procedure / City filters above are ignored. Clinic example: https://us-uk.bookimed.com/clinic/quartz-clinique/ — Search page example: https://us-uk.bookimed.com/clinics/country=turkey/procedure=hair-transplant/

## Actor input object example

```json
{
  "countries": [
    "turkey"
  ],
  "procedures": [],
  "cities": "istanbul",
  "maxResults": 100,
  "fetchDetails": false,
  "maxReviews": 10,
  "language": "us-uk",
  "startUrls": []
}
```

# 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 = {
    "cities": "istanbul",
    "maxResults": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("unfenced-group/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 = {
    "cities": "istanbul",
    "maxResults": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("unfenced-group/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 '{
  "cities": "istanbul",
  "maxResults": 100
}' |
apify call unfenced-group/bookimed-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,unfenced-group/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/XUspscvIMoL1SvPdq/builds/cdgECFhvBqEwqEc1v/openapi.json
