# Booking.com Scraper (`unfenced-group/booking-scraper`) Actor

Scrape Booking.com for hotels, apartments and villas. Get ratings, prices, addresses and coordinates for any destination and date range.

- **URL**: https://apify.com/unfenced-group/booking-scraper.md
- **Developed by:** [Unfenced Group](https://apify.com/unfenced-group) (community)
- **Categories:** Travel, Real estate
- **Stats:** 4 total users, 2 monthly users, 90.6% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.59 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
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 Scraper

![Banner](https://api.apify.com/v2/key-value-stores/lJlifu6C8YQfZMPKE/records/booking-scraper)

Extract hotel and accommodation data from Booking.com — property names, star ratings, review scores, nightly prices, addresses, coordinates, property types, and more. Search by destination, date range, and occupancy. Covers all property types: hotels, apartments, villas, hostels, and resorts worldwide.

***

### Why this scraper?

#### 💰 60% cheaper than the leading alternative

At **$1.99 per 1,000 results**, this is the most affordable reliable Booking.com scraper on Apify — no tiered pricing, no volume requirements.

#### 🌍 Any destination, worldwide

Search any city, region, landmark, or country. Supports the full Booking.com inventory of 28+ million listings across 230+ countries.

#### 🗓️ Date-aware pricing

Set check-in and check-out dates to get real-time availability and accurate nightly prices for your specific travel window.

#### ⭐ Smart filtering

Filter results by minimum review score, star rating, maximum price per night, and property type — without paying for results you don't need.

#### 📋 25+ structured fields per property

Every result includes property name, URL, star rating, review score, review count, nightly price, currency, full address, GPS coordinates, property type, cancellation policy, and meal plan info.

#### 🔄 Scheduler-ready for price monitoring

Run on a schedule to track price changes, monitor availability, or feed a hotel comparison tool. Combine with Apify's webhook notifications for real-time alerts.

***

### Input parameters

| Parameter | Type | Default | Description |
|---|---|---|---|
| `destination` | string | — | City, region, or property name (e.g. `Amsterdam`, `Bali`, `Paris 8th`) |
| `checkin` | string | today + 30 days | Check-in date in `YYYY-MM-DD` format. Optional |
| `checkout` | string | check-in + 3 nights | Check-out date in `YYYY-MM-DD` format. Optional |
| `adults` | integer | `2` | Number of adults per room |
| `children` | integer | `0` | Number of children per room |
| `rooms` | integer | `1` | Number of rooms |
| `maxResults` | integer | `100` | Maximum properties to return |
| `minRating` | number | `0` | Minimum Booking.com review score (0–10). `0` = no filter |
| `minStars` | integer | `0` | Minimum star rating (1–5). `0` = no filter |
| `maxPricePerNight` | number | `0` | Maximum nightly price. `0` = no filter |
| `propertyType` | string | `""` | Keyword filter on type: `hotel`, `apartment`, `hostel`, `villa`, etc. |
| `startUrls` | array | `[]` | Direct Booking.com search URLs to scrape |

***

### Output schema

| Field | Type | Description |
|---|---|---|
| `id` | string|null | Booking.com internal property ID |
| `url` | string|null | Full Booking.com property page URL |
| `name` | string|null | Property name |
| `starRating` | number|null | Official star rating (1–5) |
| `reviewScore` | number|null | Booking.com review score (0–10) |
| `reviewCount` | integer|null | Total number of reviews |
| `reviewCategory` | string|null | Score label (e.g. "Superb", "Very Good") |
| `pricePerNight` | number|null | Nightly price for your search dates |
| `priceCurrency` | string|null | Currency code (e.g. `EUR`, `USD`) |
| `priceTotal` | number|null | Total stay price (null if not fetched from detail) |
| `address` | string|null | Street address |
| `city` | string|null | City |
| `country` | string|null | Two-letter country code (e.g. `NL`, `FR`) |
| `latitude` | number|null | GPS latitude |
| `longitude` | number|null | GPS longitude |
| `propertyType` | string|null | Property category (e.g. `Hotel`, `Apartment`, `Villa`) |
| `photos` | string\[]|null | Photo URLs (requires detail fetch) |
| `amenities` | string\[]|null | Amenity list (requires detail fetch) |
| `description` | string|null | Property description (requires detail fetch) |
| `checkInTime` | string|null | Check-in time range (requires detail fetch) |
| `checkOutTime` | string|null | Check-out time range (requires detail fetch) |
| `freeCancellation` | boolean|null | Whether free cancellation is available |
| `breakfastIncluded` | boolean|null | Whether breakfast is included in the listed price |
| `source` | string | Always `"booking.com"` |
| `scrapedAt` | string | ISO 8601 timestamp of when data was collected |
| `contentHash` | string | 16-char MD5 fingerprint for change detection |

#### Example output record

```json
{
    "id": "254868",
    "url": "https://www.booking.com/hotel/nl/the-grand-amsterdam.html",
    "name": "The Grand Amsterdam",
    "starRating": 5,
    "reviewScore": 8.7,
    "reviewCount": 4312,
    "reviewCategory": "Fabulous",
    "pricePerNight": 385.00,
    "priceCurrency": "EUR",
    "priceTotal": null,
    "address": "Oudezijds Voorburgwal 197",
    "city": "Amsterdam",
    "country": "NL",
    "latitude": 52.3742,
    "longitude": 4.8976,
    "propertyType": "Hotel",
    "photos": null,
    "amenities": null,
    "description": null,
    "checkInTime": null,
    "checkOutTime": null,
    "freeCancellation": true,
    "breakfastIncluded": false,
    "source": "booking.com",
    "scrapedAt": "2026-06-03T15:00:00.000Z",
    "contentHash": "a3f1b2c9d4e50612"
}
```

***

### Examples

**Search hotels in Amsterdam for a weekend:**

```json
{
    "destination": "Amsterdam",
    "checkin": "2026-08-01",
    "checkout": "2026-08-03",
    "adults": 2,
    "maxResults": 50
}
```

**Find top-rated hotels in Paris under €200/night:**

```json
{
    "destination": "Paris",
    "checkin": "2026-09-15",
    "checkout": "2026-09-18",
    "adults": 2,
    "minRating": 8.5,
    "maxPricePerNight": 200,
    "maxResults": 100
}
```

**Search for apartments and villas in Bali:**

```json
{
    "destination": "Bali",
    "checkin": "2026-10-01",
    "checkout": "2026-10-08",
    "adults": 2,
    "children": 1,
    "propertyType": "apartment",
    "maxResults": 100
}
```

**Scrape a specific Booking.com search URL:**

```json
{
    "checkin": "2026-07-20",
    "checkout": "2026-07-25",
    "startUrls": [
        { "url": "https://www.booking.com/searchresults.html?ss=Santorini&no_rooms=1&group_adults=2" }
    ],
    "maxResults": 50
}
```

***

**Daily price monitoring (run on a schedule):**

```json
{
  "startUrls": [
    {
      "url": "https://www.booking.com/searchresults.html?ss=Santorini&no_rooms=1&group_adults=2"
    }
  ],
  "maxResults": 100
}
```

Schedule this input to run once a day in the Apify Scheduler to track prices and availability for the same search over time.

### 💰 Pricing

**$1.99 per 1,000 results** — you only pay for successfully saved properties.

| Results | Cost |
|---|---|
| 100 | ~$0.20 |
| 1,000 | ~$1.99 |
| 10,000 | ~$19.90 |
| 100,000 | ~$199.00 |

> The leading Booking.com scraper charges **$5.00 per 1,000** results for new users — over 2.5× more. Same data, same reliability.

***

### Performance

| Run size | Approx. time |
|---|---|
| 25 properties | ~30–45 seconds |
| 100 properties | ~1–2 minutes |
| 500 properties | ~5–8 minutes |

***

### Known limitations

- **Availability is date-dependent** — results and prices vary by check-in/check-out dates. Always provide valid future dates.
- **Dynamic pricing** — Booking.com prices change frequently. Data reflects availability at scrape time.
- **Booking.com account features** — Genius loyalty discounts and member pricing are not reflected in scraped prices (standard public rates only).
- **Detail fields** — `photos`, `amenities`, `description`, `checkInTime`, and `checkOutTime` require a separate detail-page fetch and are not included in the default run to keep costs low.

***

### Technical details

- **Source:** booking.com — global accommodation search
- **Memory:** 1,024 MB
- **Proxy:** Residential proxy (bundled, US) — required to bypass bot protection
- **Retry:** Automatic retry on network errors, 3 attempts per request

***

### Additional services

Need a custom actor, additional filters, scheduled runs, or integration support?.nl]\(mailto:info@unfencedgroup.nl) — we build on request.

***

***

### Need a custom scraper?

**[Unfenced Group](https://www.unfencedgroup.nl)** builds Apify actors for any website — for free.

If the site you need isn't in our portfolio yet, just ask. We scope, build, and publish it at no cost to you. You only pay for results — we absorb the compute and proxy costs ourselves. Same pay-per-result pricing, same quality, same standards as every actor in this portfolio.

**Get in touch:** [www.unfencedgroup.nl](https://www.unfencedgroup.nl)

# Actor input Schema

## `destination` (type: `string`):

City, region, or property name to search (e.g. 'Amsterdam', 'Paris', 'Maldives').

## `checkin` (type: `string`):

Check-in date in YYYY-MM-DD format (e.g. 2026-08-01). Optional — defaults to 30 days from today.

## `checkout` (type: `string`):

Check-out date in YYYY-MM-DD format (e.g. 2026-08-05). Optional — defaults to 3 nights after check-in.

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

Number of adults per room.

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

Number of children per room.

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

Number of rooms.

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

Maximum number of properties to return.

## `minRating` (type: `number`):

Only return properties with a review score at or above this value (0–10). Leave at 0 for no filter.

## `minStars` (type: `integer`):

Only return properties with this star rating or higher (1–5). Leave at 0 for no filter.

## `maxPricePerNight` (type: `number`):

Filter out properties above this nightly price. Leave at 0 for no filter.

## `propertyType` (type: `string`):

Optional keyword filter on property type (e.g. 'hotel', 'apartment', 'hostel', 'villa').

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

Optional list of specific Booking.com search or property URLs to scrape directly.

## Actor input object example

```json
{
  "destination": "Amsterdam",
  "checkin": "",
  "checkout": "",
  "adults": 2,
  "children": 0,
  "rooms": 1,
  "maxResults": 100,
  "minRating": 0,
  "minStars": 0,
  "maxPricePerNight": 0,
  "propertyType": "",
  "startUrls": []
}
```

# Actor output Schema

## `results` (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 = {
    "destination": "Amsterdam"
};

// Run the Actor and wait for it to finish
const run = await client.actor("unfenced-group/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 = { "destination": "Amsterdam" }

# Run the Actor and wait for it to finish
run = client.actor("unfenced-group/booking-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 '{
  "destination": "Amsterdam"
}' |
apify call unfenced-group/booking-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/Zvl7RBfmVdf9tD0fP/builds/XyJkGkqTFhXYFz8IS/openapi.json
