# Booking.com Search Scraper (`cirkit/booking-search-scraper`) Actor

Scrape Booking.com search results by destination. Returns hotel id, name, URL, price, taxes, review score, star rating, coordinates, address, district, room and bed setup, meals and cancellation policy. Dedupes past Booking's result cap, so you are never billed for repeat rows.

- **URL**: https://apify.com/cirkit/booking-search-scraper.md
- **Developed by:** [Crikit](https://apify.com/cirkit) (community)
- **Categories:** Real estate
- **Stats:** 2 total users, 1 monthly users, 72.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.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/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 Search Scraper

**Scrape Booking.com hotel search results** for any destination and date range. This **Booking.com scraper** returns hotel ID, name, URL, nightly and total price, taxes and charges, review score and count, star rating, coordinates, full address, district, room and bed setup, meal plan, and cancellation policy across 61 fields.

No Booking.com API key, no login, and no headless browser. Results land in a structured dataset you can export to JSON, CSV, Excel, or XML, or pull straight from the Apify API.

### What is Booking.com Search Scraper?

Booking.com Search Scraper is an [Apify Actor](https://apify.com/actors) that extracts hotel search results from [Booking.com](https://www.booking.com) and returns them as clean, structured records. It dedupes past Booking.com's own result cap, so a busy destination returns far more distinct properties than the site will paginate through in a browser.

### What data can this Booking.com scraper extract?

Every run writes one row per property. The full schema carries **61 fields**; the most-used ones are below.

| Field | Type | Description |
| --- | --- | --- |
| `hotelId` | integer | Booking.com internal property id. Stable across runs and the join key to Booking.com property detail pages. |
| `name` | string | Property name as displayed on the search result card. |
| `url` | string | Canonical Booking.com detail page URL for the property. |
| `slug` | string | Booking.com URL slug for the property. |
| `propertyType` | string | Human readable accommodation type, for example Hotel, Apartment or Hostel. |
| `propertyTypeId` | integer | Booking.com numeric accommodation type id. |
| `starRating` | number | Official star rating from 1 to 5. Null for property types Booking does not star rate. |
| `starRatingType` | string | Whether the rating is official stars or a Booking assigned symbol. |
| `reviewScore` | number | Guest review score on Booking's 10 point scale. |
| `reviewCount` | integer | Number of guest reviews behind the score. |
| `reviewScoreWord` | string | Booking's word for the score, for example Very Good or Superb. |
| `locationScore` | number | Guest score for the property location specifically. |
| `address` | string | Street address of the property. |
| `city` | string | City the property is listed under. |
| `countryCode` | string | Two letter ISO country code. |
| `latitude` | number | WGS84 latitude of the property. |
| `longitude` | number | WGS84 longitude of the property. |
| `district` | string | Neighbourhood and city as displayed on the card. |
| `neighborhood` | string | Popular district name Booking associates with the property. |
| `distanceFromCenter` | string | Distance from the destination centre, as displayed. |
| `publicTransport` | string | Nearest public transport description, when Booking supplies one. |
| `isCentrallyLocated` | boolean | Whether Booking flags the property as centrally located. |

See the **Output** tab in Apify Console for all 61 fields.

### How to scrape Booking.com hotel search results

1. Open [Booking.com Search Scraper](https://apify.com/cirkit/booking-search-scraper) and click **Try for free**.
2. Put a destination in `search`, then set `checkIn`, `checkOut`, `adults`, and `rooms`.
3. Filter server-side with `minPrice`, `maxPrice`, `minReviewScore`, `starRatings`, and `propertyTypes`.
4. Choose `currency` and `language`, and pick a `sortBy` order.
5. Set `maxResults` to bound the run.
6. Click **Start** and watch rows appear live in the **Output** tab.
7. Export the dataset as JSON, CSV, Excel, or XML — or fetch it from the [Apify API](https://docs.apify.com/api/v2) once the run finishes.

### Booking.com Search Scraper input options

| Input | Type | What it does | Default |
| --- | --- | --- | --- |
| `search` | array | One or more destinations to search, exactly as you would type them into Booking.com. Cities, regions, districts,... | **yes** |
| `checkIn` | string | Check-in date in YYYY-MM-DD format. Prices and availability are always tied to a date range. Leave empty to use a... |  |
| `checkOut` | string | Check-out date in YYYY-MM-DD format. Must be at least one night after check-in. Leave empty to use a two night stay. |  |
| `adults` | integer | Number of adults in the party. Affects which rooms and prices Booking returns. | `2` |
| `childrenAges` | array | Age of each child travelling, for example \[4, 9] for two children. Leave empty for an adults-only search. |  |
| `rooms` | integer | Number of rooms required. | `1` |
| `maxResults` | integer | Hard cap on the number of properties written to the dataset across all destinations. Booking limits any single... | `100` |
| `sortBy` | string | Result ordering. Booking's default relevance ranking is used when left empty. |  |
| `currency` | string | Currency for all returned prices, as a 3 letter ISO code. Setting this explicitly is recommended, since an unset... | `"USD"` |
| `language` | string | Booking language code used for text fields such as district names, meal plans and review score words. | `"en-us"` |
| `minPrice` | integer | Only return properties at or above this total stay price, in the selected currency. |  |
| `maxPrice` | integer | Only return properties at or below this total stay price, in the selected currency. |  |
| `minReviewScore` | string | Only return properties whose guest review score is at least this value, on Booking's 10 point scale. |  |
| `starRatings` | array | Only return properties with these star ratings. Leave empty for all. |  |
| `propertyTypes` | array | Narrow results to these Booking property categories. This maps to Booking's own category filter, which is broader... |  |

Proxy is configured through the standard `proxyConfiguration` object; the defaults shipped with this Actor are already tuned for the target site.

### Example output

```json
{
  "hotelId": 1169919,
  "name": "Hotel Edison Times Square",
  "url": "https://www.booking.com/hotel/us/edison-triumph-group.html",
  "propertyType": "Hotel",
  "starRating": 4,
  "reviewScore": 8.1,
  "reviewCount": 12316,
  "reviewScoreWord": "Very Good",
  "locationScore": 9.6,
  "address": "228 West 47th Street",
  "city": "New York (New York)",
  "countryCode": "us",
  "latitude": 40.7596825,
  "longitude": -73.9863504,
  "district": "Manhattan, New York",
  "neighborhood": "Times Square",
  "distanceFromCenter": "1 km from downtown",
  "publicTransport": "49th Street station is within 250 meters",
  "price": 895.22,
  "originalPrice": 1098.02,
  "isDiscounted": true,
  "pricePerNight": 447.61,
  "currency": "USD",
  "taxesAndCharges": "+US$139 taxes",
  "dealBadges": ["Getaway Deal"],
  "roomName": "Signature 1 Queen Bed",
  "beds": 1,
  "mealPlan": "Breakfast included",
  "freeCancellation": true,
  "freeCancellationUntil": "2026-09-13T04:00:00Z",
  "urgencyMessage": "We have 3 left at this price",
  "isSustainable": false,
  "mainImage": "https://cf.bstatic.com/xdata/images/hotel/square600/864195523.jpg",
  "position": 1
}
```

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

This Actor runs on **pay per result** pricing: **$0.0005 per property** ($0.5 per 1,000). A one-time start fee of $0.00005 applies per run.

| Results | Approximate cost |
| --- | --- |
| 1,000 | $0.50 |
| 10,000 | $5.00 |
| 100,000 | $50.00 |

You pay for rows you actually receive, so a search that returns nothing costs nothing beyond the start fee. Every Apify account includes free monthly usage credit, so you can trial Booking.com Search Scraper at no cost.

### What can you build with Booking.com data?

#### Track hotel rates across a destination

Re-run the same dates daily to build a rate calendar per property and see exactly when competitors open or close discounts.

#### Benchmark your property against its comp set

Review score, star rating, and price on one row let you position a hotel against genuinely comparable properties rather than the whole city.

#### Feed a travel metasearch or comparison site

Coordinates, address, price, and booking URL are enough to render a full comparison listing directly.

#### Research a hospitality market before investing

Distribution of star ratings, review scores, and prices across a destination shows where supply is thin and where it is saturated.

#### Monitor cancellation and meal-plan strategy

Policy fields reveal how competitors use free cancellation and breakfast inclusion as conversion levers.

### Booking.com scraping tips and limits

- Always set `checkIn` and `checkOut`. Booking.com prices are date-dependent and a dateless run returns indicative rates that will not match a real quote.
- Keep `currency` fixed across runs — Booking.com localises by IP, and mixed-currency rows quietly corrupt any price time series.
- Booking.com caps how deep its own search paginates. Splitting a large city by district returns more distinct properties than one broad search.
- Prices move constantly. For rate-tracking, run at the same hour each day so your series is comparable.

### Integrations and automation

Run Booking.com Search Scraper on a [schedule](https://docs.apify.com/platform/schedules) to keep a Booking.com dataset fresh, or trigger it from your own stack through the [Apify API](https://docs.apify.com/api/v2) and the official [JavaScript](https://docs.apify.com/sdk/js) and [Python](https://docs.apify.com/sdk/python) clients. Native [integrations](https://docs.apify.com/platform/integrations) push results into Google Sheets, Slack, Airtable, Zapier, Make, GitHub, or any webhook endpoint. The Actor also works as an [MCP](https://docs.apify.com/platform/integrations/mcp) tool, so an AI agent can call it directly.

### Related scrapers

| Actor | What it does |
| --- | --- |
| [Booking.com Property Details Scraper](https://apify.com/cirkit/booking-property-details-scraper) | 50+ detail fields per property, including all rooms and policies. |
| [Agoda Hotel Search Scraper](https://apify.com/cirkit/agoda-hotel-search-scraper) | The same destinations on Agoda, for rate comparison. |
| [Tripadvisor Hotels Scraper](https://apify.com/cirkit/tripadvisor-hotels-scraper) | Tripadvisor rankings and per-provider offers. |
| [Hostelworld Property Search Scraper](https://apify.com/cirkit/hostelworld-property-search-scraper) | Hostel and budget inventory Booking.com under-covers. |

### Frequently asked questions

#### Does it return the total price including taxes?

Yes. `price`, `pricePerNight`, and `taxesAndCharges` come back separately, so you can work with either the headline rate or the true all-in cost.

#### Can I scrape a whole city?

Yes, and the Actor dedupes beyond Booking.com's visible result cap. For very large destinations, split by district or neighborhood to maximise distinct property coverage.

#### Do I need a Booking.com API key?

No. Booking.com Search Scraper reads publicly available Booking.com pages and endpoints directly, so there is no key to obtain, no OAuth app to register, and no account to connect.

#### Can I export Booking.com data to CSV, Excel, or Google Sheets?

Yes. Every run stores results in an Apify dataset that exports to JSON, JSONL, CSV, Excel, XML, or HTML with one click, and the Google Sheets integration writes rows straight into a spreadsheet.

#### Can I run Booking.com Search Scraper on a schedule?

Yes. Apify schedules run the Actor hourly, daily, weekly, or on any cron expression, and webhooks can notify your systems the moment a run finishes.

#### Is it legal to scrape Booking.com?

Scraping publicly available data is broadly lawful in the US and EU, but the answer depends on what you collect and how you use it. This Actor is built to gather public hotel and pricing information Booking.com publishes publicly. Personal data carries extra obligations under GDPR and CCPA. Read Apify's guide on [whether web scraping is legal](https://blog.apify.com/is-web-scraping-legal/) and take your own legal advice for your use case.

### Support and feedback

Found a bug, a missing field, or a Booking.com page shape this Actor does not handle yet? Open an issue from the **Issues** tab on the Actor page. Feature requests and custom-scraper enquiries are welcome there too.

# Actor input Schema

## `search` (type: `array`):

One or more destinations to search, exactly as you would type them into Booking.com. Cities, regions, districts, countries and landmarks all work, for example "New York", "Paris", "Austin, Texas" or "Shibuya, Tokyo". Booking resolves the text itself, so no ids are needed.

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

Check-in date in YYYY-MM-DD format. Prices and availability are always tied to a date range. Leave empty to use a stay starting 30 days from the run date.

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

Check-out date in YYYY-MM-DD format. Must be at least one night after check-in. Leave empty to use a two night stay.

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

Number of adults in the party. Affects which rooms and prices Booking returns.

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

Age of each child travelling, for example \[4, 9] for two children. Leave empty for an adults-only search.

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

Number of rooms required.

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

Hard cap on the number of properties written to the dataset across all destinations. Booking limits any single search to roughly 1,100 unique properties, so to collect more than that split a large city into districts or price bands.

## `sortBy` (type: `string`):

Result ordering. Booking's default relevance ranking is used when left empty.

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

Currency for all returned prices, as a 3 letter ISO code. Setting this explicitly is recommended, since an unset currency follows the exit IP of the proxy.

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

Booking language code used for text fields such as district names, meal plans and review score words.

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

Only return properties at or above this total stay price, in the selected currency.

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

Only return properties at or below this total stay price, in the selected currency.

## `minReviewScore` (type: `string`):

Only return properties whose guest review score is at least this value, on Booking's 10 point scale.

## `starRatings` (type: `array`):

Only return properties with these star ratings. Leave empty for all.

## `propertyTypes` (type: `array`):

Narrow results to these Booking property categories. This maps to Booking's own category filter, which is broader than an exact type match: selecting Apartments also returns aparthotels and serviced apartments that Booking labels as hotels. Filter on the propertyType column afterwards if you need an exact type. Leave empty for all.

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

Proxy settings. Booking's search endpoint works from Apify datacenter proxy, so the default is fine and residential proxy is not required.

## Actor input object example

```json
{
  "search": [
    "New York",
    "Paris"
  ],
  "adults": 2,
  "childrenAges": [],
  "rooms": 1,
  "maxResults": 100,
  "currency": "USD",
  "language": "en-us",
  "starRatings": [],
  "propertyTypes": [],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (type: `string`):

Every Booking.com property matched by the search, one row per property.

## `resultsCsv` (type: `string`):

The same results as a downloadable CSV file.

# 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 = {
    "search": [
        "New York"
    ],
    "adults": 2,
    "rooms": 1,
    "maxResults": 100,
    "currency": "USD",
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("cirkit/booking-search-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 = {
    "search": ["New York"],
    "adults": 2,
    "rooms": 1,
    "maxResults": 100,
    "currency": "USD",
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("cirkit/booking-search-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 '{
  "search": [
    "New York"
  ],
  "adults": 2,
  "rooms": 1,
  "maxResults": 100,
  "currency": "USD",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call cirkit/booking-search-scraper --silent --output-dataset

```

## MCP server setup

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