# Booking.com Scraper — Hotel Prices & Ratings, Cheap (`fabrikit/booking-hotels-scraper`) Actor

Booking.com Scraper for hotel, apartment and hostel search results: prices for your dates, review scores, stars, location, free cancellation and breakfast flags. Search by destination or paste a Booking.com URL. No login, no browser. Pay per result, no subscription.

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

## Pricing

from $1.50 / 1,000 property 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 — Hotel Prices & Ratings, Cheap

Scrape **Booking.com** search results for hotels, apartments, hostels, guest houses and more. For every property you get the **price for your exact dates**, review score, stars, location, free-cancellation and breakfast flags, photo and link. Search by destination name or paste a Booking.com search URL. No login, no browser, no cookies.

Pay per property saved. See *How much does it cost to scrape Booking.com?* below.

### What you get

- Total price for the stay in the currency you choose (plus price per night, price before discount and the taxes note)
- Review score, score word (Superb, Very good...) and number of reviews
- Stars, property type, address, district, city, country, latitude/longitude, distance from centre
- Free cancellation (with deadline), breakfast included, room / unit name, highlighted facilities
- Main photo and a link to the property page that keeps your dates and guests
- Searches with more than ~1,000 matches are split automatically by price range, so `maxItems` of several thousand works

The Actor does **not** collect review texts or reviewer information.

### Who it is for

- **Hotels and revenue managers** comparing their rate with the competitive set for the same dates, guests and room count.
- **Travel agencies, tour operators and deal newsletters** looking for the best-rated or cheapest options in a destination.
- **Travel startups and metasearch projects** that need structured Booking.com prices without building their own crawler.
- **Tourism boards, analysts and investors** studying supply, price levels and review scores by city or district.
- **Short-term rental hosts** checking how hotels and apartments nearby are priced on Booking.com.

### How to scrape Booking.com

1. Add one or more **destinations** (a city, region, neighbourhood or landmark), or paste **Booking.com search URLs**.
2. Set **check-in** and **check-out** dates, **adults**, **children** (with ages) and **rooms**. Without dates the actor uses a one-night stay 30 days from today.
3. Choose the **currency** and **language**.
4. Optionally filter by **stars**, **minimum review score**, **property types**, **free cancellation** or **breakfast included**, and pick a **sort order**.
5. Set **maxItems** (and **maxItemsPerDestination** for several destinations), run, and export the dataset as JSON, CSV or Excel.

### Input

| Field | Description |
|---|---|
| `destinations` | City, region, country, neighbourhood or landmark names. One search per entry. |
| `startUrls` | Optional Booking.com search result URLs. Dates, guests, currency, filters and sort in the URL are respected. |
| `checkIn`, `checkOut` | `YYYY-MM-DD`. Default: 30 and 31 days from today. Max 90 nights. |
| `adults`, `children`, `childrenAges`, `rooms` | Guests and rooms (default 2 adults, 1 room). |
| `currency`, `language` | Prices currency (default `USD`) and language (default `en-gb`). |
| `stars`, `minReviewScore`, `propertyTypes`, `freeCancellation`, `breakfastIncluded` | Filters. |
| `sortBy` | Top picks, price, best reviewed, stars, distance from centre. |
| `maxItems`, `maxItemsPerDestination` | Limits (default 50). |
| `includeUnavailable` | Also keep sold-out properties (no price). |
| `proxyConfiguration` | Starts on datacenter and switches to residential automatically when Booking blocks. |

Property types you can filter on: `hotel`, `apartment`, `hostel`, `guest_house`, `bed_and_breakfast`, `homestay`, `villa`, `holiday_home`, `chalet`, `campsite`, `boat`, `capsule_hotel`.

#### Example

```json
{
  "destinations": ["Lisbon", "Porto"],
  "checkIn": "2026-12-10",
  "checkOut": "2026-12-12",
  "adults": 2,
  "currency": "EUR",
  "stars": ["4", "5"],
  "minReviewScore": 8.5,
  "freeCancellation": true,
  "sortBy": "price",
  "maxItems": 200
}
```

#### More input examples

Hotel prices in Paris in euros (the "Hotel prices in Paris" example task):

```json
{ "destinations": ["Paris"], "adults": 2, "rooms": 1, "currency": "EUR", "maxItems": 50 }
```

4-star hotels in New York (the "4-star hotels in New York" task):

```json
{ "destinations": ["New York"], "stars": ["4"], "adults": 2, "currency": "USD", "maxItems": 50 }
```

A family of four in Buenos Aires, Spanish property names, sorted by review score:

```json
{
  "destinations": ["Buenos Aires"],
  "checkIn": "2027-01-15",
  "checkOut": "2027-01-20",
  "adults": 2,
  "children": 2,
  "childrenAges": [6, 10],
  "language": "es",
  "currency": "USD",
  "sortBy": "review_score_and_price",
  "maxItems": 100
}
```

### Output example

```json
{
  "id": "13814927",
  "name": "Inspira Santos Boutique Hotel",
  "url": "https://www.booking.com/hotel/pt/inspira-santos-boutique.en-gb.html?checkin=2026-11-12&checkout=2026-11-13&group_adults=2&no_rooms=1&group_children=0&selected_currency=USD",
  "propertyType": "Hotel",
  "stars": 3,
  "address": "Av. Dom Carlos I 59 59",
  "district": "Estrela, Lisbon",
  "city": "Lisboa",
  "country": "PT",
  "latitude": 38.7085825889692,
  "longitude": -9.15332709316155,
  "distanceFromCentre": "1.3 km from centre",
  "reviewScore": 8.9,
  "reviewScoreWord": "Excellent",
  "reviewsCount": 1204,
  "price": 125.92,
  "currency": "USD",
  "priceText": "US$125.92",
  "pricePerNight": 125.92,
  "priceBeforeDiscount": 179.89,
  "taxesNote": "+US$9 taxes and charges",
  "nights": 1,
  "roomName": "Double or Twin Room",
  "unitType": null,
  "freeCancellation": true,
  "freeCancellationUntil": "2026-11-05T00:00:00Z",
  "breakfastIncluded": false,
  "mealPlan": null,
  "facilities": [],
  "mainPhoto": "https://cf.bstatic.com/xdata/images/hotel/square600/662084524.webp",
  "checkIn": "2026-11-12",
  "checkOut": "2026-11-13",
  "adults": 2,
  "rooms": 1,
  "searchDestination": "Lisbon",
  "scrapedAt": "2026-10-13T12:27:14.526Z"
}
```

#### Output fields

| Field | Description |
|---|---|
| `id` / `name` / `url` | Booking.com property id, name and link (keeps your dates and guests). |
| `propertyType` / `stars` | Hotel, Apartment, Hostel…; star rating. |
| `address` / `district` / `city` / `country` | Location text and country code. |
| `latitude` / `longitude` / `distanceFromCentre` | Coordinates and Booking's distance label. |
| `reviewScore` / `reviewScoreWord` / `reviewsCount` | Score on a 0-10 scale, its word, and number of reviews. |
| `price` / `currency` / `priceText` | Total price for the whole stay and all rooms. |
| `pricePerNight` | `price` divided by the number of nights. |
| `priceBeforeDiscount` | Crossed-out price when Booking shows a discount. |
| `taxesNote` | Whether taxes and charges are included or added. |
| `nights` | Length of stay. |
| `roomName` / `unitType` | Room or unit offered first for your search. |
| `freeCancellation` / `freeCancellationUntil` | Free cancellation flag and deadline. |
| `breakfastIncluded` / `mealPlan` | Breakfast flag and meal plan text. |
| `facilities` | Highlighted facilities. |
| `mainPhoto` | Main photo URL. |
| `checkIn` / `checkOut` / `adults` / `rooms` | Search parameters used for the price. |
| `searchDestination` | The destination or URL that found the property. |
| `scrapedAt` | When the row was collected. |

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

Pay per event, no subscription.

| Event | When it is charged |
|---|---|
| Actor start | Once per run (a fraction of a cent) |
| Property result | One property saved to the dataset |

From 30 October 2026, 1,000 properties cost US$2.50 on the Apify Free plan; paid Apify plans pay less per property — see the **Pricing** tab. Platform usage is included in these prices.

### FAQ

**Is the price per night or for the whole stay?** `price` is the total for the whole stay and all rooms, as Booking shows it. `pricePerNight` divides it by the number of nights. `taxesNote` tells whether taxes are included or added.

**How many properties can I get?** Booking limits one search to about 1,000 properties. The Actor splits bigger searches by price range and removes duplicates, so large cities can be collected in one run.

**Why do I sometimes see fewer properties than "available"?** Sold-out properties and properties with no price for your dates are skipped unless you enable `includeUnavailable`.

**Do I need a proxy?** The default (Apify datacenter, falling back to residential automatically) works out of the box.

**Can I scrape reviews?** No. This Actor only returns property data.

**Which room's price do I get?** One price per property: the first offer Booking shows for your dates and guests. `roomName` tells you which room it is.

**Why did "Rome" return so many properties?** Booking interprets some names broadly. Use a more specific destination ("Rome, Italy" or a neighbourhood) or paste a search URL for exactly the area you want.

**What if nothing is found?** The run fails with a clear message (check the destination spelling, dates and filters, or use a residential proxy if Booking kept blocking), so a broken scheduled run never looks like an empty city.

**Can I monitor rates daily?** Yes. Save the input as a task with fixed dates and schedule it; compare `price` per `id` across runs.

### Use cases

Hotel price monitoring and rate comparison, market research by city or neighbourhood, travel deal finders, revenue management benchmarks, real-estate and tourism analysis, building travel apps and newsletters.

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

The Actor only reads publicly visible Booking.com search results, without logging in, and it does not collect review texts, reviewer names or guest information. Some properties are run by individuals (for example, private apartments), so names and addresses can be personal data under laws such as the EU GDPR, Chile's Ley 21.719 or the California CCPA; you are responsible for a lawful purpose and for keeping only what you need. Photos and descriptions belong to their owners. Use it in line with Booking.com's terms of service and applicable law. This is general information, not legal advice.

### Integrations

Run the Booking.com Scraper from the Apify API or the JavaScript and Python clients, pass results on with webhooks, or schedule daily rate checks in Apify Console. It works with n8n, Make and Zapier (for example, to append prices to Google Sheets or alert on price drops), and with LangChain and LlamaIndex through their Apify integrations. AI agents in Claude, ChatGPT, Cursor and other MCP clients can find and run it through Apify's MCP server. Export as JSON, CSV or Excel, or read from the dataset API.

### Use with AI agents

Use this actor to get Booking.com properties for a destination with the total price for given dates, guests and rooms, review score, stars, location and cancellation/breakfast flags.

```json
{ "destinations": ["Lisbon"], "checkIn": "2026-12-10", "checkOut": "2026-12-12", "adults": 2, "currency": "EUR", "maxItems": 30 }
```

Main output fields: `name`, `url`, `propertyType`, `stars`, `reviewScore`, `reviewsCount`, `price`, `pricePerNight`, `currency`, `freeCancellation`, `breakfastIncluded`, `district`, `latitude`, `longitude`. It is pay-per-event: an agent pays a small start fee plus a fixed price per property saved, not for compute time.

### Related actors

- [Airbnb Scraper](https://apify.com/fabrikit/airbnb-search-scraper) — short-term rentals and their prices for the same dates.
- [Google Maps Scraper](https://apify.com/fabrikit/google-maps-places-scraper) — restaurants, attractions and services near each hotel.
- [Google Trends Scraper](https://apify.com/fabrikit/google-trends-scraper) — seasonality of searches for a destination.
- [Google News Scraper](https://apify.com/fabrikit/google-news-scraper) — travel and tourism news for a city.

#### Ready-made examples

- [Hotel prices in Paris](https://apify.com/fabrikit/booking-hotels-scraper/examples/hotels-paris-prices)
- [4-star hotels in New York](https://apify.com/fabrikit/booking-hotels-scraper/examples/4-star-hotels-new-york)
- [Hoteles en Buenos Aires](https://apify.com/fabrikit/booking-hotels-scraper/examples/hoteles-buenos-aires)

### Changelog

- **2026-10-16** — README expanded: how-to, more input examples, output field table, FAQ, legal notes, integrations and example tasks.
- **2026-10-15** — Tiered pricing announced, effective 2026-10-30 (lower per-property price on paid Apify plans).
- **2026-10-13** — Builds 0.1.1–0.1.3: initial release. Destination and URL search, date/guest pricing, filters, automatic price-range splitting beyond ~1,000 results, residential proxy fallback; default memory 512 MB.

***

### En español

**Booking.com Scraper**: extrae resultados de búsqueda de Booking.com (hoteles, departamentos, hostales) con el precio para tus fechas, puntaje de reseñas, estrellas, ubicación, cancelación gratuita y desayuno incluido. Busca por destino o pega una URL de búsqueda de Booking. Sin login ni navegador. Fechas por defecto: 30 y 31 días desde hoy. Las búsquedas de más de ~1.000 resultados se dividen automáticamente por rango de precio. No incluye textos de reseñas ni datos de huéspedes. Se cobra por propiedad guardada; el precio vigente para tu plan está en la pestaña Pricing.

# Actor input Schema

## `destinations` (type: `array`):

City, region, country, neighbourhood or landmark names, e.g. "Lisbon" or "Manhattan, New York". One search is run per destination.

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

Paste URLs copied from a Booking.com search results page (https://www.booking.com/searchresults…?ss=…). Dates, guests, currency, filters and sort order in the URL are used when present.

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

Check-in date as YYYY-MM-DD. Leave empty to use 30 days from today.

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

Check-out date as YYYY-MM-DD. Leave empty to stay one night (31 days from today by default). Maximum stay is 90 nights.

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

Number of adult guests.

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

Number of children. Prices depend on their ages.

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

One age (0-17) per child, in order. Missing ages default to 8.

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

Number of rooms.

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

Three-letter currency code for prices, e.g. USD, EUR, GBP, CLP.

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

Booking.com language code for names, review words and property links.

## `stars` (type: `array`):

Only properties with these star ratings. Leave empty for all.

## `minReviewScore` (type: `number`):

Only properties rated at least this on Booking.com's 0-10 scale (e.g. 8.5). 0 disables the filter.

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

Only these types of property. Leave empty for all types.

## `freeCancellation` (type: `boolean`):

Only offers that can be cancelled for free.

## `breakfastIncluded` (type: `boolean`):

Only offers that include breakfast.

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

Order of the results. With a low maxItems this decides which properties you get.

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

Total number of properties to save across all searches. Searches with more than ~1,000 matches are split automatically by price range.

## `maxItemsPerDestination` (type: `integer`):

Cap for each destination or URL so one search cannot use the whole budget. 0 = no separate cap.

## `includeUnavailable` (type: `boolean`):

Also save properties that have no room for these dates (price will be empty).

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

Booking blocks many datacenter IPs. The Actor starts with Apify datacenter proxy and switches to residential automatically when it gets blocked.

## Actor input object example

```json
{
  "destinations": [
    "Lisbon"
  ],
  "adults": 2,
  "children": 0,
  "rooms": 1,
  "currency": "USD",
  "language": "en-gb",
  "minReviewScore": 0,
  "freeCancellation": false,
  "breakfastIncluded": false,
  "sortBy": "popularity",
  "maxItems": 50,
  "maxItemsPerDestination": 0,
  "includeUnavailable": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

All properties collected during the run

# 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 = {
    "destinations": [
        "Lisbon"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("fabrikit/booking-hotels-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 = {
    "destinations": ["Lisbon"],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("fabrikit/booking-hotels-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 '{
  "destinations": [
    "Lisbon"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call fabrikit/booking-hotels-scraper --silent --output-dataset

```

## MCP server setup

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