# Booking.com Reviews Scraper (`boncross/booking-reviews`) Actor

Scrape every Booking.com guest review for any hotel. Just add hotel URLs or names and get the score, the good and the bad text, stay dates, nights, room, traveller type, reviewer country, owner replies and photos. Filter by language, score, traveller type or stay month. $1.65 per 1,000 reviews.

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

## Pricing

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

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.com Reviews Scraper

### What is Booking.com Reviews Scraper?

Booking.com asks every guest two questions: what did you like, and what didn't you? Booking.com Reviews Scraper gives you both answers as separate fields, for every review a property has, back to the oldest one. Paste a hotel link or just type the hotel's name.

What you get here that a plain review dump doesn't give you:

- The whole history. A property with 317 reviews returned all 317, and one with 4,470 returned all of those.
- Booking's own review filters, applied by Booking: language, score band, traveller type, topic, keyword and date. A review your filters remove isn't charged.
- The stay behind each review: check-in, check-out, nights, the room that was booked (with a room id you can join to rate data) and who travelled.
- Booking's AI summary of a hotel's reviews as an optional extra row, with pros and cons by topic. 12 of 13 hotels in one test had one.
- A typed name that can't be matched with confidence gets a free row naming the closest hotel. You never get another hotel's reviews by mistake: of 25 names tested, 15 of 16 real ones resolved, and 6 that would have landed on the wrong hotel were refused.
- Speed. 36 hotels at 200 reviews each, 7,200 reviews, took 11 to 16 seconds.

**BonCross Verified** means we tested this actor against the live site before release and kept the record:

- 37 of 37 live checks on its inputs and filters passed on 8 October 2026
- 12 hotels run on 7 October 2026 in 12 countries: 300 reviews, 2 error rows
- Charges checked against the 300 reviews; error rows were free
- A weak name match gets a free error row naming the closest hotel

It also returns the property's reply where there is one, the guest's country and display name (which you can switch off), helpful votes, review photos as full-size links, and the hotel's category scores. Scheduled runs can return only the reviews that are new since last time.

### What data is in each review?

| Field | Description |
|---|---|
| ⭐ Score | The guest's score out of ten |
| 👍 Liked | What the guest praised |
| 👎 Disliked | What the guest complained about |
| Title | The review headline, where the guest wrote one |
| 🗓️ Posted date | When the review appeared |
| 🛏️ Stay dates | Check-in, check-out and number of nights |
| Room | The room type that was booked, with Booking.com's room id |
| Stay status | Whether the guest stayed, or cancelled and reviewed anyway |
| 👪 Traveller type | Families, couples, groups, solo or business |
| 🌍 Language | The language the review was written in |
| Guest | Display name and country |
| 💬 Property reply | The owner's response text |
| Helpful votes | How many people found the review useful |
| 📊 Category scores | Staff, services, cleanliness, comfort, value, location and wifi |
| Review total | How many reviews match your filters |
| 📷 Photos | The photos the guest attached: links to the full-size images, ids and count |
| 🔗 Hotel | Hotel id, name, country and page link |
| AI summary (optional) | Booking.com's pros and cons of the hotel's recent reviews, each with its topic, as one row per hotel |

### How to scrape Booking.com reviews

You don't need to write any code. It's a form, and what you get back opens in Excel.

1. [Create a free Apify account](https://console.apify.com/sign-up).
2. Open [Booking.com Reviews Scraper](https://apify.com/boncross/booking-reviews).
3. Paste a Booking.com hotel link, or type the hotel name. A numeric Booking hotel id works too.
4. Set how many reviews you want per hotel and any filter you need.
5. Click Start, then download the reviews as Excel, CSV or JSON.

### ⬇️ Input

A hotel is all you have to give it: a Booking.com hotel link, a hotel name, or a numeric Booking hotel id. A link is the safest of the three, because it's looked up as that exact page. Only a typed name goes through the name check described in the FAQ: a link or an id is taken as given.

Got a long list of links? Put them in Start URLs, which loads them in bulk from a file, a Google Sheet or a remote list. The two inputs are combined.

You have two limits. "Maximum reviews per hotel" (default 100) applies to each hotel separately: ten hotels at 50 each returns 500. "Maximum results for the whole run" caps the run as a whole, and nothing past it is fetched or charged.

The filters are Booking.com's own:

- "Sort": newest, oldest, highest score, lowest score, or Booking.com's own order.
- "Languages", "Traveller type" and "Score band" (superb 9+, good 7 to 9, average 5 to 7, poor 3 to 5, very poor under 3).
- "Months of stay": keep reviews whose stay began in the months you list, as numbers from 1 to 12.
- "Contains keyword": only reviews mentioning a word or phrase, such as breakfast or noisy.
- "Topics": the chips above a hotel's review list on Booking.com (Location, Breakfast, Room, Clean, Staff and so on), matched on each hotel's own list. A topic id works too.
- "Posted after" (YYYY-MM-DD): only reviews posted on or after a date.
- "Only reviews with an owner response": only the ones the property replied to.

**Every review for one hotel**

```json
{
  "hotels": ["https://www.booking.com/hotel/fr/le-bristol-paris.html"],
  "maxReviewsPerHotel": 100000
}
```

**Look a property up by name and take the recent complaints**

```json
{
  "hotels": ["Hôtel Le Bristol Paris"],
  "sortBy": "lowest",
  "scoreBand": "poor",
  "maxReviewsPerHotel": 200
}
```

**Summer couples, in English, with no personal data**

```json
{
  "hotels": ["1769895"],
  "customerType": "COUPLES",
  "stayMonths": ["6", "7", "8"],
  "reviewLanguages": ["en"],
  "includeGuestProfile": false
}
```

**Booking.com's AI summary of each hotel, ahead of its 20 newest reviews**

```json
{
  "hotels": ["https://www.booking.com/hotel/us/bellagio.html", "Raffles Singapore", "62665"],
  "maxReviewsPerHotel": 20,
  "includeAiSummary": true
}
```

**A daily watch that returns only new reviews**

```json
{
  "hotels": ["Hôtel Le Bristol Paris", "Generator Berlin Mitte"],
  "sortBy": "newest",
  "onlyNewReviews": true,
  "dedupStoreName": "my-booking-watch"
}
```

#### For developers

- `maxReviewsPerHotel` is the per-hotel limit and `maxItems` the run-wide one (0 means no run-wide limit). Error rows don't count toward `maxItems` and are never charged.
- `stayMonths` takes strings from `"1"` to `"12"`. Booking.com groups the year into four seasons, so the matching season is applied at source and the exact month is then checked on each review.
- With `reviewedAfter` and newest first, the run stops as soon as it has passed the date.
- With `onlyNewReviews` and newest first, a run stops at the first review it has already delivered. `dedupStoreName` names the store that remembers them. A day with no new reviews returns nothing.
- A filter that keeps almost nothing is cut short: after 200 reviews read for a hotel, the run stops reading that hotel if fewer than 0.15 reviews a page are being kept.
- `maxConcurrency` (Parallel requests, default 32, from 1 to 32) sets how many requests run at once. Set it to 1 for a strictly one-at-a-time run. The rows and their order are the same either way.
- `delayMs` (default 0) adds a pause before each request, in milliseconds. Values above 2000 are treated as 2000. We'd leave both alone unless a run reports errors.
- If the platform moves or restarts a run part-way, it carries on where it stopped. Reviews already in the dataset aren't delivered or billed twice. We tested that by restarting a 36-hotel run part-way: the same 7,200 reviews in the same order as an uninterrupted run.

### ⬆️ Output

One row per review. This one is from Le Bristol Paris, looked up by name on 7 October 2026 (the owner's reply is shortened here).

```json
{
  "id": "1769895-1ae9dca08bb88594",
  "reviewId": "1ae9dca08bb88594",
  "url": "https://www.booking.com/hotel/fr/le-bristol-paris.html",
  "scrapedAt": "2026-10-07T19:38:17.207Z",
  "input": "Hôtel Le Bristol Paris",
  "hotelId": 1769895,
  "hotelName": "Le Bristol Paris, Oetker Hotels",
  "hotelCountryCode": "FR",
  "title": "Near perfect!",
  "text": "Best Laundry and dry cleaning service EVER!!! Our clothes looked NEW like coming out of the store..bravo to the team! Next time we'll bring more shirts and dresses to enjoy the top quality service!\n\nThe Bar was closed during our stay!",
  "positiveText": "Best Laundry and dry cleaning service EVER!!! Our clothes looked NEW like coming out of the store..bravo to the team! Next time we'll bring more shirts and dresses to enjoy the top quality service!",
  "negativeText": "The Bar was closed during our stay!",
  "language": "en",
  "isTranslatable": false,
  "rating": 10,
  "ratingScale": 10,
  "postedAt": "2026-08-03T11:17:16.000Z",
  "checkIn": "2026-07-26",
  "checkOut": "2026-07-29",
  "nights": 3,
  "stayMonth": "2026-07",
  "customerType": "COUPLES",
  "roomName": "Deluxe Room",
  "roomId": 176989501,
  "stayStatus": "stayed",
  "authorName": "Jean-dominique",
  "authorCountry": "Democratic Republic of Congo",
  "authorCountryCode": "CD",
  "authorAvatar": "https://xx.bstatic.com/static/img/review/avatars/ava-j.png",
  "helpfulVotes": 0,
  "hasOwnerResponse": true,
  "ownerResponseText": "Dear Sir,\n\nThank you very much for your kind feedback regarding our laundry and dry-cleaning service. All team concerned were very touched by your compliments.…",
  "photoIds": [],
  "photos": [],
  "photoCount": 0,
  "isApproved": true,
  "hotelSubRatings": [{ "name": "clean", "rating": 9.52 }, { "name": "comfort", "rating": 9.94 }, { "name": "free_wifi", "rating": 9.38 }, { "name": "location", "rating": 9.75 }, { "name": "services", "rating": 9.08 }, { "name": "staff", "rating": 9.65 }, { "name": "value", "rating": 8.38 }],
  "hotelRatingScale": 10,
  "hotelReviewCount": 58
}
```

A few columns worth a word:

- `id` joins the hotel to the review, which keeps rows distinct across hotels. `reviewId` is Booking's own identifier for the review.
- `url` is the hotel's page. Booking publishes no link for a single review. It's filled whichever way you gave the hotel: link, name or id.
- `text` is `positiveText` and `negativeText` joined by a blank line, if you want one review body. The title stays apart in `title`.
- `hotelReviewCount` is the number of reviews matching your filters, and `hotelSubRatings` holds the hotel's category scores out of 10.
- `language` is a two-letter code. A regional variant (US English, Latin American Spanish, Brazilian Portuguese, traditional Chinese) is reported as its base language.
- `roomId` is the same number [Booking.com Room Rates Scraper](https://apify.com/boncross/booking-room-rates) returns for a room, which lets you match a review to its room and rate.

Switch on "Add Booking's AI review summary" and each hotel also gets one row ahead of its reviews, marked `isSummary: true`. It has the hotel's identity and the pros and cons Booking.com's own AI draws from its recent reviews. `summaryReviewCount` is the number of reviews Booking says the summary is based on. A hotel Booking hasn't summarised gets no summary row and no charge.

```json
{
  "isSummary": true,
  "id": "186104-summary",
  "url": "https://www.booking.com/hotel/us/bellagio.html",
  "scrapedAt": "2026-10-07T20:36:10.220Z",
  "input": "https://www.booking.com/hotel/us/bellagio.html",
  "hotelId": 186104,
  "hotelName": "Bellagio",
  "hotelCountryCode": "US",
  "pros": [
    { "topic": "Location", "text": "Central position on the Strip near major attractions and restaurants." },
    { "topic": "Cleanliness", "text": "Tidy and well-maintained spaces with fresh linens." },
    { "topic": "Views", "text": "Overlooks the famous fountains and mountains through large panoramic windows." }
  ],
  "cons": [
    { "topic": "Prices", "text": "High costs for parking, resort fees, and basic amenities like water and kettles." },
    { "topic": "Staff", "text": "Friendly and helpful team, though some guests report rude or dismissive service at reception." }
  ],
  "summaryReviewCount": 1414
}
```

You can download any of it as JSON, CSV, Excel, XML or HTML.

### How much does it cost?

| Event | Free plan | Starter | Scale | Business |
|---|---|---|---|---|
| `actor-start`, per run | $0.001 | $0.001 | $0.001 | $0.001 |
| `hotel-resolved`, per hotel looked up | $0.0005 | $0.0005 | $0.0005 | $0.0005 |
| `review-scraped`, per review | $0.00165 | $0.00148 | $0.0012 | $0.00084 |
| `hotel-summary`, per hotel AI review summary | $0.002 | $0.0018 | $0.0016 | $0.0014 |

Enterprise plans pay the Business price.

**$1.65 per 1,000 reviews** on the Free plan, $0.84 on Business. That's the whole price: proxy usage and platform usage are included, and there's nothing to set up. `hotel-summary` is billed only when "Add Booking's AI review summary" is on, once per hotel that has a summary.

- One hotel with 1,000 reviews: $0.001 + $0.0005 + 1,000 × $0.00165 = **$1.6515** ($0.84 on Business).
- Ten hotels at 200 reviews each: $0.001 + 10 × $0.0005 + 2,000 × $0.00165 = **$3.306** ($1.69 on Business). The AI summary for those ten adds 10 × $0.002 = $0.02 ($0.014 on Business).

Apify's Free plan comes with $5 of credits a month, which is about 30 runs of one hotel at the default 100 reviews, or roughly 3,000 reviews, before you pay anything.

### How many reviews can you get, and how fast?

All of them. There's no depth limit, and the run reaches the oldest review a property has if you set the per-hotel maximum high enough.

| Run | Reviews | Time |
|---|---|---|
| One hotel, newest 10 | 10 | 3 to 5 s |
| Four hotels, 150 each | 600 | 6 to 17 s on most runs, up to 51 s |
| 36 hotels, 200 each | 7,200 | 11 to 16 s |

These are whole runs on Apify, start-up included, measured on 2 October 2026. Booking.com's answer time varies through the day, which is the spread on the second line. Several hotels are read at once, and a longer list adds little time: the 36-hotel run worked out at about 30,000 reviews a minute, which puts hundreds of hotels inside the default one-hour run limit.

### What people do with Booking.com reviews

- Track a property's score month by month and see which category is dragging it down.
- Read every complaint about a competitor before repositioning.
- Compare what couples say against what families say about the same hotel.
- Find the rooms that attract the most complaints, using the room name on each review.
- Measure how often a property replies to its guests, and whether that moves its score.
- Compare summer stays against winter stays using the actual check-in date.
- Build a labelled dataset for sentiment work, with the positive and negative halves already separated.
- Watch for new low-scoring reviews the day they appear.

For that last one you don't need code. Schedule the run in Apify, switch on "Only reviews not seen in earlier runs", and send the result to Slack or a Google Sheet through Apify's integrations. From your own code, `POST https://api.apify.com/v2/acts/boncross~booking-reviews/run-sync-get-dataset-items` with the input JSON as the body runs it and returns the reviews in one call, and an AI agent can call it as `boncross/booking-reviews` through the Apify MCP server (`mcp.apify.com`) with a hotel name and a filter.

### FAQ

#### I typed a hotel name and got an error row. Why?

Because no suggestion from Booking matched the name closely enough, and we'd sooner tell you than hand you another hotel's reviews. Spelling slips and partial names do resolve. When nothing matches with confidence, the row names the closest hotel and its id, and it costs you nothing. If that's the hotel you meant, pass its id. If a name is shared by several hotels, use a link or an id. One known miss: "Plaza Hotel New York" resolves to a property in Cyprus whose name contains every word you typed.

#### How do I get only the complaints?

Sort by "Lowest score first" and pick the "Poor" or "Very poor" score band. Each review's complaint is in `negativeText`, apart from the praise. Bear in mind that many guests write only what they liked: a negative half appears on roughly four reviews in ten.

#### Can I filter by the time of year guests stayed?

Use "Months of stay". Booking.com itself only filters by season, so the season is applied by Booking and the exact month is then checked on each review. What you get back is the months you asked for and nothing else.

#### How do I get only the new reviews each day?

Schedule the run, keep the sort on newest first, switch on "Only reviews not seen in earlier runs" and give the "De-duplication store name" a name. Each run then returns what was posted since the last one. A day with no new reviews returns nothing.

#### I filtered for business travellers. Why don't the rows say "business"?

The business-traveller filter is Booking.com's own and it does return business trips. But each review's `customerType` names who travelled (solo, couple, family, friends), and that's what the column shows.

#### Can I leave guest names out?

Turn off "Include guest details" and the name, country and avatar are left empty.

#### Do I need proxies or a Booking.com account?

Neither. There's no login, and proxy usage is included in the price.

#### What are the limits?

- Booking.com doesn't publish one overall score on this data. You get the per-category scores, not a single headline number.
- A link Booking has no page for returns an error row naming the nearest hotel it suggests.
- A hotel with no reviews yet, or with none that pass your filters, writes one row with an `error` saying so. The $0.0005 lookup fee for that hotel still applies.
- A title appears on roughly four reviews in ten.
- Review photos are links to the full-size image as Booking.com serves them, beside their ids. About 1 review in 15 has a photo.
- `stayStatus` is Booking.com's own code: `stayed` on almost every review, and for example `non_stayed_cancelled_by_guest` on the few written by guests who cancelled (2 of 300 measured).
- `language` is the base language. Regional variants such as US English or Brazilian Portuguese aren't told apart.

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

The scraper collects what Booking.com publishes publicly, without signing in. Collecting public data is broadly lawful, but reviews include personal data such as guest names, and what you do with that is your responsibility under GDPR and similar rules. Take legal advice if you're unsure, or switch guest details off.

### More from BonCross

- [Booking.com Hotel Details Scraper](https://apify.com/boncross/booking-hotel-details): The full Booking.com record for a property.
- [Booking.com Hotel Search Scraper](https://apify.com/boncross/booking-hotel-search): Every hotel Booking.com is selling for a destination and your dates.
- [Booking.com Room Rates Scraper](https://apify.com/boncross/booking-room-rates): Every room Booking.com is selling for a hotel and your dates.
- [Expedia Reviews Scraper](https://apify.com/boncross/expedia-reviews): Expedia guest reviews for any hotel, including hotels given as Hotels.com links.
- [Google Hotels Reviews Scraper](https://apify.com/boncross/google-hotels-reviews): Google Hotels reviews from every source Google shows, including the hotel's own site.
- [Google Maps Reviews Scraper](https://apify.com/boncross/google-maps-reviews): Google Maps reviews for any place using URLs, Place IDs or names.

### Your feedback

Is a review missing, or did a hotel name land somewhere it shouldn't? Report it on the Issues tab in Apify Console, where we read every issue and answer. If it's a name that resolved wrongly, include the name you typed and the hotel you expected.

# Changelog

This Actor's version history is a separate document: https://apify.com/boncross/booking-reviews/changelog.md

# Actor input Schema

## `hotels` (type: `array`):

The hotels to scrape. Paste a Booking.com hotel address, or just type the hotel name and it will be looked up. A numeric Booking hotel id also works.

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

Booking.com page addresses, with the option to load them in bulk from a file, a Google Sheet or a remote list. Use this when you have more links than you want to paste. Combined with anything in the list above.

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

Stop after this many reviews for each hotel. Set it high to take everything; the scraper reaches the oldest review a hotel has.

## `maxItems` (type: `integer`):

A run-wide ceiling across every target. The per-target limit applies to each one separately, so ten targets at 50 each returns 500; set this to cap the total. Zero means no run-wide limit. Rows that report an input the actor could not resolve are not counted here and are never charged for.

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

The order reviews are read in. Newest first is the one to use when you only want recent reviews.

## `reviewLanguages` (type: `array`):

Keep only reviews written in these languages, as two-letter codes such as en, fr, de, es, it, ja, zh. Leave empty for every language.

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

Keep only reviews from one kind of trip.

## `scoreBand` (type: `string`):

Keep only reviews in one of Booking.com's score bands.

## `stayMonths` (type: `array`):

Keep only reviews whose stay began in these months, as numbers from 1 to 12. Booking.com groups the year into four seasons, so the season is applied at source and the exact month is checked here.

## `containsText` (type: `string`):

Keep only reviews mentioning this word or phrase, for example breakfast or noisy.

## `topics` (type: `array`):

Keep reviews about these topics, as on the chips above Booking.com's review list: Location, Breakfast, Room, Clean, Staff and so on. Names are matched on each hotel's own list, which varies by hotel; a topic id works too.

## `reviewedAfter` (type: `string`):

Keep only reviews posted on or after this date, as YYYY-MM-DD. Pair it with newest first and the run stops as soon as it has passed the date.

## `onlyWithOwnerResponse` (type: `boolean`):

Keep only reviews the property has replied to.

## `includeGuestProfile` (type: `boolean`):

When off, the guest name, country and avatar are left empty. Turn it off if you do not want personal data in your dataset.

## `includeAiSummary` (type: `boolean`):

Adds one extra row per hotel, before its reviews, with the pros and cons Booking.com's own AI summary draws from recent reviews (for example "Location: central position on the Strip"). The row has isSummary set to true and is billed as its own event. A hotel Booking has not summarised gets no row and no charge.

## `onlyNewReviews` (type: `boolean`):

Skip reviews already returned by a previous run. Needs a de-duplication store name.

## `dedupStoreName` (type: `string`):

Name of a key-value store that remembers which reviews have already been returned, so a scheduled run gives you only what is new.

## `delayMs` (type: `integer`):

Optional pause before each call, in milliseconds. 0 (the default) runs as fast as the parallel limit allows. Values above 2000 are treated as 2000.

## `maxConcurrency` (type: `integer`):

How many requests run at once across the whole run. The default is the fastest level measured clean; lower it only if a run reports refusals or errors.

## Actor input object example

```json
{
  "hotels": [
    "Hôtel Le Bristol Paris"
  ],
  "startUrls": [],
  "maxReviewsPerHotel": 100,
  "maxItems": 0,
  "sortBy": "newest",
  "reviewLanguages": [],
  "customerType": "",
  "scoreBand": "",
  "stayMonths": [],
  "containsText": "",
  "topics": [],
  "reviewedAfter": "",
  "onlyWithOwnerResponse": false,
  "includeGuestProfile": true,
  "includeAiSummary": false,
  "onlyNewReviews": false,
  "dedupStoreName": "",
  "delayMs": 0,
  "maxConcurrency": 32
}
```

# Actor output Schema

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

Booking.com reviews: every row the run returned.

## `stats` (type: `string`):

Counts for the run: what was resolved, fetched, filtered and returned.

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

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

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

```

## MCP server setup

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

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/5Weeaz9Bd5qM7NChb/builds/fQvpcv6sWrCbALnSr/openapi.json
