# Booking.com Reviews Scraper - Guest Reviews API (`memo23/booking-reviews-scraper`) Actor

Scrape Booking.com guest reviews for any hotel — reviewer, country, score, title, positive/negative text, room type, stay dates, and photos. Fast, HTTP-only, JSON/CSV.

- **URL**: https://apify.com/memo23/booking-reviews-scraper.md
- **Developed by:** [Muhamed Didovic](https://apify.com/memo23) (community)
- **Categories:** Travel, AI, Agents
- **Stats:** 2 total users, 1 monthly users, 66.7% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 review scrapeds

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

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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 ⭐

Scrape **Booking.com guest reviews** for any hotel — reviewer name, country, score, title, positive & negative text, room type, stay dates, length of stay, helpful votes, partner replies, and review photos. Fast, HTTP-only, structured JSON/CSV/Excel out.

![Booking.com Reviews Scraper](https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/how-it-works-booking-reviews.png)

### Why use Booking.com Reviews Scraper?

- **Every review, not just the first page** — paginate through a hotel's full review history.
- **Rich per-review data** — reviewer name & country, numeric score, title, separate positive and negative text, room type, check-in/out dates, number of nights, customer type, helpful votes, and any partner (hotel) reply.
- **Find a hotel two ways** — by name (e.g. `Sansi Pedralbes Barcelona`) or by pasting a Booking.com hotel URL.
- **Sort control** — most relevant, newest, oldest, highest, or lowest score.
- **Category rating breakdown** — cleanliness, staff, location, and other sub-scores included per hotel.
- **No login, no browser** — talks directly to Booking's data API, so runs are fast and cheap.
- **Pay only for what you scrape** — pay-per-review pricing, no monthly rental.

### What data can you extract from each review?

| Field | Type | Description |
|-------|------|-------------|
| hotelName | string | Hotel the review belongs to |
| hotelId | number | Booking.com internal hotel ID |
| hotelUrl | string | Direct Booking.com hotel page URL |
| reviewUrl | string | Direct link to the review |
| reviewScore | number | Reviewer's overall score (0–10) |
| title | string | Review headline |
| positiveText | string | What the guest liked |
| negativeText | string | What the guest disliked |
| language | string | Language code of the review text |
| reviewedDate | string | ISO 8601 date the review was posted |
| helpfulVotes | number | Number of "helpful" votes |
| reviewerName | string | Reviewer's display name |
| reviewerCountry | string | Reviewer's country |
| reviewerCountryCode | string | ISO country code |
| reviewerType | string | Guest type (e.g. Couple, Family, Solo traveller) |
| reviewerReviewCount | number | How many reviews this guest has written |
| roomType | string | Room the guest stayed in |
| customerType | string | Booking customer type |
| checkinDate / checkoutDate | string | The guest's stay dates |
| numNights | number | Length of stay in nights |
| partnerReply | string | The hotel's reply to the review, if any |
| photos | string[] | URLs of photos attached to the review |
| scrapedAt | string | ISO 8601 timestamp of collection |

### Use cases

- **Reputation monitoring** — track guest sentiment and scores for your property or competitors.
- **Review analysis & NLP** — feed positive/negative text into sentiment models and topic analysis.
- **Hospitality benchmarking** — compare category sub-scores (cleanliness, staff, location) across hotels.
- **Content & research** — surface authentic guest feedback for travel content or market studies.

### How to scrape Booking.com reviews

1. Enter a **Hotel name** (e.g. `Sansi Pedralbes Barcelona`) **or** paste one or more **Booking.com hotel URLs**.
2. Choose how to **sort** the reviews and set **Max reviews per hotel** (0 = all).
3. Run and download the results as JSON, CSV, Excel, HTML, or XML — one row per review.

### Input configuration

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| hotelQuery | string | — | Hotel name (or "Hotel Name, City") to fetch reviews for. Provide this or Start URLs. |
| startUrls | array | — | Booking.com hotel page URLs (e.g. `https://www.booking.com/hotel/es/sansipedralbes.html`). |
| maxHotels | integer | 1 | When the query is broad (a city), how many matching hotels to cover. Ignored for exact URLs. |
| maxReviews | integer | 100 | Max reviews per hotel. `0` = all available. |
| sortBy | enum | most_relevant | `most_relevant`, `newest`, `oldest`, `score_high`, `score_low`. |
| language | string | en-us | Language code for review text and labels. |
| proxyConfiguration | object | Residential | Proxy settings. Residential is strongly recommended. |

### Output sample

```json
{
  "hotelName": "Sansi Pedralbes",
  "hotelId": 91017,
  "hotelUrl": "https://www.booking.com/hotel/es/sansipedralbes.html",
  "reviewScore": 10,
  "title": "Best service ever!",
  "positiveText": "The service is exceptional.",
  "negativeText": "Nothing. Everything is great.",
  "language": "en",
  "reviewedDate": "2026-07-09T00:00:00.000Z",
  "reviewerName": "Ricardo",
  "reviewerCountry": "Mexico",
  "reviewerType": "Couple",
  "roomType": "Standard Double Room",
  "checkinDate": "2026-07-01",
  "checkoutDate": "2026-07-09",
  "numNights": 8,
  "partnerReply": null,
  "photos": [],
  "scrapedAt": "2026-07-14T04:00:00.000Z"
}
````

### FAQ

**Do I need a Booking.com account or API key?**
No. The scraper pulls public review data directly — no login, cookies, or key required.

**How do I target a specific hotel?**
Either enter its name (e.g. `Sansi Pedralbes Barcelona`) or paste its Booking.com hotel URL. Hotel names resolve reliably; hyphenated URL slugs also work.

**Why are some `positiveText` / `title` fields empty?**
Many Booking guests leave only a score with no written text — those fields are simply blank for those reviews.

**Can I get every review?**
Yes — set `maxReviews` to `0` to paginate through all available reviews for the hotel.

**Which proxy should I use?**
Residential proxies are strongly recommended. The default configuration uses Apify Residential.

### Support

Found a bug or need a field added? Open an issue on the Actor's **Issues** tab.

### Additional services

Need **hotel search data** (prices, ratings, coordinates, room types) across a whole destination? See our companion **Booking.com Scraper** on the same fast, HTTP-only pipeline.

### Explore more scrapers

Check the Apify Store for more travel and accommodation data tools.

### ⚠️ Disclaimer

This Actor scrapes only publicly available guest-review information from Booking.com. It does not log in, bypass access controls, or collect private personal data. You are responsible for how you use the extracted data, including compliance with Booking.com's Terms of Service, applicable laws (such as GDPR), and any copyright or database rights. Use the data lawfully and ethically.

### SEO Keywords

booking.com reviews scraper, booking review scraper, hotel reviews scraper, scrape booking reviews, booking.com guest reviews, hotel review data, review sentiment data, accommodation reviews, booking.com ratings, hotel reputation monitoring, guest feedback scraper, review export, booking reviews api, hotel review extraction

# Actor input Schema

## `hotelQuery` (type: `string`):

Hotel name (or 'Hotel Name, City') to fetch reviews for, e.g. 'Sansi Pedralbes Barcelona'. Provide this or Start URLs.

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

List of direct Booking.com hotel page URLs (e.g. https://www.booking.com/hotel/es/sansipedralbes.html). Each is resolved to its reviews.

## `maxHotels` (type: `integer`):

When 'Hotel name' is a broad term (like a city), how many matching hotels to fetch reviews for. Ignored for exact hotel URLs.

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

Maximum reviews to fetch per hotel. Set to 0 for all available reviews.

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

Review sort order.

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

Language code for review text and labels (e.g. en-us, de, fr, es).

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

Proxy settings. Residential proxies are strongly recommended for Booking.com.

## Actor input object example

```json
{
  "hotelQuery": "The Savoy London",
  "startUrls": [
    {
      "url": "https://www.booking.com/hotel/gb/the-savoy.html"
    }
  ],
  "maxHotels": 1,
  "maxReviews": 100,
  "sortBy": "most_relevant",
  "language": "en-us",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# 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 = {
    "hotelQuery": "The Savoy London",
    "startUrls": [
        {
            "url": "https://www.booking.com/hotel/gb/the-savoy.html"
        }
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

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

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

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Booking.com Reviews Scraper - Guest Reviews API",
        "description": "Scrape Booking.com guest reviews for any hotel — reviewer, country, score, title, positive/negative text, room type, stay dates, and photos. Fast, HTTP-only, JSON/CSV.",
        "version": "0.0",
        "x-build-id": "W5xJIf7wVkooaNrqD"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/memo23~booking-reviews-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-memo23-booking-reviews-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/memo23~booking-reviews-scraper/runs": {
            "post": {
                "operationId": "runs-sync-memo23-booking-reviews-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/memo23~booking-reviews-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-memo23-booking-reviews-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "hotelQuery": {
                        "title": "Hotel name",
                        "type": "string",
                        "description": "Hotel name (or 'Hotel Name, City') to fetch reviews for, e.g. 'Sansi Pedralbes Barcelona'. Provide this or Start URLs."
                    },
                    "startUrls": {
                        "title": "Start URLs (Booking.com hotel pages)",
                        "type": "array",
                        "description": "List of direct Booking.com hotel page URLs (e.g. https://www.booking.com/hotel/es/sansipedralbes.html). Each is resolved to its reviews.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "maxHotels": {
                        "title": "Max hotels per query",
                        "minimum": 1,
                        "type": "integer",
                        "description": "When 'Hotel name' is a broad term (like a city), how many matching hotels to fetch reviews for. Ignored for exact hotel URLs.",
                        "default": 1
                    },
                    "maxReviews": {
                        "title": "Max reviews per hotel",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Maximum reviews to fetch per hotel. Set to 0 for all available reviews.",
                        "default": 100
                    },
                    "sortBy": {
                        "title": "Sort reviews by",
                        "enum": [
                            "most_relevant",
                            "newest",
                            "oldest",
                            "score_high",
                            "score_low"
                        ],
                        "type": "string",
                        "description": "Review sort order.",
                        "default": "most_relevant"
                    },
                    "language": {
                        "title": "Language",
                        "type": "string",
                        "description": "Language code for review text and labels (e.g. en-us, de, fr, es).",
                        "default": "en-us"
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Proxy settings. Residential proxies are strongly recommended for Booking.com.",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyGroups": [
                                "RESIDENTIAL"
                            ]
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
