# Booking Reviews Scraper - Guest Reviews & Scores (`jdtpnjtp/booking-reviews-scraper`) Actor

Scrape Booking.com guest reviews for any hotel: scores, positive/negative text, reviewer country, room type, stay length, partner replies. Real-time data, all review filters, full pagination. Pay only per review - no subscription.

- **URL**: https://apify.com/jdtpnjtp/booking-reviews-scraper.md
- **Developed by:** [Data Forge](https://apify.com/jdtpnjtp) (community)
- **Categories:** Travel, E-commerce, Integrations
- **Stats:** 3 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.90 / 1,000 guest reviews

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 Reviews Scraper - Guest Reviews & Scores

**Bulk-pull guest reviews for any Booking.com hotel in one run - scores, what guests liked and disliked, reviewer country, room type, length of stay, and the hotel's reply.** Paste a Booking.com hotel URL (or type a hotel name), set how many reviews you want (20 for a quick sample, 200 for a deep dataset), and export clean, structured rows. No subscription, pay only per review delivered.

***

### Why this Actor?

Most Booking review tools take a URL and hand back one blob of text. This Data Forge actor targets a hotel by URL or name and slices the reviews the way a real analyst needs them:

| Capability | This actor (Data Forge) | Typical competitor |
|---|---|---|
| Target a hotel by | **Booking.com URL, name, or slug** | URL only |
| Guest-segment filter | **4 segments: couples, families, solo, groups** | Not available |
| Score-band filter | **5 bands: Superb (9+) down to Very poor (1-3)** | Not available |
| Season-of-stay filter | **4 seasons: Mar-May, Jun-Aug, Sep-Nov, Dec-Feb** | Not available |
| Keyword search inside reviews | **Yes, free-text match** | Not available |
| Sort order | **Newest first, oldest first, or most relevant** | Fixed order |
| Liked vs disliked text | **2 separate columns** | Blended into 1 field |
| Hotel partner reply | **Captured per review** | Not available |
| Pricing | **Pay per review, error rows free** | Per page or monthly subscription |

### What this actor does

Give it a hotel - a Booking.com URL, a hotel name, or a slug like `le-bristol-paris` - and it paginates the property's guest reviews, pulling the fields you need to analyze sentiment, spot patterns, and benchmark a property:

- 📊 **Score** - the guest review score (1-10) for each stay
- 👍 **Liked / 👎 Disliked** - the positive and negative free text, kept in separate columns
- 🙋 **Reviewer** - name, country, and traveller type (couple, solo, family, group)
- 🛏 **Stay context** - room type, number of nights, check-in date, and season
- 🕒 **Timing** - the review date (converted from epoch to a clean `YYYY-MM-DD`)
- 👏 **Engagement** - helpful votes, and the hotel's `partner_reply` (in the `data` payload)

Need reviews for several hotels at once? Paste their URLs into **Start URLs** - each hotel's reviews land in the same dataset, ready to compare side by side.

### Input modes

Point the actor at a hotel by URL (most reliable), name, or slug, then shape the pull with optional filters. Each mode below matches a one-click example task on this actor's Apify Store page.

#### 1. Reviews by hotel URL

A market analyst wants a 200-review baseline for a property. Paste the Booking.com hotel URL for the most reliable, fastest match - a hotel name also works, but name lookup leans on Booking.com's search and can be ambiguous for common names.

```json
{
    "hotel": "https://www.booking.com/hotel/gb/the-ritz-london.html",
    "maxReviews": 200
}
```

#### 2. Couples segment

A revenue manager profiling how couples rate the stay, to shape a romance-package pitch.

```json
{
    "hotel": "https://www.booking.com/hotel/gb/the-ritz-london.html",
    "customerType": "COUPLES",
    "maxReviews": 200
}
```

#### 3. Newest-first monitor

A reputation team polling the 200 most recent reviews on a schedule to catch fresh feedback first.

```json
{
    "hotel": "https://www.booking.com/hotel/gb/the-ritz-london.html",
    "sort": "f_recent_desc",
    "maxReviews": 200
}
```

#### 4. Superb (9+) only

A marketing lead mining top-band praise (score 9 and up) for testimonial and ad copy.

```json
{
    "hotel": "https://www.booking.com/hotel/gb/the-ritz-london.html",
    "scoreRange": "REVIEW_ADJ_SUPERB",
    "maxReviews": 200
}
```

#### 5. Summer stays

An operations analyst isolating Jun-Aug stays to study peak-season sentiment against the rest of the year.

```json
{
    "hotel": "https://www.booking.com/hotel/gb/the-ritz-london.html",
    "timeOfYear": "_06_08",
    "maxReviews": 200
}
```

### Input reference

| Field | What it does |
|---|---|
| **Hotel** | Booking.com hotel URL (most reliable), hotel name, or slug. Optional if you use Start URLs. |
| **Start URLs** | Paste 2 or more Booking.com hotel URLs to pull reviews for each. |
| **Max reviews** | Cap per hotel, up to 5000. The actor paginates Booking.com (up to 25/page) to reach it. |
| **Sort** | Most relevant, newest first, or oldest first. |
| **Reviews per page** | How many reviews to request per upstream page (1-25). |
| **Filters** | Guest type, score band, language, season of stay, and free-text search. |

Friendly-label filters (guest type, score band, season) map to Booking.com's own values for you - pick **Families** or **Wonderful (9+)**, no codes to look up.

### Output

One flat row per review, discriminated by `row_type`, with the full payload under `data`. The dataset ships with **two ready-made table tabs** - **Overview** and **Reviews** - so the data reads as a clean spreadsheet you can sort, filter and export to CSV/Excel/JSON in one click.

Common columns: `score`, `title`, `positive_text`, `negative_text`, `reviewer_name`, `reviewer_country`, `traveller_type`, `room_type`, `num_nights`, `checkin_date`, `customer_type`, `review_date`, `language`, `helpful_votes`, `review_url`. The `data` payload adds `reviewer_country_code`, `reviewer_avatar`, and the hotel's `partner_reply`. The `customer_type` column also surfaces business travelers and groups of friends when guests self-report them. Error rows carry an `error_code` and are **free** - you pay only for real reviews.

A run-summary record (`OUTPUT` key) reports review counts and the estimated cost. Live per-event pricing is shown on this actor's Apify Store page.

> Tip: combine **score band** and **language** to isolate a segment fast - for example only the English-language "Poor (3-5)" reviews to read exactly what is going wrong.

### Example output

One flat row per review. The `data` field carries the complete review object; the flat columns are projected from it for a clean table view.

```json
{
    "hotel_query": "The Ritz London",
    "row_type": "review",
    "score": 9.6,
    "title": "Faultless London stay",
    "positive_text": "Staff were attentive and the location by Green Park is central.",
    "negative_text": "Breakfast was busy at 8am on a Saturday.",
    "reviewer_name": "Marta",
    "reviewer_country": "Spain",
    "traveller_type": "Couple",
    "room_type": "Deluxe King Room",
    "num_nights": 3,
    "checkin_date": "2026-05-14",
    "customer_type": "COUPLES",
    "review_date": "2026-05-19",
    "language": "en",
    "helpful_votes": 4,
    "review_url": "rid_123456789",
    "data": {
        "reviewer_country_code": "es",
        "reviewer_avatar": "https://q-xx.bstatic.com/avatar/marta.jpg",
        "partner_reply": "Thank you Marta, we hope to welcome you back soon."
    }
}
```

### Highlights

- **Real-time reviews with replies** - pulled live from Booking.com on each run, including the hotel's own `partner_reply`, not a stale snapshot.
- **Liked and disliked, separated** - clean `positive_text` and `negative_text` columns, ready for sentiment scoring.
- **5 review filters** - guest type, score band, language, season, and free-text search, plus newest-first or oldest-first sort. Friendly labels, no codes to memorize.
- **One hotel or many** - add Start URLs to pull several properties into 1 dataset and compare side by side.
- **Spreadsheet-ready tabs** - a pre-built Reviews table, not a wall of mixed columns.
- **Pay for results only** - error rows and your own misconfigurations are never charged.

### FAQ

**How fresh is the data?**
Reviews are pulled live from Booking.com on each run - there is no cached snapshot. Run it on demand, or on a schedule to keep a dataset current.

**Is scraping Booking.com reviews allowed?**
The actor collects publicly visible guest reviews - text that any visitor can read without signing in. You stay responsible for using the output in line with Booking.com's terms and applicable law (for example GDPR when you handle reviewer names). If in doubt, check with your own legal counsel before large-scale collection.

**Should I enter a hotel name or a URL?**
Both work. A Booking.com URL or exact slug (`le-bristol-paris`) is the most precise. A plain name (`The Ritz London`) is resolved automatically - quick to type, and worth a 20-review test run first to confirm the actor locked onto the property you meant.

**Can I schedule this to run automatically?**
Yes. Use Apify Schedules to run the actor every day or week. Pair a schedule with `sort: f_recent_desc` and a modest `maxReviews` (for example 100) to catch new reviews as they land.

**How many reviews can I pull per hotel?**
Set `maxReviews` up to 5000. The actor paginates 25 reviews per page under the hood. Booking.com limits how deep its review panel goes, so treat the result as a deep, filtered sample rather than a guaranteed full dump.

**Do I pay for errors or empty results?**
No. Rows with an `error_code` (for example a hotel with 0 matching reviews) carry no billing event - you pay only for delivered review rows.

**Can I pull reviews for several hotels at once?**
Yes. Paste 2 or more Booking.com hotel URLs into Start URLs and each property's reviews land in the same dataset for side-by-side comparison.

### Related actors

Part of the Data Forge Booking.com and reviews suite:

- **[Booking.com Hotels Scraper](https://apify.com/jdtpnjtp/booking-hotels-scraper)** - search any destination for hotels with live prices, review scores, and full detail pages.
- **[Booking.com Airport Taxis Scraper](https://apify.com/jdtpnjtp/booking-airport-taxis-scraper)** - live airport transfer quotes between 2 points, by date and passenger count.
- **[Tripadvisor Reviews Bulk Scraper](https://apify.com/jdtpnjtp/tripadvisor-reviews-bulk)** - bulk guest reviews from Tripadvisor to cross-reference sentiment across 2 platforms.

### Support

Built and maintained by Data Forge. I personally support each customer - reach out on any channel for help, higher limits, or custom scraping.

[![Telegram](https://img.shields.io/badge/Telegram-2CA5E0?style=for-the-badge\&logo=telegram\&logoColor=white)](https://t.me/j4dtpnj2tp)
[![WhatsApp](https://img.shields.io/badge/WhatsApp-25D366?style=for-the-badge\&logo=whatsapp\&logoColor=white)](https://wa.me/380686031542)
[![Email](https://img.shields.io/badge/Email-D14836?style=for-the-badge\&logo=gmail\&logoColor=white)](mailto:jdtpnjtp@gmail.com)

# Actor input Schema

## `hotel` (type: `string`):

The hotel to pull reviews for. Accepts a **slug** (`le-bristol-paris`), a **hotel name** (`Le Bristol Paris`), or a full **Booking.com hotel URL** - the actor resolves it automatically. Optional if you provide Start URLs below.

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

Paste specific Booking.com hotel URLs to pull reviews for each, in addition to (or instead of) the single Hotel above. Reviews for every hotel land in the same dataset.

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

Upper bound on reviews pulled per hotel. 20 = quick sample, 200 = deep dataset. The actor paginates Booking.com (up to 25/page) under the hood to reach this number.

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

Order of reviews. Most relevant surfaces the reviews Booking highlights; the recency sorts walk newest-first or oldest-first.

## `count` (type: `integer`):

How many reviews to request per upstream page (1-25). Lower it for tighter control over partial runs; the default works for most jobs.

## `customerType` (type: `string`):

Keep only reviews from a single traveller segment.

## `scoreRange` (type: `string`):

Keep only reviews in a single Booking.com score band.

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

Keep only reviews written in this language. Pick from the list or type any 2-letter ISO code.

## `timeOfYear` (type: `string`):

Keep only reviews from stays in this part of the year.

## `text` (type: `string`):

Keep only reviews mentioning this phrase (e.g. `breakfast`, `view`, `noise`). Free text.

## Actor input object example

```json
{
  "hotel": "le-bristol-paris",
  "startUrls": [
    "https://www.booking.com/hotel/fr/le-bristol-paris.html"
  ],
  "maxReviews": 50,
  "sort": "most_relevant",
  "count": 10,
  "customerType": "",
  "scoreRange": "",
  "language": "",
  "timeOfYear": "",
  "text": "breakfast"
}
```

# Actor output Schema

## `dataset` (type: `string`):

The default dataset. Each row carries one Booking.com guest review, discriminated by row\_type, with common fields flattened to top-level columns and the full payload under `data`. Use the Overview / Reviews tabs to view clean tables.

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

A single JSON object written to the default key-value store under the OUTPUT key. Contains hotels, review\_results, errors, total\_rows, estimated\_cost\_usd, limit\_reached, and actor\_version.

# 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 = {
    "hotel": "le-bristol-paris",
    "startUrls": [
        "https://www.booking.com/hotel/fr/le-bristol-paris.html"
    ],
    "maxReviews": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("jdtpnjtp/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 = {
    "hotel": "le-bristol-paris",
    "startUrls": ["https://www.booking.com/hotel/fr/le-bristol-paris.html"],
    "maxReviews": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("jdtpnjtp/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 '{
  "hotel": "le-bristol-paris",
  "startUrls": [
    "https://www.booking.com/hotel/fr/le-bristol-paris.html"
  ],
  "maxReviews": 50
}' |
apify call jdtpnjtp/booking-reviews-scraper --silent --output-dataset

```

## MCP server setup

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