# Booking.com Hotels Scraper - Prices, Rooms & Availability (`topapi/booking-hotels-scraper`) Actor

Scrape Booking.com hotels, apartments and other stays by destination, dates and guests: total and nightly price, rating, review count, stars, coordinates, room and bed details, free-cancellation and breakfast flags. Optional rooms and rates and a nightly price calendar. Monitor mode. No login.

- **URL**: https://apify.com/topapi/booking-hotels-scraper.md
- **Developed by:** [Top Api](https://apify.com/topapi) (community)
- **Categories:** Travel, E-commerce, Automation
- **Stats:** 2 total users, 1 monthly users, 85.7% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.95 / 1,000 properties

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?

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

### What does Booking.com Hotels Scraper do?

**Booking.com Hotels Scraper** extracts hotels, apartments, vacation homes and every other property type from [Booking.com](https://www.booking.com) for the destination, dates and guests you choose. Each property becomes one row with its total and nightly price, guest score, review count, stars, coordinates, room and bed details, and free-cancellation and breakfast flags. Built for travel startups, revenue managers, market researchers and data teams who need Booking.com prices and listings in a spreadsheet or an API.

Booking scraper · Booking.com API · Booking hotel price scraper · Booking.com listings extractor

<a href="https://console.apify.com/actors/a6w2OfnqV2BeQNSYS"><img src="https://api.apify.com/v2/key-value-stores/qNQ9zP0xaj2yxGeMY/records/booking-hotels-scraper-source.png" alt="Booking.com hotels search results page that Booking.com Hotels Scraper turns into rows" style="width:70%"></a>

- **Every property in a search:** hotels, apartments, homes, hostels, B\&Bs, villas, resorts and 15 more types, with the price for your exact stay
- **100 properties per request:** a 100-hotel search is one request to Booking.com, so runs are fast and small
- **Booking's own filters:** property type, stars, review score, price per night, free cancellation, meals, facilities, distance, sort order
- **Search, URL or hotel id:** type a destination, paste Booking.com search or hotel URLs, or pass hotel ids
- **More than 1,000 results:** Booking.com stops a search at about 1,000 properties; above that the search is split by price to go further
- **Paid add-ons when you need depth:** full hotel details with every room and rate, guest reviews, and a day-by-day price calendar
- **Monitor mode:** get only new properties and price drops on a schedule
- **No login, cookies or Booking.com API key**
- **Export anywhere:** JSON, CSV, Excel, XML; schedules, webhooks, Make, Zapier, n8n, Google Sheets; Apify API and MCP

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

<table>
<tr>
<td>🏨 Name, URL and hotel id (<code>hotelId</code>)</td>
<td>🏷️ Property type (<code>type</code>)</td>
<td>⭐ Star class (<code>stars</code>)</td>
</tr>
<tr>
<td>💯 Guest score and label (<code>rating</code>)</td>
<td>💬 Review count (<code>reviews</code>)</td>
<td>📍 Location sub-score (<code>secondaryRating</code>)</td>
</tr>
<tr>
<td>💲 Total price for the stay (<code>price</code>)</td>
<td>🌙 Price per night (<code>pricePerNight</code>)</td>
<td>🔻 Price before discount, discount %</td>
</tr>
<tr>
<td>🧾 Taxes and fees not included</td>
<td>💱 Price in the hotel's currency</td>
<td>📅 Check-in / check-out dates, nights, guests</td>
</tr>
<tr>
<td>🗺️ Latitude and longitude</td>
<td>🏙️ Street, city, district</td>
<td>🚇 Distance from centre, public transport, beach</td>
</tr>
<tr>
<td>🛏️ Room name, beds, bedrooms, area</td>
<td>✅ Free cancellation (and until when)</td>
<td>🍳 Breakfast / meal plan</td>
</tr>
<tr>
<td>⏳ Rooms left at this price</td>
<td>🌿 Sustainability certifications</td>
<td>🖼️ Main photo and thumbnail</td>
</tr>
</table>

On a 100-property Lisbon run (run `m9dgqSQnjJSUChuc2`) name, URL, price, score, review count and coordinates were filled on 100% of rows and the star class on 86% (apartments and homes often have none).

### How to scrape Booking.com with Booking.com Hotels Scraper

1. [Create a free Apify account](https://console.apify.com/sign-up) — $5 of monthly credit, no card needed.
2. Open [Booking.com Hotels Scraper](https://apify.com/TopApi/booking-hotels-scraper) and click **Try for free**.
3. Type a **Destination** (or paste Booking.com URLs), pick your **Check-in** and **Check-out** dates and set **Max properties**.
4. Click **Start**. Properties stream into the dataset as they are found.
5. Open the **Storage** tab and **Export** as JSON, CSV or Excel — or let a schedule run it for you.

### ⬇️ Input

| Parameter | Type | Description |
|---|---|---|
| **🔍 What to scrape** | | |
| `search` | String | A city, region, district, landmark or airport, e.g. `Lisbon`, `Tuscany`, `Eiffel Tower`. |
| `searches` | List | More destinations, one per line. |
| `startUrls` | List | Booking.com search-result URLs (dates, guests, filters and sort are read from the URL) and hotel page URLs. |
| `hotelIds` | List | Booking.com property ids, e.g. `4045490`. |
| `destinationId` + `destinationType` | String | Booking.com `dest_id` and its type (CITY, REGION, DISTRICT, LANDMARK, AIRPORT, COUNTRY). |
| `latitude` + `longitude` | Number | Search around a point. |
| **🎯 Filters** (applied by Booking.com) | | |
| `checkIn` / `checkOut` | String | `YYYY-MM-DD` or relative (`30 days`, `2 weeks`). Default: 30 days from today, 2 nights. |
| `flexWindow` | Select | Also search stays starting ± 1, 2, 3 or 7 days; each property keeps its cheapest stay. |
| `adults`, `children`, `childrenAges`, `rooms` | Integer / List | Guests and rooms. Default: 2 adults, 1 room. |
| `currency`, `language` | Select | e.g. `USD`, `EUR`; `en-us`, `de`. Default: USD, en-us. |
| `propertyTypes` | Multi-select | Hotels, Apartments, Vacation Homes, Guesthouses, Hostels, Villas, Resorts… |
| `starRatings` | Multi-select | 1-5 stars, or unrated only. |
| `minScore` | Select | 6+, 7+, 8+, 9+ (Booking's filter) or any value such as `8.4`. |
| `minPrice` / `maxPrice` | Integer | Price per night in the selected currency. |
| `freeCancellationOnly`, `breakfastIncluded`, `mealPlans`, `facilities`, `distanceFromCentre`, `onlyAvailable` | Boolean / Select | Booking.com's own filters. |
| `rawFilters` | String | Any `nflt` value from a Booking.com URL, e.g. `roomfacility=11`. |
| `sortBy` | Select | popularity (Our top picks), price, price_from_high_to_low, review_score_and_price, bayesian_review_score, class, class_asc, distance_from_search, upsort_bh. Default: popularity. |
| `travelPurpose` | Select | Leisure or business. |
| **✂️ Refine results** | | |
| `minReviews` | Integer | Keep properties with at least this many reviews. |
| `radiusKm`, `swLat`/`swLon`/`neLat`/`neLon` | Number | Keep properties within a radius of the point or inside a box. |
| **➕ Extra data** (paid add-ons) | | |
| `extractAdditionalHotelData` | Boolean | Hotel details — charged as **hotel-details** per property that gets them. |
| `includeReviews` + `maxReviewsPerHotel`, `reviewsSortBy`, `reviewsGuestType`, `reviewsLanguage` | Boolean / Integer / Select | Guest reviews, up to 100 per property — charged as **review** per review. |
| `stripPersonalData` | Boolean | On by default: reviewer first names (`guestName`) are left empty; country, traveler type and stay details are kept. Turn off only if you have a lawful basis to process names. |
| `includeCalendar` + `calendarDays` | Boolean / Integer | Day-by-day availability and price from check-in, up to 365 days — charged as **calendar-day** per day. |
| `maxHotelsToEnrich` | Integer | Add-ons for the first N properties only. |
| **🔁 Monitoring** | | |
| `monitorMode`, `monitorStoreName`, `monitorPriceDrops` | Boolean / String | Only properties not delivered before, plus price drops. Pair with a daily schedule. |
| **📦 Output** | | |
| `maxItems` | Integer | Default `100`; `0` = everything (above 1,000 the search is split by price). |
| `maxItemsPerSearch` | Integer | Cap per destination or URL. |
| `compact` | Boolean | Core fields only, sized for AI agents and MCP. |

<a href="https://console.apify.com/actors/a6w2OfnqV2BeQNSYS"><img src="https://api.apify.com/v2/key-value-stores/qNQ9zP0xaj2yxGeMY/records/booking-hotels-scraper-output.png" alt="Booking.com Hotels Scraper output table with hotel names, prices, scores and coordinates" style="width:70%"></a>

#### Input JSON

```json
{
  "search": "Lisbon",
  "checkIn": "2026-11-20",
  "checkOut": "2026-11-23",
  "adults": 2,
  "propertyTypes": ["204"],
  "minScore": "8",
  "sortBy": "price",
  "maxItems": 200
}
```

#### Set your dates before anything else

Booking.com prices only exist for concrete dates and guests, so every price in the output is for the stay you set. Leave the dates empty and the actor searches a 2-night stay 30 days from today. **Do:** `"checkIn": "2026-11-20", "checkOut": "2026-11-23"` · **Don't:** a check-out before the check-in (the actor then keeps the 2-night default).

#### Paste a Booking.com URL to reuse your own search

Run a search on Booking.com with the filters you want, copy the address bar and paste it into **Booking.com URLs**. The destination, dates, guests, filters (`nflt`) and sort order are read from the URL. Hotel page URLs (`/hotel/gb/royal-national.html`) return that one property with its price.

#### Use a fixed sort order for monitors

"Our top picks" is ordered differently from one request to the next, so a monitor watching the first 50 properties should sort by price or distance. In monitor mode **Max properties** sets how much of the search is watched; an unchanged search returns nothing.

### ⬆️ Output

Every property becomes one dataset item. Here is the start of a real row from run `m9dgqSQnjJSUChuc2` (Lisbon, 2 adults, 2 nights):

```json
{
  "hotelId": 38673,
  "name": "SANA Malhoa Hotel",
  "url": "https://www.booking.com/hotel/pt/sanamalhoahotellisbon.html",
  "type": "Hotels",
  "stars": 4,
  "rating": 8.7,
  "ratingLabel": "Excellent",
  "reviews": 2274,
  "price": 353.56,
  "pricePerNight": 176.78,
  "currency": "USD",
  "checkinDate": "2026-11-07",
  "checkoutDate": "2026-11-09",
  "latitude": 38.7370423066105,
  "longitude": -9.16234016418457,
  "district": "Campolide, Lisbon",
  "roomName": "Double or Twin Room",
  "breakfastIncluded": true,
  "freeCancellation": false
}
```

With **Hotel details** on, each row also carries `description`, `address.full`, `checkIn` / `checkOut` times, `facilities` (grouped), `popularFacilities`, `categoryReviews` (staff, facilities, cleanliness, comfort, value, location, WiFi), `rooms` (every room with beds, size, persons, features, photos and all `rates` with price, meal plan, cancellation and prepayment policy, rooms available), `cheapestRate`, `houseRules`, `childPolicy`, `spokenLanguages`, `images` (gallery), `surroundings` (attractions, restaurants, transport, airports, beaches), `faq`, `questionsAndAnswers` and `operator` (the company running the property, when Booking.com lists one).

#### Fields

| Field | Type | What it is | Fill on test run |
|---|---|---|---|
| `hotelId`, `name`, `url`, `urlWithDates` | number / string | Property id, name and Booking.com page | 100% |
| `type`, `propertyTypeId` | string / number | Booking's property type | 100% |
| `stars` | number | Star class | 86% |
| `rating`, `ratingLabel`, `reviews` | number / string | Guest score (1-10), its label, review count | 100% |
| `secondaryRating`, `secondaryRatingLabel` | number / string | Highlighted sub-score (usually Location) | 64% |
| `price`, `priceText`, `currency` | number / string | Total for the stay | 100% |
| `pricePerNight`, `averagePricePerNight` | number | Total ÷ nights; Booking's own nightly average | 100% |
| `priceBeforeDiscount`, `discountPercent`, `discounts` | number / array | Discounted stays | 44% |
| `taxesAndFees` | number | Taxes and fees on top of the price | 100% |
| `priceHotelCurrency`, `hotelCurrency` | number / string | Price in the property's currency | 100% |
| `latitude`, `longitude`, `location` | number | Coordinates | 100% |
| `address`, `city`, `countryCode`, `district` | object / string | Address parts | 100% |
| `distanceFromCentre`, `publicTransport` | string | Distance texts | 100% / 82% |
| `roomName`, `roomBeds`, `bedsCount` | string / array / number | The room the price is for | 100% |
| `freeCancellation`, `freeCancellationUntil` | boolean / string | Cancellation | 100% / 59% |
| `breakfastIncluded`, `mealPlan` | boolean / string | Meals | 100% / 25% |
| `roomsLeft` | number | "We have 3 left at this price" | 72% |
| `isPreferred`, `isGeniusDeal`, `isSustainable`, `isNew`, `isSponsored` | boolean | Booking's badges | 100% |
| `image`, `thumbnail` | string | Main photo | 100% |

On a 100-property Barcelona run with hotel details (run `uC62VfCYEfWLwAy6K`) every row had a description, facilities, sub-scores, FAQ and house rules; the 100 properties listed 671 rooms with 1,767 priced rates, each rate with its cancellation policy; 92% had operator details and the gallery averaged 50 photos.

### How can I use Booking.com hotel data?

- 🏨 **Hotels and revenue managers** — track competitor prices for your dates, room types and cancellation terms
- 📊 **Market researchers** — count properties, types and price levels per city or district
- 🧭 **Travel startups and OTAs** — fill a hotel database with coordinates, photos, scores and amenities
- 🏘️ **Short-term rental analysts** — compare apartments and homes by bedrooms, area and nightly price
- 🤖 **AI and data teams** — feed compact rows to an LLM or a pricing model
- 📈 **Investors and tourism boards** — run it on a schedule and follow prices and new openings week over week

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

Booking.com Hotels Scraper is pay-per-result: **$0.95 per 1,000 properties**, no start fee. You pay only for the properties written to the dataset.

| Properties | Cost |
|---:|---:|
| 10 | $0.0095 |
| 100 | $0.095 |
| 1,000 | $0.95 |
| 10,000 | $9.50 |

Add-ons are charged only on properties delivered with them:

| Add-on | Price | Example |
|---|---|---|
| Hotel details (`hotel-details`) | $0.00095 per property | 100 properties with details = $0.095 + $0.095 = $0.19 |
| Guest reviews (`review`) | $0.000047 per review | 10 reviews on 100 properties = $0.047 |
| Price calendar (`calendar-day`) | $0.00047 per day | 30 days on 10 properties = $0.141 |

There is nothing else to pay: Apify platform usage is included in these prices. Measured on 256 MB: 25 properties in 6 s, 100 properties in 14 s, 100 properties with hotel details in 64 s.

### Integrations, API, scheduling & MCP

- **Schedules:** run Booking.com Hotels Scraper daily or weekly from the **Schedules** tab; turn on monitor mode to get only new properties and price drops.
- **Webhooks:** fire a URL when a run finishes — push rows to your database, Slack or a sheet.
- **No-code:** Make, Zapier, n8n, Google Sheets, Airtable, Slack via [Apify integrations](https://docs.apify.com/integrations).
- **API:** call it from Node.js or Python with `apify-client` — code on the [API tab](https://apify.com/TopApi/booking-hotels-scraper/api/python) and the [Apify API reference](https://docs.apify.com/api/v2).
- **MCP / AI agents:** connect Claude, Cursor or any MCP client through the [MCP tab](https://apify.com/TopApi/booking-hotels-scraper/api/mcp) and ask for Booking.com hotels in plain language.

### More scrapers from TopApi

<table>
<tr>
<td>⭐ <a href="https://apify.com/TopApi/google-maps-reviews-scraper">Google Maps Reviews Scraper</a></td>
<td>🍎 <a href="https://apify.com/TopApi/apple-maps-scraper">Apple Maps Scraper</a></td>
<td>📍 <a href="https://apify.com/TopApi/google-geocoding-scraper">Google Geocoding Scraper</a></td>
</tr>
<tr>
<td>🍽️ <a href="https://apify.com/TopApi/yelp-reviews-scraper">Yelp Reviews Scraper</a></td>
<td>🏠 <a href="https://apify.com/TopApi/zillow-scraper">Zillow Scraper</a></td>
<td>📈 <a href="https://apify.com/TopApi/similarweb-scraper">SimilarWeb Scraper</a></td>
</tr>
<tr>
<td>📸 <a href="https://apify.com/TopApi/instagram-profile-scraper">Instagram Profile Scraper</a></td>
<td>🎵 <a href="https://apify.com/TopApi/tiktok-scraper">TikTok Scraper</a></td>
<td>🧭 <a href="https://apify.com/TopApi">All TopApi actors</a></td>
</tr>
</table>

### Limits & empty runs

- **Results per search:** Booking.com serves about 1,000 properties per search. Set **Max properties** above 1,000 (or `0`) and the actor splits the search into nightly-price bands to go further; on a 1,600-property Porto test every row was unique.
- **Prices:** Booking.com's search lists properties that are bookable for your dates and guests; a hotel URL that is not bookable for them comes back with its score and location but no price.
- **Speed:** about 100 properties per request; a 1,000-property search is 10 requests.
- **Empty dataset:** the destination did not match (check the spelling or use a Booking.com URL), your filters removed everything, or the hotel URL / id does not exist. The run status and the `RUN_SUMMARY` record name the reason for each input.

### FAQ

#### How many properties can Booking.com Hotels Scraper collect in one run?

As many as the destination has. Booking.com stops one search at about 1,000 properties; with **Max properties** above 1,000 or `0` the actor splits the search by price and keeps going. Add several destinations or URLs to cover more places in one run.

#### Can I run Booking.com Hotels Scraper on a schedule to track prices?

Yes. Save your input as a task, open **Schedules** and pick the cadence. With **Monitor mode** on, each run returns only properties not delivered before, plus properties whose price dropped (`monitorChange`, `previousPrice`).

#### Does Booking.com Hotels Scraper return room types and every rate?

Yes, with **Hotel details** on: every room with beds, size, persons, features and photos, and every rate with its price, meal plan, cancellation and prepayment policy and rooms available. The base row already carries the room the search price is for.

#### Can I get Booking.com prices for flexible dates?

Yes. Set **Flexible dates** to ± 1, 2, 3 or 7 days and each property keeps its cheapest stay, with the dates of that stay in `checkinDate` and `checkoutDate`. The **Nightly price calendar** add-on gives day-by-day prices for up to 365 days.

#### Can I integrate Booking.com Hotels Scraper with other apps?

Yes — Make, Zapier, n8n, Google Sheets, Slack and more via [Apify integrations](https://docs.apify.com/integrations), or use [webhooks](https://docs.apify.com/integrations/webhooks) to trigger an action when a run finishes.

#### Can I use Booking.com Hotels Scraper with the Apify API?

Yes. Start runs, fetch datasets and manage schedules with `apify-client` for [Node.js](https://apify.com/TopApi/booking-hotels-scraper/api/javascript) or [Python](https://apify.com/TopApi/booking-hotels-scraper/api/python); the API tab has ready-to-paste code.

#### Can I use Booking.com Hotels Scraper through an MCP server?

Yes. Open the [MCP tab](https://apify.com/TopApi/booking-hotels-scraper/api/mcp), connect your MCP client and ask for Booking.com hotels in plain language. Turn on **Compact output** for shorter rows.

#### Do I need a Booking.com account, cookies or an API key?

No. You pass a destination, URLs or hotel ids; nothing else.

#### Why did my Booking.com Hotels Scraper run return no results?

Most often the filters were too narrow for the dates (try without a price band or a star filter), the destination name matched nothing (use a Booking.com URL instead), or a hotel id is wrong. The run's status message and the `RUN_SUMMARY` record list each input with its result.

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

Booking.com Hotels Scraper collects only data Booking.com shows publicly to every visitor. Guest reviews can contain personal data, which is protected by laws such as the GDPR: reviewer first names are left out by default (`stripPersonalData`), and if you turn that off or keep review text, make sure you have a legitimate reason to keep it.

#### Your feedback

We keep improving Booking.com Hotels Scraper. Found a bug or missing a field? Open an issue on the [Issues tab](https://apify.com/TopApi/booking-hotels-scraper/issues/open).

# Actor input Schema

## `search` (type: `string`):

A city, region, district, landmark or airport as you would type it on Booking.com, e.g. "Lisbon", "Tuscany", "Eiffel Tower". Booking's own autocomplete picks the destination.

## `searches` (type: `array`):

Several destinations in one run, one per line, e.g. "Porto", "Bali", "Shinjuku". Each is searched separately (see Max properties per search).

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

Search-result URLs (dates, guests, filters and sort are read from the URL) and hotel page URLs, e.g. https://www.booking.com/hotel/gb/royal-national.html (that property with its price for the dates).

## `hotelIds` (type: `array`):

Booking.com numeric property ids (the hotelId field of a previous run), e.g. 4045490. Returns each property with its price for the dates below.

## `destinationId` (type: `string`):

Booking.com dest_id when you already know it (skips the name lookup), e.g. -2167973 for Lisbon. Set the destination type too.

## `destinationType` (type: `string`):

The type of the destination id above (Booking's dest_type). With a destination name it picks which autocomplete match to use.

## `latitude` (type: `number`):

Search around a point instead of a named place, e.g. 40.758 (with longitude). Pair with Radius to keep only properties within a distance.

## `longitude` (type: `number`):

Longitude of the point, e.g. -73.9855.

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

YYYY-MM-DD or relative: "30 days", "2 weeks", "tomorrow". Empty = 30 days from today. Prices exist only for concrete dates.

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

YYYY-MM-DD or relative. Empty = two nights after check-in.

## `flexWindow` (type: `string`):

Also search stays starting up to N days before and after check-in (same length); each property keeps its cheapest stay, with its own dates in checkinDate / checkoutDate.

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

Adult guests across all rooms.

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

Child guests. Booking prices children by age, so set their ages below.

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

One age (0-17) per child, e.g. 5 and 12. Missing ages default to 10.

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

Number of rooms.

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

ISO code for prices, e.g. USD, EUR, GBP. Rows also carry the price in the property's own currency.

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

Booking.com locale for names, labels and room titles, e.g. en-us, en-gb, de, fr.

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

Keep only these kinds of places (Booking's property-type filter). Empty = every type.

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

Keep only these star classes (Booking's filter). Empty = any.

## `minScore` (type: `string`):

Guest score on Booking's 10-point scale: 6 Pleasant, 7 Good, 8 Very Good, 9 Wonderful (Booking's own filter). Any other value, e.g. 8.4, is applied on top of the nearest one.

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

In the selected currency, per night (Booking's price filter compares the total price divided by the nights).

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

In the selected currency, per night. Empty = no upper bound.

## `freeCancellationOnly` (type: `boolean`):

Only properties with a free-cancellation rate.

## `breakfastIncluded` (type: `boolean`):

Only properties whose rate includes breakfast.

## `mealPlans` (type: `array`):

Booking's meal filter, e.g. All-inclusive. Empty = any.

## `facilities` (type: `array`):

Only properties with all of these facilities (Booking's filter).

## `distanceFromCentre` (type: `string`):

Booking's distance-from-centre filter for city searches.

## `onlyAvailable` (type: `boolean`):

Booking's "only show available properties" filter.

## `rawFilters` (type: `string`):

Any filter string from a Booking.com URL's nflt parameter, e.g. roomfacility=11;popular_activities=11 (air conditioning, fitness). Added to the filters above.

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

Booking's own orderings: popularity (Our top picks), price, price_from_high_to_low, review_score_and_price, bayesian_review_score (Top reviewed), class, class_asc, distance_from_search, upsort_bh (homes first).

## `travelPurpose` (type: `string`):

Booking's leisure / business switch.

## `minReviews` (type: `integer`):

Keep only properties with at least this many guest reviews, e.g. 50.

## `radiusKm` (type: `number`):

With latitude / longitude: keep only properties within this distance of the point, e.g. 2.

## `swLat` (type: `number`):

With the three fields below: keep only properties inside this box (the search runs around its centre).

## `swLon` (type: `number`):

South-west corner longitude.

## `neLat` (type: `number`):

North-east corner latitude.

## `neLon` (type: `number`):

North-east corner longitude.

## `extractAdditionalHotelData` (type: `boolean`):

Adds description, full address, check-in/out times, facilities, every room with all rates and cancellation policies, review sub-scores, house rules, photos, surroundings, FAQ and operator details. Charged as hotel-details.

## `maxHotelsToEnrich` (type: `integer`):

Fetch the add-ons for only the first N properties of the run; the rest come without them. 0 = all.

## `includeReviews` (type: `boolean`):

Attach guest reviews to each property (liked / disliked text, score, date, country, traveler type, room, hotel reply). Charged as review, per review attached.

## `maxReviewsPerHotel` (type: `integer`):

Up to 100 per property (Booking serves 25 per request).

## `reviewsSortBy` (type: `string`):

Which reviews come first.

## `reviewsGuestType` (type: `string`):

Keep only reviews from this kind of guest (Booking's filter).

## `reviewsLanguage` (type: `string`):

Two-letter code, e.g. en, de. Empty = all languages.

## `stripPersonalData` (type: `boolean`):

ON (default): guestName is empty on every review; the country, traveler type and stay details are kept. Turn OFF only if you have a lawful basis to process reviewers' first names.

## `includeCalendar` (type: `boolean`):

Attach a day-by-day calendar from the check-in date: available or not, the nightly price and the minimum stay. Charged as calendar-day, per day attached.

## `calendarDays` (type: `integer`):

How many days from check-in, up to 365 (Booking serves 61 per request).

## `monitorMode` (type: `boolean`):

Return only properties not delivered by earlier runs of the same search (plus price drops, below). Pairs with a daily schedule.

## `monitorStoreName` (type: `string`):

Name of the key-value store that remembers delivered properties. Use one name per watch list.

## `monitorPriceDrops` (type: `boolean`):

In monitor mode, also return a property seen before when its price is now lower (monitorChange = priceDrop, with previousPrice).

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

Per run, across all destinations and URLs. Booking serves about 1,000 per search; above 1,000 the search is split by price to go further. 0 = everything.

## `maxItemsPerSearch` (type: `integer`):

Cap per destination or search URL, so one big city does not use up the whole run. 0 = no per-search cap.

## `compact` (type: `boolean`):

Core fields only (name, url, price, rating, stars, location, flags), sized for AI agents and MCP.

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

Keep the default Apify Proxy (datacenter). Booking.com answers Apify's own IP addresses with a bot-check page, so a proxy is required.

## `maxConcurrency` (type: `integer`):

Parallel requests (searches and add-on lookups).

## Actor input object example

```json
{
  "search": "Lisbon",
  "flexWindow": "0",
  "adults": 2,
  "children": 0,
  "rooms": 1,
  "currency": "USD",
  "language": "en-us",
  "freeCancellationOnly": false,
  "breakfastIncluded": false,
  "distanceFromCentre": "any",
  "onlyAvailable": false,
  "sortBy": "popularity",
  "travelPurpose": "leisure",
  "extractAdditionalHotelData": false,
  "includeReviews": false,
  "maxReviewsPerHotel": 10,
  "reviewsSortBy": "most_relevant",
  "reviewsGuestType": "all",
  "stripPersonalData": true,
  "includeCalendar": false,
  "calendarDays": 30,
  "monitorMode": false,
  "monitorStoreName": "booking-hotels-monitor",
  "monitorPriceDrops": true,
  "maxItems": 25,
  "compact": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "maxConcurrency": 4
}
```

# Actor output Schema

## `hotels` (type: `string`):

The dataset of Booking.com properties (one item per property, with any add-ons attached).

## `summary` (type: `string`):

Per-destination and per-URL status and counts (read, filtered, delivered), add-ons delivered, requests made and bytes transferred.

# 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": "Lisbon",
    "maxItems": 25
};

// Run the Actor and wait for it to finish
const run = await client.actor("topapi/booking-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 = {
    "search": "Lisbon",
    "maxItems": 25,
}

# Run the Actor and wait for it to finish
run = client.actor("topapi/booking-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 '{
  "search": "Lisbon",
  "maxItems": 25
}' |
apify call topapi/booking-hotels-scraper --silent --output-dataset

```

## MCP server setup

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