# Booking.com MCP Server — Hotel Search for AI Agents (`longanimous_bracken/booking-scraper`) Actor

MCP Server for Booking.com. Search hotels and accommodations worldwide. AI-agent ready — returns prices, ratings, amenities, and availability.

- **URL**: https://apify.com/longanimous\_bracken/booking-scraper.md
- **Developed by:** [petteri mähönen](https://apify.com/longanimous_bracken) (community)
- **Categories:** Travel, MCP servers
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 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.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#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 MCP Server — Hotel Search for AI Agents

### 🧠 MCP Server — AI Agent Ready

This actor is a **Model Context Protocol (MCP) server** — AI assistants (Claude, GPT, Cursor) can call it directly to search and extract data:

```json
{"searchQuery": "example", "maxResults": 5}
```

Search hotels worldwide on Booking.com. Returns prices, ratings, amenities, availability — perfect for travel planning and accommodation research.

Scrape hotels, apartments, and other accommodations from Booking.com search results. Extract prices, ratings, reviews, availability, amenities, and more — with residential proxy support to avoid blocking.

\[💰 **$1.00 / 1,000 results**] — no monthly subscription, no hidden fees.

### Why This Scraper?

- **Pay only per result** — flat $1.00 per 1,000 hotels, all platform costs included
- **Direct URL support** — paste any Booking.com search or hotel URL, the actor handles both modes
- **Every Booking.com search field exposed** — dates, guests, rooms, currencies, star rating, price range, and sort order
- **Anti-bot protection handled** — Playwright with residential proxies bypasses Booking.com's WAF where simple scrapers fail
- **20+ data fields per hotel** — prices, review scores, star ratings, room types, cancellation policy, breakfast, distance, photos, and more
- **Automatic pagination** — scrapes across multiple result pages until your `maxResults` is reached
- **Multi-language support** — works with English, Finnish, Swedish, German, French, Dutch, Polish, and more
- **Clean, flat output** — every field is a primitive type (string, number, boolean), ready for spreadsheets and databases

### Who Is It For?

- **Revenue managers and hoteliers** monitoring competitor pricing across their market
- **Travel agencies and OTAs** building data feeds or price comparison tools
- **Data analysts and researchers** studying hotel supply, pricing trends, and review distributions
- **Developers** integrating accommodation data into applications, dashboards, or automated pipelines
- **Individual travelers** who want to track prices for a specific destination over time

### Use Cases

- **Travel price monitoring** — track hotel prices in a destination over time to find the best booking window
- **Competitor analysis for hoteliers** — compare your property's pricing and review scores against nearby competitors
- **Market research** — analyze hotel supply, pricing tiers, and review distributions across cities or regions
- **Lead generation for travel agencies** — build lists of hotels with locations, ratings, and pricing
- **Travel content & editorial** — power "Top 25 hotels in Lisbon" guides with live data
- **Aggregator data feeds** — power a travel comparison site or internal dashboard with fresh Booking.com data

### Quick Start

#### 1. Search by location (most common)

```json
{
  "locations": ["Barcelona, Spain"],
  "maxResults": 50,
  "checkIn": "2026-09-01",
  "checkOut": "2026-09-07",
  "adults": 2,
  "rooms": 1,
  "currency": "USD",
  "sortOrder": "review"
}
```

#### 2. Filtered — narrow by stars, price, and currency

```json
{
  "locations": ["Lisbon"],
  "maxResults": 100,
  "checkIn": "2026-07-10",
  "checkOut": "2026-07-15",
  "adults": 2,
  "currency": "EUR",
  "minPrice": 80,
  "maxPrice": 200,
  "starsFilter": ["4", "5"],
  "sortOrder": "review"
}
```

#### 3. Direct Booking.com URLs

Paste any Booking.com hotel page or search URL. The actor visits each property and extracts all available data.

```json
{
  "startUrls": [
    { "url": "https://www.booking.com/hotel/gb/the-savoy.html" },
    { "url": "https://www.booking.com/hotel/es/arts-barcelona.html" }
  ],
  "checkIn": "2026-09-01",
  "checkOut": "2026-09-07",
  "currency": "EUR"
}
```

### Input

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `startUrls` | array | `[]` | Direct Booking.com hotel or search page URLs |
| `locations` | string\[] | `["San Francisco, CA"]` | Cities/areas to search |
| `maxResults` | integer | `30` | Maximum results to return |
| `checkIn` | string | `"2026-08-01"` | Check-in date (YYYY-MM-DD) |
| `checkOut` | string | `"2026-08-07"` | Check-out date (YYYY-MM-DD) |
| `adults` | integer | `2` | Number of adults (1-30) |
| `children` | integer | `0` | Number of children (0-10) |
| `rooms` | integer | `1` | Number of rooms (1-30) |
| `currency` | enum | `"USD"` | Currency: USD, EUR, GBP, JPY, CAD, AUD, CHF, SEK, NOK, DKK, PLN, CZK, HUF, BRL, INR, CNY, KRW, MXN, TRY |
| `sortOrder` | enum | `"popularity"` | Sort: popularity, price, review, stars, distance |
| `minPrice` | integer | `0` | Minimum price per night filter |
| `maxPrice` | integer | `0` | Maximum price per night filter |
| `starsFilter` | string\[] | `[]` | Filter by star rating (e.g., `["4", "5"]`) |
| `useProxy` | boolean | `true` | Enable residential proxies (recommended) |

### Output

| Field | Type | Description |
|-------|------|-------------|
| `title` | string | Hotel/property name |
| `hotel_id` | string | Booking.com hotel ID from URL |
| `url` | string | Clean Booking.com property URL (tracking removed) |
| `star_rating` | string | Star classification (1-5) |
| `review_score` | number | Guest review score (0.0-10.0) |
| `review_label` | string | Qualitative label (e.g., "Wonderful", "Very Good") |
| `review_count` | integer | Number of guest reviews |
| `location_score` | number | Location rating score |
| `location` | string | Address/area text |
| `distance` | string | Distance from city center |
| `price` | number | Total price for the stay |
| `price_per_night` | number | Average price per night |
| `currency` | string | Currency code (USD, EUR, etc.) |
| `original_price` | number | Original/strikethrough price |
| `price_label` | string | Price period description |
| `room_type` | string | Recommended room/unit type |
| `free_cancellation` | boolean | Whether free cancellation is available |
| `breakfast_included` | boolean | Whether breakfast is included |
| `property_type` | string | Property type (Hotel, Apartment, Resort, etc.) |
| `is_preferred` | boolean | Whether property has Preferred/Genius badge |
| `image_url` | string | Property image URL |
| `availability` | string | Room availability text |
| `search_source` | string | Whether from `location_search` or `direct_url` |
| `search_location` | string | The location searched |
| `platform` | string | Always "booking.com" |
| `scraped_at` | string | ISO 8601 timestamp |

### Pricing

| Tier | Price |
|------|-------|
| Pay per result | **$1.00 / 1,000 results** |

All platform costs (compute, residential proxy, storage) are included. No monthly subscription.

### Tips for Best Results

- **Start small** — test with `maxResults: 10` before running large scrapes
- **Set specific dates** — Booking.com prices vary significantly by date
- **Use price filters** — narrow results with `minPrice` and `maxPrice` to focus on your target segment
- **Filter by stars** — use `starsFilter: ["4", "5"]` to only get upscale properties
- **Change currency** — set `currency` to your local currency to avoid conversion math
- **Residential proxies recommended** — the actor uses them by default for best reliability against Booking.com's WAF
- **Batch URLs** — when scraping by direct URL, include 5+ hotels per run for best value

### Notes

- Booking.com uses heavy JavaScript rendering — PlaywrightCrawler is required
- Residential proxies are **strongly recommended** (Booking.com blocks datacenter IPs)
- Targets vary by region — results are in the chosen currency
- Max ~25-30 cards per page; `maxResults` controls total across all pages
- Direct hotel URLs skip pagination (single property only)

***

### Support & Feedback

**Enjoying this Actor?** [Leave a review on Apify Store](https://apify.com/longanimous_bracken/booking-scraper/reviews) — it helps others discover the tool.

Found a bug or have a feature request? [Open an issue](https://console.apify.com/actors/Gm73o9hX4uV931UxR/issues) on the Actor page.

# Actor input Schema

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

Paste Booking.com hotel or search page URLs directly. Either this or 'Locations' is required.

## `locations` (type: `array`):

Cities or areas to search (e.g., 'London', 'Paris, France', 'Tokyo'). Either this or 'Direct Hotel URLs' is required.

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

Maximum number of results to return.

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

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

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

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

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

Number of adult guests.

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

Number of children.

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

Number of rooms.

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

Currency for prices.

## `sortOrder` (type: `string`):

Sort order for results.

## `minPrice` (type: `integer`):

Minimum price per night filter. 0 = no minimum.

## `maxPrice` (type: `integer`):

Maximum price per night filter. 0 = no maximum.

## `starsFilter` (type: `array`):

Filter by star rating (e.g., '4', '5' for 4- and 5-star only).

## `useProxy` (type: `boolean`):

Enable residential proxies (recommended for Booking.com).

## Actor input object example

```json
{
  "startUrls": [],
  "locations": [
    "San Francisco, CA"
  ],
  "maxResults": 30,
  "checkIn": "2026-08-01",
  "checkOut": "2026-08-07",
  "adults": 2,
  "children": 0,
  "rooms": 1,
  "currency": "USD",
  "sortOrder": "popularity",
  "minPrice": 0,
  "maxPrice": 0,
  "starsFilter": [],
  "useProxy": true
}
```

# Actor output Schema

## `listings` (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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("longanimous_bracken/booking-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 = {}

# Run the Actor and wait for it to finish
run = client.actor("longanimous_bracken/booking-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{}' |
apify call longanimous_bracken/booking-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=longanimous_bracken/booking-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/Gm73o9hX4uV931UxR/builds/KBzel9phA3AE6CgWg/openapi.json
