# Booking.com Search Scraper (`mina_safwat/booking-search-scraper`) Actor

Scrapes Booking.com search results over plain HTTP. Full filter set, currency selection, and structured output — prices, ratings, coordinates, room layout.

- **URL**: https://apify.com/mina\_safwat/booking-search-scraper.md
- **Developed by:** [Mina](https://apify.com/mina_safwat) (community)
- **Categories:** Travel, Automation, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 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/actors/running/actors-in-store.md#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

Scrape **Booking.com search results** at speed — every property matching your dates, destination, and filters, with prices in the currency you choose. No browser, no cookies, no login.

### What does Booking.com Search Scraper do?

This Actor runs a search on [Booking.com](https://www.booking.com) exactly as you would in a browser — destination, dates, guests, and any combination of Booking's filters — and returns the results as structured data. For each property you get the name, link, price for your stay, review score, star rating, coordinates, distance from the centre, room layout, and cancellation terms.

It runs no browser, so it is fast and inexpensive — expect a few hundred properties in well under a minute.

### Why use Booking.com Search Scraper?

- **Rate and availability monitoring** — track competitor pricing for a city on given dates, on a schedule.
- **Market research** — pull every 4- and 5-star hotel in a region with review scores and facilities.
- **Travel aggregation** — feed a comparison site or an internal booking tool.
- **Lead lists** — build a list of properties by type, brand, or facility for outreach.

Running it on Apify adds scheduling, an API, integrations (Sheets, Slack, Zapier, S3), and run monitoring.

### How to use Booking.com Search Scraper

1. Type a **Destination** — a city, region, landmark, or property name, exactly as you would on Booking.com.
2. Set **Check-in** and **Check-out** dates. Leave them empty to browse without prices.
3. Set **Adults**, **Children ages**, and **Rooms**.
4. Pick a **Currency** — all prices are converted to it.
5. Add any **Filters** you want, then click **Start**.

Results appear in the Output tab as they are scraped, and can be downloaded as JSON, CSV, Excel, or XML.

### Input

Destination is the only required field.

| Field | Description |
| --- | --- |
| `destination` | Where to search — a city, region, district, landmark, airport, or a specific property. Type it as you would on Booking.com. |
| `checkin` / `checkout` | `YYYY-MM-DD`. Omit both to search without availability. |
| `adults`, `children_ages`, `rooms` | Occupancy. Children are priced by age, so pass one age per child. |
| `currency` | Currency for all prices, e.g. `EUR`. |
| `language` | Language of names, descriptions, and labels in the output. |
| `sort_by` | Price, review score, distance, star rating, and so on. |
| `max_results` | Stops after this many properties. |

#### Filters

The full Booking filter set is exposed as plain dropdowns:

**Price** (min/max per night) · **Property rating** (1–5 stars) · **Review score** (6+ through 9+) · **Property type** (hotels, apartments, villas, resorts, hostels, and 18 more) · **Meals** (breakfast, half board, all-inclusive, self catering) · **Reservation policy** (free cancellation, no prepayment, book without credit card) · **Property facilities** (pool, parking, spa, beachfront, gym, and more) · **Room facilities** (kitchen, balcony, sea view, air conditioning, and more) · **Fun things to do** (beach, golf, diving, skiing, and more) · **Accessibility** (property and room features) · **Bed preference** · **Travel group** (pets allowed, adults only) · **Distance from centre** · **Min bedrooms / bathrooms** · **Entire homes only** · **Only available properties** · **Accepts online payments** · **Sustainability certified**

Booking also offers filters that exist only for a particular search — the hotel brands present in that city, its neighbourhoods, nearby landmarks. Every run saves the full list of filters available for *your* search, along with how many properties match each one, to the **Available filters** output. Copy an entry from there into **Extra filters** to apply it.

### Output

```json
{
  "hotel_id": 16768029,
  "name": "Hôtel Test Paris",
  "url": "https://www.booking.com/hotel/fr/hotel-test.html",
  "price": 450.0,
  "price_formatted": "€ 450",
  "currency": "EUR",
  "taxes_and_charges": "+€ 30 taxes and charges",
  "review_score": 8.6,
  "review_count": 412,
  "star_rating": 4,
  "address": "1 Rue de Rivoli",
  "city": "Paris",
  "country_code": "fr",
  "latitude": 48.8566,
  "longitude": 2.3522,
  "distance_from_centre": "1.2 km from centre",
  "unit_type": "Entire apartment",
  "bedrooms": 2,
  "bathrooms": 1,
  "beds": 3,
  "area": "110 m²",
  "meal_plan": "Breakfast included",
  "free_cancellation_until": "2026-09-01T11:00:00Z",
  "is_sustainable": true,
  "photo_urls": ["https://cf.bstatic.com/xdata/images/hotel/square600/…"]
}
```

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

#### Data fields

| Field | Description |
| --- | --- |
| `hotel_id`, `name`, `url` | Property identity and its Booking.com page. |
| `price`, `price_formatted`, `currency`, `taxes_and_charges` | Total for the whole stay, in the selected currency. |
| `price_before_discount` | Struck-through price, when the property is discounted. |
| `review_score`, `review_count`, `star_rating` | Guest rating and official star rating. |
| `address`, `city`, `country_code`, `latitude`, `longitude` | Location. |
| `display_location`, `distance_from_centre`, `beach_distance` | Location as shown on the search card. |
| `unit_type`, `bedrooms`, `bathrooms`, `beds`, `living_rooms`, `kitchens`, `area` | Room or unit layout. |
| `meal_plan`, `free_cancellation_until` | Board basis and cancellation deadline. |
| `is_sustainable`, `is_sold_out`, `is_newly_opened`, `wishlist_count` | Property flags. |
| `photo_urls`, `description` | Main photo and summary. |

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

Cost scales with how many properties you ask for, not with how complex the pages are. Set **Max results** to the number you actually need — it is the single biggest lever on what a run costs.

### Tips

- **Narrow before you paginate.** Filters are applied by Booking, not after the fact, so filtering cuts requests as well as noise.
- **Dates matter for prices.** Without `checkin`/`checkout` there is no availability to price, so price fields come back empty.
- **Be specific with ambiguous places.** Your destination is matched the same way Booking's own search box matches it, and the closest match wins — "Paris" could mean the city, a district, an airport, or Disneyland Paris. The run log names the place it searched and lists the other matches, so if it picked the wrong one, retype the destination more precisely ("Paris City Center", "Paris Charles de Gaulle Airport").
- **Discover niche filters** via the `AVAILABLE_FILTERS` key-value store record after any run.

### FAQ and support

**Does it need a Booking.com account or cookies?** No. It reads only publicly visible search results.

**Why did a run return fewer results than I asked for?** Booking limits how far any single search goes, no matter how many properties match. To cover a large market, split it into several narrower searches — by price band, star rating, or neighbourhood — and run each one.

**Is scraping Booking.com legal?** This Actor collects only publicly available data and no personal information. You are responsible for how you use the data, including compliance with Booking.com's terms and with GDPR and similar laws. Consult a lawyer if you are unsure.

Found a bug or need a field that is missing? Open an issue on the Actor's Issues tab.

### SEO Keywords

booking.com scraper, scrape booking.com hotels, hotel price scraper, booking.com api, hotel rate monitoring, travel data scraping, hotel availability scraper, accommodation price comparison, booking.com search results, hotel reviews and ratings data, revenue management data

# Actor input Schema

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

City, region, district, landmark, airport, or a specific property — type it exactly as you would in the search box on Booking.com. The closest match is used, and the run log shows which place was picked plus any other matches, so you can be more specific if needed.

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

YYYY-MM-DD. Leave both dates empty to search without availability (no prices).

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

YYYY-MM-DD.

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

Number of adults per room.

## `children_ages` (type: `array`):

One age per child, e.g. \[4, 9]. Booking prices children by age.

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

Number of rooms to price for.

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

Currency all prices are converted to.

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

Language of names, descriptions, and labels in the output.

## `sort_by` (type: `string`):

Leave empty for Booking's default ordering.

## `max_results` (type: `integer`):

Stops once this many properties are scraped. Results come 25 per request.

## `price_min` (type: `integer`):

In the selected currency.

## `price_max` (type: `integer`):

Highest price per night, in the selected currency.

## `star_ratings` (type: `array`):

Official star rating of the property. Pick several to combine them.

## `min_review_score` (type: `string`):

Only properties whose guest review score is at least this high.

## `property_types` (type: `array`):

Hotels, apartments, villas, and so on.

## `meal_plans` (type: `array`):

Board basis included in the price.

## `reservation_policies` (type: `array`):

Cancellation and prepayment terms.

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

Facilities the property must offer.

## `room_facilities` (type: `array`):

Facilities the room or unit must have.

## `popular_activities` (type: `array`):

On-site activities and amenities.

## `accessibility` (type: `array`):

Property and room accessibility features.

## `bed_preference` (type: `array`):

Bed configuration in the room.

## `travel_group` (type: `array`):

Pet and adults-only policies.

## `distance_from_centre` (type: `string`):

Maximum distance from the centre of the destination.

## `min_bedrooms` (type: `integer`):

Only entire places with at least this many bedrooms.

## `min_bathrooms` (type: `integer`):

Only properties with at least this many bathrooms.

## `entire_homes_only` (type: `boolean`):

Exclude private rooms — show only entire homes and apartments.

## `available_only` (type: `boolean`):

Hide properties that are sold out for your dates.

## `online_payment_only` (type: `boolean`):

Only properties that accept payment through Booking.com.

## `sustainable_only` (type: `boolean`):

Only properties holding a sustainability certification.

## `extra_filters` (type: `array`):

Raw Booking filter tokens as "field=value", e.g. "chaincode=1234". Every run writes the full list of filters valid for that search to the AVAILABLE\_FILTERS key in the key-value store — copy tokens from there.

## `proxy_country` (type: `string`):

Comma-separated 2-letter codes, rotated across retries. Residential proxies are required — Booking challenges datacentre IPs.

## Actor input object example

```json
{
  "destination": "Paris",
  "adults": 2,
  "children_ages": [],
  "rooms": 1,
  "currency": "USD",
  "language": "en-gb",
  "max_results": 100,
  "star_ratings": [],
  "property_types": [],
  "meal_plans": [],
  "reservation_policies": [],
  "facilities": [],
  "room_facilities": [],
  "popular_activities": [],
  "accessibility": [],
  "bed_preference": [],
  "travel_group": [],
  "entire_homes_only": false,
  "available_only": true,
  "online_payment_only": false,
  "sustainable_only": false,
  "extra_filters": [],
  "proxy_country": "US,GB,DE,NL,FR"
}
```

# Actor output Schema

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

No description

## `availableFilters` (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": "Paris"
};

// Run the Actor and wait for it to finish
const run = await client.actor("mina_safwat/booking-search-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": "Paris" }

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

```

## MCP server setup

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