# Booking Scraper (Cheap) (`data_api/booking-scraper-cheap`) Actor

Booking Scraper pulls hotel details, prices, ratings, amenities, and images from Booking.com listings, giving you clean structured data ready to use.

- **URL**: https://apify.com/data\_api/booking-scraper-cheap.md
- **Developed by:** [Data API](https://apify.com/data_api) (community)
- **Categories:** Travel, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.99 / 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 a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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 Data Scraper

Pulling hotel details off Booking.com by hand means a lot of tab-switching: copy the name, the score, the price, hunt down the photos, repeat. Hand this scraper a list of property links instead. It reads each page and gives you back the hotel name, star rating, guest score, nightly rate, the full address with coordinates, the amenities, and the photo URLs, one row per hotel. One link or a few hundred, same idea.

![Booking.com Hotel Data Scraper](cover.jpg)

### What you get

Every Booking.com link you supply comes back as a single record with a steady set of fields, so your spreadsheet or database columns line up the same way each run. The data splits into a few natural groups:

- **Identity** — `hotelName`, `propertyCategory`, `starRating`, `listingUrl`
- **Reputation** — `guestScore`, `guestScoreLabel`, `reviewsTotal`
- **Location** — `fullAddress`, `cityName`, `countryName`, `lat`, `lng`
- **Stay details** — `nightlyPrice`, `currencyCode`, `checkInTime`, `checkOutTime`, `propertySummary`, `facilities`
- **Media and contact** — `imageLinks`, `officialWebsite`, `contactPhone`

### Quick start

1. Click **Try for free** and open the input form.
2. Paste your Booking.com property links into **Booking.com hotel links** — copy each one straight from the browser address bar.
3. Set **Maximum hotels** if you want to cap the run, and raise **Response timeout** for slow connections.
4. Hit **Start**, then download the results as JSON, CSV, Excel, or XML once the run wraps up.

![How it works](how-it-works.jpg)

### Use cases

- **Travel platforms** — assemble a hotel catalogue across cities and countries to power a comparison site or trip-planning app
- **Rate monitoring** — watch nightly prices on rival properties in a market you care about
- **Destination research** — compare guest scores and amenities across a region to find gaps worth filling
- **Database enrichment** — top up existing hotel records with current ratings, photos, and contact details
- **Hospitality analysis** — track property types, star spreads, and review volume in a chosen area

### Input

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `hotelUrls` | array of strings | Yes | Booking.com property page links to collect. Copy each full link from your browser address bar; one record comes back per link. |
| `resultsLimit` | integer | No | Largest number of hotels one run will handle. Default `50`; max `1000`. |
| `timeoutSeconds` | integer | No | Seconds to wait on each page before giving up. Default `45`; raise it on slow networks. |

#### Example input

```json
{
  "hotelUrls": [
    "https://www.booking.com/hotel/fr/hotel-le-six-paris.en-gb.html",
    "https://www.booking.com/hotel/jp/park-hyatt-tokyo.en-gb.html"
  ],
  "resultsLimit": 50,
  "timeoutSeconds": 45
}
````

### Output

Each link turns into one row. Fields that Booking.com does not show on a given page come back empty, so the shape of your dataset stays steady from hotel to hotel.

#### Example output

```json
{
  "listingUrl": "https://www.booking.com/hotel/fr/hotel-le-six-paris.en-gb.html",
  "hotelName": "Hôtel Le Six",
  "propertyCategory": "Hotel",
  "starRating": 4,
  "guestScore": 8.9,
  "guestScoreLabel": "Fabulous",
  "reviewsTotal": 1273,
  "fullAddress": "14 Rue Stanislas, 6th arr., 75006 Paris, France",
  "cityName": "Paris",
  "countryName": "France",
  "lat": 48.8432,
  "lng": 2.3281,
  "propertySummary": "A quiet boutique hotel near the Luxembourg Gardens, blending classic Parisian style with a spa and a relaxed lounge bar.",
  "nightlyPrice": 320.0,
  "currencyCode": "EUR",
  "checkInTime": "15:00",
  "checkOutTime": "12:00",
  "facilities": ["Free WiFi", "Spa", "Bar", "Room service", "Airport shuttle", "Non-smoking rooms"],
  "imageLinks": [
    "https://cf.bstatic.com/xdata/images/hotel/max1280x900/987001.jpg",
    "https://cf.bstatic.com/xdata/images/hotel/max1280x900/987002.jpg"
  ],
  "officialWebsite": "https://www.hotel-le-six.com",
  "contactPhone": "+33 1 42 22 00 75"
}
```

#### Output fields

| Field | Type | Description |
|-------|------|-------------|
| `listingUrl` | string | The Booking.com page that was scraped |
| `hotelName` | string | Name of the hotel or property |
| `propertyCategory` | string | Accommodation type, such as Hotel, Apartment, or Hostel |
| `starRating` | integer | Official star rating from 1 to 5 |
| `guestScore` | number | Aggregate guest review score, for example 8.9 |
| `guestScoreLabel` | string | Wording attached to the score, such as Fabulous or Superb |
| `reviewsTotal` | integer | Total guest reviews counted on the page |
| `fullAddress` | string | Complete street address |
| `cityName` | string | Town or city |
| `countryName` | string | Country name or code |
| `lat` | number | Latitude of the property |
| `lng` | number | Longitude of the property |
| `propertySummary` | string | Short description text about the property |
| `nightlyPrice` | number | Per-night rate when the page shows one |
| `currencyCode` | string | Currency of the price, such as USD, EUR, or GBP |
| `checkInTime` | string | Check-in time |
| `checkOutTime` | string | Check-out time |
| `facilities` | array | List of on-site facilities and amenities |
| `imageLinks` | array | High-resolution photo URLs for the property |
| `officialWebsite` | string | The property's own website link |
| `contactPhone` | string | Contact phone number |

### Tips for best results

- **Start with a handful.** Run five or ten links before a big batch — any URL-format slips show up right away in the first rows.
- **Use English page variants.** Links ending in `.en-gb.html` or `.en-us.html` tend to expose the richest structured data, which fills more fields.
- **Stick to property pages.** This actor reads individual hotel pages (links with `/hotel/` in them), not search-result listings.
- **Prices come and go.** A nightly rate only appears when Booking.com prints one on the static page, and it can shift with date parameters in the URL — so `nightlyPrice` may be empty on some pages.
- **Bump `timeoutSeconds` to around 60** if your connection is slow and pages keep timing out.

### How can I use Booking.com hotel data?

**How can I use the Booking.com Hotel Data Scraper to build a hotel pricing dataset?**
Paste in the Booking.com links for the properties you track and the scraper returns each hotel's nightly price, currency, star rating, and guest score in one row apiece. Re-run it on a schedule and you have a clean feed for benchmarking rates across a market or feeding a price-comparison tool.

**How do I get hotel reviews and ratings from Booking.com without copying them by hand?**
Drop a list of property links into the input. For every page the scraper reads the aggregate guest score, its wording label, and the total review count, alongside the hotel name and address — so you collect review signals across dozens of hotels in a single run instead of clicking through each one.

**How can I export Booking.com hotel data to a spreadsheet for research?**
Run the actor on your links, then download the dataset as CSV or Excel from the run's results tab. Each hotel arrives as a row with location, coordinates, amenities, photos, and contact details, ready to sort, filter, or join against your own travel or real-estate data.

### Is it legal to scrape data?

Our actors are ethical and do not extract any private user data, such as email addresses or private contact information. They only extract what the user has chosen to share publicly. We therefore believe that our actors, when used for ethical purposes by Apify users, are safe.

However, you should be aware that your results could contain personal data. Personal data is protected by the GDPR in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your reason is legitimate, consult your lawyers.

You can also read Apify's blog post on the [legality of web scraping](https://blog.apify.com/is-web-scraping-legal/).

### Support

Questions, feature requests, or a field you'd like added? Reach out at <data.apify@proton.me> and we'll get back to you.

# Actor input Schema

## `hotelUrls` (type: `array`):

List of Booking.com property page links you want to collect data for. Copy each full address straight from your browser's address bar.

## `resultsLimit` (type: `integer`):

Upper bound on how many hotels a single run will handle. Bump it up when you feed in a longer batch of links.

## `timeoutSeconds` (type: `integer`):

Seconds the scraper waits on each page before giving up on it. Push this higher when your network is sluggish.

## Actor input object example

```json
{
  "hotelUrls": [
    "https://www.booking.com/hotel/it/gritti-palace-venice.en-gb.html"
  ],
  "resultsLimit": 50,
  "timeoutSeconds": 45
}
```

# 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 = {
    "hotelUrls": [
        "https://www.booking.com/hotel/th/veranda-chiangmai.en-gb.html",
        "https://www.booking.com/hotel/jp/park-hyatt-tokyo.en-gb.html"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("data_api/booking-scraper-cheap").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 = { "hotelUrls": [
        "https://www.booking.com/hotel/th/veranda-chiangmai.en-gb.html",
        "https://www.booking.com/hotel/jp/park-hyatt-tokyo.en-gb.html",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("data_api/booking-scraper-cheap").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 '{
  "hotelUrls": [
    "https://www.booking.com/hotel/th/veranda-chiangmai.en-gb.html",
    "https://www.booking.com/hotel/jp/park-hyatt-tokyo.en-gb.html"
  ]
}' |
apify call data_api/booking-scraper-cheap --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Booking Scraper (Cheap)",
        "description": "Booking Scraper pulls hotel details, prices, ratings, amenities, and images from Booking.com listings, giving you clean structured data ready to use.",
        "version": "0.0",
        "x-build-id": "aAQlubZB7aE4eJ0Jy"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/data_api~booking-scraper-cheap/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-data_api-booking-scraper-cheap",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/data_api~booking-scraper-cheap/runs": {
            "post": {
                "operationId": "runs-sync-data_api-booking-scraper-cheap",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/data_api~booking-scraper-cheap/run-sync": {
            "post": {
                "operationId": "run-sync-data_api-booking-scraper-cheap",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "hotelUrls"
                ],
                "properties": {
                    "hotelUrls": {
                        "title": "Booking.com hotel links",
                        "type": "array",
                        "description": "List of Booking.com property page links you want to collect data for. Copy each full address straight from your browser's address bar.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "resultsLimit": {
                        "title": "Maximum hotels",
                        "minimum": 1,
                        "maximum": 1000,
                        "type": "integer",
                        "description": "Upper bound on how many hotels a single run will handle. Bump it up when you feed in a longer batch of links.",
                        "default": 50
                    },
                    "timeoutSeconds": {
                        "title": "Response timeout (seconds)",
                        "minimum": 5,
                        "maximum": 300,
                        "type": "integer",
                        "description": "Seconds the scraper waits on each page before giving up on it. Push this higher when your network is sluggish.",
                        "default": 45
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
