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

The Booking Reviews Scraper exports guest reviews from Booking.com hotels — scores, liked/disliked text, review and stay dates, room, traveller type, reviewer country and hotel replies, with language, keyword and date filters. Ideal for reputation monitoring and hospitality research.

- **URL**: https://apify.com/piotrv1001/booking-reviews-scraper.md
- **Developed by:** [FalconScrape](https://apify.com/piotrv1001) (community)
- **Categories:** Travel
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 reviews

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

### 🚀 Booking Reviews Scraper

Export guest reviews from any Booking.com hotel. The **Booking Reviews Scraper** gives you every review's score, title, liked and disliked text, the date it was published **and** the dates of the stay, room type, traveller type, reviewer country and the hotel's reply, all as clean structured data.

Filter by language, traveller type, keyword, score and stay dates before you pay, so a German-only export of complaints from families costs you only those reviews.

### ✨ Features

- 🏨 **Complete review data**: score, title, liked / disliked text, language, room type, nights, traveller type, reviewer country, hotel reply and helpful votes.
- 📅 **Two date axes**: `reviewedAt` (when the review was published) and `stayCheckin` / `stayCheckout` (when the guest stayed), so you can filter by either.
- 🔁 **Incremental exports**: sort by newest and set **Reviewed since** (e.g. `7 days`). The run stops as soon as it reaches older reviews, which makes it ideal for scheduled monitoring.
- 🌍 **Language and traveller filters**: collect only reviews in the languages you need, or only from families, couples, groups, solo or business travellers.
- 🔍 **Keyword, score and text filters**: find every review that mentions "breakfast", only the 1–5 scores, or skip score-only reviews.
- 📈 **Hotel category scores for free**: each run's `SUMMARY` record lists the hotel's staff, cleanliness, comfort, value, location, facilities and Wi-Fi averages.
- 🔒 **No personal data**: reviewer names and profile pictures are never exported.

### 🛠️ How It Works

1. **Add hotel URLs**: paste one or more Booking.com hotel pages (any language version works).
2. **Choose how many and which reviews**: set the maximum per hotel, a sort order and any filters.
3. **Run the scraper**: reviews land in the dataset; the `SUMMARY` record shows per-hotel coverage and category scores.

### ⚙️ Input

| Field | Description |
|---|---|
| `startUrls` | Booking.com hotel URLs, e.g. `https://www.booking.com/hotel/gb/the-savoy.html` |
| `maxReviewsPerHotel` | Stop after this many reviews per hotel (default 50) |
| `sortBy` | `newest` (default), `oldest`, `highestScore`, `lowestScore`, `mostRelevant` |
| `reviewedSince` | Only reviews published on or after this date: `2026-01-01` or relative, e.g. `30 days` |
| `stayedFrom` / `stayedTo` | Only guests whose check-in falls in this range |
| `languages` | Only reviews written in these languages |
| `travellerType` | `families`, `couples`, `groups`, `solo` or `business` |
| `keyword` | Only reviews mentioning this word |
| `minScore` / `maxScore` | Score range, 1–10 |
| `onlyWithText` | Skip score-only reviews |

Example: every German review from the last 30 days that scored 5 or lower:

```json
{
    "startUrls": [{ "url": "https://www.booking.com/hotel/gb/the-savoy.html" }],
    "maxReviewsPerHotel": 500,
    "reviewedSince": "30 days",
    "languages": ["de"],
    "maxScore": 5
}
```

### 📊 Sample Output Data

```json
[
    {
        "reviewId": "0ba046c695e5a921",
        "hotelId": 280149,
        "hotelName": "The Savoy",
        "hotelUrl": "https://www.booking.com/hotel/gb/the-savoy.html",
        "score": 9,
        "title": "The new decoration is really very very disapointing  this decoration down grade the hotel a lot.",
        "liked": "the water debit",
        "disliked": "not too much space",
        "language": "en",
        "reviewedAt": "2026-09-23T20:10:18.000Z",
        "stayCheckin": "2026-09-22",
        "stayCheckout": "2026-09-23",
        "nights": 1,
        "stayStatus": "stayed",
        "roomType": "One-Bedroom River View Suite",
        "travellerType": "SOLO_TRAVELLERS",
        "reviewerCountryCode": "lu",
        "reviewerCountry": "Luxembourg",
        "hotelReply": "Thank you for taking the time to leave feedback. We are pleased to see from your scores that you enjoyed your Savoy stay, but did note your feedback concerning the décor…",
        "helpfulVotes": 0
    }
]
```

Placeholder answers such as "N/A" or "nothing" are returned as `null`. `stayStatus` is `stayed` for almost all reviews; guests who cancelled or did not show up are marked `non_stayed…`.

### 💰 Pricing

**$0.001 per review** returned in the dataset: $1 per 1,000 reviews, with every filter included. Reviews removed by your filters are not charged.

### ⚠️ Good to know

- Booking.com only shows reviews from the **last 36 months**, so older reviews cannot be exported.
- Around 40% of Booking.com reviews contain only a score and no text. Turn on **Only reviews with text** if you only want written feedback.
- Review text is returned in the language the guest wrote it in (no machine translation).
- Score and stay-date filters are checked review by review, so a very selective combination can take longer on hotels with tens of thousands of reviews.

Understand what guests love and hate about any hotel with the **Booking Reviews Scraper**! 🚀

# Actor input Schema

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

Booking.com hotel pages, e.g. https://www.booking.com/hotel/gb/the-savoy.html. Any language version and tracking parameters are fine.

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

Stop after this many reviews for each hotel. Booking.com shows reviews from the last 36 months.

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

Order in which reviews are collected. "Newest first" together with a date filter stops as soon as older reviews start.

## `reviewedSince` (type: `string`):

Only reviews published on or after this date. Use it for incremental exports, e.g. "7 days" or 2026-01-01.

## `stayedFrom` (type: `string`):

Only reviews from guests whose check-in was on or after this date.

## `stayedTo` (type: `string`):

Only reviews from guests whose check-in was on or before this date.

## `languages` (type: `array`):

Only reviews written in these languages. Leave empty for all languages.

## `travellerType` (type: `string`):

Only reviews from this type of traveller.

## `keyword` (type: `string`):

Only reviews that mention this word, e.g. "breakfast" or "noise".

## `minScore` (type: `integer`):

Only reviews scored at least this (1–10).

## `maxScore` (type: `integer`):

Only reviews scored at most this (1–10), e.g. 5 for complaints.

## `onlyWithText` (type: `boolean`):

Skip score-only reviews (roughly 40% of Booking.com reviews have no written text).

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

The default Apify Proxy works well.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.booking.com/hotel/gb/the-savoy.html"
    }
  ],
  "maxReviewsPerHotel": 50,
  "sortBy": "newest",
  "onlyWithText": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

No description

## `summary` (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 = {
    "startUrls": [
        {
            "url": "https://www.booking.com/hotel/gb/the-savoy.html"
        }
    ],
    "maxReviewsPerHotel": 50,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("piotrv1001/booking-reviews-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 = {
    "startUrls": [{ "url": "https://www.booking.com/hotel/gb/the-savoy.html" }],
    "maxReviewsPerHotel": 50,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("piotrv1001/booking-reviews-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 '{
  "startUrls": [
    {
      "url": "https://www.booking.com/hotel/gb/the-savoy.html"
    }
  ],
  "maxReviewsPerHotel": 50,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call piotrv1001/booking-reviews-scraper --silent --output-dataset

```

## MCP server setup

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