# Booking.com Scraper — Hotels, Prices, Reviews & Host Data (`pro100chok/booking-all-in-one-scraper`) Actor

Extract Booking.com hotel listings, live room prices & availability, guest reviews and ratings, full property details, and professional host contacts. Scrape by destination or URL with automatic pagination — no code, no login. Export to JSON, CSV, Excel or via API.

- **URL**: https://apify.com/pro100chok/booking-all-in-one-scraper.md
- **Developed by:** [Raven](https://apify.com/pro100chok) (community)
- **Categories:** Travel, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.70 / 1,000 properties

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/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 Scraper — Hotels, Prices, Reviews & Host Data

**Scrape Booking.com hotel data by destination or URL: live room prices, availability, guest reviews, ratings, full property details and professional host contacts.** Point the scraper at a city (like `Amsterdam`) or paste Booking.com URLs, and export clean, structured data to JSON, CSV, Excel, XML or via API — for rate shopping, revenue management, market research or B2B lead lists.

One actor replaces a whole stack of single-purpose tools: a **Booking hotels scraper**, a **Booking price scraper** (room-level, with a price calendar up to **365 days ahead**), a **Booking reviews scraper**, and a **host / owner contact scraper**.

> ✅ No login, no cookies, no API key, no browser setup. The scraper handles Booking.com's anti-bot protection (AWS WAF) and pagination automatically.

### What does Booking.com Scraper do?

It extracts public data from Booking.com search results and hotel pages and returns it as clean dataset records (each tagged with `dataType`):

- 🏨 **Hotel search results** — every property for a destination: name, price, star rating, review score, address, GPS coordinates, photo, host type and sold-out status.
- 💶 **Prices & availability** — room-level offers by room type: current price, original (pre-discount) price, occupancy, meal plan, free-cancellation deadline and **rooms left at this price** (scarcity signal) for your dates — plus a multi-day **price calendar** (up to a full year ahead).
- ⭐ **Guest reviews** — every review with score, title, positive/negative text, reviewer name & country, stay dates, room type and the owner's reply — plus aggregate **category scores** (staff, cleanliness, comfort, value, location, Wi-Fi).
- 📋 **Hotel details** — description, stars, rating, address, coordinates, facilities & amenities, photos, check-in/out times, pet & child policies, languages spoken, room types, Q&A, chain & brand, sustainability — plus **hotel surroundings ("what's nearby")**: landmarks, top attractions, restaurants & cafes, public transport, closest airports and beaches with walking/driving distances.
- 🧑‍💼 **Host / owner contacts** — the legally published professional-host block: company name, registration number, email, phone and address. Ready for B2B outreach to property managers.

### Why use this Booking.com Scraper?

- **All Booking.com data in one actor** — hotels, prices, reviews, details and host contacts in a single run, instead of juggling three or four separate scrapers.
- **HTTP-only, no browser** — it talks to Booking.com's pages and internal GraphQL API directly. Faster and cheaper than browser-based scrapers, with no JavaScript-rendering failures.
- **Anti-bot handled for you** — Booking.com gates non-browser clients behind an AWS WAF challenge; this actor solves it automatically. No tokens, no CAPTCHA solving, nothing to configure.
- **Real pagination** — search results and reviews are fetched through Booking's GraphQL API page after page, up to your limits (the plain `offset=` URL trick other scrapers rely on silently returns page 1).
- **Sequential crawl** — scrape a search, then auto-drill into each hotel for its details / reviews / prices / host contact, returned as **one tidy record per hotel** with nested data.
- **No coding required** — run it from the Apify Console, schedule it, or call it via API and MCP.
- **Clean, structured output** — flat fields ready for spreadsheets, BI tools and databases; export to JSON, CSV, Excel, XML, HTML.

### Who is it for?

- **Revenue managers & hoteliers** — rate shopping: monitor competitor room prices, discounts and availability.
- **Travel agencies & OTAs** — power apps and price-comparison sites with fresh accommodation data.
- **Market researchers & analysts** — build datasets of hotel inventory, ratings and reviews by city or country.
- **Data scientists** — collect review text and category scores for sentiment analysis and NLP models.
- **Sales & lead-gen teams** — gather professional host / property-manager contacts (email, phone, company).
- **Developers** — a practical **Booking.com API alternative**: no partner agreement, no scraping infrastructure to maintain.

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

| Data type (`dataType`) | Key fields you get |
|---|---|
| **property** (search result) | name, url, stars, rating, ratingLabel, reviewsCount, price, originalPrice, currency, taxesAndCharges, roomName, beds/bedrooms/bathrooms, address, city, countryCode, latitude, longitude, distanceFromCenter, hostType, image, isSustainable, isSoldOut |
| **price** (room offer) | hotelName, checkIn, checkOut, roomId, roomName, occupancy, mealPlanId, price, originalPrice, currency, roomsLeft, freeCancellationUntil |
| **review** | score, title, positiveText, negativeText, language, reviewDate, userName, userCountry, guestType, customerType, roomType, numNights, checkInDate, checkOutDate, stayStatus, ownerReply, photos, helpfulVotesCount |
| **reviewScores** | totalReviews, scores[] (name, label, value, lowerBound, higherBound) |
| **hotel** (details) | description, stars, rating, address, latitude, longitude, checkInFrom, checkOutUntil, petsAllowed, child & crib policy, languagesSpoken, highlights, popularFacilities, facilities, amenities, meals, finePrints, roomTypes, questionsAnswers, photos, chainId, brandName, sustainability & certifications, host profile, surroundings (whatsNearby, topAttractions, restaurants, cafesBars, publicTransport, closestAirports, beaches, naturalBeauty — each POI with distance, walking/driving time and GPS) |
| **host / hostContact** | companyName, personName, registrationNumber, tradeRegisterName, email, phone, addressLine1/2, city, postalCode, countryCode, subjectType |

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

You pay **per result** — platform usage, proxies and compute are **included**. Prices per 1,000 results (plus a negligible actor-start fee of $0.00005 per run); higher Apify plans get a discount, up to the Gold rate:

| Result (`dataType`) | Price / 1,000 | Gold discount |
|---|---|---|
| Property (search result) | $1.50 | $0.70 |
| Room price offer | $3.00 | $1.20 |
| Guest review | $2.00 | $0.40 |
| Review category scores (per hotel) | $3.00 | $1.00 |
| Hotel details | $4.00 | $2.00 |
| Host / owner contact | $5.00 | $2.50 |

**Worked examples:**
- List **1,000 hotels** for a city → **$1.50** (from $0.70 on paid plans)
- **1,000 guest reviews** → **$2.00** (from $0.40 on paid plans)
- **100 hotels** with full details **and** host contacts → **$0.90** (from $0.45)
- **1,000 room-price offers** for rate monitoring → **$3.00** (from $1.20)

Apify's **free plan includes $5 of usage every month** — enough to list roughly **3,300 hotels per month for free**. Start free and scale as you go.

### How to scrape Booking.com hotels (step by step)

**Option A — by destination (no URLs needed):**
1. Click **Try for free** / **Start**.
2. Leave **What to scrape** on **Search results** (or pick another mode).
3. In **Destinations**, type one or more places, e.g. `Amsterdam`, `Paris, France`.
4. *(Optional)* set check-in/check-out dates, guests, currency, language, star/price filters and **Max properties**.
5. *(Optional)* tick **Also scrape for each result** (Hotel details, Prices, Reviews, Host) to drill into every hotel.
6. Click **Save & Start**, then download your data as JSON, CSV or Excel.

**Option B — by URL (specific hotels or a filtered search):**
1. Open the search or hotel page you want on booking.com and copy its URL.
2. Paste it into **Booking.com URLs** (`startUrls`).
3. Pick the mode — hotel URLs feed Reviews / Hotel details / Host / Prices; search URLs feed Search results / Prices.
4. Click **Save & Start**.

#### How to scrape Booking.com hotel prices

Set **What to scrape → Prices**, enter destinations (or hotel/search URLs) and your dates. Each room offer is returned as its own record with room name, occupancy, meal plan, current and original price, the free-cancellation deadline and **`roomsLeft`** — how many rooms remain at that price when Booking shows its "We have X left" scarcity message. For a rate calendar, set **Price calendar — days ahead** (`daysAhead`, up to **365**) to scrape one-night prices for consecutive dates — a full-year price calendar in one run.

#### How to scrape Booking.com reviews

Set **What to scrape → Reviews** and paste hotel URLs (or a destination, whose top hotels are used). You get every guest review with text, score, reviewer details, stay info and the owner's reply, plus one aggregate category-scores record per hotel. Control volume with **Max reviews per hotel** and order with **Sort reviews by** (newest, oldest, highest/lowest score).

#### How to scrape hotel surroundings ("what's nearby")

Whenever hotel details are scraped (**Hotel details** / **All** modes, or the Hotel details enrich option), the actor also collects the property's **surroundings** block: what's nearby, top attractions, restaurants & cafes, public transport stops, closest airports, beaches and natural-beauty spots — each with the localized distance, walking/driving distance and time, and GPS coordinates. Turn it off with **Include surroundings** (`includeSurroundings: false`) to save one request per hotel.

#### How to extract Booking.com host / owner contacts

Set **What to scrape → Host / owner contact info** and paste hotel URLs. For professional hosts, Booking.com is legally required (EU trader-transparency rules) to publish a business contact block — company name, registration number, email, phone and address — which the actor returns as one clean record per property. Ideal for property-manager and rental-agency lead lists.

### Scrape modes

| Mode | What you get | Input |
|------|--------------|-------|
| `search` | List of properties for a destination | Destinations or Booking search URLs |
| `prices` | Room-level offers (+ price calendar) | Destinations or Booking search URLs |
| `reviews` | Every guest review + category scores | Hotel URLs or a destination |
| `hotelDetails` | Full property profile | Hotel URLs |
| `hostInfo` | Host / owner contact block | Hotel URLs |
| `all` | Details + host + reviews per hotel (nested) | Hotel URLs |

#### Sequential crawl (search → details / reviews / prices / host)

In **Search** mode, use **Also scrape for each result** (`enrichWith`) to drill into every property automatically. The drilled-down data is returned **nested inside one record per hotel** — `prices` and `reviews` arrays, a `reviewScores` array and a `hostContact` object alongside the detail fields — so you get one row per property instead of scattered records. The `all` mode does the same starting from hotel URLs.

### Input example

```json
{
  "scrapeType": "search",
  "searchQueries": ["Amsterdam"],
  "enrichWith": ["hotelDetails", "reviews"],
  "checkIn": "2026-07-15",
  "checkOut": "2026-07-16",
  "adults": 2,
  "rooms": 1,
  "currency": "USD",
  "language": "en-us",
  "maxItems": 100,
  "maxReviews": 50,
  "sortBy": "review_score_and_price"
}
````

Other useful parameters: `startUrls` (hotel or search URLs), `starRating`, `minScore`, `minPrice` / `maxPrice`, `sortReviewsBy`, `children` + `childrenAges`, `daysAhead` (price calendar), `includeSurroundings` (what's-nearby POIs with hotel details, on by default), `maxConcurrency`, `proxyConfiguration` (Apify residential by default; your own HTTP or SOCKS5 proxies are supported).

### Output example

```json
{
  "dataType": "property",
  "name": "Mercure Amsterdam Sloterdijk Station",
  "url": "https://www.booking.com/hotel/nl/mercure-amsterdam-sloterdijk-station-opening-july-2015.en-us.html",
  "stars": 4, "rating": 8.6, "ratingLabel": "Excellent", "reviewsCount": 4177,
  "price": 126.21, "priceRounded": "$126", "currency": "USD",
  "city": "Amsterdam", "countryCode": "nl", "latitude": 52.387911, "longitude": 4.834296,
  "distanceFromCenter": "4.3 km from downtown",
  "hostType": "PROFESSIONAL",
  "isSoldOut": false,
  "image": "https://cf.bstatic.com/xdata/images/hotel/square600/873579185.webp"
}
```

In the sequential / `all` modes one hotel record also carries nested `prices[]`, `reviews[]`, `reviewScores[]` and `hostContact{}`.

### Understanding key fields

- **`dataType`** — tags every record (`property`, `price`, `review`, `reviewScores`, `hotel`, `host`) so you can filter mixed exports in one click.
- **`price` vs `originalPrice`** — the current (possibly discounted) price vs the strike-through price before the discount; the gap is the active promotion.
- **`isSoldOut`** — the property has no availability for your dates; useful as a demand/occupancy signal for revenue management.
- **`roomsLeft`** — the number from Booking's "We have X left at this price" urgency message on a room offer; present only when Booking shows the scarcity banner. Combined with `isSoldOut`, a practical occupancy proxy.
- **`surroundings`** — nested per-category POI lists on hotel-detail records (`whatsNearby`, `topAttractions`, `restaurants`, `cafesBars`, `publicTransport`, `closestAirports`, `beaches`, `naturalBeauty`); each POI carries `distance` (localized), `distanceKm`, walking/driving distance and time, and GPS coordinates.
- **`freeCancellationUntil`** — the exact timestamp until which a room offer is refundable.
- **`reviewScores.lowerBound` / `higherBound`** — Booking's benchmark range for that category in the destination, so you can see how a hotel compares to its market.
- **`hostType`** — whether the property is run by a `PROFESSIONAL` trader (these have legal contact blocks) or a private host.
- **Empty fields are omitted** — Booking.com doesn't publish every field for every property (e.g. host contacts exist only for professional traders).

### Tips for best results

- Keep the default **residential proxies** for the best reliability.
- Booking.com search returns at most ~1,000 properties per query — split big cities by district or star rating (`starRating`, `minPrice`/`maxPrice` filters) to cover the full inventory.
- Set `checkIn`/`checkOut` to get realistic prices and availability; without dates Booking shows default rates.
- For price monitoring, start with a short `daysAhead` window to validate your setup, then scale to 365.
- Use `maxItems` and `maxReviews` to cap costs on large runs.

### Integrations & export

Download results as **JSON, CSV, Excel, XML or HTML**, or fetch them through the **Apify API**. Connect the scraper to **Google Sheets, Make, Zapier, n8n, Slack, Discord**, or your own backend with **webhooks**. Use **Schedules** to keep data fresh — e.g. a daily price-monitoring run that appends to a Google Sheet.

### Use with AI agents (MCP)

The scraper works as a tool for AI assistants via the **Apify MCP server** — let Claude, Cursor or any LLM agent pull Booking.com data on demand:

```bash
claude mcp add --transport http apify "https://mcp.apify.com?tools=pro100chok/booking-all-in-one-scraper"
```

Then just ask your assistant:

> "Scrape the top 20 hotels in Barcelona for next weekend with their prices and reviews from Booking.com."

### How do I monitor Booking.com hotel prices over time?

Use **Prices** mode with your dates — or set **Price calendar — days ahead** for a multi-night calendar up to a full year — then **schedule** the run daily or hourly from the Apify Console. Pipe the output to Google Sheets or a database via integration/webhook to build a price-history dashboard, track competitor discounts and set up rate-shopping alerts.

### Does Booking.com block scrapers?

Booking.com serves an AWS WAF anti-bot challenge to non-browser clients and hides pagination behind its internal GraphQL API. This actor handles both automatically — it solves the WAF challenge in about a second, re-solves it whenever it expires, and paginates through the GraphQL API — so you never deal with tokens, CAPTCHAs or empty page-2 results.

### What are the best alternatives to the official Booking.com API?

Booking.com's official API is **partner-only**: you need a commercial agreement, and it exposes booking functionality rather than open data access. For public hotel, price and review data, a scraper like this one is the practical alternative — no partner contract, no rate-limit negotiations, pay only per result.

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

This scraper collects only **publicly available** information — the same data any visitor sees without logging in. Web scraping of public data is broadly legal, but you are responsible for how you use it: avoid collecting personal data without a lawful basis, respect **GDPR/CCPA** and Booking.com's Terms, and consult a lawyer for your specific use case. Host contact details are business information that Booking.com publishes under **EU trader-transparency rules**, i.e. data professional hosts are legally required to disclose.

### FAQ

**Do I need a Booking.com account, cookies, or a token?** No. The scraper handles access and anti-bot protection automatically — no login, no API key, no setup.

**Does it support pagination?** Yes — search results and reviews are paginated through Booking's GraphQL API up to your `maxItems` / `maxReviews`.

**Can I scrape all hotels in a city?** Yes — enter the city in **Destinations** and raise **Max properties**. For markets with more than ~1,000 listings, split the search with star/price filters.

**Can I scrape a specific hotel by name?** Search the name as a destination, or paste the hotel's Booking.com URL into **Booking.com URLs**.

**Can I get hotels, prices, reviews and host info together?** Yes — use **Search** mode with **Also scrape for each result**, or `all` mode with hotel URLs. Everything for a hotel is nested in one record.

**How many reviews can I scrape per hotel?** All of them — set **Max reviews per hotel** as high as you need; the actor pages through the full review list.

**Can I scrape reviews in a specific language or order?** Use **Sort reviews by** (newest, oldest, best, worst); each review record includes its own `language` field.

**Which export formats are supported?** JSON, JSONL, CSV, Excel, XML and HTML, plus the Apify API and webhooks.

**Which currencies and languages are supported?** Any that Booking.com supports — set `currency` (USD, EUR, GBP, …) and `language` (en-us, en-gb, de, fr, es, it, ru, …).

**Why are some fields empty?** Booking.com doesn't publish every field for every property — e.g. host contacts exist only for professional traders, and star ratings are missing on some apartments. Empty values are omitted rather than returned as null.

**Does it include hotel surroundings / "what's nearby"?** Yes — hotel-detail records include the surroundings block: landmarks, top attractions, restaurants & cafes, public transport, closest airports, beaches and natural beauty, each with distances, walking/driving times and GPS coordinates. Disable with `includeSurroundings: false`.

**Can I see how many rooms are left?** Yes — room-price offers include `roomsLeft` whenever Booking shows its "We have X left at this price" message, and properties carry `isSoldOut`.

**Can I use my own proxies?** Yes — add HTTP or SOCKS5 proxy URLs in the proxy configuration. Apify residential proxies are the default and work out of the box.

**How fast is it?** It's HTTP-only (no browser), so runs are quick and memory-light; hotel-level modes process several hotels in parallel (`maxConcurrency`).

### Related scrapers

Combine Booking.com data with other sources in one pipeline:

- [TripAdvisor Hotels & Reviews Scraper](https://apify.com/pro100chok/tripadvisor-all-in-one) — cross-reference ratings and reviews from TripAdvisor.
- [Google Maps Scraper](https://apify.com/pro100chok/google-maps-scraper) — enrich hotels with Google reviews, photos and contact details.
- [Apartments.com Scraper](https://apify.com/pro100chok/apartments-scraper-usage) — rentals, prices and reviews from Apartments.com.
- [Website Contact Scraper](https://apify.com/pro100chok/extract-emails) — turn hotel websites into emails, phones and socials for outreach.

### Support & feedback

The actor is actively maintained. Found a bug, missing a field, or need a new filter? Open an issue from the actor's **Issues** tab — most requests are handled quickly.

### Changelog

- **July 2026** — added **hotel surroundings** ("what's nearby": landmarks, attractions, restaurants, transport, airports, beaches with walking/driving distances) to hotel details, and **`roomsLeft`** (rooms remaining at a price) to room offers.
- **June 2026** — initial public release: 6 scrape modes (search, prices, reviews, hotel details, host contacts, all), sequential crawl with nested one-record-per-hotel output, 365-day price calendar, automatic AWS WAF handling, custom HTTP/SOCKS5 proxy support.

***

#### Tags

`booking` · `booking.com` · `booking-scraper` · `booking-com-scraper` · `booking-api` · `booking-com-api-alternative` · `hotel-scraper` · `hotels` · `hotel-data` · `hotel-prices` · `room-prices` · `price-scraper` · `price-calendar` · `price-monitoring` · `rate-shopping` · `revenue-management` · `availability` · `rooms-left` · `sold-out-detection` · `booking-reviews` · `reviews-scraper` · `hotel-reviews` · `ratings` · `review-scores` · `hotel-surroundings` · `whats-nearby` · `landmarks` · `host-scraper` · `hotel-contacts` · `property-manager-leads` · `lead-generation` · `b2b-leads` · `travel` · `travel-data` · `hospitality` · `accommodation` · `ota` · `web-scraping` · `data-extraction` · `crawler` · `api` · `no-code` · `mcp` · `ai-agents` · `json` · `csv` · `excel`

# Actor input Schema

## `scrapeType` (type: `string`):

What the actor returns. "Search results" = a list of properties for a destination. The other modes work on hotel page URLs. Tip: with "Search results" you can tick the options below to also drill into each hotel.

## `enrichWith` (type: `array`):

Only used with the "Search results" mode. For every property found, also scrape these — they are returned nested inside the same hotel record. Leave empty to get just the listing.

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

Destinations to search — e.g. "Amsterdam", "Paris, France", "Bali". One per line. Used by the Search results & Prices modes. Skip this if you paste URLs below instead.

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

Booking.com hotel page URLs and/or search-result URLs (paste straight from your browser). Hotel URLs feed Reviews / Hotel details / Host / Prices; search URLs feed Search results / Prices.

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

Maximum number of properties to return per destination (also caps how many hotels are processed in the hotel-centric modes).

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

Maximum reviews to fetch per hotel. Only used when reviews are scraped (Reviews mode, All mode, or the Reviews enrich option).

## `includeSurroundings` (type: `boolean`):

Only used when hotel details are scraped (Hotel details / All modes, or the Hotel details enrich option). Adds nearby POIs — landmarks, top attractions, restaurants & cafes, public transport, closest airports, beaches — with walking/driving distances. Costs one extra request per hotel.

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

Format YYYY-MM-DD. Optional — affects prices and availability.

## `checkOut` (type: `string`):

Format YYYY-MM-DD. Optional.

## `daysAhead` (type: `integer`):

Prices mode only. If greater than 0, builds a price calendar of one-night stays for this many consecutive days starting at the check-in date (or today). Leave 0 for a single check-in/check-out range.

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

Number of adults per room.

## `children` (type: `integer`):

Number of children.

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

Ages of children (0–17), one per child.

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

Number of rooms.

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

ISO currency code, e.g. USD, EUR, GBP.

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

Booking language code, e.g. en-us, en-gb, de, fr, es, it, ru.

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

Order of search results.

## `starRating` (type: `array`):

Filter by class, e.g. \["4","5"].

## `minScore` (type: `string`):

e.g. 8 or 9 (review score bucket).

## `minPrice` (type: `integer`):

Minimum price per night filter (in the chosen currency).

## `maxPrice` (type: `integer`):

Maximum price per night filter (in the chosen currency).

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

Order of reviews. Used only when reviews are scraped.

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

Parallel hotels processed in hotel-centric modes.

## `maxRetries` (type: `integer`):

Max retries per request on network errors or anti-bot challenges.

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

Proxy used for all requests. Residential proxies are recommended. To use your own proxy (incl. SOCKS5), open the Custom proxies tab and add its URL.

## Actor input object example

```json
{
  "scrapeType": "search",
  "enrichWith": [],
  "searchQueries": [
    "Amsterdam"
  ],
  "maxItems": 50,
  "maxReviews": 100,
  "includeSurroundings": true,
  "daysAhead": 0,
  "adults": 2,
  "children": 0,
  "rooms": 1,
  "currency": "USD",
  "language": "en-us",
  "sortBy": "relevance",
  "sortReviewsBy": "relevance",
  "maxConcurrency": 5,
  "maxRetries": 5,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

## `properties` (type: `string`):

No description

## `prices` (type: `string`):

No description

## `reviews` (type: `string`):

No description

## `hosts` (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 = {
    "searchQueries": [
        "Amsterdam"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("pro100chok/booking-all-in-one-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 = { "searchQueries": ["Amsterdam"] }

# Run the Actor and wait for it to finish
run = client.actor("pro100chok/booking-all-in-one-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 '{
  "searchQueries": [
    "Amsterdam"
  ]
}' |
apify call pro100chok/booking-all-in-one-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Booking.com Scraper — Hotels, Prices, Reviews & Host Data",
        "description": "Extract Booking.com hotel listings, live room prices & availability, guest reviews and ratings, full property details, and professional host contacts. Scrape by destination or URL with automatic pagination — no code, no login. Export to JSON, CSV, Excel or via API.",
        "version": "1.0",
        "x-build-id": "b4JThd0UzLFOd5rDd"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/pro100chok~booking-all-in-one-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-pro100chok-booking-all-in-one-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/pro100chok~booking-all-in-one-scraper/runs": {
            "post": {
                "operationId": "runs-sync-pro100chok-booking-all-in-one-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/pro100chok~booking-all-in-one-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-pro100chok-booking-all-in-one-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",
                "required": [
                    "scrapeType"
                ],
                "properties": {
                    "scrapeType": {
                        "title": "🎯 What to scrape",
                        "enum": [
                            "search",
                            "prices",
                            "reviews",
                            "hotelDetails",
                            "hostInfo",
                            "all"
                        ],
                        "type": "string",
                        "description": "What the actor returns. \"Search results\" = a list of properties for a destination. The other modes work on hotel page URLs. Tip: with \"Search results\" you can tick the options below to also drill into each hotel.",
                        "default": "search"
                    },
                    "enrichWith": {
                        "title": "🔗 Also scrape for each result (Search mode)",
                        "type": "array",
                        "description": "Only used with the \"Search results\" mode. For every property found, also scrape these — they are returned nested inside the same hotel record. Leave empty to get just the listing.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "hotelDetails",
                                "prices",
                                "reviews",
                                "host"
                            ],
                            "enumTitles": [
                                "📋 Hotel details",
                                "💶 Prices (room offers)",
                                "⭐ Reviews + scores",
                                "🧑‍💼 Host / owner contact info"
                            ]
                        },
                        "default": []
                    },
                    "searchQueries": {
                        "title": "🔍 Destinations",
                        "type": "array",
                        "description": "Destinations to search — e.g. \"Amsterdam\", \"Paris, France\", \"Bali\". One per line. Used by the Search results & Prices modes. Skip this if you paste URLs below instead.",
                        "default": [
                            "Amsterdam"
                        ],
                        "items": {
                            "type": "string"
                        }
                    },
                    "startUrls": {
                        "title": "🔗 Booking.com URLs",
                        "type": "array",
                        "description": "Booking.com hotel page URLs and/or search-result URLs (paste straight from your browser). Hotel URLs feed Reviews / Hotel details / Host / Prices; search URLs feed Search results / Prices.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "maxItems": {
                        "title": "🔢 Max properties per destination",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Maximum number of properties to return per destination (also caps how many hotels are processed in the hotel-centric modes).",
                        "default": 50
                    },
                    "maxReviews": {
                        "title": "💬 Max reviews per hotel",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Maximum reviews to fetch per hotel. Only used when reviews are scraped (Reviews mode, All mode, or the Reviews enrich option).",
                        "default": 100
                    },
                    "includeSurroundings": {
                        "title": "🗺️ Include surroundings (what's nearby)",
                        "type": "boolean",
                        "description": "Only used when hotel details are scraped (Hotel details / All modes, or the Hotel details enrich option). Adds nearby POIs — landmarks, top attractions, restaurants & cafes, public transport, closest airports, beaches — with walking/driving distances. Costs one extra request per hotel.",
                        "default": true
                    },
                    "checkIn": {
                        "title": "📅 Check-in date",
                        "type": "string",
                        "description": "Format YYYY-MM-DD. Optional — affects prices and availability."
                    },
                    "checkOut": {
                        "title": "📅 Check-out date",
                        "type": "string",
                        "description": "Format YYYY-MM-DD. Optional."
                    },
                    "daysAhead": {
                        "title": "📆 Price calendar — days ahead (Prices mode)",
                        "minimum": 0,
                        "maximum": 365,
                        "type": "integer",
                        "description": "Prices mode only. If greater than 0, builds a price calendar of one-night stays for this many consecutive days starting at the check-in date (or today). Leave 0 for a single check-in/check-out range.",
                        "default": 0
                    },
                    "adults": {
                        "title": "🧑 Adults",
                        "minimum": 1,
                        "maximum": 30,
                        "type": "integer",
                        "description": "Number of adults per room.",
                        "default": 2
                    },
                    "children": {
                        "title": "🧒 Children",
                        "minimum": 0,
                        "maximum": 10,
                        "type": "integer",
                        "description": "Number of children.",
                        "default": 0
                    },
                    "childrenAges": {
                        "title": "🧒 Children ages",
                        "type": "array",
                        "description": "Ages of children (0–17), one per child.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "rooms": {
                        "title": "🛏️ Rooms",
                        "minimum": 1,
                        "maximum": 30,
                        "type": "integer",
                        "description": "Number of rooms.",
                        "default": 1
                    },
                    "currency": {
                        "title": "💱 Currency",
                        "type": "string",
                        "description": "ISO currency code, e.g. USD, EUR, GBP.",
                        "default": "USD"
                    },
                    "language": {
                        "title": "🌐 Language",
                        "type": "string",
                        "description": "Booking language code, e.g. en-us, en-gb, de, fr, es, it, ru.",
                        "default": "en-us"
                    },
                    "sortBy": {
                        "title": "↕️ Sort search by",
                        "enum": [
                            "relevance",
                            "popularity",
                            "price",
                            "review_score",
                            "review_score_and_price",
                            "stars_high",
                            "stars_low",
                            "distance"
                        ],
                        "type": "string",
                        "description": "Order of search results.",
                        "default": "relevance"
                    },
                    "starRating": {
                        "title": "⭐ Star rating filter",
                        "type": "array",
                        "description": "Filter by class, e.g. [\"4\",\"5\"].",
                        "items": {
                            "type": "string"
                        }
                    },
                    "minScore": {
                        "title": "📊 Minimum review score",
                        "type": "string",
                        "description": "e.g. 8 or 9 (review score bucket)."
                    },
                    "minPrice": {
                        "title": "💶 Min price",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Minimum price per night filter (in the chosen currency)."
                    },
                    "maxPrice": {
                        "title": "💶 Max price",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Maximum price per night filter (in the chosen currency)."
                    },
                    "sortReviewsBy": {
                        "title": "↕️ Sort reviews by",
                        "enum": [
                            "relevance",
                            "newest",
                            "oldest",
                            "score_high",
                            "score_low"
                        ],
                        "type": "string",
                        "description": "Order of reviews. Used only when reviews are scraped.",
                        "default": "relevance"
                    },
                    "maxConcurrency": {
                        "title": "⚡ Max concurrency",
                        "minimum": 1,
                        "maximum": 20,
                        "type": "integer",
                        "description": "Parallel hotels processed in hotel-centric modes.",
                        "default": 5
                    },
                    "maxRetries": {
                        "title": "🔁 Max retries",
                        "minimum": 1,
                        "maximum": 15,
                        "type": "integer",
                        "description": "Max retries per request on network errors or anti-bot challenges.",
                        "default": 5
                    },
                    "proxyConfiguration": {
                        "title": "🛡️ Proxy configuration",
                        "type": "object",
                        "description": "Proxy used for all requests. Residential proxies are recommended. To use your own proxy (incl. SOCKS5), open the Custom proxies tab and add its URL.",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyGroups": [
                                "RESIDENTIAL"
                            ],
                            "apifyProxyCountry": "US"
                        }
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
