# Booking.com Hotel Search Scraper — Rooms, Rates, Reviews (`lergassy/booking-hotels-scraper`) Actor

Scrape Booking.com hotel search: nightly and total prices for your dates, every room and rate with cancellation terms, guest reviews, facilities and a year of availability. Hotel search data for any destination, no login.

- **URL**: https://apify.com/lergassy/booking-hotels-scraper.md
- **Developed by:** [Matvey](https://apify.com/lergassy) (community)
- **Categories:** Travel, Agents, MCP servers
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.10 / 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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

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 Hotels Scraper** is the all-in-one **Booking.com** data extractor: search any destination and dates and get one clean row per property with the **price for your stay and per night**, discounts, guest score, stars, the matched room, breakfast and free-cancellation deadline, location and photo; open any property and get **every room and every rate** — occupancy, meal plan, price, cancellation policy, prepayment, rooms left — plus facilities, the review-score breakdown, child policy and photos; pull **guest reviews** with scores, text, guest type and the hotel's reply; and price **every day up to a year ahead** from the availability calendar. Sorting and every sidebar filter, or paste Booking.com URLs with your own filters. No browser, no login, no API key: the Actor calls the same JSON endpoints the site uses, so a page of 25 hotels takes a second and costs a fraction of a cent.

![One run of Booking.com Hotels Scraper: live prices for two nights in Amsterdam, with the room on offer and the distance from the centre.](https://raw.githubusercontent.com/lergassy/apify-actor-assets/main/booking-hotels-scraper/booking-hotels-scraper-output-table.png)

Pick a mode — Search, Hotel, Reviews or Calendar — type a place or paste URLs, set dates and guests, click Start. Export JSON, CSV or Excel, run it on a schedule, or call it from the API, n8n, Make or an AI agent through MCP.

### What is Booking.com Hotels Scraper?

It is a **Booking.com API** alternative for people who need hotel data as tables rather than web pages: rate shopping and revenue management, travel agencies quoting stays, price trackers and deal alerts, market research on a destination, review analysis, and AI agents that get asked "what does a four-star in Kuta cost next weekend and can I cancel". Booking.com licenses its data only to affiliates through a closed programme; this Actor gives you the public data at pay-per-row prices.

Four modes, one Actor:

| Mode | What you give | What you get |
|---|---|---|
| **Search** | Destination or search URLs, dates, guests, filters | One row per property with price for the stay, matched room, rating, location, photo (up to 1,000 per search) — optionally with every room and rate and with facilities and score breakdown for the first N properties |
| **Hotel** | Property URLs or ids, dates, guests | One `hotel` row (facilities by group, spoken languages, review-score breakdown, bed-comfort score, child policy, photos, lowest rate), one `room` row per room type (size, beds, max guests, facilities, photos) and one `rate` row per offer (meal plan, occupancy, price, discount, cancellation policy, prepayment, rooms left) |
| **Reviews** | Property URLs or ids | One `review` row per guest review: score, title, liked / disliked text, date, guest name, country and type, room, nights, hotel reply — sorted and filtered like the site (newest, by score, families, couples, language) |
| **Calendar** | Property URLs or ids, start date, days ahead | One `calendar` row per day: available or not, lowest average nightly price, minimum stay — up to 365 days |

- **Real prices for real dates** in the currency you choose and in the hotel's own, with taxes and fees marked the way Booking shows them, crossed-out prices, discount percentages and deal badges.
- **Every rate of every room**: breakfast included or its price, free cancellation deadline, non-refundable flags, pay-now or pay-at-property, "only 2 left", Genius rates.
- **Any destination**: cities, regions, districts, landmarks, airports — resolved from free text like the site's search box — or Booking.com search URLs with your own filters, several per run.
- **Booking's own sorting and filters**: top picks, price, best reviewed, stars, distance; property types, minimum stars and score, free cancellation, breakfast, price band, any raw `nflt` string.
- **Review scores that mean something**: staff, facilities, cleanliness, comfort, value, location and Wi-Fi scores with the city's average band next to each.
- **Pure HTTP**: no headless browser, so a run of 100 properties finishes in seconds.

### What data can Booking.com Hotels Scraper extract?

#### Property (search and hotel rows)

| Field | Example |
|---|---|
| `name`, `propertyType`, `stars`, `hotelId`, `url`, `urlWithDates` | The Magani Hotel and Spa · Hotel · 5 · 402556 · property page · page opened on your dates |
| `reviewScore`, `reviewScoreWord`, `reviewCount` | 9.1 · Wonderful · 1,616 |
| `address`, `city`, `area`, `countryCode`, `latitude`, `longitude`, `distanceFromCentre` | Jl. Dewi Sartika · Kuta · Legian · ID · -8.7154 · 115.1717 · 1.2 km from centre |
| `checkin`, `checkout`, `nights`, `adults`, `children`, `rooms` | 2026-10-10 · 2026-10-12 · 2 · 2 · 0 · 1 |
| `priceTotal`, `pricePerNight`, `currency`, `priceBeforeDiscount`, `discountPercent`, `priceBadges` | 267.67 · 133.83 · USD · 334.58 · 20 · \["20% off", "Late Escape Deal"] |
| `hotelCurrency`, `priceTotalHotelCurrency`, `chargesInfo` | IDR · 4,720,000 · Includes taxes and fees |
| `roomName`, `roomBeds`, `breakfastIncluded`, `freeCancellationUntil`, `roomsLeft` | Deluxe Room Double Bed · 1 extra-large double bed · false · 2026-09-19T17:00:00Z · 2 |
| `soldOut`, `isNew`, `isSustainable`, `wishlistCount`, `photo`, `summary` | false · false · true · 120 · main photo · "The Magani Hotel and Spa (Hotel, 5★), Kuta — USD 268 for 2 nights, rated 9.1/10 by 1616 guests" |
| Hotel rows add: `facilities`, `facilitiesByGroup`, `spokenLanguages`, `ratingScores`, `bedComfortScore`, `childPolicy`, `roomTypesCount`, `ratesCount`, `lowestRateTotal`, `lowestRatePerNight`, `photos` | 90 facilities · {"Food & Drink": \[...]} · \["en", "id"] · {staff: {score: 9.7, cityAverageLow: 8.1, cityAverageHigh: 9.9}, …} · 9.2 · {allowChildren: true, rules: \[...]} · 13 · 19 · 267.67 · 133.83 · 16 photos |

#### Room and rate rows (hotel mode, or search with rooms on)

Room: `roomId`, `roomName`, `roomDescription`, `sizeM2`, `beds`, `bedConfigurations`, `maxGuests`, `maxChildren`, `bathrooms`, `extraBeds`, `cribsAvailableForFree`, `roomFacilities`, `roomHighlights`, `photos`, `ratesCount`, `lowestPricePerNight`.
Rate: `roomName`, `blockId`, `mealPlan`, `breakfastIncluded`, `breakfastPrice`, `occupancy`, `maxAdults`, `priceTotal`, `pricePerNight`, `priceBeforeDiscount`, `discountPercent`, `discounts`, `priceBadges`, `hotelCurrency`, `priceTotalHotelCurrency`, `cancellationPolicy`, `cancellationDetails`, `freeCancellation`, `refundable`, `prepayment`, `prepaymentDetails`, `noCreditCardNeeded`, `roomsAvailableAtThisPrice`, `isGeniusRate`.

#### Review rows

`score`, `title`, `positive`, `negative`, `language`, `reviewedAt`, `guestName`, `guestCountry`, `guestType`, `roomName`, `nights`, `checkin`, `checkout`, `helpfulVotes`, `hotelReply`, `photos`, `reviewUrl`.

#### Calendar rows

`date`, `available`, `avgPricePerNight`, `currency`, `minLengthOfStay`.

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

The Actor uses Apify's **pay-per-event** pricing: you pay per row and nothing per run, per page or per proxy megabyte. Error rows are never charged.

| Event | Price | Per 1,000 |
|---|---|---|
| Property row (search result with price, matched room, rating, location, photo) | $0.003 | **$3** |
| Hotel row (facilities, score breakdown, child policy, photos, lowest rate) | $0.008 | **$8** |
| Room row (room type with size, beds, facilities, photos) | $0.001 | **$1** |
| Rate row (one offer with price, meal plan and cancellation policy) | $0.002 | **$2** |
| Review row | $0.002 | **$2** |
| Calendar day | $0.0005 | **$0.50** |

A page of 25 properties costs $0.075; one hotel with 13 rooms and 19 rates costs about $0.06; 100 reviews cost $0.20; a year of daily prices costs $0.18. Platform usage is negligible — no browser, about 90 KB per search page. The **Apify Free plan** ($5 monthly credit) covers roughly 1,600 property rows a month. Bronze, Silver and Gold Store tiers get a discount on top.

### How to scrape Booking.com

1. Open the Actor and choose **What to get**: Search, Hotel, Reviews or Calendar.
2. For a search, type the **Destination** — city, region, district or landmark, as you would on Booking.com — or paste **search URLs** under Advanced settings. For the other modes paste **Hotel URLs** or ids.
3. Set **Check-in** and **Check-out** (or leave them empty for a two-night stay a month from now), **Adults**, **Children's ages**, **Rooms** and **Currency**.
4. Pick **Sort by** and any **Filters**; switch on **rooms and rates** or **facilities and scores** to enrich search results.
5. Click **Start**. Rows appear in the **Properties**, **Rooms**, **Rates**, **Reviews** and **Calendar** table views.
6. Download JSON, CSV or Excel, or read the dataset through the API.

### ⬇️ Input

#### Hotels in Bali, cheapest first, rated 8+

```json
{ "mode": "search", "destination": "Bali", "checkin": "2026-10-10", "checkout": "2026-10-12", "adults": 2, "currency": "USD", "sortBy": "price", "propertyTypes": ["hotel", "villa"], "minReviewScore": 8, "maxResults": 100 }
```

#### Family of four in Paris, four stars, free cancellation, under €300 a night

```json
{ "mode": "search", "destination": "Paris", "checkin": "2026-11-05", "checkout": "2026-11-08", "adults": 2, "childrenAges": ["6", "12"], "currency": "EUR", "minStars": 4, "freeCancellationOnly": true, "maxPricePerNight": 300, "sortBy": "review_score" }
```

#### Search with every room and rate of the first 20 properties

```json
{ "mode": "search", "destination": "Canggu", "checkin": "2026-10-10", "checkout": "2026-10-12", "includeRooms": true, "includeHotelDetails": true, "maxHotelsToEnrich": 20, "maxResults": 50 }
```

#### One property in full: rooms, rates, facilities, scores

```json
{ "mode": "hotel", "hotelUrls": ["https://www.booking.com/hotel/id/the-magani-amp-spa.html"], "checkin": "2026-10-10", "checkout": "2026-10-12", "adults": 2, "currency": "USD" }
```

#### The newest 200 reviews of a property, families only

```json
{ "mode": "reviews", "hotelUrls": ["https://www.booking.com/hotel/id/the-magani-amp-spa.html"], "reviewsSortBy": "newest", "reviewsGuestType": "FAMILIES", "maxReviewsPerHotel": 200 }
```

#### Nightly prices for the next 180 days

```json
{ "mode": "calendar", "hotelUrls": ["402556"], "checkin": "2026-09-10", "calendarDays": 180, "adults": 2, "currency": "USD" }
```

#### Paste search URLs from the site (dates, guests, sorting and filters are read from the URL)

```json
{ "startUrls": ["https://www.booking.com/searchresults.html?ss=Canggu&checkin=2026-10-10&checkout=2026-10-13&group_adults=2&no_rooms=1&order=price&nflt=ht_id%3D213%3Bclass%3D4"], "currency": "USD", "maxResults": 300 }
```

| Field | Description |
|---|---|
| `mode` | `search` (default), `hotel`, `reviews`, `calendar` |
| `destination` / `startUrls` | Free text resolved like the site's search box, or Booking.com search-result URLs (`ss`, `dest_id`, dates, guests, `order`, `nflt` are read from each) |
| `hotelUrls` | Property URLs or numeric ids for hotel, reviews and calendar modes |
| `checkin`, `checkout` | `YYYY-MM-DD`; default is a two-night stay 30 days from today; calendar mode counts from `checkin` |
| `adults`, `childrenAges`, `rooms` | Occupancy; children's ages change the price |
| `currency`, `language` | ISO currency; Booking locale for labels (`en-us`, `de`, `fr`, `ru`…) |
| `sortBy` | `top_picks`, `price`, `review_score`, `stars`, `distance`, `popularity` |
| `propertyTypes`, `minStars`, `minReviewScore`, `freeCancellationOnly`, `breakfastIncluded`, `minPricePerNight`, `maxPricePerNight`, `rawFilters` | The sidebar filters plus any `nflt` string |
| `includeRooms`, `includeHotelDetails`, `maxHotelsToEnrich` | Enrich the first N search results with rooms and rates / facilities and scores ($) |
| `reviewsSortBy`, `reviewsGuestType`, `reviewsLanguage`, `maxReviewsPerHotel` | Reviews mode: `most_relevant`, `newest`, `oldest`, `highest_score`, `lowest_score`; `ALL`, `FAMILIES`, `COUPLES`, `GROUP_OF_FRIENDS`, `SOLO_TRAVELLERS`, `BUSINESS_TRAVELLERS`; language code; count |
| `calendarDays` | Calendar mode: days ahead, up to 365 |
| `maxResults` | Per run; Booking serves at most 1,000 properties per search |

### ⬆️ Output

#### Property (search)

```json
{
    "type": "property",
    "hotelId": 402556,
    "name": "The Magani Hotel and Spa",
    "url": "https://www.booking.com/hotel/id/the-magani-amp-spa.html",
    "urlWithDates": "https://www.booking.com/hotel/id/the-magani-amp-spa.html?checkin=2026-10-10&checkout=2026-10-12&group_adults=2&no_rooms=1&group_children=0&selected_currency=USD",
    "propertyType": "Hotel", "propertyTypeId": 204, "stars": 5,
    "reviewScore": 9.1, "reviewCount": 1616, "reviewScoreWord": "Wonderful",
    "address": "Jl. Dewi Sartika, Kuta", "city": "Kuta", "area": "Legian", "countryCode": "ID", "latitude": -8.7154, "longitude": 115.1717, "distanceFromCentre": null,
    "checkin": "2026-10-10", "checkout": "2026-10-12", "nights": 2, "adults": 2, "children": 0, "rooms": 1,
    "currency": "USD", "priceTotal": 267.67, "pricePerNight": 133.83, "priceTotalText": "US$267.67", "priceBeforeDiscount": 334.58, "discountPercent": 20,
    "hotelCurrency": "IDR", "priceTotalHotelCurrency": 4720000, "chargesInfo": "Includes taxes and fees", "taxesAndFeesExcluded": [], "priceBadges": ["20% off", "Late Escape Deal"],
    "roomName": "Deluxe Room Double Bed", "roomBeds": "1 extra-large double bed", "breakfastIncluded": false, "mealPlan": null, "freeCancellationUntil": "2026-09-19T17:00:00Z", "roomsLeft": 2,
    "soldOut": false, "isNew": false, "isSustainable": true, "wishlistCount": 120,
    "photo": "https://cf.bstatic.com/xdata/images/hotel/max1024x768/117209532.jpg?k=…",
    "destination": "Bali, Indonesia", "destinationId": 835, "destinationType": "REGION", "position": 1, "page": 1,
    "summary": "The Magani Hotel and Spa (Hotel, 5★), Kuta — USD 268 for 2 nights, rated 9.1/10 by 1616 guests",
    "scrapedAt": "2026-09-06T14:00:00.000Z"
}
```

#### Hotel, room and rate (hotel mode)

```json
{ "type": "hotel", "hotelId": 402556, "name": "The Magani Hotel and Spa", "stars": 5, "reviewScore": 9.1, "reviewCount": 1616,
  "facilities": ["Outdoor swimming pool (free)", "Airport shuttle (paid)", "Air conditioning (free)", "Spa", "Restaurant", "…"],
  "facilitiesByGroup": { "General": ["Air conditioning", "Elevator"], "Food & Drink": ["Restaurant", "Bar"], "Activities": ["Spa", "Massage"] },
  "spokenLanguages": ["en", "id"],
  "ratingScores": { "staff": { "label": "Staff", "score": 9.7, "cityAverageLow": 8.1, "cityAverageHigh": 9.9 }, "clean": { "label": "Cleanliness", "score": 9.5 }, "location": { "label": "Location", "score": 9.6 }, "value": { "label": "Value for money", "score": 9.0 } },
  "bedComfortScore": 9.2, "childPolicy": { "allowChildren": true, "allowCribs": true, "allowExtraBeds": true, "rules": [{ "ageFrom": 0, "ageTo": 5, "price": "Rp 0", "type": "CRIB" }] },
  "roomTypesCount": 13, "ratesCount": 19, "lowestRateTotal": 267.67, "lowestRatePerNight": 133.83, "photos": ["https://cf.bstatic.com/xdata/images/hotel/max1024x768/117209532.jpg?k=…"] }
```

```json
{ "type": "room", "hotelId": 402556, "hotelName": "The Magani Hotel and Spa", "roomId": 40255601, "roomName": "Deluxe Room Double Bed",
  "roomDescription": "Modern room with a flat-screen TV, mini-bar and tea/coffee-making facilities. Balcony offers garden view.",
  "sizeM2": 43, "beds": "1 extra-large double bed", "maxGuests": 2, "maxChildren": 1, "bathrooms": 1, "extraBeds": 1, "cribsAvailableForFree": true,
  "roomFacilities": ["Shower", "Balcony", "Air conditioning", "Safety deposit box", "Flat-screen TV", "Minibar"], "roomHighlights": ["Balcony", "Air conditioning", "Private bathroom"],
  "photos": ["https://cf.bstatic.com/xdata/images/hotel/max1024x768/117209532.jpg?k=…"], "ratesCount": 4, "lowestPricePerNight": 133.83, "currency": "USD" }
```

```json
{ "type": "rate", "hotelId": 402556, "hotelName": "The Magani Hotel and Spa", "roomId": 40255601, "roomName": "Deluxe Room Double Bed", "blockId": "40255601_88839597_2_2_0_190046",
  "checkin": "2026-10-10", "checkout": "2026-10-12", "nights": 2, "occupancy": 2, "maxAdults": 2,
  "mealPlan": "BREAKFAST_EXCLUDED", "breakfastIncluded": false, "breakfastPrice": "US$12",
  "currency": "USD", "priceTotal": 267.67, "pricePerNight": 133.83, "priceBeforeDiscount": 334.58, "discountPercent": 20,
  "discounts": [{ "name": "Late Escape Deal", "amount": 66.92, "description": "This property is offering a discount on select stays between Oct 1, 2026 and Jan 7, 2027." }], "priceBadges": ["20% off", "Late Escape Deal"],
  "hotelCurrency": "IDR", "priceTotalHotelCurrency": 4720000,
  "cancellationPolicy": "Free cancellation before September 19, 2026", "cancellationDetails": "You can cancel for free until 21 days before arrival…", "cancellationType": "free_cancellation", "freeCancellation": true, "refundable": true,
  "prepayment": "Pay the property before arrival", "prepaymentDetails": "You'll be charged a prepayment of the total price of the reservation within 21 days of arrival.", "noCreditCardNeeded": false,
  "roomsAvailableAtThisPrice": 2, "isGeniusRate": false }
```

#### Review

```json
{ "type": "review", "hotelId": 402556, "hotelName": "The Magani Hotel and Spa", "reviewId": "0b57bb5f033c3498", "score": 10, "title": "Amazing hotel - we will always come back and stay",
  "positive": "We love the Magani, it's the best hotel so close to everything and everyone is so lovely…", "negative": "Our room near the lane was noisier this time.", "language": "en", "reviewedAt": "2026-09-03",
  "guestName": "Carly", "guestCountry": "AU", "guestCountryName": "Australia", "guestType": "Family", "roomName": "Deluxe Room Double Bed", "nights": 7, "checkin": "2026-08-20", "checkout": "2026-08-27",
  "helpfulVotes": 0, "hotelReply": "Dear Carly, thank you for taking the time to share your feedback…", "photos": [] }
```

#### Calendar day

```json
{ "type": "calendar", "hotelId": 402556, "hotelName": "The Magani Hotel and Spa", "date": "2026-10-10", "available": true, "avgPricePerNight": 176, "currency": "USD", "minLengthOfStay": 1, "adults": 2, "children": 0, "rooms": 1 }
```

Prices are what a logged-out visitor sees in the selected currency for the exact dates and occupancy; Genius member prices are not applied. `priceTotal` is the amount Booking displays for the stay, with `chargesInfo` saying whether taxes and fees are inside it.

### Use cases for Booking.com data

#### Rate shopping and revenue management

Hotel mode every morning for your property and its competitive set: every room and rate with meal plan and cancellation terms, plus the calendar of nightly prices up to a year ahead — the data behind a rate grid, without the licensed feed.

#### Travel agencies and quotes

A search returns priced, bookable options sorted the way the client thinks — cheapest, best reviewed, closest to the centre — with the link that opens each property on the right dates; hotel mode gives the rooms to choose from.

#### Price tracking and deal alerts

Schedule a search and alert when `pricePerNight` drops or `priceBadges` gains a deal label; `roomsLeft` and `roomsAvailableAtThisPrice` say how urgent it is.

#### Review analysis and reputation

Reviews mode with `newest` and a guest-type filter feeds sentiment dashboards; `ratingScores` on hotel rows benchmark a property against its city on staff, cleanliness, location and value.

#### Market research and investment

Count properties by type and stars in a district, read the distribution of scores and prices, map them with coordinates, and read facilities to see what the market offers.

#### AI agents and chatbots

Every property row carries a ready `summary`; an agent answers "a good hotel in Seminyak under $100 next weekend with free cancellation" from one search, then opens hotel mode for the rooms and hands over `urlWithDates`.

### Integrations and Booking.com API

Run the Actor from the [Apify API](https://docs.apify.com/api/v2) or the JavaScript and Python clients, on a schedule, and connect it to n8n, Make, Zapier, Google Sheets, Slack, Airtable or webhooks through Apify integrations.

```bash
curl -X POST "https://api.apify.com/v2/acts/lergassy~booking-hotels-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "mode": "search", "destination": "Bali", "checkin": "2026-10-10", "checkout": "2026-10-12", "sortBy": "price", "maxResults": 50 }'
```

```python
from apify_client import ApifyClient
client = ApifyClient("YOUR_TOKEN")
run = client.actor("lergassy/booking-hotels-scraper").call(run_input={"mode": "hotel", "hotelUrls": ["https://www.booking.com/hotel/id/the-magani-amp-spa.html"], "checkin": "2026-10-10", "checkout": "2026-10-12"})
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
    if row["type"] == "rate":
        print(row["roomName"], row["mealPlan"], row["pricePerNight"], row["cancellationPolicy"])
```

#### Use it from Claude, Cursor or any MCP agent

Connect the [Apify MCP server](https://mcp.apify.com) and let the agent call `lergassy/booking-hotels-scraper` — the modes map onto natural questions (search → "what does a hotel in X cost", hotel → "which rooms does it have and can I cancel", reviews → "what do guests say", calendar → "when is it cheapest").

### 🤖 For AI Agents & LLM Apps

Compact reference for agents calling this Actor through the [Apify MCP server](https://mcp.apify.com) or the Apify API (`lergassy/booking-hotels-scraper`).

**Purpose:** Booking.com data in four modes — `search` (priced properties for a destination and dates), `hotel` (all rooms and rates, facilities, review-score breakdown, child policy of one property), `reviews` (guest reviews), `calendar` (nightly prices ahead). Use it to answer "what does a hotel in X cost on these dates", "find a 4-star with free cancellation under Y", "which rooms does hotel Z have and what do they cost", "what do guests say about Z", "when is Z cheapest".

**Minimal inputs:**

```json
{ "mode": "search", "destination": "Bali", "checkin": "2026-10-10", "checkout": "2026-10-12", "adults": 2, "currency": "USD" }
{ "mode": "hotel", "hotelUrls": ["https://www.booking.com/hotel/id/the-magani-amp-spa.html"], "checkin": "2026-10-10", "checkout": "2026-10-12" }
{ "mode": "reviews", "hotelUrls": ["402556"], "maxReviewsPerHotel": 50 }
{ "mode": "calendar", "hotelUrls": ["402556"], "checkin": "2026-10-01", "calendarDays": 90 }
```

**Output:** rows typed by `type`. `property`: `hotelId`, `name`, `url`, `urlWithDates`, `propertyType`, `stars`, `reviewScore`, `reviewScoreWord`, `reviewCount`, `address`, `city`, `countryCode`, `latitude`, `longitude`, `distanceFromCentre`, `checkin`, `checkout`, `nights`, `currency`, `priceTotal`, `pricePerNight`, `priceBeforeDiscount`, `discountPercent`, `priceBadges`, `roomName`, `roomBeds`, `breakfastIncluded`, `freeCancellationUntil`, `roomsLeft`, `soldOut`, `photo`, `summary`. `hotel`: the same plus `facilities`, `facilitiesByGroup`, `spokenLanguages`, `ratingScores`, `bedComfortScore`, `childPolicy`, `roomTypesCount`, `ratesCount`, `lowestRatePerNight`, `photos`. `room`: `roomId`, `roomName`, `roomDescription`, `sizeM2`, `beds`, `maxGuests`, `roomFacilities`, `photos`, `lowestPricePerNight`. `rate`: `roomName`, `mealPlan`, `breakfastIncluded`, `occupancy`, `priceTotal`, `pricePerNight`, `discountPercent`, `cancellationPolicy`, `freeCancellation`, `refundable`, `prepayment`, `roomsAvailableAtThisPrice`. `review`: `score`, `title`, `positive`, `negative`, `reviewedAt`, `guestName`, `guestCountry`, `guestType`, `roomName`, `nights`, `hotelReply`. `calendar`: `date`, `available`, `avgPricePerNight`, `minLengthOfStay`.

**Behaviors an agent should know:**

- Dates are required for prices; without them the Actor searches a two-night stay 30 days ahead. Always pass the user's real dates and party.
- `destination` is resolved like the site's search box; `hotelUrls` accept property URLs or the numeric `hotelId` from any row — chain search → hotel → reviews with it.
- **Quote `summary`** for a sentence, `pricePerNight` and `priceTotal` for numbers, and hand the user `urlWithDates` to book. For "can I cancel" read `rate.cancellationPolicy` and `freeCancellation`, not the property row alone.
- `sortBy: "price"` gives the cheapest first; `minReviewScore` and `minStars` are the fastest way to shrink a big destination. Booking never serves more than 1,000 properties per search — narrow with filters instead of raising `maxResults`.
- `ratingScores` carries the city average band next to each score — say "cleanliness 9.5, above the Kuta average" rather than the bare number.
- Rows are a snapshot at run time; prices on Booking.com move by the hour, and reviews mode returns 25 per page.

### ❓ FAQ

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

The Actor reads only public data that Booking.com shows to every visitor — listings, prices, facilities and published reviews. Reviews carry the guest's first name and country as displayed; treat them as personal data under your local law. Respect the site's terms for commercial use and consult a lawyer if unsure.

#### Does Booking.com have a public API?

Only for approved affiliates and connectivity partners. This Actor is a **Booking.com API alternative** built on the site's public endpoints.

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

Yes — start runs, pass input and read the dataset with any HTTP client or the official JavaScript and Python clients. See the snippets above.

#### Can I use it through an MCP server?

Yes. Add the Apify MCP server to Claude, Cursor, ChatGPT or your own agent and call `lergassy/booking-hotels-scraper`.

#### Can I integrate it with other apps?

Yes — n8n, Make, Zapier, Google Sheets, Slack, Airtable and webhooks through Apify integrations, or a scheduled run that posts the dataset anywhere.

#### Why do prices differ from what I see when logged in?

Booking shows Genius members and app users lower prices. The Actor returns the public, logged-out price in your currency — the same number everybody sees before signing in. Rates reserved for members are flagged `isGeniusRate`.

#### How do I get all rooms and rates of a hotel?

Use **hotel** mode with the property URL, or switch on **Add every room and rate** in a search. Each rate row is one bookable offer: room × meal plan × cancellation policy, with its own price.

#### Can I get more than 1,000 properties for a destination?

Not in one search — Booking stops at 1,000. Split the destination into districts or run several searches with different filters (stars, property types, price bands) and de-duplicate on `hotelId`.

#### How far ahead does the calendar go?

Up to 365 days from the start date, in blocks of 61 days as the site loads them. Days with `available: false` have no price.

#### Do I need proxies?

Apify datacenter proxies are on by default and are enough for most runs. If a run ends with `bot-check` error rows, switch the proxy setting to **Residential** — a search page transfers about 90 KB, a hotel with rooms about 250 KB, so the cost stays negligible.

#### What happens on an error?

The Actor writes an `error` row with the destination, dates, filters or hotel instead of failing silently, and you are not charged for it.

### Your feedback

Need a field or a mode that is not here — availability by room over a date range, host and company details, more markets? Open an issue in the **Issues** tab. If the data saved you money or time, a review helps other travellers find it.

### You might also like

| Actor | What it does |
|---|---|
| [Agoda Reviews Scraper](https://apify.com/lergassy/agoda-reviews-scraper) | Hotel reviews from Agoda, including the Booking.com reviews shown on Agoda |
| [Trip.com Scraper](https://apify.com/lergassy/tripcom-scraper) | Hotels with prices, details and guest reviews from Trip.com |
| [Google Flights Scraper](https://apify.com/lergassy/google-flights-scraper) | Flight prices, price calendars and booking links from Google Flights |
| [Tennis Scores & Stats API](https://apify.com/lergassy/tennis-scores-api) | Live tennis scores, statistics, odds and rankings for every tour |
| [Email & Phone Verifier](https://apify.com/lergassy/email-phone-verifier) | Checks e-mails and phone numbers in bulk: deliverability, disposable and role flags, numbering plan |

# Actor input Schema

## `mode` (type: `string`):

<b>Search</b> — properties for a destination and dates with prices. <b>Hotel</b> — one property in full: every room and rate for your dates, facilities, review scores, photos, child policy. <b>Reviews</b> — guest reviews of a property. <b>Calendar</b> — the price of every day ahead for a property.

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

City, region, landmark or hotel name as you would type it on Booking.com, e.g. <code>Bali</code>, <code>Paris</code>, <code>Canggu</code>. Leave empty and paste search URLs below instead.

## `hotelUrls` (type: `array`):

Booking.com property pages, e.g. <code>https://www.booking.com/hotel/id/the-magani-amp-spa.html</code>, or numeric hotel ids from the <code>hotelId</code> field of search rows.

## `checkin` (type: `string`):

<code>YYYY-MM-DD</code>. Prices exist only for concrete dates; leave empty for a stay 30 days from today.

## `checkout` (type: `string`):

<code>YYYY-MM-DD</code>. Leave empty for two nights.

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

Guests aged 18 and over, across all rooms.

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

One age per child, e.g. <code>6</code>, <code>12</code>. Child prices and free-stay rules depend on age.

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

Number of rooms.

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

ISO code for prices: <code>USD</code>, <code>EUR</code>, <code>IDR</code>, <code>GBP</code>, <code>AUD</code>… Every row also carries the price in the hotel's own currency.

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

Booking.com's own orderings.

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

Per run, across all destinations and URLs. Booking.com serves at most 1,000 properties per search — narrow with filters to reach the rest.

## `includeRooms` (type: `boolean`):

For the first properties of the search (see the cap below), fetch the full room list with all rates, cancellation policies and meal plans — the same rows as Hotel mode. One extra request per property.

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

For the first properties of the search, fetch the facilities list, spoken languages and the review score breakdown (staff, cleanliness, location, value…). Two extra requests per property.

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

How many search results get rooms / details when the options above are on.

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

Keep only these kinds of places. Empty = everything.

## `minStars` (type: `integer`):

1–5. Keeps properties with this star class or higher.

## `minReviewScore` (type: `number`):

Guest score on Booking.com's 10-point scale: <code>8</code> for Very good, <code>9</code> for Wonderful.

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

Only rooms that can be cancelled for free.

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

Only rates with breakfast.

## `minPricePerNight` (type: `number`):

In the selected currency.

## `maxPricePerNight` (type: `number`):

In the selected currency.

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

Any filter string from a Booking.com URL's <code>nflt</code> parameter, e.g. <code>hotelfacility=4;roomfacility=11</code> (pool, air conditioning). Combined with the filters above.

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

Reviews mode.

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

Keep only reviews from this kind of guest.

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

Two-letter code to keep only reviews written in that language, e.g. <code>en</code>, <code>de</code>, <code>ru</code>. Empty = all languages.

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

Newest, most relevant or by score depending on the order; Booking serves 25 per page.

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

Calendar mode: how many days from the check-in date to price (up to 365). One request per 61 days.

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

Paste search-result URLs from the site with your own dates, guests, sorting and filters — each becomes a search. Used together with or instead of <b>Destination</b>.

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

Booking.com <code>dest\_id</code> when you already know it (skips the name lookup). Needs <b>Destination type</b>.

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

<code>city</code>, <code>region</code>, <code>district</code>, <code>landmark</code>, <code>airport</code>, <code>hotel</code> or <code>country</code> — the <code>dest\_type</code> that goes with the id.

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

Language of names, room titles and labels, as a Booking.com locale: <code>en-us</code>, <code>en-gb</code>, <code>de</code>, <code>fr</code>, <code>es</code>, <code>ru</code>, <code>id</code>…

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

Apify datacenter proxies by default. If runs end with <code>bot-check</code> error rows, switch to <b>Residential</b> — a page of 25 properties transfers about 90 KB.

## Actor input object example

```json
{
  "mode": "search",
  "destination": "Bali",
  "adults": 2,
  "rooms": 1,
  "currency": "USD",
  "sortBy": "top_picks",
  "maxResults": 100,
  "includeRooms": false,
  "includeHotelDetails": false,
  "maxHotelsToEnrich": 20,
  "freeCancellationOnly": false,
  "breakfastIncluded": false,
  "reviewsSortBy": "most_relevant",
  "reviewsGuestType": "ALL",
  "maxReviewsPerHotel": 100,
  "calendarDays": 90,
  "language": "en-us",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `properties` (type: `string`):

One flat row per property: name, type, stars, guest score and review count, address and coordinates, total and per-night price for the stay in your currency and the hotel's, discount, matched room and beds, breakfast, free-cancellation deadline, rooms left, photo, one-sentence summary.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "destination": "Bali"
};

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

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

```

## MCP server setup

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