# 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:** 2 total users, 1 monthly users, 100.0% 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 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 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`):

Convenience extension: a place name resolved via Booking autocomplete to a city/region id. Use instead of looking up a numeric id.

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

Demand `city`: numeric destination id, e.g. -2140479 for Amsterdam (from /common/locations/cities).

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

Demand `region`: numeric region id (from /common/locations/regions).

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

Demand `country` (ISO 2-letter). Note: country-level search is not supported by the underlying mobile backend — use region/city/search.

## `coordinates` (type: `object`):

Demand `coordinates` {latitude, longitude, radius}. Accepted for parity but not supported by the mobile backend.

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

Extension: fetch specific accommodations by numeric id (bypasses search). e.g. \[10004, 1392565].

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

Demand `checkin` (YYYY-MM-DD). Defaults to 30 days from now.

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

Demand `checkout` (YYYY-MM-DD). Defaults to check-in + 1 night.

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

Demand `currency` (ISO code), e.g. USD, EUR, GBP.

## `guests` (type: `object`):

Demand `guests`: { number\_of\_rooms, number\_of\_adults, children: \[ages], allocation: \[{ number\_of\_adults, children:\[ages] }] }.

## `accommodation_types` (type: `array`):

Demand `accommodation_types`: type ids to include, e.g. \[204] for hotels (from /accommodations/constants).

## `accommodation_facilities` (type: `array`):

Demand `accommodation_facilities`. Accepted for parity; not supported by the mobile backend (ignored).

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

Demand `room_facilities`. Accepted for parity; not supported by the mobile backend (ignored).

## `rating` (type: `object`):

Demand `rating`: { minimum\_review\_score }. Applied client-side.

## `price` (type: `object`):

Demand `price`: { minimum, maximum } in the selected currency. Applied client-side.

## `sort` (type: `object`):

Demand `sort`: { by: price|review\_score, direction: ascending|descending }.

## `extras` (type: `array`):

Demand `extras`: `extra_charges` (price breakdown in products and result price). The `products`/`rooms` sections are controlled by includeRooms, `details` by includeDetails, and `reviews` by includeReviews.

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

Master switch for 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 roomList request per property in search mode.

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

Attach a `reviews` array per accommodation with guest reviews (author, score, title, pros/cons, date). Paginated — see maxReviews. Costs one request per 10 reviews per property.

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

How many reviews to fetch per accommodation (only when includeReviews is on). Paginated in pages of 10, so higher values cost more requests. Capped by the property's total review count.

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

Attach a `details` object per accommodation with static content: name, accommodation type, star rating, review score/count, location, main photos, facilities (named), languages spoken, address. Costs one extra hotelPage request per property in search mode.

## `booker` (type: `object`):

Demand `booker`: { country }. Accepted for parity. Note: `platform` is not supported — the mobile backend always serves the mobile/app platform.

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

Maximum number of accommodations to return.

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

Locale for localized text (e.g. en-us, de, fr).

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

Maximum parallel requests for product/detail fetches.

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

Proxy settings. Apify Proxy recommended.

## Actor input object example

```json
{
  "search": "Amsterdam",
  "hotel_ids": [],
  "currency": "USD",
  "guests": {
    "number_of_rooms": 1,
    "number_of_adults": 2
  },
  "accommodation_types": [],
  "accommodation_facilities": [],
  "room_facilities": [],
  "extras": [
    "extra_charges"
  ],
  "includeRooms": false,
  "includeReviews": false,
  "maxReviews": 10,
  "includeDetails": false,
  "maxItems": 100,
  "language": "en-us",
  "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": [],
    "guests": {
        "number_of_rooms": 1,
        "number_of_adults": 2
    },
    "accommodation_types": [],
    "accommodation_facilities": [],
    "room_facilities": [],
    "extras": [
        "extra_charges"
    ]
};

// 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": [],
    "guests": {
        "number_of_rooms": 1,
        "number_of_adults": 2,
    },
    "accommodation_types": [],
    "accommodation_facilities": [],
    "room_facilities": [],
    "extras": ["extra_charges"],
}

# 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": [],
  "guests": {
    "number_of_rooms": 1,
    "number_of_adults": 2
  },
  "accommodation_types": [],
  "accommodation_facilities": [],
  "room_facilities": [],
  "extras": [
    "extra_charges"
  ]
}' |
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

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Booking.com API Scraper",
        "description": "Scrape Booking.com properties, live prices and full room-rate tables via the mobile API — by destination search or by hotel id.",
        "version": "1.0",
        "x-build-id": "XTZRbij3ahU4p8mWy"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/rl1987~booking-api-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-rl1987-booking-api-scraper",
                "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/rl1987~booking-api-scraper/runs": {
            "post": {
                "operationId": "runs-sync-rl1987-booking-api-scraper",
                "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/rl1987~booking-api-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-rl1987-booking-api-scraper",
                "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",
                "properties": {
                    "search": {
                        "title": "Destination (free text)",
                        "type": "string",
                        "description": "Convenience extension: a place name resolved via Booking autocomplete to a city/region id. Use instead of looking up a numeric id."
                    },
                    "city": {
                        "title": "City id (ufi)",
                        "type": "integer",
                        "description": "Demand `city`: numeric destination id, e.g. -2140479 for Amsterdam (from /common/locations/cities)."
                    },
                    "region": {
                        "title": "Region id",
                        "type": "integer",
                        "description": "Demand `region`: numeric region id (from /common/locations/regions)."
                    },
                    "country": {
                        "title": "Country code",
                        "type": "string",
                        "description": "Demand `country` (ISO 2-letter). Note: country-level search is not supported by the underlying mobile backend — use region/city/search."
                    },
                    "coordinates": {
                        "title": "Coordinates",
                        "type": "object",
                        "description": "Demand `coordinates` {latitude, longitude, radius}. Accepted for parity but not supported by the mobile backend."
                    },
                    "hotel_ids": {
                        "title": "Hotel IDs",
                        "type": "array",
                        "description": "Extension: fetch specific accommodations by numeric id (bypasses search). e.g. [10004, 1392565]."
                    },
                    "checkin": {
                        "title": "Check-in",
                        "type": "string",
                        "description": "Demand `checkin` (YYYY-MM-DD). Defaults to 30 days from now."
                    },
                    "checkout": {
                        "title": "Check-out",
                        "type": "string",
                        "description": "Demand `checkout` (YYYY-MM-DD). Defaults to check-in + 1 night."
                    },
                    "currency": {
                        "title": "Currency",
                        "type": "string",
                        "description": "Demand `currency` (ISO code), e.g. USD, EUR, GBP.",
                        "default": "USD"
                    },
                    "guests": {
                        "title": "Guests",
                        "type": "object",
                        "description": "Demand `guests`: { number_of_rooms, number_of_adults, children: [ages], allocation: [{ number_of_adults, children:[ages] }] }."
                    },
                    "accommodation_types": {
                        "title": "Accommodation types",
                        "type": "array",
                        "description": "Demand `accommodation_types`: type ids to include, e.g. [204] for hotels (from /accommodations/constants)."
                    },
                    "accommodation_facilities": {
                        "title": "Accommodation facilities",
                        "type": "array",
                        "description": "Demand `accommodation_facilities`. Accepted for parity; not supported by the mobile backend (ignored)."
                    },
                    "room_facilities": {
                        "title": "Room facilities",
                        "type": "array",
                        "description": "Demand `room_facilities`. Accepted for parity; not supported by the mobile backend (ignored)."
                    },
                    "rating": {
                        "title": "Rating filter",
                        "type": "object",
                        "description": "Demand `rating`: { minimum_review_score }. Applied client-side."
                    },
                    "price": {
                        "title": "Price filter",
                        "type": "object",
                        "description": "Demand `price`: { minimum, maximum } in the selected currency. Applied client-side."
                    },
                    "sort": {
                        "title": "Sort",
                        "type": "object",
                        "description": "Demand `sort`: { by: price|review_score, direction: ascending|descending }."
                    },
                    "extras": {
                        "title": "Extras",
                        "type": "array",
                        "description": "Demand `extras`: `extra_charges` (price breakdown in products and result price). The `products`/`rooms` sections are controlled by includeRooms, `details` by includeDetails, and `reviews` by includeReviews."
                    },
                    "includeRooms": {
                        "title": "Include rooms & products",
                        "type": "boolean",
                        "description": "Master switch for 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 roomList request per property in search mode.",
                        "default": false
                    },
                    "includeReviews": {
                        "title": "Include reviews",
                        "type": "boolean",
                        "description": "Attach a `reviews` array per accommodation with guest reviews (author, score, title, pros/cons, date). Paginated — see maxReviews. Costs one request per 10 reviews per property.",
                        "default": false
                    },
                    "maxReviews": {
                        "title": "Max reviews per property",
                        "minimum": 1,
                        "type": "integer",
                        "description": "How many reviews to fetch per accommodation (only when includeReviews is on). Paginated in pages of 10, so higher values cost more requests. Capped by the property's total review count.",
                        "default": 10
                    },
                    "includeDetails": {
                        "title": "Include static details",
                        "type": "boolean",
                        "description": "Attach a `details` object per accommodation with static content: name, accommodation type, star rating, review score/count, location, main photos, facilities (named), languages spoken, address. Costs one extra hotelPage request per property in search mode.",
                        "default": false
                    },
                    "booker": {
                        "title": "Booker",
                        "type": "object",
                        "description": "Demand `booker`: { country }. Accepted for parity. Note: `platform` is not supported — the mobile backend always serves the mobile/app platform."
                    },
                    "maxItems": {
                        "title": "Max accommodations",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Maximum number of accommodations to return.",
                        "default": 100
                    },
                    "language": {
                        "title": "Language",
                        "type": "string",
                        "description": "Locale for localized text (e.g. en-us, de, fr).",
                        "default": "en-us"
                    },
                    "maxConcurrency": {
                        "title": "Max concurrency",
                        "minimum": 1,
                        "maximum": 50,
                        "type": "integer",
                        "description": "Maximum parallel requests for product/detail fetches.",
                        "default": 10
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Proxy settings. Apify Proxy recommended.",
                        "default": {
                            "useApifyProxy": true
                        }
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
