# Booking.com Hotels Scraper (`parseforge/booking-com-hotels-scraper`) Actor

Scrapes Booking.com hotel listings by destination search or direct URL. Returns each hotel as a flat row with price, rating, review count, address, star count, and property type.

- **URL**: https://apify.com/parseforge/booking-com-hotels-scraper.md
- **Developed by:** [ParseForge](https://apify.com/parseforge) (community)
- **Categories:** Travel, Developer tools, Automation
- **Features:** Limited permissions
- **Stats:** 118 total users, 5 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $11.99 / 1,000 result items

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

[![ParseForge](https://raw.githubusercontent.com/ParseForge/apify-assets/main/banner-v4.webp)](https://apify.com/parseforge?fpr=vmoqkp)

### Booking.com Hotels Scraper

**Scrape hotel listings from Booking.com by destination and stay dates, up to a million per run.** Every listing returns its name, price, review score, review count, stars, address, city, country, image and URL. Export to CSV, JSON, Excel, or XML.

**Low minimum charge:** $0.01 to start a run, then you only pay for the results you get.

Booking.com's hotel data is spread across thousands of search pages, and manually copying prices or ratings for a market analysis is slow and error-prone. This Actor opens the public search results for any destination and stay dates and returns one structured row per hotel.

| Who uses it | What they scrape Booking.com for |
|---|---|
| Revenue managers | Monitor competitor pricing and rating trends for a destination over a specific date range. |
| Market researchers | Build a dataset of hotel supply, price distribution, and locations in a city. |
| Travel app builders | Feed a hotel search backend with fresh listing data for a set of destinations. |
| Lead generation teams | Collect the business contact Booking.com publishes for each property. |

### What it does

- 🏨 **Destination search:** type a city, region or landmark and the Actor builds the Booking.com search for you.
- 📅 **Date control:** set check-in and check-out to capture real prices and availability for those nights.
- 📄 **Flat rows:** every hotel has the same fields, ready for CSV, JSON, Excel, or XML export.
- 🌐 **Residential proxies built in:** no proxy setup needed.
- ➕ **Optional extras:** price breakdown, coordinates, full hotel details and host contact, each behind its own switch.

### Input

| Field | What it does |
|---|---|
| `destination` | City, region, or landmark to search (for example `Paris`). Required. |
| `checkIn` | Check-in date, `YYYY-MM-DD`. |
| `checkOut` | Check-out date, `YYYY-MM-DD`. |
| `maxItems` | Maximum number of hotels to collect. |
| `includePriceBreakdown` | Optional extra, off by default. Adds `priceBreakdown`. |
| `includeGeoLocation` | Optional extra, off by default. Adds `geoLocation`. |
| `includeHotelDetails` | Optional extra, off by default. Adds `hotelDetails`. |
| `includeHostContact` | Optional extra, off by default. Adds `hostContact`. |

A first run with the defaults:

```json
{
  "destination": "Paris",
  "checkIn": "2026-11-10",
  "checkOut": "2026-11-12",
  "maxItems": 10
}
```

With every extra turned on:

```json
{
  "destination": "Barcelona",
  "checkIn": "2026-11-10",
  "checkOut": "2026-11-12",
  "maxItems": 50,
  "includePriceBreakdown": true,
  "includeGeoLocation": true,
  "includeHotelDetails": true,
  "includeHostContact": true
}
```

### Output

Every row carries `imageUrl`, `name`, `stars`, `rating`, `reviewCount`, `reviewScore`, `pricePerNight`, `currency`, `city`, `country`, `address`, `hotelUrl` and `scrapedAt`.

The optional extras add one block each, only when it comes back:

| Block | What is inside |
|---|---|
| `priceBreakdown` | Exact total for the stay, nights, average per night, total in the hotel currency, price before discount, each discount with its amount, taxes and fees not included, deal badges, free cancellation and its deadline, prepayment terms, meal plan, and the room the price is for (name, bedrooms, bathrooms, beds, area, occupancy). |
| `geoLocation` | Latitude, longitude, Booking.com property ID, street address, district, distance from the center, nearest public transport, country code. |
| `hotelDetails` | Full description, full address with postal code and region, property type, check-in and check-out times, popular facilities, amenities, languages spoken, review subscores (staff, facilities, cleanliness, comfort, value, location, wifi), featured guest reviews, room types with size and beds, breakfast, questions and answers, fine print, and photo URLs. |
| `hostContact` | The trader information Booking.com publishes for the property: email, phone, company legal name, trade register name, registration number, business address and license numbers. When the trader is a private individual, the person's name and street address are left out. |

### Pricing

Pay-per-result: **$0.01599 per result** collected. You pay only for the results written to your dataset.

| Results collected | Approximate cost |
|---|---|
| 100 results | $1.60 |
| 1,000 results | $15.99 |
| 10,000 results | $159.90 |

#### Optional extras (from 2026-10-03)

Four opt-in blocks add data to each hotel: `priceBreakdown`, `geoLocation`, `hotelDetails` and `hostContact`. All are off by default, the per-result price does not change, and a block that does not come back is never charged.

| Event | Price | Charged when |
|---|---|---|
| `apify-actor-start` | $0.005 per GB of run memory | the run starts |
| `price-breakdown` | $0.004 per hotel | `includePriceBreakdown` is on and the hotel comes back with a price for your dates |
| `geo-location` | $0.003 per hotel | `includeGeoLocation` is on and the hotel comes back with coordinates |
| `hotel-details` | $0.012 per hotel | `includeHotelDetails` is on and the property page comes back |
| `host-contact` | $0.01 per hotel | `includeHostContact` is on and Booking.com publishes an email or phone for the property |

New Apify accounts start with $5 in free credit.

### Free users

Free-plan runs return up to 10 results as a preview. [Upgrade your Apify plan](https://console.apify.com/sign-up?fpr=vmoqkp) to collect up to 1,000,000 results per run.

### Run it

1. [Create a free Apify account with $5 in credit](https://console.apify.com/sign-up?fpr=vmoqkp).
2. Open the [Booking.com Hotels Scraper](https://apify.com/parseforge/booking-com-hotels-scraper?fpr=vmoqkp).
3. Set your destination and dates, then click **Start**.
4. Export the results as CSV, Excel, JSON, or XML from the **Dataset** tab.

Run it programmatically through the [Apify API](https://docs.apify.com/api/v2) (`run-sync-get-dataset-items`) or the [ApifyClient](https://docs.apify.com/api/client/js) for JavaScript and Python.

### Use with AI agents (MCP)

Give an AI agent live access to Booking.com through the Model Context Protocol. Add the Actor to Claude, Cursor, or any MCP client:

```bash
claude mcp add --transport http apify "https://mcp.apify.com?tools=parseforge/booking-com-hotels-scraper"
```

Then prompt it in plain language to run the scraper and read back the results.

### Troubleshooting

**Why am I getting no results?**

Check that your destination name is spelled correctly and that Booking.com returns results for it in a browser. Also check that the dates are in the future and in `YYYY-MM-DD` format.

**Why are prices missing or different from what I see on the site?**

Prices depend on the exact check-in and check-out dates. Booking.com also personalizes prices by visitor location; this Actor searches from the United States in USD.

**Why does a hotel have no `hostContact`?**

Booking.com publishes trader information mainly for properties that sell to customers in the European Union. When a property has none, the block is left out and nothing is charged for it.

### Related actors

Browse the full [ParseForge collection](https://apify.com/parseforge?fpr=vmoqkp) for more scrapers.

🆘 **Need help?** Email parseforge@protonmail.com with your run ID, your input, and what you expected.

⚠️ **Disclaimer.** This Actor is unofficial and is not affiliated with, endorsed by, or sponsored by Booking.com B.V. It collects only publicly available data. You are responsible for using the collected data in compliance with the source's terms of service and applicable data-protection laws, including GDPR, CCPA, and PIPL. Do not use it to collect personal data unlawfully.

# Actor input Schema

## `destination` (type: `string`):

City, region, or landmark to search for hotels (e.g. 'Paris', 'New York', 'Tokyo').

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

Check-in date in YYYY-MM-DD format.

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

Check-out date in YYYY-MM-DD format.

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

Maximum number of hotels to collect per run.

## `includePriceBreakdown` (type: `boolean`):

Adds priceBreakdown to each hotel: exact total for the stay, average per night, price in the hotel currency, price before discount, each discount, taxes and fees not included, free cancellation and prepayment terms, and the room the price is for. No extra request. Charged only for a row that receives it.

## `includeGeoLocation` (type: `boolean`):

Adds geoLocation to each hotel: latitude, longitude, Booking.com property ID, street address, district, distance from the center and nearest public transport. No extra request. Charged only for a row that receives it.

## `includeHotelDetails` (type: `boolean`):

Adds hotelDetails to each hotel from its property page: full description, full address with postal code, check-in and check-out times, amenities, review subscores (staff, cleanliness, location and more), featured guest reviews, room types, breakfast, questions and answers, fine print and photos. One extra request per hotel. Charged only for a row that receives it.

## `includeHostContact` (type: `boolean`):

Adds hostContact to each hotel when Booking.com publishes the trader information for it: email, phone, company legal name, registration number, business address and license numbers. One extra request per hotel (shared with hotel details). Charged only for a row that receives it.

## Actor input object example

```json
{
  "destination": "Paris",
  "checkIn": "2026-08-01",
  "checkOut": "2026-08-03",
  "maxItems": 10,
  "includePriceBreakdown": false,
  "includeGeoLocation": false,
  "includeHotelDetails": false,
  "includeHostContact": false
}
```

# 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 = {
    "destination": "Paris",
    "checkIn": "2026-08-01",
    "checkOut": "2026-08-03",
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("parseforge/booking-com-hotels-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 = {
    "destination": "Paris",
    "checkIn": "2026-08-01",
    "checkOut": "2026-08-03",
    "maxItems": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("parseforge/booking-com-hotels-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 '{
  "destination": "Paris",
  "checkIn": "2026-08-01",
  "checkOut": "2026-08-03",
  "maxItems": 10
}' |
apify call parseforge/booking-com-hotels-scraper --silent --output-dataset

```

## MCP server setup

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