# Booking.com Listings Scraper (`piotrv1001/booking-com-listings-scraper`) Actor

The Booking.com Listings Scraper extracts property listings from Booking.com, capturing live stay prices, room offers, review scores, coordinates, facilities, house rules, host type, and short-term rental licence and trader registration numbers — ideal for rate intelligence and STR compliance.

- **URL**: https://apify.com/piotrv1001/booking-com-listings-scraper.md
- **Developed by:** [FalconScrape](https://apify.com/piotrv1001) (community)
- **Categories:** Travel, Developer tools, Automation
- **Stats:** 1 total users, 0 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 1,000 property listings

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

### 🏨 Booking.com Listings Scraper

Extract **Booking.com property listings with live prices** — and, uniquely, the **licence numbers, registration numbers and trader details** that regulated short-term rentals are required to publish. Type a destination, get a structured dataset of every property with its current rate, review score, location, host type and compliance data. Try it right now with the default input.

Running on the [Apify platform](https://apify.com) means you also get a REST API, scheduled runs, webhook integrations, proxy rotation and run monitoring — without maintaining any of it yourself.

### ✨ Features

- 💶 **Live prices for your dates** — total stay price, price per night, price before discount, taxes and charges, and every individual room offer with its own rate and free-cancellation deadline.
- 🪪 **Licence & registration numbers** — `licenceNumbers` (e.g. `49017/AL`, `12582/RNET`), plus the legal entity behind the listing: company name, registration number, trade register, registered address, email and phone.
- 🏠 **Professional vs private hosts** — `hostType` separates commercial operators from private hosts on every single listing, at no extra cost.
- ⭐ **Reviews at a glance** — overall score, review count, and per-category sub-scores (staff, cleanliness, comfort, value, location, breakfast, Wi-Fi) plus sample guest reviews.
- 📍 **Full location data** — coordinates, district, distance from centre, full postal address, city-centre and old-town flags.
- 🛏️ **Rooms & facilities** — every room type with photos and amenities, plus the property's complete facility list.
- 📜 **House rules** — check-in/check-out windows, minimum age, pets, smoking, parties, quiet hours, group limits, accepted payment methods.
- 🔎 **Goes deeper than the site** — automatically splits large destinations into price bands to reach far more properties than a single search can return, and de-duplicates so you never pay for the same property twice.
- ⚡ **Fast & cheap** — no browser needed. One request returns 100 properties.

### 🛠️ How to use Booking.com Listings Scraper

1. **Enter a destination** — a city, region, country, district or landmark, exactly as you would type it on Booking.com (e.g. `Lisbon`).
2. **Pick your dates and occupancy** — or leave them empty to price a two-night stay a month from now.
3. **Choose how much detail you need** — leave *Scrape property details* off for fast listings with prices, or turn it on to add licence numbers, facilities, room types, house rules and review sub-scores.
4. **Set a limit** and click **Start**. Results stream into the dataset as they arrive.
5. **Download** as JSON, CSV, Excel or HTML — or pull them from the API.

### 📥 Input

Configure everything from the **Input** tab. All fields except the destination are optional.

| Field | Type | Description |
| --- | --- | --- |
| `search` | string | **Required.** Destination to search — city, region, country, district or landmark. |
| `checkIn` | string | Check-in date, `YYYY-MM-DD`. Defaults to 30 days from now. |
| `checkOut` | string | Check-out date, `YYYY-MM-DD`. Defaults to 32 days from now. |
| `adults` | integer | Number of adult guests prices are quoted for. Default `2`. |
| `rooms` | integer | Number of rooms to price. Default `1`. |
| `currency` | string | Currency for all prices. Default `USD`. |
| `sortBy` | string | Result ordering — price, review score, star rating or distance from centre. |
| `scrapeDetails` | boolean | Also open each property for licensing, facilities, rooms, house rules and review sub-scores. Default `false`. |
| `maxItems` | integer | Stop after this many properties. Default `50`. |
| `proxyConfiguration` | object | Proxy settings. Datacenter proxies are sufficient. |

Example input:

```json
{
    "search": "Lisbon",
    "checkIn": "2026-09-10",
    "checkOut": "2026-09-12",
    "adults": 2,
    "rooms": 1,
    "currency": "EUR",
    "scrapeDetails": true,
    "maxItems": 50
}
```

### 📊 Output

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel. Example item (trimmed — with `scrapeDetails` enabled):

```json
[
    {
        "url": "https://www.booking.com/hotel/pt/ldl-madalena-studios.en-gb.html",
        "id": 8877162,
        "name": "Sonel Investe Madalena 287 Boutique Apartments by Get Your Stay",
        "stars": 4,
        "checkIn": "2026-09-10",
        "checkOut": "2026-09-12",
        "nights": 2,
        "currency": "EUR",
        "totalPrice": 257.55,
        "pricePerNight": 128.77,
        "taxesAndCharges": 23.82,
        "reviewScore": 8.5,
        "reviewScoreLabel": "Very good",
        "reviewsCount": 293,
        "city": "Lisbon",
        "countryCode": "pt",
        "latitude": 38.7124,
        "longitude": -9.1359,
        "district": "Baixa, Lisbon",
        "distanceFromCentre": "0.4 km from centre",
        "freeCancellation": true,
        "hostType": "PROFESSIONAL",
        "licenceNumbers": ["25636/AL"],
        "isTrader": true,
        "traderName": "Sonel Investe Lda",
        "traderRegistrationNumber": "516861026",
        "traderRegister": "Republica Portuguesa",
        "traderAddress": "Rua da Madalena 287, 1100-320, Lisbon, pt",
        "fullAddress": "Rua da Madalena, 287 4F, Santa Maria Maior, 1100-320 Lisbon, Portugal",
        "propertyType": "APARTMENT",
        "facilities": ["Non-smoking rooms", "Lift", "Free WiFi", "Air conditioning"],
        "reviewSubscores": { "staff": 8.3, "clean": 8.8, "location": 9.3, "value": 8.1 },
        "checkInFrom": "15:00",
        "checkOutUntil": "11:00",
        "petsAllowed": "NO",
        "quietHours": "Quiet hours are between 22:00 and 08:00.",
        "image": "https://cf.bstatic.com/xdata/images/hotel/square600/…webp",
        "scrapedAt": "2026-07-28T12:34:29.177Z"
    }
]
```

#### Data fields

| Field | Description |
| --- | --- |
| `url`, `id`, `slug`, `name` | Property identity and link |
| `stars`, `propertyType`, `brand` | Star rating, accommodation type, hotel brand |
| `totalPrice`, `pricePerNight`, `priceBeforeDiscount`, `taxesAndCharges`, `currency` | Live pricing for your dates and occupancy |
| `offers[]` | Every bookable room offer: room id, occupancy, price, meal plan, cancellation deadline, urgency message |
| `reviewScore`, `reviewScoreLabel`, `reviewsCount` | Guest rating summary |
| `reviewSubscores`, `sampleReviews[]` | Per-category scores and example reviews *(details only)* |
| `address`, `fullAddress`, `city`, `countryCode`, `latitude`, `longitude` | Location |
| `district`, `distanceFromCentre`, `isCityCentre`, `isOldTown`, `locationScore` | Neighbourhood context |
| `hostType`, `isTrader`, `isNonTrader` | Professional vs private host |
| `licenceNumbers`, `licencePhrases` | Short-term rental licence / registration numbers *(details only)* |
| `traderName`, `traderRegistrationNumber`, `traderRegister`, `traderAddress`, `traderEmail`, `traderPhone` | Legal entity behind the listing *(details only)* |
| `facilities[]`, `roomTypes[]` | Full facility list and room types with photos and amenities *(details only)* |
| `checkInFrom`, `checkOutUntil`, `minCheckInAge`, `petsAllowed`, `smokingRule`, `partiesRule`, `quietHours`, `groupLimit`, `cityRegulations` | House rules *(details only)* |
| `freeCancellation`, `noPrepayment`, `breakfastIncluded`, `mealPlan` | Booking conditions |
| `isPreferredPartner`, `isSponsored`, `geniusRateAvailable`, `isSustainable` | Listing badges and placement signals |
| `image`, `thumbnail` | Property photos |

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

This Actor uses **pay per event** pricing — you pay for the data you receive, not for time spent running.

| Event | Price | Fires |
| --- | --- | --- |
| Actor start | $0.00005 | Once per run (per GB of memory) |
| Property listing | $0.004 | Per property returned, with live prices |
| Property detail | $0.004 | Per property when *Scrape property details* is on |

So **1,000 properties with prices costs about $4**, and **$8 with the full detail** including licence and trader data. Apify's free plan includes $5 of monthly usage, which is enough to try the Actor on roughly 1,200 listings at no cost.

You are never billed twice for the same property — duplicates are removed before anything is charged.

### 💡 Tips

- **Start small.** Run with `maxItems: 10` to confirm the destination resolves the way you expect before launching a large run.
- **Leave `scrapeDetails` off unless you need it.** Prices, review scores, location and `hostType` all come from the listing sweep — the detail pass is only for licensing, facilities, rooms, house rules and review sub-scores.
- **Licensing is market-specific.** Registration numbers are published where local law requires them (Portugal, Spain, France, the Netherlands, Italy and other regulated markets). Conventional hotels usually return an empty `licenceNumbers` array, but still populate `traderName` and `traderRegistrationNumber`.
- **Very large destinations.** Booking.com limits how deep any single search can be paged. The Actor automatically re-runs the search across price bands to get past that, so a big city yields several thousand distinct properties rather than roughly a thousand. For nationwide coverage, run several city-level searches instead of one country search.
- **Track prices over time.** Schedule the same input daily and compare `totalPrice` across runs to build a rate history.

### ❓ FAQ

**Is scraping Booking.com legal?**
This Actor collects only publicly available information — the same data any visitor sees without logging in. It does not collect private personal data and does not bypass any login. Web scraping of public data is broadly legal, but how you use the data is your responsibility. If the results include personal data (for example a private host's name published in trader information), you need a lawful basis under GDPR or your local equivalent. Consult a lawyer if you are unsure.

**Why are some `licenceNumbers` arrays empty?**
Because Booking.com only shows a registration number where the property is legally required to publish one. Hotels and properties in unregulated markets legitimately have none. `traderName` and `traderRegistrationNumber` are separate and populate much more widely, including for hotels.

**Can I get all properties in a whole country?**
A single search is capped by Booking.com's own paging depth. This Actor works around it with price-band splitting, but for national coverage you should run one search per city and merge the datasets.

**Do I need residential proxies?**
No. Datacenter proxies — the default — are sufficient and cheaper.

**Can I get reviews for each property?**
Turning on `scrapeDetails` gives you per-category review sub-scores and a sample of guest reviews. Full review-by-review extraction is out of scope for this Actor.

**Something is broken or missing.**
Open an issue on the **Issues** tab of this Actor and it will be looked at. Need a custom version, a different output shape, or another data source? Get in touch — custom solutions are available.

# Actor input Schema

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

City, region, country, district or landmark to search for, exactly as you would type it on Booking.com.

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

Check-in date in YYYY-MM-DD format. Leave empty to use a date 30 days from now.

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

Check-out date in YYYY-MM-DD format. Leave empty to use a date 32 days from now.

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

Number of adult guests. Prices are returned for this occupancy.

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

Number of rooms to price.

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

Currency the prices are returned in.

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

How the results are ordered before they are collected.

## `scrapeDetails` (type: `boolean`):

Also open each property to collect licence/registration numbers, trader details, the full facility list, room types, house rules, review sub-scores and sample reviews. Slower and billed per property.

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

Stop after this many properties.

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

Proxy settings. Datacenter proxies are enough for this Actor.

## Actor input object example

```json
{
  "search": "Lisbon",
  "adults": 2,
  "rooms": 1,
  "currency": "USD",
  "sortBy": "",
  "scrapeDetails": false,
  "maxItems": 50,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# 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 = {
    "search": "Lisbon"
};

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

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

```

## MCP server setup

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