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

Scrape Booking.com guest reviews — full review text, scores, traveler type, nationality, stay details & owner replies. Feed it hotel URLs, hotel names, or whole destinations. Filter by score, traveler type, season, language & keywords. $1 per 1,000 reviews — half the usual price, no start fee.

- **URL**: https://apify.com/omkar-cloud/booking-reviews-scraper.md
- **Developed by:** [Chetan Jain](https://apify.com/omkar-cloud) (community)
- **Categories:** Travel, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 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.

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 Reviews Scraper — Extract Booking.com Guest Reviews & Ratings

Scrape Booking.com guest reviews — full review text, scores, traveler types, nationalities, stay details, and owner replies. No coding required.

Paste a hotel's Booking.com URL, type its name, or just enter a destination — click Start and get one clean JSON record per review: score, title, what guests **liked and disliked** (full text), review date, guest profile (name, country, traveler type), the exact room and stay dates, and the property's reply when it responded.

Filters run **server-side**, so you only scrape (and pay for) what you need: traveler type, score bucket (Wonderful 9+ … Very poor), review language, season, and free-text keywords like `breakfast` or `noise`. Sort newest-first and set a **cutoff date** to scrape only reviews since your last run — perfect for scheduled monitoring.

Scales from one hotel to whole markets: up to **10,000 reviews per property** (Booking's own ceiling), and destination searches take the **top hotels automatically** — hotel discovery is free, you pay only for reviews. All 45 Booking.com languages, at **$1 per 1,000 reviews** — half the price of comparable scrapers, with **no start fee**.

**Rated Excellent — 4.6 based on 25 reviews** on [Trustpilot](https://www.trustpilot.com/review/omkar.cloud).

### Output example: Booking.com review data in JSON

Each review becomes one dataset item:

```json
{
  "hotel_id": 5218600,
  "hotel_name": "Hyatt Place New York City - Times Square",
  "hotel_url": "https://www.booking.com/hotel/us/hyatt-place-new-york-city-times-square.html",
  "query": "New York → Hyatt Place New York City - Times Square",
  "id": "f3471c6807b78fa3",
  "score": 10,
  "title": "Great location and good value",
  "positive": "Location is great, near subway and bus, walkable distance to Times Square and Broadway. Breakfast is good, staff are friendly and helpful.",
  "negative": "Room size is limited",
  "language": "en",
  "date": "2026-08-25",
  "helpful_votes": 0,
  "is_approved": true,
  "photos": [],
  "guest": {
    "name": "Xiaowei",
    "country_code": "au",
    "country": "Australia",
    "type": "group_of_friends",
    "review_count": 23,
    "member_since": "2014-10-27",
    "avatar": "https://xx.bstatic.com/static/img/review/avatars/ava-x.png",
    "is_anonymous": false
  },
  "stay": {
    "checkin": "2026-08-18",
    "checkout": "2026-08-21",
    "nights": 3,
    "room_id": 521860001,
    "room_name": "Standard King Room",
    "status": "stayed"
  },
  "owner_reply": "Thank you for staying with us — we're glad the location worked so well for your group!"
}
```

You can download the dataset as JSON, CSV, Excel, XML, or an HTML table.

### What data does the Booking Reviews Scraper extract?

| Data group | Fields |
|------------|--------|
| Review | Score, title, full positive text, full negative text, language, date, helpful votes, approval flag, photos |
| Guest | Name, country and country code, traveler type (family, couple, solo, business, group), review count, member-since date, avatar, anonymous flag |
| Stay | Check-in/check-out dates, nights, room id and room name, stay status |
| Owner | The property's public reply to the review, when present |
| Hotel context | Numeric hotel id, hotel name, Booking.com link, and the query that found it — so multi-hotel datasets stay organized |

### How to scrape Booking.com reviews

1. Click **Try for free**.
2. Add hotels any way you like — paste **hotel page URLs**, paste a **search results URL**, or type **hotel names or destinations** (each search takes the top hotels automatically).
3. Set **max reviews per hotel** and optionally filters: traveler type, score bucket, language, season, keyword — or a **cutoff date** to only get recent reviews.
4. Click **Start** and wait for the run to finish.
5. Open the **Dataset** tab to preview your reviews, then download them as **JSON, CSV, Excel, XML, or an HTML table**.

No proxies, no browser setup, no CAPTCHA solving — you paste a hotel and get structured reviews back.

### Input

```json
{
  "startUrls": [
    "https://www.booking.com/hotel/us/pod-times-square.html",
    "https://www.booking.com/searchresults.html?ss=New York&nflt=class%3D5"
  ],
  "searchQueries": ["Hyatt Place Times Square"],
  "maxHotelsPerSearch": 5,
  "maxReviewsPerHotel": 100,
  "sortBy": "newest",
  "cutoffDate": "2026-08-01",
  "customerType": "all",
  "score": "all",
  "timeOfYear": "all",
  "keyword": "",
  "locale": "en-us"
}
```

| Field | Type | Description |
|-------|------|-------------|
| `startUrls` | array | Booking.com hotel page URLs, and/or search results URLs (top `maxHotelsPerSearch` hotels taken, with the URL's embedded filters applied). |
| `searchQueries` | array | Destinations (`New York`) or hotel names (`Hyatt Place Times Square`). |
| `maxHotelsPerSearch` | integer | Top hotels per search to scrape reviews for (default 5). |
| `maxReviewsPerHotel` | integer | Up to 10,000 per property (default 100). Controls your cost. |
| `sortBy` | string | `newest` (default), `most_relevant`, `oldest`, `highest_score`, `lowest_score`. |
| `cutoffDate` | string | Only reviews on/after this date. With newest-first sorting, scraping auto-stops at the cutoff. |
| `customerType` | string | `all`, `families`, `couples`, `group_of_friends`, `solo_travellers`, `business_travellers`. |
| `score` | string | `all`, `wonderful` (9+), `good` (7–9), `fair` (5–7), `poor` (3–5), `very_poor` (1–3). |
| `reviewLanguage` | string | 2-letter code like `en`, `de` — only reviews written in that language. |
| `timeOfYear` | string | `all`, `mar_may`, `jun_aug`, `sep_nov`, `dec_feb`. |
| `keyword` | string | Free-text search inside review texts. |
| `locale` | string | Response language for labels (45 Booking.com languages). |

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

Scraping Booking.com reviews costs **$1 per 1,000 reviews** ($0.001 per review) — half of what comparable scrapers charge, with **no Actor start fee**. Hotel discovery (destination searches, URL resolution) is **free** — you pay only for reviews delivered, and every review is billed exactly once.

Apify gives you **$5 in free credits** every month, so you can scrape your first **5,000 reviews** free and test the Booking Reviews Scraper before paying anything.

### FAQs

#### Why scrape Booking.com reviews?

- **Reputation monitoring** — track new reviews of your (or competitors') properties on a schedule, with the cutoff date delivering only what's new since the last run.
- **Sentiment & product analysis** — thousands of structured liked/disliked texts per property, pre-filtered by traveler type, season, or keyword.
- **AI & ML training data** — clean, labeled review text with scores, languages, and traveler segments, exportable in bulk.
- **Market research** — reviews of the top hotels of an entire destination in one run.

#### Can I scrape reviews by hotel name or destination?

Yes — that's built in. Type a hotel name (`Hyatt Place Times Square`) and its reviews are scraped directly; type a destination (`New York`) and the top `maxHotelsPerSearch` hotels are taken automatically. You can also paste a Booking.com search results URL — its embedded filters (stars, score, price) are applied when picking the hotels. Discovery is never billed.

#### How many reviews can I get per hotel?

Up to **10,000 per property** — Booking.com's own ceiling (400 pages × 25 reviews). Set `maxReviewsPerHotel` to control depth and cost.

#### How do I monitor new reviews automatically?

Keep `sortBy: newest`, set `cutoffDate` to your last check, and put the Actor on an Apify **Schedule**. Scraping stops automatically as soon as older reviews are reached — you pay only for the new ones. Webhooks can push each run's dataset wherever you need it.

#### Do filters reduce what I pay?

Yes. Traveler type, score bucket, language, season, and keyword filters run **server-side** — filtered-out reviews are never scraped, never appear in your dataset, and are never billed.

#### Will I be charged twice for the same review?

No. Hotels are deduplicated per run — the same hotel arriving via a URL and a search is scraped once. Every review row is billed exactly once, and failed pages are never billed.

#### How fresh is the data?

Reviews are scraped from Booking.com on demand — the newest review in your dataset can be from the same day. Each response also includes the property's own filter counts, so numbers match what visitors see on the site.

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

The Actor extracts publicly available review data only — the same reviews any visitor sees. It collects no data from behind logins. You are responsible for how you use the data; consult a lawyer if unsure about your use case.

#### Need hotel prices and details too?

Use our **[Booking Scraper](https://apify.com/omkar-cloud/booking-scraper)** — search whole destinations with live prices, ratings, and full hotel details (rooms, facilities, photos), then feed its `link` values straight into this Actor's `startUrls`.

### Support

Built by developers, for developers — when you reach out, you talk to the engineers who built the Actor, not a support script. Message us anytime and we'll resolve your query within 1 working day.

[![Contact Us on WhatsApp about Booking Reviews Scraper](https://raw.githubusercontent.com/omkarcloud/assets/master/images/whatsapp-us.png)](https://api.whatsapp.com/send?phone=918178804274\&text=I%20have%20a%20question%20about%20the%20Booking%20Reviews%20Scraper.)

Email: [happy.to.help@omkar.cloud](mailto:happy.to.help@omkar.cloud?subject=Booking%20Reviews%20Scraper%20Question)

[![Email Us about Booking Reviews Scraper](https://raw.githubusercontent.com/omkarcloud/assets/master/images/ask-on-email.png)](mailto:happy.to.help@omkar.cloud?subject=Booking%20Reviews%20Scraper%20Question)

### Love It? Star It! ⭐

From one business owner to another: if this Actor saved you hours of copying guest reviews off Booking.com, please [rate the Booking Reviews Scraper on Apify](https://apify.com/omkar-cloud/booking-reviews-scraper/reviews).

Here's why it matters: most people judge an Actor by its reviews before trying it. Your rating helps the next person — someone deciding whether this Actor really delivers clean Booking.com review data — hit "Try for free" with confidence, and it helps the Actor rank higher in the Apify Store.

It takes only 1 second, and means the world to me.

# Actor input Schema

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

Hotel page URLs (https://www.booking.com/hotel/…) and/or search results URLs (https://www.booking.com/searchresults.html?ss=…). For search URLs, the top `maxHotelsPerSearch` hotels are taken — with the filters embedded in the URL applied.

## `searchQueries` (type: `array`):

Destinations (`New York`) or hotel names (`Hyatt Place Times Square`). Each search takes the top `maxHotelsPerSearch` hotels and scrapes their reviews.

## `maxHotelsPerSearch` (type: `integer`):

How many top hotels to take from each destination search or search results URL (ignored for hotel page URLs).

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

Maximum reviews to scrape per hotel — up to 10,000 (Booking's own ceiling). Use this to control your cost (1,000 reviews ≈ $1).

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

Review order. Defaults to newest first — best for monitoring and incremental scraping with the cutoff date.

## `cutoffDate` (type: `string`):

Only keep reviews written on or after this date (`YYYY-MM-DD`). With "Newest first" sorting, scraping stops automatically once older reviews are reached — perfect for scheduled incremental runs.

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

Only reviews from this traveler type.

## `score` (type: `string`):

Only reviews in this score bucket.

## `reviewLanguage` (type: `string`):

Only reviews written in this language — a 2-letter code like `en`, `de`, `fr`. Leave empty for all languages.

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

Only reviews from stays in this season.

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

Free-text search within the review texts — e.g. `breakfast`, `wifi`, `noise`.

## `locale` (type: `string`):

Booking.com language for labels (room names, traveler types, …).

## Actor input object example

```json
{
  "startUrls": [
    "https://www.booking.com/hotel/us/pod-times-square.html",
    "https://www.booking.com/hotel/us/hyatt-place-new-york-city-times-square.html"
  ],
  "searchQueries": [
    "New York",
    "Hyatt Place Times Square"
  ],
  "maxHotelsPerSearch": 5,
  "maxReviewsPerHotel": 100,
  "sortBy": "newest",
  "customerType": "all",
  "score": "all",
  "timeOfYear": "all",
  "locale": "en-us"
}
```

# Actor output Schema

## `results` (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": [
        "https://www.booking.com/hotel/us/pod-times-square.html",
        "https://www.booking.com/hotel/us/hyatt-place-new-york-city-times-square.html"
    ],
    "maxReviewsPerHotel": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("omkar-cloud/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": [
        "https://www.booking.com/hotel/us/pod-times-square.html",
        "https://www.booking.com/hotel/us/hyatt-place-new-york-city-times-square.html",
    ],
    "maxReviewsPerHotel": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("omkar-cloud/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": [
    "https://www.booking.com/hotel/us/pod-times-square.html",
    "https://www.booking.com/hotel/us/hyatt-place-new-york-city-times-square.html"
  ],
  "maxReviewsPerHotel": 100
}' |
apify call omkar-cloud/booking-reviews-scraper --silent --output-dataset

```

## MCP server setup

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