# Booking.com API Scraper (`rl1987/booking-api-scraper`) Actor

Scrape Booking.com properties, live prices and full room-rate tables via the mobile API — by destination search or by hotel id.

- **URL**: https://apify.com/rl1987/booking-api-scraper.md
- **Developed by:** [R.L.](https://apify.com/rl1987) (community)
- **Categories:** Travel
- **Stats:** 6 total users, 6 monthly users, 93.2% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 search results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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 – Hotel Prices, Rooms, Reviews & Availability

**Scrape Booking.com at scale** — extract hotels, live room prices, availability,
full rate breakdowns, facilities, photos and guest reviews as clean, structured
**JSON**. No login, no captchas, no browser automation to maintain. Just give it a
destination and dates, and get back ready-to-use accommodation data you can export
to **CSV, Excel, JSON or the API**.

Whether you're tracking competitor hotel prices, building a travel app, feeding a
rate-shopping dashboard, or doing market research, this **Booking.com data
extractor** turns the world's largest accommodation site into a structured feed.

> ⚡ **Fast & reliable** — pulls data straight from Booking.com's own data API, so
> it's dramatically faster and more stable than page-rendering scrapers.
> 🔌 **Demand API–compatible** — input and output mirror Booking.com's official
> **Demand API** `/accommodations/search` format, so it's a drop-in, no-contract
> alternative for search-style hotel data.

### What you can extract

- 🏨 **Hotel search results** – every property for a city, region or coordinates,
  with live total price, currency, and direct booking links.
- 💶 **Live prices & rates** – per-stay and per-night pricing, taxes and extra
  charges, discounts and deals, in the currency you choose.
- 🛏️ **Rooms & availability** – the full list of room types and bookable rates:
  occupancy, board (breakfast/half/full/all-inclusive), cancellation policy,
  payment options, and how many rooms are left at each price.
- ⭐ **Guest reviews** – paginated reviews with score, title, positive/negative
  text, date and reviewer country (fetch as many as you need per property).
- 📋 **Property details** – name, star rating, review score & count, GPS
  coordinates, address, 100+ named facilities, family amenities, languages
  spoken and photos.

### Example use cases

- **Hotel price monitoring & rate shopping** – track competitor and market prices
  over time for revenue management.
- **Travel & metasearch products** – power a booking site, app or price-comparison
  tool with fresh inventory.
- **Market & investment research** – analyze pricing, occupancy signals, ratings
  and amenities across a destination.
- **Review & reputation analysis** – mine guest sentiment and review trends for any
  property.
- **Lead lists & data enrichment** – build accommodation datasets with geo,
  facilities and contact context.

### Output example

One clean record per accommodation:

```json
{
  "id": 1392565,
  "currency": "EUR",
  "deep_link_url": "booking://hotel/1392565?affiliate_id=337862&checkin=2026-11-10&checkout=2026-11-12",
  "price": {
    "base": 181.82,
    "book": 183.64,
    "total": 183.64,
    "extra_charges": { "excluded": 54.82, "included": 0 }
  },
  "url": "https://www.booking.com/hotel/nl/mercure-amsterdam-sloterdijk-station.html?checkin=2026-11-10&checkout=2026-11-12&group_adults=2&selected_currency=EUR",
  "rooms": [
    { "id": 1000420, "name": "Standard Double or Twin Room", "maxOccupancy": 2,
      "productCount": 4, "minPrice": 153.59, "currency": "EUR" }
  ],
  "products": [
    {
      "id": "139256508_91477112_2_34_0",
      "number_of_adults": 2,
      "number_available_at_this_price": 14,
      "policies": {
        "cancellation": { "free_cancellation_until": null, "type": "non_refundable" },
        "meal_plan": { "meals": [], "plan": "no_plan" },
        "payment": { "types": ["pay_now"] }
      },
      "price": { "base": 181.82, "book": 262.73, "total": 262.73 },
      "room": 139256508
    }
  ],
  "reviews": [
    { "title": "Exceptional", "score": 10,
      "pros": "Great location. Nice room. Friendly staff.",
      "cons": "Blinds didn't fully block the light.",
      "date": "2026-06-19",
      "author": { "name": "Gregory", "countryCode": "us", "countryName": "United States" } }
  ],
  "details": {
    "name": "Mercure Amsterdam Sloterdijk Station",
    "accommodationType": "Hotels",
    "starRating": 4,
    "reviewScore": 8.6,
    "reviewScoreWord": "Excellent",
    "reviewsCount": 4215,
    "city": "Amsterdam", "countryCode": "nl",
    "latitude": 52.39, "longitude": 4.84,
    "facilities": ["Parking", "24-hour front desk", "Fitness center", "Free Wifi"],
    "languagesSpoken": ["nl", "en-gb", "de"],
    "address": "Naritaweg 1, Westpoort, 1043 BP Amsterdam, Netherlands"
  }
}
```

`rooms` + `products` appear when you enable **Include rooms**, `reviews` with
**Include reviews**, and `details` with **Include details** — so you only pull
(and pay for) the data you actually need.

### How to use it

No coding required. Set up your search in the visual input form, then **run it on
demand, schedule it**, or call it via the **API** and connect it to **Make,
Zapier, n8n, Google Sheets** and more. Results land in a dataset you can download
as JSON, CSV, Excel or HTML, or pull through the API.

#### Input

```json
{
  "search": "Amsterdam",
  "checkin": "2026-11-10",
  "checkout": "2026-11-12",
  "currency": "EUR",
  "guests": { "number_of_rooms": 1, "number_of_adults": 2, "children": [5, 9] },
  "accommodation_types": [204],
  "rating": { "minimum_review_score": 8 },
  "price": { "minimum": 80, "maximum": 300 },
  "sort": { "by": "price", "direction": "ascending" },
  "includeRooms": true,
  "includeReviews": true,
  "includeDetails": true,
  "maxItems": 100
}
```

| Field | Description |
|-------|-------------|
| `search` | Destination name (city, region, landmark) — e.g. `"Amsterdam"`. The easiest way to start. |
| `city` / `region` | Target a specific Booking destination by numeric id (alternative to `search`). |
| `checkin` / `checkout` | Stay dates (`YYYY-MM-DD`). Defaults to a 1-night stay 30 days out. |
| `currency` | Price currency, e.g. `USD`, `EUR`, `GBP`. |
| `guests` | Occupancy: `number_of_adults`, `number_of_rooms`, `children` (ages), `allocation` (per-room). |
| `accommodation_types` | Keep only certain property types, e.g. `[204]` for hotels. |
| `rating` | `minimum_review_score` to keep only well-rated properties. |
| `price` | `minimum` / `maximum` price range filter. |
| `sort` | `by`: `price` or `review_score`; `direction`: `ascending` / `descending`. |
| `includeRooms` | Add the full **rooms & rates** (products) per property. |
| `includeDetails` | Add **property details** (stars, reviews, facilities, photos, address, geo). |
| `includeReviews` | Add **guest reviews**. |
| `maxReviews` | How many reviews per property (default 10). |
| `hotel_ids` | Scrape specific properties by id instead of searching. |
| `maxItems` | Cap the number of properties returned. |
| `language` | Locale for text, e.g. `en-us`, `de`, `fr`. |
| `proxyConfiguration` | Proxy settings (Apify Proxy recommended for large runs). |

### Pricing – pay only for the data you get

This scraper uses **pay-per-event** billing. You're charged only for results
actually delivered — never for failed requests.

| You pay | Per |
|---------|-----|
| **$0.001** | hotel search result |
| **$0.001** | property details record |
| **$0.0001** | room option |
| **$0.0001** | guest review |

A plain search result costs a tenth of a cent; rooms, reviews and details add
their tiny per-item charge only when you ask for them — so a lightweight price
check stays extremely cheap, and a full property profile is still a fraction of a
cent.

### Frequently asked questions

**Do I need a Booking.com account or API key?**
No. Just configure the input and run it.

**Can I get prices in my own currency and language?**
Yes — set `currency` and `language` to whatever you need.

**How many reviews can I collect?**
Reviews are paginated, so you can pull well beyond the first page — set
`maxReviews` to the number you want per property.

**Can I scrape a specific hotel?**
Yes — pass its Booking id in `hotel_ids` to fetch that property directly.

**Does it return phone numbers or email addresses?**
No. Booking.com hides direct property contact details until after a booking, so
they aren't available from public data.

**What formats can I export?**
Results are stored in a dataset and can be downloaded as JSON, CSV, Excel or HTML,
or accessed via the API and integrations.

**Is this an official Booking.com product?**
No. It's an independent scraper whose input/output happen to mirror Booking.com's
public Demand API search format for convenience.

### Legal & responsible use

Use this scraper to collect **publicly available** information only, in line with
Booking.com's Terms of Service and applicable laws (including data-protection
rules). Avoid collecting personal data without a lawful basis, and scrape at a
reasonable rate. You are responsible for how you use the data you extract.

# Actor input Schema

## `search` (type: `string`):

Place name (city, region, landmark) resolved via Booking autocomplete. The easiest way to start — e.g. "Amsterdam". Leave the numeric ID fields empty if you use this.

## `city` (type: `integer`):

Advanced: exact numeric destination id (Demand `city`), e.g. -2140479 for Amsterdam. Use only if you already know the id; otherwise just fill in Destination above.

## `region` (type: `integer`):

Advanced: exact numeric region id (Demand `region`). Use only if you already know the id.

## `country` (type: `string`):

ISO 2-letter country code (Demand `country`). Note: country-level search is not supported by the backend — prefer Destination, City ID or Region ID.

## `hotel_ids` (type: `array`):

Scrape specific properties by their numeric Booking ID (bypasses search). Add one ID per line, e.g. 10004. When set, search/destination is ignored.

## `latitude` (type: `number`):

Optional coordinate search (Demand `coordinates`). Note: coordinate search is not supported by the backend and is ignored — use Destination/City/Region instead.

## `longitude` (type: `number`):

Longitude paired with Latitude. Accepted for parity; ignored by the backend.

## `radius` (type: `number`):

Radius around the coordinates, in kilometres. Accepted for parity; ignored by the backend.

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

Arrival date. Defaults to 30 days from the run date.

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

Departure date. Defaults to check-in + 1 night.

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

Number of rooms to book for.

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

Number of adult guests.

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

Add one child age (in years) per line, e.g. 5 then 9 for two children. Leave empty for no children.

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

Currency for displayed prices.

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

Locale for localized text (names, facilities, reviews).

## `accommodationTypes` (type: `array`):

Limit results to these property types. Leave empty for all types.

## `minReviewScore` (type: `integer`):

Only return properties with at least this guest review score (1–10). Applied client-side.

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

Only return properties at or above this total stay price, in the selected currency. Applied client-side.

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

Only return properties at or below this total stay price, in the selected currency. Applied client-side.

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

Order of the returned accommodations.

## `sortDirection` (type: `string`):

Applies only when "Sort by" is set to Price or Review score.

## `includeRooms` (type: `boolean`):

Add both room sections: the per-rate `products` list (board, cancellation, deals, price) AND the distinct room-type `rooms` list (name, occupancy, availability, lowest price). Costs one extra request per property in search mode.

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

Add a `details` object per property: name, type, star rating, review score/count, location, main photos, named facilities, languages spoken and address. Costs one extra request per property in search mode.

## `includeReviews` (type: `boolean`):

Add a `reviews` array per property (author, score, title, pros/cons, date). Costs one request per 10 reviews per property.

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

How many reviews to fetch per property (only when "Include reviews" is on). Capped by the property's total review count.

## `includeExtraCharges` (type: `boolean`):

Add the `extra_charges` price breakdown (taxes/fees) to each result and product (Demand `extras: extra_charges`).

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

Maximum number of accommodations to return.

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

Maximum parallel requests for product/detail fetches.

## `bookerCountry` (type: `string`):

ISO 2-letter country of the booker (Demand `booker.country`). Accepted for parity; affects some localized pricing.

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

Proxy settings. Apify Proxy recommended.

## Actor input object example

```json
{
  "search": "Amsterdam",
  "hotel_ids": [],
  "rooms": 1,
  "adults": 2,
  "childrenAges": [],
  "currency": "USD",
  "language": "en-us",
  "accommodationTypes": [],
  "sortBy": "none",
  "sortDirection": "ascending",
  "includeRooms": false,
  "includeDetails": false,
  "includeReviews": false,
  "maxReviews": 10,
  "includeExtraCharges": true,
  "maxItems": 100,
  "maxConcurrency": 10,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `accommodations` (type: `string`):

Scraped accommodations (one item per property).

## `datasetView` (type: `string`):

Open the dataset in the Apify Console.

# 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 = {
    "search": "Amsterdam",
    "hotel_ids": [],
    "rooms": 1,
    "adults": 2,
    "childrenAges": [],
    "accommodationTypes": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("rl1987/booking-api-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 = {
    "search": "Amsterdam",
    "hotel_ids": [],
    "rooms": 1,
    "adults": 2,
    "childrenAges": [],
    "accommodationTypes": [],
}

# Run the Actor and wait for it to finish
run = client.actor("rl1987/booking-api-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 '{
  "search": "Amsterdam",
  "hotel_ids": [],
  "rooms": 1,
  "adults": 2,
  "childrenAges": [],
  "accommodationTypes": []
}' |
apify call rl1987/booking-api-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/hOb6eSGvMQIbf6z1X/builds/myDDfweHARqHgsFwk/openapi.json
