# Booking Scraper (`silentflow/booking-scraper`) Actor

Scrape Booking.com hotels at scale. Extract prices, ratings, reviews, photos, availability for any destination. Filter by stars, price, score. Get 20+ data points per hotel. Supports all currencies & languages. Fast, reliable with residential proxies

- **URL**: https://apify.com/silentflow/booking-scraper.md
- **Developed by:** [SilentFlow](https://apify.com/silentflow) (community)
- **Categories:** Travel
- **Stats:** 9 total users, 2 monthly users, 100.0% runs succeeded, 2 bookmarks
- **User rating**: No ratings yet

## Pricing

$24.99/month + usage

To use this Actor, you pay a monthly rental fee to the developer. The rent is subtracted from your prepaid usage every month after the free trial period. You also pay for the Apify platform usage, which gets cheaper the higher Apify subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#rental-actors

## 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 Hotel Scraper

by [SilentFlow](https://apify.com/silentflow)

Extract hotel data from Booking.com at scale. Get prices, ratings, reviews, photos, and availability for any destination worldwide.

### ✨ Why use this scraper?

- 📊 **Comprehensive data** — 20+ fields per hotel: prices, reviews, photos, amenities, and more
- 🌍 **Global coverage** — Search any destination worldwide: cities, regions, or entire countries
- 💰 **Real-time prices** — Get current availability and pricing for your dates
- ⚡ **Fast & reliable** — ~25 hotels/second with residential proxy support

### 🎯 Use cases

| Industry | Application |
|----------|-------------|
| **Travel agencies** | Compare hotel prices across destinations |
| **Market research** | Analyze hospitality market trends |
| **Price monitoring** | Track competitor pricing |
| **Data analytics** | Build travel recommendation systems |
| **Academic research** | Study tourism and pricing patterns |

### 📥 Input parameters

#### Search

You have two options:

**Option 1 (Recommended):** Paste a Booking.com search URL — go to booking.com, set your destination, dates, guests, price range, stars, sort order, and any other filter, then copy the URL.

**Option 2:** Use the fields below for a simple location-based search.

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `searchUrl` | string | No | Full Booking.com search URL with all filters applied |
| `location` | string | No | City, region, or country (e.g., "Paris", "Bali", "New York") |
| `checkIn` | string | No | Check-in date in YYYY-MM-DD (default: 7 days from now) |
| `checkOut` | string | No | Check-out date in YYYY-MM-DD (default: 8 days from now) |
| `adults` | integer | No | Number of adult guests (default: 2) |
| `children` | string | No | Comma-separated ages of children (e.g., "2,5,10") |
| `rooms` | integer | No | Number of rooms (default: 1) |

Either `searchUrl` or `location` is required.

#### Options

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `currency` | string | USD | Currency for prices (USD, EUR, GBP, JPY, etc.) |
| `language` | string | en-us | Results language (en-us, fr, de, es, it, ja, etc.) |
| `maxItems` | integer | 100 | Maximum hotels to return (max: 1,000) |
| `enrichDetails` | boolean | false | Visit each hotel page for full description, photos, facilities |

> **Tip:** Need to filter by price, stars, or review score? Set those filters on booking.com and paste the URL into `searchUrl` — the scraper reads all filters directly from the URL.
>
> **`enrichDetails`** adds ~1-2s per hotel (3 parallel workers). A 50-hotel scrape takes ~20-30s extra. You get full descriptions, 10-60 photos per hotel, facilities list, and highlights.

### 📊 Output data

Each hotel record contains:

```json
{
  "hotelId": "12345678",
  "name": "Grand Hotel Paris",
  "type": "Hotel",
  "url": "https://www.booking.com/hotel/fr/grand-hotel-paris.html",

  "address": "1 Avenue des Champs-Élysées",
  "city": "Paris",
  "country": "fr",
  "latitude": 48.8566,
  "longitude": 2.3522,
  "distanceFromCenter": "0.5 km from center",
  "publicTransport": "Champs-Élysées Clemenceau station is within 200 yards",

  "starRating": 5,
  "reviewScore": 9.2,
  "reviewCount": 2847,
  "reviewWord": "Superb",

  "price": 450.00,
  "originalPrice": 520.00,
  "currency": "EUR",
  "pricePerNight": 225.00,
  "taxesAndCharges": 45.00,

  "mainPhoto": "https://cf.bstatic.com/xdata/images/hotel/...",
  "photos": ["https://cf.bstatic.com/..."],

  "checkIn": "2026-04-15",
  "checkOut": "2026-04-17",

  "description": "Located on the Champs-Élysées...",
  "facilities": ["Free WiFi", "Spa", "Restaurant", "Parking"],
  "highlights": ["Great location", "Top-rated breakfast"],

  "freeCancellation": true,
  "breakfastIncluded": true,
  "noPrepayment": false,

  "isPreferred": true,
  "isSustainable": true,

  "scrapedAt": "2026-04-01T12:00:00Z"
}
```

### 🗂️ Data fields

| Category | Fields |
|----------|--------|
| **Identity** | hotelId, name, type, url |
| **Location** | address, city, country, latitude, longitude, distanceFromCenter, publicTransport |
| **Ratings** | starRating, reviewScore, reviewCount, reviewWord |
| **Pricing** | price, originalPrice, currency, pricePerNight, taxesAndCharges, discount |
| **Media** | mainPhoto, photos |
| **Details** | description, facilities, highlights |
| **Policies** | freeCancellation, breakfastIncluded, noPrepayment |
| **Badges** | isPreferred, isPreferredPlus, isSustainable |
| **Meta** | checkIn, checkOut, scrapedAt |

### 🚀 Examples

#### Simple search — Paris hotels

```json
{
  "location": "Paris",
  "maxItems": 50
}
```

#### Detailed hotel data with photos & description

```json
{
  "location": "Tokyo",
  "checkIn": "2026-07-01",
  "checkOut": "2026-07-05",
  "adults": 2,
  "currency": "JPY",
  "maxItems": 50,
  "enrichDetails": true
}
```

#### Using a Booking.com URL (with all filters)

```json
{
  "searchUrl": "https://www.booking.com/searchresults.html?ss=New+York&checkin=2026-08-01&checkout=2026-08-03&nflt=class%3D5%3Breview_score%3D90",
  "maxItems": 100
}
```

### 💻 Integrations

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_API_TOKEN")

run = client.actor("silentflow/booking-scraper").call(run_input={
    "location": "Barcelona",
    "checkIn": "2026-09-01",
    "checkOut": "2026-09-03",
    "maxItems": 50,
    "currency": "EUR"
})

for hotel in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(f"{hotel['name']}: {hotel['price']} {hotel['currency']}")
```

#### JavaScript

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });

const run = await client.actor('silentflow/booking-scraper').call({
    location: 'London',
    checkIn: '2026-10-15',
    checkOut: '2026-10-17',
    maxItems: 100,
    currency: 'GBP'
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach(hotel => console.log(`${hotel.name}: £${hotel.price}`));
```

### 📈 Performance & limits

| Metric | Value |
|--------|-------|
| Hotels per page | ~25 |
| Average speed | ~25 hotels/second |
| Max items per run | 1,000 |
| Supported destinations | Worldwide |

### 💡 Tips for best results

1. **Use specific locations** — "Paris, France" works better than just "Paris"
2. **Use `searchUrl` for advanced filters** — Set price range, stars, review score, sort order directly on booking.com, then paste the URL
3. **Set realistic dates** — Prices vary significantly by date
4. **Start small** — Test with `maxItems: 10` before large scrapes

### ❓ FAQ

**Q: How do I filter by price, stars, or review score?**
A: Go to booking.com, apply all your filters, then paste the URL into `searchUrl`. The scraper reads filters directly from the URL.

**Q: Why are some prices different from the Booking.com website?**
A: Prices on Booking.com vary based on user location and login status. The scraper sees prices as a new visitor.

**Q: Can I scrape hotel details pages?**
A: This scraper focuses on search results. For detailed info (full description, all photos, room types), contact us for a custom solution.

**Q: What happens if no hotels are found?**
A: The scraper returns an empty dataset. Check your location spelling and date range.

### 📬 Support

Need help? We're here for you:

- **Feature requests**: Let us know what you need
- **Custom solutions**: Contact us for enterprise integrations or high-volume needs

Check out our other scrapers: [SilentFlow on Apify](https://apify.com/silentflow)

# Actor input Schema

## `searchUrl` (type: `string`):

Paste a Booking.com search URL with all your filters already applied (dates, guests, price range, stars, etc.). Go to booking.com, set everything up, then copy the URL.

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

City, region, or country to search (e.g., 'Paris', 'Bali', 'New York'). Ignored when a Search URL is provided.

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

Check-in date in YYYY-MM-DD format. Defaults to 7 days from now.

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

Check-out date in YYYY-MM-DD format. Defaults to 8 days from now.

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

Number of adult guests.

## `children` (type: `string`):

Comma-separated ages of children (e.g., '2,5,10'). Leave empty for no children.

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

Number of rooms needed.

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

Currency for prices.

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

Results language.

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

Maximum number of hotels to scrape.

## `enrichDetails` (type: `boolean`):

Visit each hotel's detail page to get full description, facilities, photo gallery, and highlights. Slower but much richer data.

## Actor input object example

```json
{
  "location": "Paris",
  "adults": 2,
  "rooms": 1,
  "currency": "USD",
  "language": "en-us",
  "maxItems": 100,
  "enrichDetails": false
}
```

# Actor output Schema

## `hotels` (type: `string`):

Complete hotel data including: name (hotel name), type (Hotel/Apartment/Hostel/Villa), starRating (1-5 stars), reviewScore (0-10), reviewCount (number of reviews), price (current price), originalPrice (before discount), currency, city, country, address, distanceFromCenter, coordinates (lat/lng), facilities (pool/wifi/parking/gym), roomTypes, photos (image URLs), url (booking page), checkInTime, checkOutTime, policies.

## `hotelsCSV` (type: `string`):

CSV format export of all hotels for spreadsheet analysis

## `hotelsExcel` (type: `string`):

Excel format export of all hotels

# 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 = {
    "searchUrl": "",
    "location": "Paris",
    "checkIn": "",
    "checkOut": "",
    "children": ""
};

// Run the Actor and wait for it to finish
const run = await client.actor("silentflow/booking-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "searchUrl": "",
    "location": "Paris",
    "checkIn": "",
    "checkOut": "",
    "children": "",
}

# Run the Actor and wait for it to finish
run = client.actor("silentflow/booking-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchUrl": "",
  "location": "Paris",
  "checkIn": "",
  "checkOut": "",
  "children": ""
}' |
apify call silentflow/booking-scraper --silent --output-dataset

```

## MCP server setup

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

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/E1rxBDvNrmf3KnG5b/builds/41eOZLbtd7823kePT/openapi.json
