# Booking Hotels Scraper - Search, Prices & Details (`jdtpnjtp/booking-hotels-scraper`) Actor

Scrape Booking.com hotels for any destination: live prices, ratings, reviews count, location, facilities and full detail pages. Real-time data, all filters, optional detail enrichment. Pay only per result - no subscription.

- **URL**: https://apify.com/jdtpnjtp/booking-hotels-scraper.md
- **Developed by:** [Data Forge](https://apify.com/jdtpnjtp) (community)
- **Categories:** Lead generation, Travel, Developer tools
- **Stats:** 10 total users, 4 monthly users, 81.1% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 hotel results

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 web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Booking.com Hotels Scraper - Search, Prices & Details

**Scrape Booking.com hotels for any destination in one run - live prices, guest scores, review counts, location, facilities and full detail pages.** Type a city, set your dates, and export clean, structured rows. No setup, no subscription, pay only per result.

***

### Why this Actor?

| What you get | This Actor (Data Forge) | Other Booking.com scrapers |
|---|---|---|
| Live nightly prices | **Dated per-night and total rates for your exact check-in / check-out, guests and rooms** | List-only, or stale cached prices with no dates |
| Filter depth | **20+ filter options - 5 star classes, 3 meal plans, 13 facilities, free cancellation, review score, price band** | A handful of basic filters |
| Sort modes | **8 modes including cheapest-first, guest score, stars and distance** | Default order only |
| Detail enrichment | **Full detail page from any hotel URL - facilities, description, check-in / check-out times, photos** | Search list only, no detail pages |
| Per-night pricing | **Separate `price_per_night` and `total_price` fields - compare per-night rates without doing the math** | Raw stay total only |
| Pricing model | **Pay per result - error rows are always free** | Monthly subscription, or you pay for failed rows too |

### What this actor does

Give it a destination (`Paris`, a Booking.com dest\_id, or a Booking.com search URL) and it pulls hotels with everything you need to compare and analyze:

- 🏨 **Hotel** - name, star class, accommodation type
- 📊 **Guest score** - Booking review score (1-10), score word, review count
- 💲 **Live prices** - per-night and total price, currency, pre-discount price (set check-in/out for real dated rates)
- 📍 **Location** - address, city, country, latitude/longitude, distance from center
- ✅ **Policies** - free cancellation, breakfast included
- 🖼 **Media + IDs** - primary photo, canonical URL, hotel id, slug

Flip on **Also fetch full detail** and each result is enriched with its full detail page - complete facility list, description, check-in/out times and more photos (charged as a separate `hotel-details` event).

Already have specific hotels? Paste their URLs into **Start URLs** - each is fetched as a full detail row, alongside (or instead of) a destination search.

### Input

| Field | What it does |
|---|---|
| **Destination** | City / area name, Booking.com dest\_id, or search URL. Optional if you use Start URLs. |
| **Start URLs** | Paste specific Booking.com hotel URLs to fetch their full detail directly. |
| **Max hotels** | Cap for the destination search (1 to 1000). The actor paginates Booking.com (up to 100/page) to reach it. |
| **Also fetch full detail** | Enrich every result with its full detail page. Extra `hotel-details` charge per hotel. |
| **Currency** | 12 presets + any 3-letter ISO code. |
| **Stay & occupancy** | Check-in/out dates (unlock real prices), adults, children, rooms. |
| **Filters & sort** | Price range, min guest score, star class, meal plan, facilities, free cancellation, sustainable, sort order. |

Friendly-label filters (star class, meal plan, facilities) map to Booking.com's values for you - pick **Free WiFi** or **5 Star**, no IDs to look up. The underlying REST API exposes even more filters (room facilities, accessibility, property type) for power users.

### Input modes

Eight ready-to-run recipes - paste any block straight into the input editor. Each maps 1:1 to a published example task.

#### 1. Destination scan with live prices

Travel aggregator building a city price index: pull the first 100 Paris hotels with live USD rates.

```json
{"location": "Paris", "maxResults": 100, "currency": "USD"}
```

#### 2. Budget cap, cheapest first

Deal site or budget traveler: cap at 100 per night and surface the cheapest rooms first.

```json
{"location": "New York", "priceMax": 100, "sort": "price_low", "maxResults": 100}
```

#### 3. 5-star luxury by guest score

Luxury concierge: rank Dubai 5-star properties by guest review score.

```json
{"location": "Dubai", "stars": ["5"], "sort": "review_score", "maxResults": 100}
```

#### 4. Only 9+ rated stays

Quality-first researcher: keep only Rome stays rated 9 and above (Superb).

```json
{"location": "Rome", "minReviewScore": "9", "maxResults": 100}
```

#### 5. Free cancellation only

Flexible-plans OTA: list London hotels that offer a free-cancellation rate.

```json
{"location": "London", "freeCancellation": true, "maxResults": 100}
```

#### 6. All-inclusive resorts

Package-holiday desk: find Cancun all-inclusive resorts in one pass.

```json
{"location": "Cancun", "mealPlan": ["all_inclusive"], "maxResults": 100}
```

#### 7. Facility filter (pool / spa)

Family-trip planner: Orlando hotels that must have a swimming pool.

```json
{"location": "Orlando", "facilities": ["swimming_pool"], "maxResults": 100}
```

#### 8. Full details from hotel URLs

Rate-monitoring analyst: pull full detail for specific hotels you already track by URL.

```json
{"startUrls": ["https://www.booking.com/hotel/us/rodeway-inn-secaucus.html"]}
```

### Output

One flat row per hotel, discriminated by `row_type`, with the full payload under `data`. The dataset ships with **three ready-made table tabs** - **Overview**, **Hotels**, and **Details** - so the data reads as a clean spreadsheet you can sort, filter and export to CSV/Excel/JSON in one click.

| `row_type` | What each row contains |
|---|---|
| `hotel_search_result` | One hotel from a destination search: name, star class, guest score + review count, live `price_per_night` and `total_price`, currency, address / city / country, latitude / longitude, distance from center, free-cancellation and breakfast flags, hotel id, slug, photo and canonical URL. Full raw object under `data`. |
| `hotel_detail` | Deep detail for one hotel (from a Start URL, or when **Also fetch full detail** is on): description, check-in / check-out times, full facility list and `facility_count`, coordinates, plus the core identity fields. Full raw object under `data`. |
| `error` | A skipped input (bad URL, no match, or upstream issue) carrying an `error_code` and `error_message`. Always **free** - you are never charged for it. |

Common columns: `name`, `stars`, `score`, `review_count`, `price`, `price_per_night`, `total_price`, `currency`, `address`, `city`, `country`, `url`, `hotel_id`, `image_url`, `free_cancellation`, `breakfast_included`.

A run-summary record (`OUTPUT` key) reports hotel/detail counts and the estimated cost. Live per-event pricing is shown on this actor's Apify Store page.

> Tip: **check-in / check-out are optional.** Leave them blank and the actor auto-applies a sensible default stay (about a week out, 2 nights) so you still get real prices - or set them for an exact stay.

### Input & output example

Input - search Paris for a 2-night stay:

```json
{
  "location": "Paris",
  "checkIn": "2026-07-18",
  "checkOut": "2026-07-20",
  "adults": 2,
  "maxResults": 50,
  "currency": "USD"
}
```

Output - one flat `hotel_search_result` row (common columns at the top level, full payload under `data`):

```json
{
  "row_type": "hotel_search_result",
  "name": "Villa Royale Montsouris",
  "stars": 3,
  "score": 8.0,
  "score_word": "Very Good",
  "review_count": 1218,
  "price_per_night": 298.57,
  "total_price": 298.57,
  "currency": "USD",
  "display_price": "US$298.57",
  "address": "144 Rue De La Tombe Issoire",
  "city": "Paris",
  "country": "France",
  "free_cancellation": false,
  "breakfast_included": false,
  "hotel_id": "217597",
  "url": "https://www.booking.com/hotel/fr/pavillonroyalemontsouris.html",
  "data": {"...": "full hotel object"}
}
```

### Why buyers pick this actor

- **Real-time, real prices** - dated nightly + total rates straight from Booking.com, not stale cached numbers.
- **Every filter, friendly labels** - stars, score, meal plan, 13 facilities, price, free cancellation. No internal IDs to look up.
- **Search or URLs** - scan a whole city (up to 100 hotels per page), or fetch exact hotels. Both in one actor.
- **Clean tabs** - export-ready Hotels / Details tables, not a wall of mixed columns.
- **You only pay for results** - errors and your own misconfigurations are never charged.

### FAQ

**Is scraping Booking.com legal?**
The actor collects publicly available listing data. You are responsible for using the output in line with Booking.com's terms and applicable law.

**How fresh are the prices?**
Prices are fetched live from Booking.com at run time for the exact check-in / check-out, guests and rooms you set - not cached numbers. Run the actor again (or on a schedule) to capture how rates move day to day.

**What if a hotel comes back with no price?**
A `hotel_search_result` needs a dated stay to show a rate. Leave the dates blank (the actor applies a 1-week-ahead, 2-night default) or set explicit check-in / check-out and re-run. `hotel_detail` rows describe the property itself, so they intentionally carry no price. A property can also be sold out for your exact dates.

**Can I run this on a schedule?**
Yes. Use Apify Schedules to run the actor daily or weekly - each run writes a fresh dated snapshot to the dataset, ideal for price tracking and availability monitoring.

**Do I need to set check-in / check-out dates?**
No. Leave them blank and the actor applies a sensible default stay (about a week out, 2 nights) so you still get real prices. Set them for an exact stay.

**Can I scrape specific hotels instead of a whole city?**
Yes. Paste Booking.com hotel URLs into Start URLs and each is fetched as a full detail row, with or without a destination search.

**How much does it cost?**
You pay per result (one `hotel-result` charge per hotel row). Turning on "Also fetch full detail" adds a separate `hotel-details` charge per hotel. Error rows are free. Live per-event pricing is on this actor's Apify Store page.

**What currency are the prices in?**
Whatever you pass in `currency` - 12 presets or any 3-letter ISO code (default USD).

### Related actors

Part of the Data Forge travel suite - pick the tool that fits the job:

- **[Booking.com Reviews Scraper](https://apify.com/jdtpnjtp/booking-reviews-scraper)** - bulk-pull guest reviews for any hotel, with score breakdowns and filters.
- **[Booking.com Airport Taxis Scraper](https://apify.com/jdtpnjtp/booking-airport-taxis-scraper)** - live airport transfer quotes between any two points.
- **[Tripadvisor Scraper](https://apify.com/jdtpnjtp/tripadvisor)** - hotels, restaurants and attractions with ratings and reviews from Tripadvisor.
- **[Google Flights Scraper](https://apify.com/jdtpnjtp/google-flights-scraper)** - live flight prices and itineraries for any route and date.

### Support

I personally support every customer - drop a message on any channel for help, higher limits, or a custom scraping build.

[![Telegram](https://img.shields.io/badge/Telegram-2CA5E0?style=for-the-badge\&logo=telegram\&logoColor=white)](https://t.me/j4dtpnj2tp)
[![WhatsApp](https://img.shields.io/badge/WhatsApp-25D366?style=for-the-badge\&logo=whatsapp\&logoColor=white)](https://wa.me/380686031542)
[![Email](https://img.shields.io/badge/Email-D14836?style=for-the-badge\&logo=gmail\&logoColor=white)](mailto:jdtpnjtp@gmail.com)

# Actor input Schema

## `location` (type: `string`):

Search an entire destination. Accepts a **city/area name** (`Paris`), a **Booking.com dest\_id** (numeric), or a full **Booking.com search URL** - the actor resolves it automatically. Optional if you provide Start URLs below.

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

Paste specific Booking.com hotel URLs to fetch their full detail directly - each is parsed into one detail row (charged as a detail event), independent of the destination search below.

## `maxResults` (type: `integer`):

Upper bound on hotels pulled for the destination search. 20 = quick sample, 100 = solid dataset. The actor paginates Booking.com (up to 100/page) under the hood to reach this number.

## `includeDetails` (type: `boolean`):

When on, every hotel search result is enriched with a second call that pulls its full detail page (complete facility list, description, check-in/out times, more photos). **This adds a `hotel-details` charge per hotel on top of the search-result event.** Leave off for a fast, cheap listing-only run.

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

Currency for prices. Pick from the list or type any 3-letter ISO 4217 code.

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

Leave blank and the actor uses a 1-week-ahead, 2-night stay so results come back with real per-night prices. Accepts an absolute `YYYY-MM-DD` or a relative value like `3 days`, `1 week`.

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

Optional. Pair with check-in. Blank defaults to 2 nights after check-in. Accepts `YYYY-MM-DD` or a relative value like `5 days`.

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

Guests for dated pricing.

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

Children for dated pricing.

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

Number of rooms for dated pricing.

## `sort` (type: `string`):

Order of search results. (Booking occasionally returns fewer results for the combined star+price sorts.)

## `priceMin` (type: `integer`):

Lowest per-night price to include.

## `priceMax` (type: `integer`):

Highest per-night price to include.

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

Keep only hotels at or above this Booking.com guest score.

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

Official hotel star class. Multi-select.

## `mealPlan` (type: `array`):

Board basis. Multi-select.

## `facilities` (type: `array`):

Required property facilities. Multi-select - pick by name, no IDs to look up.

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

Keep only hotels offering a free-cancellation rate.

## `sustainable` (type: `boolean`):

Keep only properties flagged as sustainable by Booking.com.

## Actor input object example

```json
{
  "location": "Paris",
  "startUrls": [
    "https://www.booking.com/hotel/fr/le-bristol-paris.html"
  ],
  "maxResults": 20,
  "includeDetails": false,
  "currency": "USD",
  "checkIn": "1 week",
  "checkOut": "9 days",
  "adults": 2,
  "children": 0,
  "rooms": 1,
  "sort": "popularity",
  "minReviewScore": "",
  "stars": [],
  "mealPlan": [],
  "facilities": [],
  "freeCancellation": false,
  "sustainable": false
}
```

# Actor output Schema

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

The default dataset. Each row carries one hotel search result or detail, discriminated by row\_type, with common fields flattened to top-level columns and the full payload under `data`. Use the Overview / Hotels / Details tabs to view per-type tables.

## `summary` (type: `string`):

A single JSON object written to the default key-value store under the OUTPUT key. Contains hotel\_results, hotel\_details, errors, total\_rows, estimated\_cost\_usd, limit\_reached, and actor\_version.

# 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 = {
    "location": "Paris",
    "startUrls": [
        "https://www.booking.com/hotel/fr/le-bristol-paris.html"
    ],
    "maxResults": 20,
    "checkIn": "1 week",
    "checkOut": "9 days"
};

// Run the Actor and wait for it to finish
const run = await client.actor("jdtpnjtp/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 = {
    "location": "Paris",
    "startUrls": ["https://www.booking.com/hotel/fr/le-bristol-paris.html"],
    "maxResults": 20,
    "checkIn": "1 week",
    "checkOut": "9 days",
}

# Run the Actor and wait for it to finish
run = client.actor("jdtpnjtp/booking-hotels-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 '{
  "location": "Paris",
  "startUrls": [
    "https://www.booking.com/hotel/fr/le-bristol-paris.html"
  ],
  "maxResults": 20,
  "checkIn": "1 week",
  "checkOut": "9 days"
}' |
apify call jdtpnjtp/booking-hotels-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/m9rkiUEEHbl1YLNfe/builds/3pX6xHGPLKjK8XYg9/openapi.json
