# Booking Reviews Scraper (`mof1re/booking-reviews-scraper-browserless`) Actor

Extracts Booking.com hotel reviews via the site's own internal API — no browser needed. Full review text, guest profiles, stay details, hotel replies, and category rating breakdowns, ready to export.

- **URL**: https://apify.com/mof1re/booking-reviews-scraper-browserless.md
- **Developed by:** [Vladimir Efimenco](https://apify.com/mof1re) (community)
- **Categories:** SEO tools, Lead generation, Travel
- **Stats:** 3 total users, 2 monthly users, 96.9% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.75 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
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

## Booking Reviews Scraper | ⚡ Fast & Browserless

This Booking Reviews Scraper pulls hotel reviews straight from Booking.com's internal review API, not a headless browser. You get the full review content (positive, negative, and title) alongside guest details, stay data, and hotel-wide rating breakdowns, all in one clean dataset.

### 🎥 Video tutorial

https://www.youtube.com/watch?v=J8gS7x6UN8M

### ⚡ Why this Booking Reviews Scraper

- **Full dataset, not a summary.** Every review comes with the complete positive/negative text split, guest profile info, room and stay details, and the hotel's reply where present. Most Booking.com review scrapers give you a score and a snippet of text and stop there.
- **Bypasses Booking.com's bot protection automatically.** Booking.com puts an AWS WAF challenge in front of its pages specifically to slow down scrapers. This Booking Reviews Scraper solves that challenge on its own, on every run, so you never see a blocked request.
- **Hotel-wide rating breakdown included.** Per-category scores (cleanliness, comfort, location, and more) are attached to every review, not buried behind a separate call.
- **Flexible filtering.** Sort order and translation language match what's available on the live site, plus keyword search across the review title, positive text, and negative text at once.
- **Batch scraping.** Crawl and extract reviews for multiple hotels in a single run, with a configurable result cap per hotel or unlimited collection.
- **Proxies included.** The proxy pool is built into the price, nothing to configure.
- **Fast, no-code extraction.** No browser, no rendering wait. Pure HTTP calls to the same internal API the Booking.com frontend uses.

### 🎯 Who uses this Booking Reviews Scraper

- **Hotel operators & revenue managers** monitoring guest feedback across their own properties and reacting to recurring complaints before they hit occupancy.
- **Market researchers & hospitality analysts** studying guest sentiment, category-score trends, or seasonal patterns across a city or hotel chain.
- **Competitor analysis teams** benchmarking review scores and category ratings against rival properties to spot where they're losing on cleanliness, location, or service.
- **Data teams running sentiment analysis** feeding positive/negative review text straight into NLP pipelines for topic and trend detection.
- **Reputation monitoring tools** tracking new reviews and hotel replies over time to measure response rate and tone.

### 🧾 What you get, per review

- Review content: title, positive text, negative text, overall score, approval status
- Guest info: username, guest type, review count, country, avatar, anonymity flag, join date
- Stay details: room type, check-in/check-out dates, customer type, stay status
- Hotel reply: reply message, when the hotel responded
- Hotel-wide ratings: category-by-category score breakdown for the hotel
- Keyword match: whether and where a search term was found

### 🔧 Input options

| Field | Description |
|---|---|
| `hotelUrls` | One or more Booking.com hotel page URLs |
| `maxResults` | Max reviews to collect per hotel. Leave empty to collect all available |
| `sort` | Sort order: most relevant, newest, oldest, highest or lowest score |
| `lang` | Language reviews are auto-translated into (40+ supported) |
| `search` | Keywords to tag in reviews, matched against title, positive, and negative text |

### 📊 Data Fields

#### 📝 Review Details

| Field | Description                                                |
|---|------------------------------------------------------------|
| `hotel_url` | Hotel page URL this review belongs to                      |
| `hotel_name` | Name of the hotel                                          |
| `accommodation_type` | Type of accommodation (hotel, apartment, etc.)             |
| `review_score` | Reviewer's overall score for this stay                     |
| `review_approved` | Whether the review passed moderation                       |
| `review_title` | Review headline                                            |
| `review_positive_text` | Positive part of the review                                |
| `review_negative_text` | Negative part of the review                                |
| `review_photos` | Photos attached to review in max resolution (if available) |
| `review_reply` | Hotel's reply to the review, if any                        |

#### 👤 Guest

| Field | Description |
|---|---|
| `guest_username` | Display name of the reviewer |
| `guest_type` | Type of guest (e.g. couple, solo, family) |
| `guest_reviews` | Total number of reviews written by this guest |
| `guest_country` | Reviewer's country name |
| `guest_country_code` | Reviewer's country code |
| `guest_avatar` | URL of the reviewer's avatar image |
| `guest_anonymous` | Whether the reviewer chose to stay anonymous |
| `guest_join_date` | Date the reviewer joined |

#### 🛏️ Stay Details

| Field | Description |
|---|---|
| `booking_room` | Room type booked by the guest |
| `booking_checkin` | Check-in date of the stay |
| `booking_checkout` | Check-out date of the stay |
| `booking_customer_type` | Customer type for this booking |
| `booking_stay_status` | Status of the stay (e.g. completed) |

#### ⭐ Ratings & Matching

| Field | Description |
|---|---|
| `rating_statistics` | Hotel-wide rating breakdown by category (cleanliness, comfort, etc.). Same for every review of a given hotel |
| `keyword_match` | True if search keywords were set and at least one matched this review |
| `matched_keywords` | Map of matched keyword to the field it was found in (title, positive, or negative text) |

### 📋 Example output

```json
[
  {
    "hotel_url": "https://www.booking.com/hotel/cy/flora-apartments.ro.html",
    "hotel_name": "Flora Hotel Apartments",
    "accommodation_type": "HOTEL",
    "review_score": 9.0,
    "review_approved": true,
    "review_title": "Very enjoyable  weekend break at tha Flora Hotel Appts which was very enjoyable.",
    "review_positive_text": "This was a short two day break to Protaras for my wife’s birthday.\nMy only slight gripe was the mattresses on the beds.\nI don’t know if they were new but they were very hard.\nWe had two breakfasts and one evening meal which were all delicious\nA special shout out to all the staff who were all brilliant.\nThis was our second short stay at the Flora Hotel Appts and we will definitely be back later in the year.",
    "review_negative_text": null,
    "review_photos": null,
    "review_reply": "Thank you for choosing Flora Hotel Apartments for your wife's birthday getaway! We are thrilled to hear that you enjoyed your stay with us and found the breakfasts and evening meal delicious. Your feedback on the mattresses is greatly appreciated, and we will look into improving this for your next visit. We are grateful for your kind words about our staff; they work hard to ensure our guests have a memorable experience. We can't wait to welcome you back later this year for another enjoyable stay.",
    "guest_username": "Brian",
    "guest_type": "Couple",
    "guest_reviews": 19,
    "guest_country": "Cyprus",
    "guest_country_code": "cy",
    "guest_avatar": "https://xx.bstatic.com/static/img/review/avatars/ava-b.png",
    "guest_anonymous": false,
    "guest_join_date": "2013-06-03",
    "booking_room": "Standard Apartment",
    "booking_checkin": "2025-04-04",
    "booking_checkout": "2025-04-06",
    "booking_customer_type": "COUPLES",
    "booking_stay_status": "stayed",
    "rating_statistics": {
      "hotel_staff": {
        "rating_rounded": 9.0,
        "rating_orig": 9.00786304473877,
        "name_translated": "Staff"
      },
      "hotel_services": {
        "rating_rounded": 7.7,
        "rating_orig": 7.72118091583252,
        "name_translated": "Facilities"
      },
      "hotel_clean": {
        "rating_rounded": 8.2,
        "rating_orig": 8.20839023590088,
        "name_translated": "Cleanliness"
      },
      "hotel_comfort": {
        "rating_rounded": 8.1,
        "rating_orig": 8.10650062561035,
        "name_translated": "Comfort"
      },
      "hotel_value": {
        "rating_rounded": 8.5,
        "rating_orig": 8.52496433258057,
        "name_translated": "Value for money"
      },
      "hotel_location": {
        "rating_rounded": 9.2,
        "rating_orig": 9.24711036682129,
        "name_translated": "Location"
      },
      "hotel_free_wifi": {
        "rating_rounded": 8.5,
        "rating_orig": 8.51440048217773,
        "name_translated": "Free Wifi"
      }
    },
    "keyword_match": false,
    "matched_keywords": {}
  },
  {
    "hotel_url": "https://www.booking.com/hotel/cy/flora-apartments.ro.html",
    "hotel_name": "Flora Hotel Apartments",
    "accommodation_type": "HOTEL",
    "review_score": 9.0,
    "review_approved": true,
    "review_title": null,
    "review_positive_text": "Great location, right on top of the northern end of the strip, few minutes walk down to the beach. Room was clean, WiFi was stable, staff were polite and attentive. Would happily stay again if a cheap and cheerful place was needed.",
    "review_negative_text": null,
    "review_photos": null,
    "review_reply": "Thank you for taking the time to share your thoughts! We are thrilled to hear you enjoyed our central location, clean rooms, reliable WiFi, and our attentive staff. It's wonderful to know that you had a pleasant stay with us. We look forward to welcoming you back to Flora Hotel Apartments whenever you need a \"cheap and cheerful\" place in the area. Your kind words mean a lot to us!",
    "guest_username": "Mark",
    "guest_type": "Family",
    "guest_reviews": 14,
    "guest_country": "United Kingdom",
    "guest_country_code": "gb",
    "guest_avatar": "https://graph.facebook.com/v2.9/10157434864745648/picture?type=square&height=64&width=64",
    "guest_anonymous": false,
    "guest_join_date": "2016-09-30",
    "booking_room": "One-Bedroom Apartment",
    "booking_checkin": "2025-03-29",
    "booking_checkout": "2025-03-30",
    "booking_customer_type": "FAMILIES",
    "booking_stay_status": "stayed",
    "rating_statistics": {
      "hotel_staff": {
        "rating_rounded": 9.0,
        "rating_orig": 9.00786304473877,
        "name_translated": "Staff"
      },
      "hotel_services": {
        "rating_rounded": 7.7,
        "rating_orig": 7.72118091583252,
        "name_translated": "Facilities"
      },
      "hotel_clean": {
        "rating_rounded": 8.2,
        "rating_orig": 8.20839023590088,
        "name_translated": "Cleanliness"
      },
      "hotel_comfort": {
        "rating_rounded": 8.1,
        "rating_orig": 8.10650062561035,
        "name_translated": "Comfort"
      },
      "hotel_value": {
        "rating_rounded": 8.5,
        "rating_orig": 8.52496433258057,
        "name_translated": "Value for money"
      },
      "hotel_location": {
        "rating_rounded": 9.2,
        "rating_orig": 9.24711036682129,
        "name_translated": "Location"
      },
      "hotel_free_wifi": {
        "rating_rounded": 8.5,
        "rating_orig": 8.51440048217773,
        "name_translated": "Free Wifi"
      }
    },
    "keyword_match": false,
    "matched_keywords": {}
  },
  {
    "hotel_url": "https://www.booking.com/hotel/cy/flora-apartments.ro.html",
    "hotel_name": "Flora Hotel Apartments",
    "accommodation_type": "HOTEL",
    "review_score": 8.0,
    "review_approved": true,
    "review_title": "Nice option for a short stay",
    "review_positive_text": "Friendly staff",
    "review_negative_text": "Mattress are very hard",
    "review_reply": null,
    "guest_username": "Milos",
    "guest_type": "Solo traveler",
    "guest_reviews": 129,
    "guest_country": "United Kingdom",
    "guest_country_code": "gb",
    "guest_avatar": "https://xx.bstatic.com/static/img/review/avatars/ava-m.png",
    "guest_anonymous": false,
    "guest_join_date": "2013-03-25",
    "booking_room": "One-Bedroom Apartment with Pool View",
    "booking_checkin": "2024-09-27",
    "booking_checkout": "2024-09-30",
    "booking_customer_type": "SOLO_TRAVELLERS",
    "booking_stay_status": "stayed",
    "rating_statistics": {
      "hotel_staff": {
        "rating_rounded": 9.0,
        "rating_orig": 9.00786304473877,
        "name_translated": "Staff"
      },
      "hotel_services": {
        "rating_rounded": 7.7,
        "rating_orig": 7.72118091583252,
        "name_translated": "Facilities"
      },
      "hotel_clean": {
        "rating_rounded": 8.2,
        "rating_orig": 8.20839023590088,
        "name_translated": "Cleanliness"
      },
      "hotel_comfort": {
        "rating_rounded": 8.1,
        "rating_orig": 8.10650062561035,
        "name_translated": "Comfort"
      },
      "hotel_value": {
        "rating_rounded": 8.5,
        "rating_orig": 8.52496433258057,
        "name_translated": "Value for money"
      },
      "hotel_location": {
        "rating_rounded": 9.2,
        "rating_orig": 9.24711036682129,
        "name_translated": "Location"
      },
      "hotel_free_wifi": {
        "rating_rounded": 8.5,
        "rating_orig": 8.51440048217773,
        "name_translated": "Free Wifi"
      }
    },
    "keyword_match": false,
    "matched_keywords": {}
  }
]
```

### ❓ FAQ

**How is this different from other Booking.com review scrapers?** Most parse the rendered HTML page, which breaks every time Booking.com updates its layout, and most stop cold at Booking.com's WAF challenge. This Booking Reviews Scraper calls the internal API directly and solves the WAF challenge automatically, so it keeps working and keeps returning data.

**Does this scraper need an account or API key?** No. It extracts publicly available review data.

**How many reviews can I extract per hotel?** Up to the limit you set in `maxResults`, or all available reviews if left empty.

**Can I filter reviews by keyword?** Yes. Set the `search` field to match against the review title, positive text, and negative text at once.

**Does it work without a browser?** Yes. It calls the internal review API directly instead of rendering pages in a browser, which makes it faster and cheaper per review than browser-based crawlers.

**Can I get reviews in a specific language?** Yes. The `lang` field matches Booking.com's own review auto-translation options.

**Is this legal? Can I scrape publicly available reviews?** This tool extracts publicly available review data. You're responsible for complying with the target site's terms of service and applicable data protection laws for your use case.

**Can I use this data for competitor analysis or market research?** Yes. The hotel-wide rating breakdown and full review text make it suitable for benchmarking competitors, tracking sentiment trends, and building hospitality research datasets.

### 💳 Pricing

Pay-per-result. You're charged for reviews actually delivered, not for pages fetched or requests made.

### ⚠️ Notes

- Free-tier accounts are capped at a small sample size per run. Upgrade to a paid Apify plan for full volume.
- Data reflects what's publicly listed on Booking.com at the time of the run; the source updates continuously.

### 🔗 See also

Need a scraper for another platform? Check out:

- [Trustpilot Reviews Scraper](https://apify.com/mof1re/trustpilot-scraper-fast-browserlessapif)
- [AirBNB Reviews Scraper](https://apify.com/mof1re/airbnb-reviews-scraper-browserless)
- [TripAdvisor Reviews Scraper](https://apify.com/mof1re/tripadvisor-reviews-scraper-browserless)
- [Arbeitsagentur Scraper, Most Complete Result Dataset on Apify](https://apify.com/mof1re/arbeitsagentur-scraper)

# Actor input Schema

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

Booking.com hotel page URLs to scrape reviews from.

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

How many reviews to collect per hotel. Leave empty to get all (free-tier is capped at 50 anyway).

## `sort` (type: `string`):

Order in which reviews are fetched from Booking.

## `lang` (type: `string`):

Language Booking will auto-translate reviews into.

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

Keywords to tag/flag in reviews (does not filter them out). Every review is still returned, but each one gets marked with keyword\_match and matched\_keywords showing whether/where a keyword was found (title, positive, or negative text).

## Actor input object example

```json
{
  "hotelUrls": [
    {
      "url": "https://www.booking.com/hotel/tr/veyron-hotels-amp-spa.html"
    }
  ],
  "maxResults": 100,
  "sort": "MOST_RELEVANT",
  "lang": "en-us",
  "search": []
}
```

# Actor output Schema

## `jobAds` (type: `string`):

No description

# API

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

## JavaScript example

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

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

// Prepare Actor input
const input = {
    "hotelUrls": [
        {
            "url": "https://www.booking.com/hotel/tr/veyron-hotels-amp-spa.html"
        }
    ],
    "search": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("mof1re/booking-reviews-scraper-browserless").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 = {
    "hotelUrls": [{ "url": "https://www.booking.com/hotel/tr/veyron-hotels-amp-spa.html" }],
    "search": [],
}

# Run the Actor and wait for it to finish
run = client.actor("mof1re/booking-reviews-scraper-browserless").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "hotelUrls": [
    {
      "url": "https://www.booking.com/hotel/tr/veyron-hotels-amp-spa.html"
    }
  ],
  "search": []
}' |
apify call mof1re/booking-reviews-scraper-browserless --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/UDhuKUPpOJZuDgn0F/builds/cf5fbDyePKYYzC00n/openapi.json
