# Booking.com Scraper: Reviews, Room Prices & Search (`sourabhbgp/booking-scraper`) Actor

Paste a hotel link or a destination. Get every guest review, room prices with all taxes and fees for up to 90 dates, or every property a search lists, even for whole regions. $1.50 per 1,000 results.

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

## Pricing

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

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 scraper: reviews, hotel details, room prices and search

Get Booking.com data in three ways: every guest review of a hotel, a hotel's full profile with live room prices, or every property a search lists for a destination. Paste a hotel link or a destination, press Start, and download a clean spreadsheet.

**$1.50 per 1,000 results in every mode, plus $0.002 per run. No proxy setup or login needed.**

Works for every country and property type on Booking.com: hotels, apartments, villas, guest houses and more, in 50+ currencies.

<br>

### Pick a mode

Set **What to scrape** (`mode`), paste your hotels or destinations, then fill the section with the mode's name. Hotel details and Search also use **Dates, guests and currency**. Other sections are ignored.

| You want | `mode` | Paste into |
|---|---|---|
| Every guest review of a hotel, with its scores | `reviews` | `hotelUrls` (hotel links or IDs) |
| A hotel's profile, room offers with all-in prices, and its availability calendar | `hotels` | `hotelUrls` (hotel links or IDs) |
| Every property a search lists, with its place in the list and its price | `search` | `searches` (a destination or a Booking.com search link) |

Every mode can be scheduled. Run it daily and you have a review monitor, a rate shopper or a ranking tracker.

<br>

### Why this Booking.com scraper?

- 💷 **The price a guest really pays:** taxes and fees Booking adds at checkout are included, and each one is listed.
- 🏷️ **Genius deals kept apart:** when a discount is for signed-in members only, `price` is what everyone pays and `memberPrice` holds the members' price.
- 🗺️ **Whole regions and countries:** a search for Tuscany returns its 30,000+ properties, not just the first 1,000.
- 📅 **Room prices for up to 90 check-in dates** in one run, plus an availability calendar with minimum stays.
- 🔔 **Only new reviews** on scheduled runs, so a daily monitor never pays twice for the same review.
- 📍 **Search rank and ads:** every row carries its position in the list and whether it's a paid placement.
- 💸 **One price for every row,** and you pay only for rows you get. A run that falls short says so in its status.

<br>

### 1. Reviews: every guest review of a hotel

**Paste** Booking.com hotel links or numeric hotel IDs, one per line.

**Get** one row per review: score, title, what the guest liked and disliked, date, language, traveller type, room, stay dates, the hotel's reply and photos. A summary row per hotel comes first, with the 7 category scores next to the city average, and how reviews split by score, traveller type and language.

| Option | Field | Default | What it does |
|---|---|---|---|
| Max reviews per hotel | `maxReviewsPerHotel` | 100 | `0` returns only the summary row |
| Sort reviews by | `sortReviewsBy` | `NEWEST_FIRST` | Also `OLDEST_FIRST`, `MOST_RELEVANT`, `SCORE_DESC`, `SCORE_ASC` |
| Reviewed on or after / before | `reviewedDateFrom`, `reviewedDateTo` | | A date, or a period such as `7 days` for scheduled runs |
| Traveller type | `travellerType` | `ALL` | Couples, families, solo, friends or business |
| Review score | `reviewScore` | `ALL` | Superb, good, passable, poor or very poor |
| Review languages | `reviewLanguages` | all | Reviews always come in the language they were written in |
| Reviews mentioning | `reviewText` | | A word or phrase, for example `breakfast` |
| Only new reviews | `onlyNewReviews` | `false` | Skips reviews an earlier run already returned |

**Input**

```json
{
  "mode": "reviews",
  "hotelUrls": [
    "https://www.booking.com/hotel/gb/the-savoy.html"
  ],
  "maxReviewsPerHotel": 500,
  "reviewedDateFrom": "30 days"
}
```

**Output** (one real row, selected fields)

```json
{
  "rowType": "review",
  "hotelName": "The Savoy",
  "reviewScore": 10,
  "reviewedDate": "2026-10-27T15:28:54.000Z",
  "reviewTitle": "Excellent!",
  "positiveText": "It was stunning. Sebastian was an outstanding member of staff, so welcoming and warm.",
  "negativeText": "Cheaper drinks",
  "reviewLanguage": "en",
  "reviewerCountry": "United Kingdom",
  "travellerType": "COUPLES",
  "roomName": "Superior Queen Room",
  "checkinDate": "2026-10-24",
  "nights": 2,
  "hotelReply": "Dear Matthew, We very much appreciate your comments regarding your recent stay at The Savoy..."
}
```

<br>

### 2. Hotel details and room prices

**Paste** hotel links or IDs, and a check-in date.

**Get** one hotel row with the full profile: address, coordinates, brand, facilities, house rules, check-in times, the legal trader behind the listing, and the review scores. Then one row per room offer for each check-in date: room, beds, meal plan, rooms left, cancellation and prepayment terms, and the all-in price with every tax and fee listed.

| Option | Field | Default | What it does |
|---|---|---|---|
| Check-in date | `checkIn` | | A date, or a period such as `30 days`. Empty = hotel profile only |
| Nights | `nights` | 1 | Length of each stay, up to 30 |
| Check-in dates to check | `checkInDays` | 1 | Up to 90 consecutive dates in one run |
| Adults, rooms, children's ages | `adults`, `rooms`, `childrenAges` | 2, 1 | Ages change which rooms Booking offers |
| Currency | `currency` | `USD` | Rows also carry the hotel's own currency |
| Cheapest offer only | `onlyCheapestRate` | `false` | One row per date: the lowest all-in price for your guests |
| Availability calendar days | `calendarDays` | 0 | One row per day: can a stay start, minimum nights, calendar price |

**Input**

```json
{
  "mode": "hotels",
  "hotelUrls": [
    "https://www.booking.com/hotel/gb/the-savoy.html"
  ],
  "checkIn": "45 days",
  "nights": 3,
  "checkInDays": 7,
  "currency": "USD"
}
```

**Output: hotel row** (one real row, selected fields)

```json
{
  "rowType": "hotel",
  "hotelId": 280149,
  "hotelName": "The Savoy",
  "fullAddress": "Strand, Westminster Borough, London, WC2R 0EU, United Kingdom",
  "starRating": 5,
  "hotelScore": 9.4,
  "hotelReviewCount": 1419,
  "brand": "Fairmont Hotels & Resorts",
  "checkInFrom": "15:00",
  "checkOutUntil": "12:00",
  "petsAllowed": "YES",
  "popularFacilities": ["Indoor swimming pool", "Non-smoking rooms", "Spa & wellness centre"],
  "traderName": "Accor",
  "traderEmail": "customercare@accor.com"
}
```

**Output: room offer** (one real row, selected fields)

```json
{
  "rowType": "rate",
  "hotelName": "The Savoy",
  "checkIn": "2026-12-12",
  "checkOut": "2026-12-15",
  "nights": 3,
  "available": true,
  "roomName": "Deluxe Room with 2 Twin Beds",
  "roomSizeM2": 35,
  "mealPlan": "BREAKFAST_EXCLUDED",
  "roomsLeft": 3,
  "currency": "USD",
  "price": 4892.53,
  "pricePerNight": 1630.84,
  "chargesExcluded": [{ "name": "20 % VAT", "amount": 815.42 }],
  "memberPrice": null,
  "cancellationText": "Free cancellation before 11 December 2026"
}
```

**Output: calendar day** (one real row)

```json
{
  "rowType": "calendarDay",
  "hotelName": "The Savoy",
  "date": "2026-11-27",
  "available": true,
  "minNights": 3,
  "calendarPrice": 3650,
  "currency": "USD"
}
```

The calendar price is Booking's own calendar figure, without deals. Use the room offer rows for what a guest pays.

<br>

### 3. Search: every property for a destination

**Paste** a destination as you'd type it on Booking.com (a city, region, country, district or landmark), or a Booking.com search results link. A link keeps its own dates, guests, filters and order.

**Get** one row per property: its position in the list, whether it's an ad, type, stars, score, review count, area and distance, and with dates, the all-in price, the price before a deal, the member price, free cancellation and rooms left.

| Option | Field | Default | What it does |
|---|---|---|---|
| Max results per search | `maxResultsPerSearch` | 100 | Up to 100,000; regions and countries are read in full |
| Sort results by | `sortResultsBy` | `popularity` | Booking's 9 orders, such as price, top reviewed or distance |
| Star rating, review score | `starRatings`, `minReviewScore` | | For example 4 and 5 stars, 8+ |
| Property types | `propertyTypes` | | Hotels, apartments, villas and 9 more |
| Free cancellation, meals | `freeCancellationOnly`, `mealPlans` | | Breakfast, half board, all inclusive, self catering |
| Price per night | `minPricePerNight`, `maxPricePerNight` | | All-in, needs a check-in date |

Dates, guests and currency come from the same section as Hotel details. Leave the check-in date empty to list every property without prices.

**Input**

```json
{
  "mode": "search",
  "searches": [
    "Lisbon"
  ],
  "checkIn": "30 days",
  "nights": 2,
  "maxResultsPerSearch": 500,
  "currency": "USD"
}
```

**Output** (one real row, selected fields)

```json
{
  "rowType": "searchResult",
  "input": "Lisbon",
  "totalResults": 3151,
  "position": 1,
  "isAd": false,
  "hotelName": "LX51 Lisbon Center - Studios & Suites by APT IIN",
  "propertyType": "Guest houses",
  "starRating": 4,
  "hotelScore": 8.2,
  "scoreWord": "Very good",
  "pageReviewCount": 2688,
  "area": "Santo Antonio, Lisbon",
  "checkIn": "2026-11-27",
  "nights": 2,
  "currency": "USD",
  "price": 179.7,
  "pricePerNight": 89.85,
  "priceBeforeDiscount": 220.17,
  "badges": ["Late Escape Deal"],
  "roomsLeft": 1
}
```

Every row has a `mode` and a `rowType` column, so you can split one export into tabs.

<br>

### Use it from an AI agent (Claude, ChatGPT, MCP)

Connect Claude, ChatGPT, Cursor or any MCP client to Apify's MCP server with this scraper as a tool:

```
https://mcp.apify.com?tools=sourabhbgp/booking-scraper
```

Then ask in plain words. The agent fills in the input, and you pay the same per result. For example:

- "Get this month's reviews of The Savoy London and list what guests complain about."
- "What does the cheapest room at this hotel cost for every check-in date in December, 2 nights, 2 adults, in EUR?"
- "List every 4 and 5 star hotel in Lisbon under $200 a night for 2 nights from 10 December, cheapest first."
- "Where does my hotel rank in Barcelona's search, and which hotels above it are ads?"

**Notes for the agent:**

| Question | Mode | Minimum input |
|---|---|---|
| What do guests say about a hotel? | `reviews` | `hotelUrls` |
| What does a room cost on a date? Is it available? | `hotels` | `hotelUrls` + `checkIn` |
| Which properties are in a place, at what price? | `search` | `searches` + `checkIn` (no `checkIn` = no prices) |

- **Keep the cost small:** you pay $1.50 per 1,000 rows, so set `maxReviewsPerHotel` or `maxResultsPerSearch` to what the question needs (20 to 100 is usually enough), and use `onlyCheapestRate: true` when only the lowest price matters.
- **Dates:** `checkIn` takes a date like `2026-12-10` or a period like `30 days` from today; `nights` sets the stay length. A hotel with a minimum stay returns `available: false` for shorter stays, so try 2 or 3 nights before calling it sold out.
- **Prices:** `price` is the total for the whole stay, all taxes and fees included, in `currency`. `pricePerNight` divides it by `nights`. `memberPrice`, when set, is the Genius members' price; quote `price` to a normal guest.
- **Hotel input:** `hotelUrls` takes a Booking.com hotel link (any language version) or Booking's numeric hotel ID, not a hotel name. If you only have the name, find the hotel's Booking.com link first, for example with a web search.
- **Reading the result:** the run's status message starts with a code when something went short: `[U_...]` means the input (for example a hotel that doesn't exist), `[E_...]` means our side. The `RUN_SUMMARY` record in the run's key-value store lists every input with its own outcome.
- **Time:** a hotel's reviews or prices take seconds; a full city or region search of thousands of properties takes minutes (about 20 seconds per 1,000).

<br>

### What people use it for

- 🏨 **Hotel and revenue managers:** compare your rates with the competition for every date of the next 3 months.
- ⭐ **Reputation teams:** pull every new review each morning and answer the bad ones first.
- 📊 **Market research:** size a destination by property type, price level and review score.
- 📍 **Distribution and OTA teams:** track where a property ranks in a city's search and who's buying ads.
- 🧳 **Travel startups and agents:** build a catalogue with profiles, photos, scores and live prices.
- 🧪 **Analysts and researchers:** guest reviews by language, traveller type and date for sentiment studies.

<br>

### How much does it cost?

You pay per row, and each row is charged once. Every kind of row costs the same, in every mode and on every Apify plan.

| What you get | Per 1,000 |
|---|---|
| Any row: review, hotel, room offer, calendar day or search result | $1.50 |

Each run also costs $0.002 to start.

- **Free plan:** your $5 monthly credit covers about **3,300 rows**.
- **Starter plan ($29):** about **19,300 rows** a month.

<br>

### Limitations

- **Prices are what a logged-out visitor sees.** Genius members' prices come in `memberPrice` when Booking shows them, but a signed-in account can see other deals.
- **Search positions can change between runs.** Booking shows different visitors different versions of its "Our top picks" order.
- **Very large searches take time:** about 20 seconds per 1,000 properties, so a country of over 170,000 properties won't fit in one hour.
- **Districts, landmarks and airports** stop at a few thousand properties, and the run says so; cities, regions and countries are read in full.
- **Reviews are the ones Booking publishes.** Each review comes in the language it was written in, without translation.

<br>

### FAQ

#### How do I scrape Booking.com without coding?

Pick a mode, paste a hotel link or a destination, and press **Start**. Download the results as Excel, CSV or JSON.

#### Can I track Booking.com prices every day?

Yes. Save your input as a task, set the check-in date to a period such as `30 days`, and add a schedule. Every run checks the stays starting from that day forward.

#### Can I get only new reviews?

Yes. Turn on **Only new reviews since the last run** and schedule the task. Each run returns, and charges, only reviews no earlier run has returned.

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

No. It works out of the box with Apify's standard proxy, and it doesn't log in.

#### Can I use it from code or an AI agent?

Yes. Call it through the Apify API, or connect it to an AI agent through Apify's MCP server.

#### Is scraping Booking.com legal?

It collects only what Booking.com shows any visitor, with no login. How you use the data is your responsibility, especially personal data such as reviewers' names.

#### Your feedback

Something missing or wrong? [Open an issue](https://console.apify.com/actors/DSSJsZK0oRYWV0aXd/issues).

# Actor input Schema

## `mode` (type: `string`):

Reviews: every guest review of the hotels below, with the hotel's score and subscores. Hotel details and room prices: one row per hotel with its profile, plus one row per room offer for each check-in date you ask for, with the all-in price and every tax and fee listed. Search: every property a Booking.com search lists for a destination, with its place in the list, whether it is an ad, its score and its price for your dates.

## `hotelUrls` (type: `array`):

Used by Reviews and Hotel details. One per line: a Booking.com hotel link such as https://www.booking.com/hotel/gb/the-savoy.html (any language version, with or without the part after ?), or a numeric Booking hotel ID. Apartments, villas and guest houses use the same links.

## `searches` (type: `array`):

Used by Search. One per line: a destination as you would type it on Booking.com (a city, region, district, landmark or airport, for example London or Eiffel Tower), searched as Booking's own search box does when you press Enter (text Booking takes as one property is refused: use Hotel details and room prices for that), or a Booking.com search results link. A link keeps its own destination, dates, guests, filters and order; the settings below fill in what it leaves out. The currency below always applies.

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

Stop after this many reviews for each hotel. 0 returns the hotel summary row only.

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

The order Booking returns reviews in. A date window works with every order; with Newest first or Oldest first the run stops reading at the window's edge, with the other orders it reads the whole list and keeps only reviews inside the window.

## `reviewedDateFrom` (type: `string`):

Only reviews written on or after this date (UTC). Pick a date, or a period such as 7 days for scheduled runs. Reviews outside the window are never returned or charged.

## `reviewedDateTo` (type: `string`):

Only reviews written on or before this date (UTC, the whole day included). Pick a date or a period such as 1 day.

## `travellerType` (type: `string`):

Only reviews from this kind of guest, filtered by Booking itself. Business trip filters on the trip's purpose, so those reviews still show their guest type (couple, family, solo or group).

## `reviewScore` (type: `string`):

Only reviews in this score band, filtered by Booking itself.

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

Only reviews written in these languages, filtered by Booking itself. Empty = all languages. Reviews are always returned in the language they were written in.

## `reviewText` (type: `string`):

Only reviews that contain this word or phrase, searched by Booking itself (not case-sensitive), for example breakfast.

## `includeHotelSummary` (type: `boolean`):

One extra row per hotel before its reviews: overall score, review count, the 7 category scores with the city-average range, how reviews split by score, traveller type and language, and the hotel's profile (address, description, facilities, house rules, legal trader details). Hotel details mode always returns this row.

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

For scheduled Reviews runs: return only reviews that an earlier run with this setting has not returned yet, per hotel and filter set. Reads newest first. The memory is kept in the storage named below, in your own account.

## `onlyNewReviewsStore` (type: `string`):

Name of the key-value store that remembers returned reviews. Use a different name to keep separate memories, for example one per client.

## `checkIn` (type: `string`):

Stays starting on this date. Pick a date, or a period such as 30 days, counted forward from the day the run starts (useful for scheduled runs). Leave empty for hotel details only, or for a search of every property without prices.

## `nights` (type: `integer`):

Length of each stay.

## `adults` (type: `integer`):

Adults in total, across all rooms.

## `rooms` (type: `integer`):

Rooms to book. Each price Booking returns is for one room.

## `childrenAges` (type: `array`):

One age per child, 0 to 17. Leave empty for no children. Ages change which rooms and prices Booking offers.

## `currency` (type: `string`):

Prices are returned in this currency, as Booking converts them. When this is not the hotel's own currency, rows also carry the price in the hotel's currency.

## `checkInDays` (type: `integer`):

Check this many consecutive check-in dates, starting at the check-in date. For example 30 gives the room prices of every stay starting in the next 30 days. Each date is one more set of rows.

## `onlyCheapestRate` (type: `boolean`):

Return one row per check-in date: the lowest all-in price among rooms that sleep your guests (guests divided by rooms), whatever the meal plan or cancellation terms.

## `calendarDays` (type: `integer`):

Also return one row per day for this many days from the check-in date (or from today): whether a stay can start that day, the minimum stay, and Booking's calendar price. The calendar price ignores deals and is not the price of any one room, so use the room price rows for what a guest pays. 0 = no calendar.

## `maxResultsPerSearch` (type: `integer`):

Stop after this many properties for each search. Booking lets one search order reach about 1,100 properties; past that the run reads other orders, and a city, region or country in parts, until it has them all.

## `sortResultsBy` (type: `string`):

The order Booking lists properties in. Ads appear only in Our top picks. Booking shows different visitors different versions of Our top picks, so each search reads its ranked list as one visitor, and positions can differ between runs.

## `starRatings` (type: `array`):

Only properties with these star ratings, filtered by Booking itself. Empty = any.

## `minReviewScore` (type: `string`):

Only properties with at least this guest review score, filtered by Booking itself.

## `propertyTypes` (type: `array`):

Only these kinds of property, filtered by Booking itself. Empty = all.

## `freeCancellationOnly` (type: `boolean`):

Only properties Booking lists with free cancellation for your dates.

## `mealPlans` (type: `array`):

Only properties offering these meal plans for your dates, filtered by Booking itself. Empty = any.

## `minPricePerNight` (type: `integer`):

In the currency above, all taxes and fees included. Needs a check-in date. Booking's own price filter lets some properties through outside the range, so every row is checked again on its all-in price per night.

## `maxPricePerNight` (type: `integer`):

In the currency above, all taxes and fees included. Needs a check-in date.

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

Booking refuses requests from Apify servers without a proxy. The default datacenter proxy works.

## Actor input object example

```json
{
  "mode": "reviews",
  "hotelUrls": [
    "https://www.booking.com/hotel/gb/the-savoy.html"
  ],
  "searches": [
    "London"
  ],
  "maxReviewsPerHotel": 50,
  "sortReviewsBy": "NEWEST_FIRST",
  "travellerType": "ALL",
  "reviewScore": "ALL",
  "includeHotelSummary": true,
  "onlyNewReviews": false,
  "onlyNewReviewsStore": "booking-reviews-seen",
  "checkIn": "30 days",
  "nights": 1,
  "adults": 2,
  "rooms": 1,
  "currency": "USD",
  "checkInDays": 3,
  "onlyCheapestRate": false,
  "calendarDays": 0,
  "maxResultsPerSearch": 50,
  "sortResultsBy": "popularity",
  "minReviewScore": "ANY",
  "freeCancellationOnly": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (type: `string`):

One row per review, hotel, room offer, calendar day or search result.

# 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 = {
    "hotelUrls": [
        "https://www.booking.com/hotel/gb/the-savoy.html"
    ],
    "searches": [
        "London"
    ],
    "maxReviewsPerHotel": 50,
    "checkIn": "30 days",
    "checkInDays": 3,
    "maxResultsPerSearch": 50,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("sourabhbgp/booking-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 = {
    "hotelUrls": ["https://www.booking.com/hotel/gb/the-savoy.html"],
    "searches": ["London"],
    "maxReviewsPerHotel": 50,
    "checkIn": "30 days",
    "checkInDays": 3,
    "maxResultsPerSearch": 50,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("sourabhbgp/booking-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 '{
  "hotelUrls": [
    "https://www.booking.com/hotel/gb/the-savoy.html"
  ],
  "searches": [
    "London"
  ],
  "maxReviewsPerHotel": 50,
  "checkIn": "30 days",
  "checkInDays": 3,
  "maxResultsPerSearch": 50,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call sourabhbgp/booking-scraper --silent --output-dataset

```

## MCP server setup

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