# Booking.com Review Monitor (`schnellscrapers/booking-review-monitor`) Actor

Extract recent Booking.com hotel reviews with scores, review titles, positive and negative text, reviewer country, room and stay details, helpful votes, photos, and management replies. Use recent-first caps, cutoff dates, and known review IDs for scheduled reputation monitoring.

- **URL**: https://apify.com/schnellscrapers/booking-review-monitor.md
- **Developed by:** [Nate Schnell](https://apify.com/schnellscrapers) (community)
- **Categories:** Travel, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$1.59 / 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/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

### What does Booking.com Review Monitor do?

Booking.com Review Monitor extracts recent guest reviews from direct Booking.com hotel or apartment URLs. It returns one structured row per review with the score, review title, positive and negative text, reviewer details, room and stay dates, helpful votes, photos, and management reply when available. The recent-first default fits scheduled hotel reputation checks and competitor monitoring.

### What data can you extract from Booking.com reviews?

- Property — property name, canonical hotel URL, hotel ID, destination UFI, and total review count
- Review — review ID, publication date, score, title, positive text, negative text, language, helpful votes, approval state, and photo URLs
- Guest and stay — reviewer name, country, country code, reviewer review count, guest type, room type, room ID, check-in date, check-out date, and nights stayed
- Response — management response, whether the review is new against your known ID list, and the UTC collection timestamp

### How to use Booking.com Review Monitor

1. Open Booking.com Review Monitor and add one or more direct property URLs to Hotel URLs.
2. Keep Newest first and set a Cutoff date for a weekly or daily review pull.
3. Set Reviews per hotel and Pages per hotel to control the slice and cost.
4. Click Run. The monitor opens the public review list and keeps only rows that pass your score, date, and known-ID filters.
5. Open the dataset and download JSON, CSV, or Excel, or read the results through the Apify dataset API.

For a historical backfill, choose Oldest first and raise the page and review caps. If Booking.com challenges direct sessions, add Apify Proxy with the RESIDENTIAL group in Proxy configuration.

### How much does Booking.com Review Monitor cost?

The actor is pay-per-event at $1.59 per 1,000 written reviews. A written review row is one billable dataset item; invalid URLs, failed pages, filtered-out reviews, and dry-run matches are not written. The free tier is capped at 100 written review rows per run. Keep the recent cutoff and per-hotel cap low when running on a schedule.

### Input

Hotel URLs are required. The main controls are Reviews per hotel, Pages per hotel, Review sort, Cutoff date, Review score bands, Known review IDs, and New reviews only. See the Input tab for the complete schema.

```json
{
  "startUrls": [
    { "url": "https://www.booking.com/hotel/us/aria-resort-casino.html" }
  ],
  "maxReviewsPerHotel": 20,
  "sortReviewsBy": "newest",
  "cutoffDate": "2026-08-01",
  "reviewScores": ["poor", "fair"]
}
```

### Output

Each dataset item is one review. Dates are normalized to `YYYY-MM-DD`; the score stays on Booking.com's 1–10 scale.

```json
{
  "reviewId": "db840d6679a665e6",
  "sourceUrl": "https://www.booking.com/hotel/us/aria-resort-casino.html",
  "propertyName": "ARIA Resort & Casino",
  "reviewerName": "Dean",
  "reviewerCountry": "United Kingdom",
  "guestType": "Family",
  "roomType": "Deluxe Two Queen Room",
  "checkinDate": "2026-08-06",
  "checkoutDate": "2026-08-07",
  "reviewedDate": "2026-08-08",
  "reviewScore": 9,
  "reviewTitle": "Fantastic hotel that is excelllent value for money, just stay away from the mini bar.",
  "positiveText": "Beautifully modern hotel with all the facilities you could need.",
  "negativeText": "Mini bar was ludicrously expensive ($18 for water) and table limits too high",
  "managementResponse": null,
  "isNew": true
}
```

### Integrations

Use the [Apify API](https://docs.apify.com/api/v2) to start a run and read the default dataset. Scheduled runs, webhooks, Make, Zapier, and n8n can feed new review rows into reputation dashboards, CRM notes, or alert workflows.

### Related actors

- [Tripadvisor Reviews Scraper](https://apify.com/schnellscrapers/tripadvisor-review-monitor) — compare recent feedback across another major travel-review source.
- [Google Flights Scraper](https://apify.com/schnellscrapers/google-flights-price-monitor) — pair hotel feedback with travel-price monitoring.

### FAQ

#### How does Booking.com Review Monitor work?

It opens each public property page in a browser session, opens the review list, captures the page's review-feed response, and paginates the visible review list. The parser preserves Booking.com's separate positive and negative text fields instead of merging them.

#### Can I use Booking.com Review Monitor as an API?

Yes. Start the actor with `POST https://api.apify.com/v2/acts/YOUR_ACTOR_ID/runs` and read the run's default dataset through the Apify API.

#### Can I use Booking.com Review Monitor in Python or Node.js?

Yes. Use `apify-client` to start the actor and download dataset items:

```js
const run = await client.actor('YOUR_ACTOR_ID').call(input);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

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

The actor reads public property and review pages without a login. Your use of the returned data must follow the laws, contracts, and policies that apply to your business and location; get professional advice for a commercial workflow.

#### Does the actor need a Booking.com account or API key?

No account or API key was needed during recon. If a direct session receives a challenge, provide an Apify residential proxy in the input.

#### Can I collect every historical review?

Yes, by increasing Pages per hotel and Reviews per hotel, but the default is deliberately bounded for monitoring. Use Oldest first for a controlled historical backfill and keep an eye on run time and platform usage.

### Your feedback

If a property URL stops working, a field changes, or you need another monitor filter, use the Issues tab on the actor page. Feature requests for language or customer-type filters are welcome.

# Actor input Schema

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

Add direct Booking.com hotel or apartment pages, not search-result URLs. Example: `https://www.booking.com/hotel/us/aria-resort-casino.html`.

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

Maximum review rows to write for each hotel. Keep this low for scheduled reputation checks; 20 reads the newest two review pages.

## `maxPagesPerHotel` (type: `integer`):

Maximum Booking.com review pages to request for each hotel. Each page normally contains 10 review cards and is an additional browser request.

## `maxTotalReviews` (type: `integer`):

Hard cap on review rows written across all hotel URLs. The free tier allows up to 100 rows per run.

## `sortReviewsBy` (type: `string`):

Choose the Booking.com order before pagination. Newest is the default for monitoring; use oldest for backfills.

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

Keep reviews on the recent side of this UTC date, for example `2026-08-01`. With Oldest first, the comparison is reversed for historical backfills.

## `reviewScores` (type: `array`):

Keep one or more Booking.com score bands: `superb`, `good`, `fair`, `poor`, or `very_poor`. Leave empty for all scores.

## `knownReviewIds` (type: `array`):

Paste review IDs from an earlier run. Each output row has `isNew`; combine this list with New reviews only for scheduled delta pulls.

## `newReviewsOnly` (type: `boolean`):

Write only reviews whose IDs are not in Known review IDs. Leave off for a fresh snapshot with `isNew` flags.

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

Direct sessions are used when omitted. If Booking.com presents a challenge, enable Apify Proxy with the RESIDENTIAL group; proxy bandwidth is billed separately by the platform.

## `dryRun` (type: `boolean`):

Fetch and filter reviews without writing dataset rows. Logs report matched rows and the rows that would be written.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.booking.com/hotel/us/aria-resort-casino.html"
    }
  ],
  "maxReviewsPerHotel": 20,
  "maxPagesPerHotel": 3,
  "maxTotalReviews": 100,
  "sortReviewsBy": "newest",
  "cutoffDate": "2026-08-01",
  "reviewScores": [],
  "knownReviewIds": [],
  "newReviewsOnly": false,
  "proxyConfiguration": {
    "useApifyProxy": false,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  },
  "dryRun": false
}
```

# Actor output Schema

## `records` (type: `string`):

Review rows with score, positive and negative text, reviewer country, room type, stay dates, and management response.

# 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/us/aria-resort-casino.html"
        }
    ],
    "cutoffDate": "2026-08-01"
};

// Run the Actor and wait for it to finish
const run = await client.actor("schnellscrapers/booking-review-monitor").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/us/aria-resort-casino.html" }],
    "cutoffDate": "2026-08-01",
}

# Run the Actor and wait for it to finish
run = client.actor("schnellscrapers/booking-review-monitor").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/us/aria-resort-casino.html"
    }
  ],
  "cutoffDate": "2026-08-01"
}' |
apify call schnellscrapers/booking-review-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,schnellscrapers/booking-review-monitor"
        }
    }
}

```

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/3LF5kMX3DBvNayW14/builds/fvkbm5iNaDyMxfuCU/openapi.json
