# Booking.com Scraper (`scraptivo/booking-com-scraper`) Actor

Extracts hotel listings, prices, availability calendars, and guest reviews from Booking.com for any destination and stay dates.

- **URL**: https://apify.com/scraptivo/booking-com-scraper.md
- **Developed by:** [Scraptivo](https://apify.com/scraptivo) (community)
- **Categories:** Real estate, Agents, MCP servers
- **Stats:** 1 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

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

**Booking.com Scraper** collects hotel listings from [Booking.com](https://www.booking.com) and turns them into structured data for price monitoring, market research, and travel lead generation. Provide a destination such as "Berlin, Germany" together with check-in and check-out dates, run the Actor, and export hotel name, price, review score, address, coordinates, and more to JSON, CSV, Excel, or your preferred integration. Optionally enrich each hotel with facilities, year-round availability calendars, and guest reviews. From just **$1 per 1,000 hotels**.

### What can you automate with Booking.com Scraper?

- **Build hotel lead lists** — export hotel name, address, coordinates, and booking URL for any destination.
- **Monitor room pricing** — capture nightly prices for your stay dates and compare across properties.
- **Track availability** — pull a year-round calendar with daily prices for each hotel.
- **Collect guest feedback** — gather review scores and review text at scale.
- **Schedule recurring collection** — refresh destination data weekly or daily without manual work.

### Who is this scraper for?

| Team | Workflow |
|---|---|
| Travel agencies | Build destination catalogs and compare hotel pricing for clients. |
| Revenue managers | Monitor competitor rates and availability over time. |
| Market researchers | Analyze hotel supply, pricing, and ratings by city. |
| OTA and booking platforms | Enrich listings with structured hotel data. |

### What data can you collect from Booking.com?

| Data group | Example fields | How it helps |
|---|---|---|
| Property identity | `name`, `hotelId`, `url`, `pageName`, `countryCode` | Identify and link each hotel. |
| Location | `address`, `city`, `latitude`, `longitude` | Map properties and segment by area. |
| Pricing | `price`, `priceRounded`, `currency` | Compare rates for the selected stay. |
| Reputation | `reviewScore`, `reviewCount`, `reviewScoreText` | Filter by guest rating. |
| Enrichment | `facilities`, `houseRules`, `surroundings`, `faq` | Optional detail when hotel details are enabled. |
| Availability & reviews | `availability`, `guestReviews` | Optional year-round calendar and guest reviews. |

### How to use Booking.com Scraper

1. Open the Actor and go to the **Input** tab.
2. Enter a destination in **Search Queries**, e.g. `Berlin, Germany`.
3. Set **Check-in** and **Check-out** dates and the number of guests.
4. Choose a **Max Items** limit and any optional detail toggles.
5. Run the Actor, then export the dataset as JSON, CSV, or Excel.

```json
{
  "searchQueries": ["Berlin, Germany"],
  "checkIn": "2026-09-01",
  "checkOut": "2026-09-03",
  "adults": 2,
  "rooms": 1,
  "maxItems": 20,
  "hotelDetails": true,
  "currency": "EUR",
  "lang": "en-gb"
}
```

### Example workflow

#### Build a monthly list of top-rated Berlin hotels

1. Run one Berlin search for your target month every week.
2. Keep only hotels above your required `reviewScore` and `price` range.
3. Send new records to Google Sheets or a CRM.
4. Deduplicate using the stable `hotelId` or `url`.

### Automate and integrate your results

You can schedule the Actor from the Apify Console or via API to run daily or weekly. After a successful run, trigger a webhook to push the dataset to Google Sheets, Make, Zapier, Slack, or a database. Use the stable `hotelId` or `url` as your deduplication key.

### Input reference

| Field | Type | Required | Default | What it controls |
|---|---:|---|---|---|
| `searchQueries` | array | No | `["Berlin, Germany"]` | Destinations to search. |
| `startUrls` | array | No | — | Direct Booking.com search or hotel URLs. |
| `checkIn` / `checkOut` | string | No | — | Stay dates (`YYYY-MM-DD`). |
| `adults` / `rooms` / `children` | integer | No | — | Occupancy for pricing. |
| `childrenAges` | array | No | — | Ages of children. |
| `maxItems` | integer | No | — | Max hotels to return (0 = unlimited). |
| `hotelDetails` | boolean | No | `false` | Add facilities, house rules, surroundings, FAQ. |
| `scrapeAvailability` | boolean | No | `false` | Add the year-round availability calendar. |
| `scrapeReviews` | boolean | No | `false` | Add guest reviews. |
| `maxReviews` | integer | No | `10` | Max reviews per hotel when enabled. |
| `lang` | string | No | — | Result language (`en-us`, `de`, `fr`, …). |
| `currency` | string | No | — | Preferred price currency. |

### Output example

```json
{
  "hotelId": 123456,
  "name": "Hotel Berlin Central",
  "url": "https://www.booking.com/hotel/de/berlin-central.html",
  "countryCode": "de",
  "city": "Berlin",
  "address": "Example Street 1, Mitte, Berlin",
  "reviewScore": 8.7,
  "reviewCount": 1240,
  "reviewScoreText": "Excellent",
  "price": 118,
  "currency": "EUR",
  "latitude": 52.520008,
  "longitude": 13.404954,
  "imageUrl": "https://cf.bstatic.com/xdata/images/hotel/example.jpg"
}
```

### How much does it cost to scrape Booking.com?

Billing is pay-per-event. You are charged **$1 per 1,000 hotels** for search-result records (`dataset-item`). Optional extras are billed only when enabled: hotel details and reviews each at $1 per 1,000, and availability calendars at $0.10 per 1,000. A one-time `Actor Start` fee of $0.00005 applies per run. Apify plan discounts reduce these prices further.

### Reliability and responsible use

The Actor uses residential proxies by default, which you can adjust in the input. Search-result fields such as `reviewScore` and `price` are available at the search level, while `facilities`, `availability`, and `guestReviews` are returned only when their toggles are enabled. Prices depend on the exact stay dates and occupancy you provide. Use the Actor only for lawful purposes and respect Booking.com's terms of service.

### Frequently asked questions

#### Can I scrape hotels for any destination?

Yes. Enter a destination string like `Paris` or `New York, USA`, and the Actor resolves it to Booking.com results for that location.

#### Can I schedule Booking.com Scraper to run automatically?

Yes. Use the Apify Scheduler to run daily or weekly and refresh pricing and availability on a set cadence.

#### What counts as one result?

One result is one hotel added to the dataset (`dataset-item`). Optional hotel details, reviews, and availability calendars are separate events.

#### Why are some fields empty?

Optional fields such as `facilities`, `availability`, and `guestReviews` appear only when the corresponding toggle is enabled. Individual hotels may also omit fields that are not present on their listing.

#### How do I avoid duplicate records?

Deduplicate on the stable `hotelId` or the hotel `url`, which are unique per property.

#### Do I need a proxy?

Residential proxies are enabled by default and recommended for reliable access to Booking.com.

### Related Scraptivo automations

- [Airbnb Scraper](https://apify.com/scraptivo/airbnb-scraper) — short-term rental listings and pricing.
- [Tripadvisor Reviews Scraper](https://apify.com/scraptivo/tripadvisor-reviews-scraper) — guest reviews for hotels, restaurants, and attractions.
- [OpenTable Scraper](https://apify.com/scraptivo/opentable-scraper) — restaurant availability and reservation data.

### Support and custom workflows

Need a different field, source, or delivery workflow? Contact Scraptivo at scraptivo@gmail.com. Include the Actor name, a sample destination and dates, required fields, and expected volume so we can assess the request.

# Actor input Schema

## `searchQueries` (type: `array`):

Destinations to search as plain strings (e.g. "Berlin, Germany" or "Paris"). The Actor resolves destination IDs via Booking.com autocomplete automatically. Objects with destination/destId/destType are also accepted if you already know them.

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

Optional search results or hotel page URLs to scrape directly (e.g. "https://www.booking.com/searchresults.html?ss=Berlin\&dest\_id=-1746443" or "https://www.booking.com/hotel/de/best-western-berlin-mitte.html").

## `checkIn` (type: `string`):

Check-in date (YYYY-MM-DD).

## `checkOut` (type: `string`):

Check-out date (YYYY-MM-DD).

## `adults` (type: `integer`):

Number of adults per room.

## `rooms` (type: `integer`):

Number of rooms.

## `children` (type: `integer`):

Number of children.

## `childrenAges` (type: `array`):

Ages of children (one integer per child).

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

Maximum number of hotels to scrape (0 = unlimited).

## `hotelDetails` (type: `boolean`):

Extract full hotel details: facilities, house rules, surroundings, FAQ, and description.

## `scrapeAvailability` (type: `boolean`):

Extract year-round availability calendar with daily pricing.

## `scrapeReviews` (type: `boolean`):

Extract guest reviews for each hotel.

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

Maximum reviews to extract per hotel (0 = unlimited). Default is 10 when reviews are enabled.

## `lang` (type: `string`):

Booking.com language code.

## `currency` (type: `string`):

Preferred currency code for prices.

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

Proxy settings for anti-bot protection.

## Actor input object example

```json
{
  "searchQueries": [
    "Berlin, Germany"
  ],
  "startUrls": [],
  "checkIn": "2026-09-25",
  "checkOut": "2026-09-27",
  "adults": 1,
  "rooms": 1,
  "children": 0,
  "childrenAges": [],
  "maxItems": 10,
  "hotelDetails": false,
  "scrapeAvailability": false,
  "scrapeReviews": false,
  "maxReviews": 10,
  "lang": "en-us",
  "currency": "EUR",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

## `runStats` (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 = {
    "searchQueries": [
        "Berlin, Germany"
    ],
    "hotelDetails": false,
    "scrapeAvailability": false,
    "scrapeReviews": false,
    "maxReviews": 10,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("scraptivo/booking-com-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 = {
    "searchQueries": ["Berlin, Germany"],
    "hotelDetails": False,
    "scrapeAvailability": False,
    "scrapeReviews": False,
    "maxReviews": 10,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("scraptivo/booking-com-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 '{
  "searchQueries": [
    "Berlin, Germany"
  ],
  "hotelDetails": false,
  "scrapeAvailability": false,
  "scrapeReviews": false,
  "maxReviews": 10,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call scraptivo/booking-com-scraper --silent --output-dataset

```

## MCP server setup

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