# Booking.com Scraper - Hotels, Reviews, Prices & Availability (`factden/booking-com-scraper`) Actor

Scrape Booking.com hotels for any destination or hotel: guest reviews (incl. rating-only), live prices, room rates, availability and occupancy, plus a forward availability calendar. Search a city or country, or paste hotel links. Structured JSON/CSV, no code, no login.

- **URL**: https://apify.com/factden/booking-com-scraper.md
- **Developed by:** [Factden](https://apify.com/factden) (community)
- **Categories:** Travel, E-commerce, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 4 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $0.002 / hotel

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

**Scrape Booking.com hotels at scale** — guest **reviews** (including rating-only), live **prices**, per-room **rates**, **availability & occupancy** (rooms left, sold-out), and a forward **availability calendar**. Search a whole city or country, or paste hotel links, and get clean **JSON, CSV or Excel** — no code, no login, no Booking.com account.

**▶ Watch the walkthrough:** https://www.youtube.com/watch?v=mxaye6x1E8U

![Input form](https://raw.githubusercontent.com/factden/apify-actor-assets/main/booking-com-scraper/01-input-form.png)

### What does Booking.com Scraper do?

**Booking.com Scraper** turns any [Booking.com](https://www.booking.com) destination or hotel into structured data. Give it a **place** (`Rome`, `Bali`, `Germany`) to discover every hotel there, an **exact hotel name**, or **Booking.com links**, and it returns one clean row per hotel plus separate datasets for reviews and availability. It runs on the [Apify platform](https://apify.com), so you get API access, scheduling, proxy rotation, storage, and integrations (Make, Zapier, n8n, Google Sheets) out of the box.

Four things it extracts, each toggle-able:

- **Prices & occupancy** (on by default) — gross / net / per-night price, per-room rates, rooms left, sold-out rooms, scarcity ("We have 2 left").
- **Guest reviews** — score, positive/negative text, reviewer country, traveller type, stay date, room type, and the hotel's reply. Includes **rating-only** reviews (a score with no text).
- **Availability calendar** — a forward day-by-day calendar of price and availability.
- **Discovery** — expand a city/region/country into all of its hotels.

### What data can I extract from Booking.com?

The actor writes to four datasets so each record type stays clean and tabular:

| Dataset | One row per | Key fields |
|---|---|---|
| **Hotels** (default) | hotel | `hotelId`, `hotelName`, `stars`, `reviewScore`, `reviewCount`, `perNightPrice`, `grossPrice`, `netPrice`, `currency`, `availableRooms`, `scarcityMessage`, `rooms[]`, `city`, `country`, `latitude`, `longitude`, `url`, `markdownContent` |
| **Reviews** | guest review | `score` (0-10), `title`, `reviewText`, `textPositive`, `textNegative`, `reviewerName`, `reviewerCountryCode`, `travellerType`, `roomType`, `stayDate`, `stayNights`, `publishedAt`, `hotelierResponse`, `isRatingOnly` |
| **Calendar** | day | `date`, `available`, `minPrice`, `currency`, `lengthOfStay` |
| **Rooms & rates** (a view of Hotels) | bookable rate | `roomName`, `rateName`, `pricePerNight`, `priceTotal`, `mealPlan`, `breakfastIncluded`, `refundable`, `freeCancellationUntil`, `maxOccupancy`, `roomSurfaceM2` |

![Hotels overview](https://raw.githubusercontent.com/factden/apify-actor-assets/main/booking-com-scraper/02-hotels-overview.png)

### What makes this different?

- **All four in one actor.** Most Booking.com tools do reviews *or* prices *or* discovery. This one does discovery + prices + occupancy + reviews + calendar in a single run.
- **Search a place, get every hotel.** The `searchLocation` field expands a city/region/country into all its hotels — you don't need to paste URLs.
- **Complete reviews, including rating-only.** No 500-review cap; it returns every written review plus the score-only ones other scrapers drop.
- **Per-room rate matrix.** A "Rooms & rates" view unwinds every bookable rate with its price, meal plan and cancellation terms.
- **LLM-ready.** Every hotel and review carries a `markdownContent` block for RAG / vector-DB ingestion.

### How to scrape Booking.com step by step

1. Click **Try for free** and open the input form.
2. Enter a **place** in *Discover hotels in a place* (e.g. `Rome`), or an exact **hotel name** in *searchTerms*, or paste **Booking.com links** in *startUrls*.
3. Choose what to pull: **prices & occupancy** (on by default), **reviews**, and/or the **availability calendar**.
4. (Optional) set check-in/out dates, guests, currency, language, and Min rating / price filters.
5. Click **Save & start**. When it finishes, **Export** the Hotels, Reviews and Calendar datasets as JSON, CSV, or Excel — or pull them from the API.

### Booking.com API vs this scraper

Booking.com has no public data API for hotels, prices or reviews — its Connectivity/Demand APIs are for accredited partners managing their own inventory, not for market research. This scraper gives any user structured Booking.com data with no partner accreditation, no keys, and no per-call contract: search-by-place discovery, prices, occupancy, reviews and a calendar, delivered as JSON/CSV.

### Who is it for?

Revenue managers and hotels (rate parity, comp-set pricing), OTAs and travel startups (catalog + availability), market researchers and analysts (guest sentiment, occupancy signals), and AI teams building travel assistants that need real hotel data.

### Common use cases

#### Rate shopping & comp-set pricing

Track a competitor set's per-night prices and per-room rates over time by scheduling daily runs on a fixed hotel list or a city.

#### Full-market discovery

Point `searchLocation` at a city or country to build a complete hotel catalog with scores, stars, geo and lead prices.

#### Guest-sentiment datasets

Pull every review (with text, score, traveller type, stay date and the hotel's reply) into a dataset for NLP or a RAG knowledge base.

#### Availability & occupancy monitoring

Use the availability calendar and `availableRooms` / `scarcityMessage` to watch demand and sell-out patterns across dates.

### Input

Provide at least one of these three (combine freely):

| Field | What it does |
|---|---|
| **`searchLocation`** | A city / region / country per line (`Rome`, `Bali`, `Germany`) → discovers **every** hotel there. |
| **`searchTerms`** | A destination or **hotel name** → a city's hotels, or that one hotel. Name matching works best with a clean, distinctive name; for one exact hotel every time, use a `startUrls` link instead. |
| **`startUrls`** | Booking.com hotel or search URLs (plain list **or** `[{"url": "..."}]` objects). Resolved by page slug (a stale `dest_id` in the URL is ignored). The most reliable way to target one exact hotel. |

Data toggles: **`includePrices`** (default on — price breakdown + per-room rates + occupancy), **`includeReviews`**, **`includeAvailabilityCalendar`**. Stay: `checkInDate`, `checkOutDate`, `adults`, `children`, `childrenAges`, `rooms`. Discovery filters: `maxResults`, `minGuestRating`, `minPrice`, `maxPrice`. Reviews: `maxReviews`, `reviewsSort`, `reviewLanguages`. Market: **`currency`** (25 options) and **`language`** (20 options). Plus `proxyConfiguration`.

### Output

**Hotels** (default dataset) — one flat row per hotel:

```json
{
  "hotelId": 55361,
  "hotelName": "Hotel Le Meurice",
  "city": "Nice",
  "country": "France",
  "stars": 3,
  "reviewScore": 8.6,
  "reviewCount": 497,
  "currency": "USD",
  "perNightPrice": 330.58,
  "grossPrice": 330.58,
  "availableRooms": 2,
  "scarcityMessage": "We have 2 left",
  "rooms": [
    { "roomName": "Junior Suite", "pricePerNight": 330.58, "priceTotal": 330.58,
      "mealPlan": "Continental breakfast costs $20 per person per night.",
      "breakfastIncluded": false, "refundable": false, "maxOccupancy": "2", "roomSurfaceM2": 20 }
  ],
  "url": "https://www.booking.com/hotel/fr/le-meurice.html"
}
```

![Rooms & rates](https://raw.githubusercontent.com/factden/apify-actor-assets/main/booking-com-scraper/03-rooms-and-rates.png)

**Reviews** dataset — one row per guest review (rating-only reviews included, flagged `isRatingOnly`):

```json
{
  "hotelId": 55361,
  "score": 7.2,
  "title": "Great location",
  "reviewText": "Cozy hotel in the heart of the city...",
  "reviewerName": "Biermans",
  "reviewerCountryCode": "NL",
  "travellerType": "Solo traveler",
  "roomType": "Standard Double Room",
  "stayDate": "2026-08-06",
  "stayNights": 5,
  "publishedAt": "2026-08-11T13:30:42+00:00",
  "isRatingOnly": false
}
```

![Reviews](https://raw.githubusercontent.com/factden/apify-actor-assets/main/booking-com-scraper/05-reviews.png)

**Calendar** dataset — one row per forward day: `{ "date": "2026-08-17", "available": true, "minPrice": 331, "currency": "USD" }`.

![Availability calendar](https://raw.githubusercontent.com/factden/apify-actor-assets/main/booking-com-scraper/06-calendar.png)

You can download every dataset as **JSON, CSV, Excel, HTML or XML**, or read it from the Apify API.

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

Pay-per-result, no start fee. You are charged only for what you pull:

| Event | Price / 1,000 |
|---|---|
| Hotel returned | $3.00 |
| Prices & availability (per priced hotel) | $5.00 |
| Review returned | $1.00 |
| Availability-calendar day | $0.50 |

A typical "50 hotels with prices + 20 reviews each" run costs well under a dollar. Turn off reviews or the calendar to pay only for what you need. New Apify accounts get free monthly usage credit to start.

### Run it on a schedule

Use Apify **Schedules** to run daily/weekly for price tracking or fresh reviews, and wire the dataset into **Make, Zapier, n8n, Google Sheets, or a webhook** so new data flows straight into your stack.

### AI agents & RAG

Every hotel and review row includes a self-contained **`markdownContent`** block — drop it straight into a vector DB or an LLM prompt with no reshaping. The actor is also discoverable by AI agents through the Apify MCP server.

![AI ingest](https://raw.githubusercontent.com/factden/apify-actor-assets/main/booking-com-scraper/04-ai-ingest.png)

### Data & compliance

The actor collects **publicly available** information from Booking.com. Review text may contain personal data (reviewer names) — if you store it, process it in line with GDPR/CCPA and your own legal basis. Use the data responsibly and respect Booking.com's Terms.

### Other travel & review scrapers by FactDen

- [Google Hotels Scraper](https://apify.com/factden/google-hotels-scraper) — hotel prices, OTA rate ladder and reviews from Google Hotels.
- [Expedia Hotel Reviews Scraper](https://apify.com/factden/expedia-hotel-reviews-scraper) — reviews and ratings from Expedia.
- [Hotels.com Reviews Scraper](https://apify.com/factden/hotels-com-reviews-scraper) — reviews from Hotels.com.
- [Ctrip / Trip.com Reviews Scraper](https://apify.com/factden/ctrip-trip-reviews-scraper) — reviews from Trip.com / Ctrip.
- [Agoda Hotel Reviews Scraper](https://apify.com/factden/agoda-hotel-reviews-scraper) — reviews from Agoda.
- [TripAdvisor Hotel Reviews](https://apify.com/factden/tripadvisor-hotel-reviews-api) — reviews and ratings from TripAdvisor.
- [MakeMyTrip & Goibibo Reviews Scraper](https://apify.com/factden/makemytrip-scraper) — hotel reviews & details from India's largest OTAs.
- [Airbnb Data Scraper](https://apify.com/factden/airbnb-data-scraper) — Airbnb listings, prices, availability, occupancy and reviews.

[See all FactDen actors →](https://apify.com/factden)

### FAQ

#### Does Booking.com have a reviews or prices API?

Not for the public. Booking.com's partner APIs require accreditation and are for managing your own listings. This scraper is the practical way to get Booking.com hotel, price and review data as structured JSON/CSV.

#### Can I discover all hotels in a city instead of pasting URLs?

Yes — put the city, region or country in **Discover hotels in a place** (`searchLocation`) and the actor returns every hotel there, paginated and de-duplicated.

#### Can I get all reviews for a hotel, including ones with no text?

Yes. There's no 500-review cap, and rating-only reviews (a score with no written text) are included and flagged `isRatingOnly`.

#### Can I get prices for specific dates?

Yes — set `checkInDate` / `checkOutDate` (and guests/rooms). For a multi-day view of price and availability, turn on the **availability calendar**.

#### Which currencies and languages are supported?

25 currencies (USD, EUR, GBP, INR, JPY, MYR, VND, PHP, TRY, and more) and 20 display languages.

#### Can I use it with the Apify API?

Yes — start runs and read datasets via the [Apify API](https://docs.apify.com/api/v2) or the JS/Python clients.

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

Yes — the actor is available through the Apify MCP server, so AI agents can call it directly.

#### Can I integrate it with Make, Zapier, n8n or Google Sheets?

Yes — through Apify's native integrations and webhooks.

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

Scraping publicly available data is generally lawful, but you are responsible for how you use it. Follow Booking.com's Terms and applicable data-protection law, especially for any personal data in reviews.

### Support

Found an issue or need a field the actor doesn't return yet? Open an issue on the **Issues** tab — we actively maintain this actor and take feature requests.

⭐ If this actor saves you time, a rating or bookmark on the Apify Store really helps.

### Changelog

- **2026-08-16** — Added `searchLocation` (discover all hotels in a place), 25 currencies / 20 languages, per-room rates & "Rooms & rates" view, `stayDate` / `stayNights` on reviews, Min/Max price discovery filters, and sorted availability calendar.
- **2026-08-13** — Initial release: discovery + prices + occupancy + reviews + availability calendar.

# Actor input Schema

## `searchLocation` (type: `array`):

A city, region, or country per line - e.g. `Rome`, `Bali`, `Germany`. Each is expanded into **every** hotel in that destination (paginated + de-duplicated). Always does destination discovery - it never collapses to a single hotel. Tip: use a clean place name for precision. A theme phrase like `beach hotels in Bali` still works (it resolves to the nearest matching place) but the theme word is not a filter - Booking lists the whole destination. To narrow, use the Min rating / price filters below. To target a brand or exact property, use the fields below instead.

## `searchTerms` (type: `array`):

One destination or exact hotel name per line - e.g. `Rome` (a city, expanded to its hotels) or `The Venetian Macao` (resolves to that one hotel). Hotel-name matching works best with a clean, distinctive name; a generic or padded phrase (e.g. `Hotel Le Meurice Paris`) can occasionally resolve to the wrong property, and the run log warns when the match looks off. For an exact hotel every time, paste its Booking.com URL into Start URLs below. For the 'all hotels in a location' workflow, prefer the Search location field above.

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

Booking.com hotel or search URLs, one per line - e.g. `https://www.booking.com/hotel/fr/le-meurice.html` (a hotel) or a `searchresults.html?ss=Rome` (a city). Both a plain URL list and the `[{"url": "..."}]` object form are accepted. Resolved by the page slug, so a stale `dest_id` inside the URL is ignored. The most reliable way to target one exact hotel. You get exactly those hotels (or every hotel in that destination).

## `includePrices` (type: `boolean`):

Fetch each hotel's live price breakdown (gross, net, per-night, taxes) plus availability - rooms left, sold-out rooms, and scarcity signals. Needs the check-in/out dates below (defaults to tomorrow, 1 night).

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

Fetch guest reviews for each hotel into the separate `reviews` dataset - score, positive/negative text, reviewer name & country, traveller type, stay dates, room, and the hotel's reply. Includes rating-only reviews (score with no text) too.

## `includeAvailabilityCalendar` (type: `boolean`):

Fetch a forward availability calendar per hotel into the separate `calendar` dataset - per day: available/sold-out and the minimum price. Cost scales with the number of days.

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

Only keep hotels whose price per night is at or above this (in the selected currency). Leave empty for no lower bound.

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

Only keep hotels whose price per night is at or below this. Leave empty for no upper bound.

## `minGuestRating` (type: `number`):

Only keep hotels with a guest review score at or above this (0-10 scale). 0 = no filter.

## `propertyType` (type: `string`):

Not currently applied. Booking's discovery API has no property-type filter, so results include every accommodation type regardless of this setting. Each result's actual type is in the `propertyType` output field; use Min rating and Min/Max price to narrow results reliably.

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

Stop after this many unique hotels per destination search. 0 = no cap. A small number keeps a first run fast and cheap; raise it for a full-market sweep. (Ignored for direct hotel links - those always return.)

## `checkInDate` (type: `string`):

Check-in day (YYYY-MM-DD). Prices/availability are date-scoped. **Leave both dates empty and, with prices on, the actor prices a 1-night stay for tomorrow (run date + 1), computed at run time.**

## `checkOutDate` (type: `string`):

Check-out day (YYYY-MM-DD). Must be after check-in. Leave both empty for a 1-night stay tomorrow.

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

Number of adult guests used for price quotes.

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

Number of children.

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

Age of each child (0-17), one per line. Should match the number of children above.

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

Number of rooms.

## `maxReviews` (type: `integer`):

Cap on reviews pulled per hotel (paginated, 100/page). Set 0 for all available reviews - a popular hotel can have several thousand (text reviews first, then rating-only). Pricing is per review, so this is your main review cost control.

## `reviewsSort` (type: `string`):

Order reviews are fetched in.

## `reviewLanguages` (type: `array`):

Only collect reviews written in these language codes (e.g. `en`, `de`, `fr`). Leave empty for all languages.

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

How many days of the forward availability calendar to pull per hotel (auto-chunked into 60-day windows). Availability is billed per calendar day, so cost scales with this.

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

Currency for all prices.

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

Language for hotel names, review text and labels.

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

Proxy settings. Datacenter (default) is sufficient for Booking.com at typical volumes. Switch to Residential only if you scale very hard and see throttling.

## `useResidentialFallback` (type: `boolean`):

If datacenter proxies get blocked mid-run, automatically retry the few run-critical requests on residential proxies so the run still returns results. Only used when datacenter fails, and only if your account has residential access.

## Actor input object example

```json
{
  "searchLocation": [
    "Rome"
  ],
  "includePrices": true,
  "includeReviews": false,
  "includeAvailabilityCalendar": false,
  "minGuestRating": 0,
  "propertyType": "any",
  "maxResults": 20,
  "adults": 2,
  "children": 0,
  "childrenAges": [],
  "rooms": 1,
  "maxReviews": 100,
  "reviewsSort": "newest",
  "reviewLanguages": [],
  "calendarDays": 60,
  "currency": "USD",
  "language": "en-us",
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "useResidentialFallback": true
}
```

# Actor output Schema

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

One row per hotel: name, Booking.com id, property type, star class, guest score, coordinates, price breakdown, availability/occupancy and an LLM-ready markdownContent block.

## `reviews` (type: `string`):

One row per guest review (hotel context merged on): reviewer, country, score, text, traveller type, stay date, hotelier reply and an LLM-ready markdownContent block. Populated only when Include reviews is enabled.

## `calendar` (type: `string`):

One row per hotel per calendar day: availability and minimum price. Populated only when Include availability calendar is enabled.

# 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 = {
    "searchLocation": [
        "Rome"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("factden/booking-com-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "searchLocation": ["Rome"] }

# Run the Actor and wait for it to finish
run = client.actor("factden/booking-com-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 '{
  "searchLocation": [
    "Rome"
  ]
}' |
apify call factden/booking-com-scraper --silent --output-dataset

```

## MCP server setup

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