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

Scrape Booking.com hotel listings with ease. Extract prices, reviews, availability & ratings instantly. Perfect for price monitoring, travel market research, competitor analysis & accommodation data collection. Scale your data insights.

- **URL**: https://apify.com/shahidirfan/booking-com-scraper.md
- **Developed by:** [Shahid Irfan](https://apify.com/shahidirfan) (community)
- **Categories:** Travel, Automation, Developer tools
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-usage

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

Extract structured hotel listings from Booking.com search results. Collect property details, location data, ratings, pricing signals, and booking policy flags for market research, travel intelligence, and catalog building.

### Features

- **Hotel Listings Extraction** - Collect listing cards from Booking search results URLs.
- **Rich Property Data** - Save identity, location, ratings, policy, and pricing-related fields.
- **Pagination Support** - Gathers hotels across multiple result pages.
- **Duplicate Protection** - Keeps unique hotels by property identity.
- **Clean Dataset Output** - Removes null and empty values automatically.

### Use Cases

#### Travel Market Research

Build datasets to compare hotel supply, quality signals, and distribution in target cities.

#### Price and Position Monitoring

Track displayed prices, policy flags, and listing presentation changes over time.

#### Hospitality Competitor Analysis

Benchmark similar properties by ratings, review volume, and listing metadata.

#### Lead and Catalog Enrichment

Create structured hotel catalogs for internal tools, dashboards, and partner workflows.

---

### Input Parameters

| Parameter            | Type    | Required | Default                                                                                                                               | Description                                                                  |
| -------------------- | ------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------- |
| `startUrl`           | String  | Yes      | `https://www.booking.com/searchresults.html?ss=London%2C+Greater+London%2C+United+Kingdom&group_adults=2&no_rooms=1&group_children=0` | Booking listing URL. Supports search results, city pages, and country pages. |
| `results_wanted`     | Integer | No       | `20`                                                                                                                                  | Maximum number of unique hotels to save.                                     |
| `max_pages`          | Integer | No       | `10`                                                                                                                                  | Safety cap for paginated result pages.                                       |
| `proxyConfiguration` | Object  | No       | —                                                                                                                                     | Optional proxy settings for reliability.                                     |

---

### Output Data

Each dataset item may include:

| Field                  | Type    | Description                               |
| ---------------------- | ------- | ----------------------------------------- |
| `hotelId`              | Integer | Unique Booking property ID.               |
| `hotelName`            | String  | Property display name.                    |
| `hotelUrl`             | String  | Booking hotel page URL.                   |
| `searchLocation`       | String  | Destination used in the search.           |
| `city`                 | String  | Property city.                            |
| `countryCode`          | String  | Property country code.                    |
| `starRating`           | Number  | Hotel star classification.                |
| `reviewScore`          | Number  | Main review score.                        |
| `reviewCount`          | Integer | Total review count.                       |
| `displayPriceText`     | String  | Listing price text shown to users.        |
| `displayPriceAmount`   | Number  | Numeric stay price amount when available. |
| `displayPriceCurrency` | String  | Currency for display price.               |
| `freeCancellation`     | Boolean | Free cancellation availability flag.      |
| `noPrepaymentNeeded`   | Boolean | Pay-later policy flag.                    |
| `isPreferred`          | Boolean | Preferred listing flag.                   |
| `isSustainable`        | Boolean | Sustainability flag.                      |
| `photoUrls`            | Array   | Main listing photo URLs.                  |

---

### Usage Examples

#### Basic Run

```json
{
    "startUrl": "https://www.booking.com/searchresults.html?ss=London%2C+Greater+London%2C+United+Kingdom&group_adults=2&no_rooms=1&group_children=0",
    "results_wanted": 20
}
````

#### Higher Volume Collection

```json
{
    "startUrl": "https://www.booking.com/searchresults.html?ss=London%2C+Greater+London%2C+United+Kingdom&group_adults=2&no_rooms=1&group_children=0",
    "results_wanted": 150,
    "max_pages": 20
}
```

#### Run With Residential Proxy

```json
{
    "startUrl": "https://www.booking.com/searchresults.html?ss=London%2C+Greater+London%2C+United+Kingdom&group_adults=2&no_rooms=1&group_children=0",
    "results_wanted": 60,
    "max_pages": 12,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": ["RESIDENTIAL"]
    }
}
```

***

### Sample Output

```json
{
    "searchUrl": "https://www.booking.com/searchresults.html?ss=London%2C+Greater+London%2C+United+Kingdom&group_adults=2&no_rooms=1&group_children=0&lang=en-us",
    "searchLocation": "London, Greater London, United Kingdom",
    "hotelId": 1929259,
    "hotelName": "Montcalm Royal London House, London City",
    "hotelUrl": "https://www.booking.com/hotel/gb/the-montcalm-royal-london-house.html",
    "city": "London",
    "countryCode": "gb",
    "starRating": 5,
    "reviewScore": 8.5,
    "reviewCount": 8880,
    "displayLocation": "Islington, London",
    "freeCancellation": false,
    "noPrepaymentNeeded": false,
    "isPreferred": true,
    "isSustainable": true,
    "certifications": ["Green Key (FEE)"],
    "photoUrls": [
        "https://www.booking.com/xdata/images/hotel/square600/86639018.webp?k=e1b72e4ccb212a323edac7268163b4e0d24f79b93c0030fc3e078cfcecd673f0&o="
    ]
}
```

***

### Tips for Best Results

#### Use Clean Search URLs

- Use Booking listing URLs from search results, city pages, or country pages.
- Keep destination and guest parameters in the URL.

#### Start Small

- Test with `results_wanted: 20` first.
- Scale up after confirming output quality.

#### Use Proxy for Stability

- Residential proxy often improves consistency on protected pages.
- Increase `max_pages` only when needed.

***

### Integrations

Connect your extracted dataset with:

- **Google Sheets** - Reporting and ad-hoc analysis.
- **Airtable** - Searchable hotel databases.
- **Make** - Automated workflows.
- **Zapier** - Trigger downstream actions.
- **Webhooks** - Push records to custom services.

#### Export Formats

- **JSON** - Developer workflows and pipelines.
- **CSV** - Spreadsheet analysis.
- **Excel** - Business reporting.
- **XML** - Legacy integrations.

***

### Frequently Asked Questions

#### Can I scrape multiple destinations in one run?

Run one destination URL per actor run for predictable output.

#### Why are some fields missing?

Some listings do not expose every optional field. Empty values are removed from output.

#### How many hotels can I collect?

Set `results_wanted` and `max_pages` based on your target volume and runtime limits.

#### Does it remove duplicates?

Yes. Duplicate properties are filtered before saving.

#### Is proxy required?

Not always, but proxy usage is recommended for consistent runs.

***

### Support

For bug reports or feature requests, use your repository issue tracker or Apify Console support channels.

***

### Legal Notice

This actor is intended for lawful data collection and analysis. You are responsible for compliance with Booking terms, local regulations, and all applicable data usage rules.

# Actor input Schema

## `startUrl` (type: `string`):

Any Booking listing URL. Supports search results, city pages, and country pages.

## `results_wanted` (type: `integer`):

Maximum number of unique hotels to save.

## `max_pages` (type: `integer`):

Safety cap for paginated API pages.

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

Apify proxy settings. Residential proxies are recommended for reliability.

## Actor input object example

```json
{
  "startUrl": "https://www.booking.com/searchresults.html?ss=London%2C+Greater+London%2C+United+Kingdom&group_adults=2&no_rooms=1&group_children=0",
  "results_wanted": 20,
  "max_pages": 10,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `overview` (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 = {
    "startUrl": "https://www.booking.com/searchresults.html?ss=London%2C+Greater+London%2C+United+Kingdom&group_adults=2&no_rooms=1&group_children=0",
    "results_wanted": 20,
    "max_pages": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("shahidirfan/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 = {
    "startUrl": "https://www.booking.com/searchresults.html?ss=London%2C+Greater+London%2C+United+Kingdom&group_adults=2&no_rooms=1&group_children=0",
    "results_wanted": 20,
    "max_pages": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("shahidirfan/booking-com-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 '{
  "startUrl": "https://www.booking.com/searchresults.html?ss=London%2C+Greater+London%2C+United+Kingdom&group_adults=2&no_rooms=1&group_children=0",
  "results_wanted": 20,
  "max_pages": 10
}' |
apify call shahidirfan/booking-com-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Booking.com Scraper",
        "description": "Scrape Booking.com hotel listings with ease. Extract prices, reviews, availability & ratings instantly. Perfect for price monitoring, travel market research, competitor analysis & accommodation data collection. Scale your data insights.",
        "version": "1.0",
        "x-build-id": "IG8vCjDKeO6lbYk6I"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/shahidirfan~booking-com-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-shahidirfan-booking-com-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/shahidirfan~booking-com-scraper/runs": {
            "post": {
                "operationId": "runs-sync-shahidirfan-booking-com-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/shahidirfan~booking-com-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-shahidirfan-booking-com-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "startUrl"
                ],
                "properties": {
                    "startUrl": {
                        "title": "Start URL (Listing URL)",
                        "type": "string",
                        "description": "Any Booking listing URL. Supports search results, city pages, and country pages."
                    },
                    "results_wanted": {
                        "title": "Results Wanted",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Maximum number of unique hotels to save.",
                        "default": 20
                    },
                    "max_pages": {
                        "title": "Maximum API Pages",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Safety cap for paginated API pages.",
                        "default": 10
                    },
                    "proxyConfiguration": {
                        "title": "Proxy Configuration",
                        "type": "object",
                        "description": "Apify proxy settings. Residential proxies are recommended for reliability.",
                        "default": {
                            "useApifyProxy": false
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
