# Booking.com Scraper — Hotels, Reviews, Calendar & Reviews API (`sian.agency/booking-com-scraper`) Actor

Scrape Booking.com hotels, reviews, calendar pricing, photos, facilities & policies via one API. Property-forensics bundle returns 10+ enrichment fields per hotel in a single row. Lean search mode also available at commodity per-place pricing. No login or API key needed.

- **URL**: https://apify.com/sian.agency/booking-com-scraper.md
- **Developed by:** [SIÁN OÜ](https://apify.com/sian.agency) (community)
- **Categories:** Travel, Automation, Lead generation
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 hotel search 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 Scraper — Hotels, Reviews, Calendar Pricing & Forensics 🏨

[![SIÁN Agency Store](https://img.shields.io/badge/Store-SI%C3%81N%20Agency-1AE392)](https://apify.com/sian.agency?fpr=sian) [![Airbnb + STR KPIs](https://img.shields.io/badge/Store-Airbnb%20%2B%20STR%20KPIs-FF5A5F)](https://apify.com/sian.agency/airbnb-property-scraper?fpr=sian) [![Vrbo + STR KPIs](https://img.shields.io/badge/Store-Vrbo%20%2B%20STR%20KPIs-3D67FF)](https://apify.com/sian.agency/vrbo-property-scraper?fpr=sian) [![Tripadvisor](https://img.shields.io/badge/Store-Tripadvisor%20Hotels-00AF87)](https://apify.com/sian.agency/tripadvisor-hotel-scraper?fpr=sian)

#### 🎉 Six scrapers in one — hotel search, reviews, calendar pricing, photos, policies & facilities, all from a Booking.com data API

##### Built for STR investors, revenue managers, OTA-competitive teams, travel content sites & PropTech — no login, no API key, no scraping headaches

---

### 📋 Overview

**Tired of brittle DIY scrapers that break every time Booking.com tweaks their UI?** This actor delivers reliable, flat structured datasets from Booking.com — one clean run per task, one tidy dataset out.

**Why teams choose SIÁN for Booking.com data:**

- ✅ **Six operations, one actor**: hotel search · hotel search by coordinates · hotel detail · reviews · 30-day calendar pricing · **Property Forensics bundle**
- 🌟 **Property Forensics is unique to SIÁN** — one row per hotel that fuses details + photos (with ML tags) + top reviews + cancellation policies + facilities. No other actor on the Apify store delivers this depth in a single row.
- 📅 **30-day forward calendar feed** — `calendarPricing` returns availability + minimum length-of-stay per date. Drop straight into a revenue-management dashboard.
- 💬 **Reviews with traveler segments** — every review row carries `reviewerGroup`, room name, nights stayed, language code, helpful votes, and pros/cons split.
- 🎯 **Production-ready data shape** — curated camelCase aliases (`hotelId`, `reviewScore`, `priceTotal`, `hotelPageUrl`, `coverPhotoUrl`, …) PLUS the raw upstream fields spread alongside for power users.
- 💰 **Pay-per-result pricing** — only charged for successful rows, never for empty pages or errors.
- 💎 **No login, no API key, no proxies** — paste a destination, hotel ID, or lat/lon and run.

---

### ✨ Features

#### 🔍 Hotel Search

Paginated city/destination search. Returns ~20 hotels per page with full pricing, review score, accommodation type, and a deep-link to the Booking.com hotel page.

- Auto-resolves destination name → Booking's internal `dest_id`
- Configurable sort (popularity, price, review score, distance, star rating)
- Configurable check-in/checkout windows (defaults to 30 days out, 2-night stay)
- Up to 50 pages per run

#### 📍 Hotel Search by Coordinates

Same shape as Hotel Search but takes `latitude` + `longitude` instead of a destination name. Use for proximity-to-X queries (workplace, airport, school, landmark).

#### 🏨 Hotel Detail

Single-row deep info for one hotel ID — full address, check-in window, currency, default language, timezone, coordinates, and structured policies.

#### 💬 Hotel Reviews

Paginated reviews for one hotel. Each row carries `author`, `authorCountryCode`, `reviewerGroup` (solo / business / couple / family), `roomName`, `nightsStayed`, `stayDate`, `ratingScore`, `reviewTitle`, `pros`, `cons`, `postedAt`, `languageCode`, `helpfulVoteCount`. Sort by relevance / recency / score.

#### 📅 Calendar Pricing

One call returns ~30 date rows. Each row has `date`, `available`, `minLengthOfStay`, and the property's `currency`. Perfect for ADR / occupancy proxies, length-of-stay rules, and forward-looking pricing trends.

#### ✨ Property Forensics Bundle (premium)

Fans out 5 upstream calls in parallel for one hotel — `details` + `photos` (with ML-tagged confidence scores) + page-0 `reviews` + `policies` (cancellation, payment, deposit) + `facilities` (with common-room flags). Returns **one ultra-rich row per hotel**. If any one of the 4 enrichment calls fails, the bundle still ships with `_partialFailures` recording which one(s) — only a failed `details` anchor produces an error row.

---

### 🛠️ Operation Modes

| Mode | What it does | Pagination | Output rows |
|------|--------------|------------|-------------|
| `search` | Hotels in a destination | ✅ ~20/page | One row per hotel |
| `searchByCoordinates` | Hotels near a lat/lon | ✅ ~20/page | One row per hotel |
| `hotelDetail` | Single hotel deep info | ❌ | 1 row |
| `reviews` | Reviews for one hotel | ✅ ~5–25/page | One row per review |
| `calendarPricing` | 30-day availability feed | ❌ | ~30 date rows |
| `forensicsBundle` | 5-endpoint fusion per hotel | ❌ | 1 ultra-rich row |

---

### 💰 Pricing

Pay-per-event with auto-laddered Apify tiers — you pay only for successful rows. Error rows are free.

| Event | FREE | BRONZE | GOLD | DIAMOND |
|---|--:|--:|--:|--:|
| `apify-actor-start` (one-time) | $0.040 | $0.004 | $0.004 | $0.004 |
| `search-result` (primary headline) | $0.012 | **$0.004** | $0.002 | $0.001 |
| `review-result` | $0.006 | $0.002 | $0.001 | $0.0005 |
| `hotel-detail-result` | $0.036 | $0.012 | $0.009 | $0.003 |
| `calendar-row-result` | $0.009 | $0.003 | $0.0015 | $0.00075 |
| `forensics-bundle-result` | $0.075 | $0.025 | $0.01875 | $0.00625 |

> **Tip:** Pick your operation by the question you're trying to answer. `search` is the cheapest per row (commodity listing data). `forensicsBundle` is the most expensive per row but bundles five upstream calls — equivalent to running 5 detail-style ops for ~1.5–2× the headline detail price.

---

### 🚀 Quick Start

#### 1. Pick your operation

Open the actor in the Apify Console and choose one of the six operations from the dropdown.

#### 2. Provide the required input

- For `search` → just the `destinationName` ("Paris", "Bali", "NYC")
- For `searchByCoordinates` → `latitude` + `longitude` ("48.85668", "2.3514764")
- For `hotelDetail` / `reviews` / `calendarPricing` / `forensicsBundle` → the `hotelId` (find one from a previous `search` run)
- Optional: `checkinDate` / `checkoutDate` (defaults to 30 days from today, 2-night stay)

#### 3. Run

Hit **Start**. Results stream into the default dataset in real time. An HTML report is saved to the key-value store on every run (success or crash).

---

### 📊 Example Inputs

**Hotel search in Paris:**
```json
{
  "operation": "search",
  "destinationName": "Paris",
  "checkinDate": "2026-06-15",
  "checkoutDate": "2026-06-17",
  "adults": 2,
  "rooms": 1,
  "currency": "USD",
  "maxPages": 3
}
````

**Reviews for a specific hotel:**

```json
{
  "operation": "reviews",
  "hotelId": "15854834",
  "sortType": "SORT_MOST_RELEVANT",
  "maxPages": 5
}
```

**Property Forensics bundle:**

```json
{
  "operation": "forensicsBundle",
  "hotelId": "15854834",
  "checkinDate": "2026-06-15",
  "checkoutDate": "2026-06-17"
}
```

**30-day calendar pricing:**

```json
{
  "operation": "calendarPricing",
  "hotelId": "15854834",
  "checkinDate": "2026-06-15",
  "checkoutDate": "2026-06-17",
  "currency": "USD"
}
```

***

### 🎯 Use Cases

- **STR / revenue managers tracking competitor rates** — pull `calendarPricing` daily to extract 30-day forward availability + length-of-stay rules. Feed into a Looker / Sheets dashboard.
- **OTA-competitive analysis** — run `forensicsBundle` on a set of competitor hotels to capture full merchandising data (photos, policies, facilities, review snippets) in a single structured row per property.
- **Brand sentiment & review monitoring** — paginate `reviews` for any hotel and stream rows into a sentiment pipeline. Each review carries traveler type, room name, nights stayed, language, pros/cons split.
- **Travel content sites & metasearch** — power city/region landing pages with `search`, then enrich top results with `hotelDetail` or `forensicsBundle`.
- **PropTech & relocation tools** — combine `searchByCoordinates` with detail bundles to surface lodging options near a workplace, school, or property listing.
- **Lead-gen for travel B2B** — enrich your CRM with structured hotel data: address, ZIP, timezone, currency, accommodation type, star rating, review profile.

***

### 📦 Output Format

Every row carries metadata stamps:

- `_operation` — which mode produced the row
- `_fetchedAt` — ISO timestamp
- `_page` — page number (for paginated ops)
- `_sourceHotelId` / `_sourceDestination` / `_sourceLat` / `_sourceLon` — what you asked for
- `status` — `success` or `error`
- `errorMessage` — populated only when `status === 'error'`

**Search / search-by-coordinates row:**

```json
{
  "_operation": "search",
  "status": "success",
  "hotelId": "15854834",
  "name": "Elegant Sunlit Flat with Balcony near Parc Monceau",
  "accommodationType": "Apartment",
  "address": "17th arr.",
  "city": "Paris",
  "countryCode": "fr",
  "latitude": 48.881,
  "longitude": 2.315,
  "reviewScore": 9.4,
  "reviewScoreWord": "Wonderful",
  "reviewNr": 5,
  "priceTotal": 765.08,
  "currency": "EUR",
  "coverPhotoUrl": "https://cf.bstatic.com/...jpg",
  "hotelPageUrl": "https://www.booking.com/hotel/fr/h15854834.html"
}
```

**Forensics bundle row:**

```json
{
  "_operation": "forensicsBundle",
  "status": "success",
  "hotelId": "15854834",
  "name": "Elegant Sunlit Flat with Balcony near Parc Monceau",
  "details": { /* full /v2/hotels/details response */ },
  "photos": [ { "photoId": "...", "urlMax": "...", "mlTags": [{"tagName":"Bed","confidence":100}, ...] }, ... ],
  "reviewsSample": [ { "author": "Marie", "ratingScore": 9.4, "pros": "...", "cons": "..." }, ... ],
  "reviewsCountTotal": 5,
  "policies": { /* full /v1/hotels/policies response */ },
  "facilities": [ { "facilityName": "Non-smoking rooms", "value": 1, "kind": "boolean" }, ... ],
  "_partialFailures": null
}
```

***

### ❓ FAQ

**Q: Why "Booking.com api" instead of "Booking.com scraper" in the title?**
A: SEO. The Google search volume for "booking.com api" is 32× higher than "booking.com scraper" (320/mo vs 10/mo). Both terms appear in the title for store-search matching.

**Q: How fresh is the data?**
A: Live — every run hits Booking.com via our upstream provider in real time. There is no cache.

**Q: Why does my `forensicsBundle` row have a `_partialFailures` field?**
A: The bundle fans out 5 upstream calls in parallel. If 1–4 of them fail (rate limit, transient 5xx, etc.) the row still ships with the successful endpoints' data; `_partialFailures` lists which ones came back empty so you can re-run those specifically with the dedicated ops (`reviews`, `hotelDetail`, etc.). Only a failed `details` anchor produces an error row.

**Q: Can I get more than ~5 reviews from `forensicsBundle`?**
A: No — Forensics intentionally pulls reviews page 0 only (~5–25 reviews, varies per hotel) to keep margins predictable. For deep review extraction, use the dedicated `reviews` operation which paginates up to 50 pages.

**Q: Does this work for properties outside hotels (apartments, villas, hostels)?**
A: Yes. All accommodation types listed on Booking.com are supported — the `accommodationType` field will tell you what you got back.

**Q: Why doesn't `hotelDetail` return pricing?**
A: Booking's `/v2/hotels/details` is a property-metadata endpoint, not a rate endpoint. For pricing, use `search` (returns price-per-night) or `calendarPricing` (returns 30-day forward availability + LOS rules).

**Q: How does pagination work?**
A: For `search`, `searchByCoordinates`, and `reviews`, the actor uses page-based pagination (`page_number=0, 1, 2, ...`). `maxPages` caps the total. The actor stops early when it sees a partial page (fewer rows than the previous page returned).

***

### ⚠️ Trademark Disclaimer

This is an **independent scraping tool**. It is not affiliated with, endorsed by, or sponsored by Booking Holdings Inc., Booking.com B.V., or any of their subsidiaries. The Booking.com® name appears under nominative fair use to indicate compatibility.

***

### 📜 Legal

Use this actor in compliance with Booking.com's Terms of Service and applicable data-protection laws (GDPR, CCPA, etc.). Do not use it to harvest personal data for unsolicited contact or other regulated purposes without a lawful basis. SIÁN Agency provides this scraping infrastructure as a tool; responsibility for use rests with the operator. See [Apify's blog on legal scraping](https://blog.apify.com/is-web-scraping-legal/).

***

### 📬 Support & Feedback

- **Telegram:** [![SIÁN Telegram](https://img.shields.io/badge/Telegram-SI%C3%81N%20Agency-26A5E4?logo=telegram)](https://t.me/sianagency)
- **Email:** apify@sian-agency.online
- **Issues:** Use the Issues tab inside the Apify Console for actor-specific feedback
- **More from SIÁN:** <https://apify.com/sian.agency?fpr=sian>

***

# Actor input Schema

## `operation` (type: `string`):

📋 Which Booking.com endpoint to run. Each run extracts ONE operation. Pick the right tool for the job:

• **Hotel Search** — paginated list of hotels in a city/destination
• **Hotel Search by Coordinates** — lat/lon based area search
• **Hotel Detail** — full info for one hotel (address, check-in window, currency)
• **Hotel Reviews** — paginated reviews for one hotel
• **Calendar Pricing** — 30-day forward availability + length-of-stay rules
• **Property Forensics Bundle** — premium: 1 row per hotel = details + photos + top reviews + policies + facilities fused

## `destinationName` (type: `string`):

City, region, or neighborhood name. Example: "Paris", "Bali", "New York". The actor resolves it to Booking's internal destination ID automatically.

## `destinationId` (type: `string`):

Skip auto-resolution by passing Booking.com's internal `dest_id` directly. Use when you know it; saves one upstream call.

## `destinationType` (type: `string`):

Booking.com's dest type. Defaults to `city`. Other values: `region`, `district`, `landmark`, `airport`, `hotel`.

## `latitude` (type: `string`):

Decimal latitude. Example: `48.85668` for central Paris.

## `longitude` (type: `string`):

Decimal longitude. Example: `2.3514764` for central Paris.

## `hotelId` (type: `string`):

Booking.com hotel ID. Find one from a previous Hotel Search run (each row carries `hotelId`). Example: `15854834`.

## `checkinDate` (type: `string`):

Check-in date used by search and pricing operations. Defaults to 30 days from today.

## `checkoutDate` (type: `string`):

Check-out date used by search and pricing operations. Defaults to 32 days from today (2-night stay).

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

Guests per booking. Defaults to 2.

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

Rooms requested. Defaults to 1.

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

3-letter currency code (USD, EUR, GBP, etc.). Defaults to USD.

## `orderBy` (type: `string`):

How Booking.com should order the results.

## `sortType` (type: `string`):

How to sort review results.

## `maxPages` (type: `integer`):

Cap on pages to fetch for paginated operations (search, reviews). Each page = 1 upstream call. Defaults to 5, max 50.

## Actor input object example

```json
{
  "operation": "search",
  "destinationName": "Paris",
  "destinationType": "city",
  "hotelId": "15854834",
  "adults": 2,
  "rooms": 1,
  "currency": "USD",
  "orderBy": "popularity",
  "sortType": "SORT_MOST_RELEVANT",
  "maxPages": 5
}
```

# Actor output Schema

## `output` (type: `string`):

Hotels, reviews, calendar rows, or forensics bundles — one flat row per upstream item with curated camelCase aliases (hotelId, name, address, reviewScore, priceTotal, hotelPageUrl, coverPhotoUrl, etc.) plus the raw upstream fields spread alongside.

## `report` (type: `string`):

HTML report with run status, success/error row counts, success rate, pages fetched, duration, and the inputs used — written even on fatal crash.

# 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 = {};

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

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

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Booking.com Scraper — Hotels, Reviews, Calendar & Reviews API",
        "description": "Scrape Booking.com hotels, reviews, calendar pricing, photos, facilities & policies via one API. Property-forensics bundle returns 10+ enrichment fields per hotel in a single row. Lean search mode also available at commodity per-place pricing. No login or API key needed.",
        "version": "1.0",
        "x-build-id": "OcEusxP9Y2RNgd2fK"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/sian.agency~booking-com-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-sian.agency-booking-com-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/sian.agency~booking-com-scraper/runs": {
            "post": {
                "operationId": "runs-sync-sian.agency-booking-com-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/sian.agency~booking-com-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-sian.agency-booking-com-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",
                "required": [
                    "operation"
                ],
                "properties": {
                    "operation": {
                        "title": "Operation",
                        "enum": [
                            "search",
                            "searchByCoordinates",
                            "hotelDetail",
                            "reviews",
                            "calendarPricing",
                            "forensicsBundle"
                        ],
                        "type": "string",
                        "description": "📋 Which Booking.com endpoint to run. Each run extracts ONE operation. Pick the right tool for the job:\n\n• **Hotel Search** — paginated list of hotels in a city/destination\n• **Hotel Search by Coordinates** — lat/lon based area search\n• **Hotel Detail** — full info for one hotel (address, check-in window, currency)\n• **Hotel Reviews** — paginated reviews for one hotel\n• **Calendar Pricing** — 30-day forward availability + length-of-stay rules\n• **Property Forensics Bundle** — premium: 1 row per hotel = details + photos + top reviews + policies + facilities fused",
                        "default": "search"
                    },
                    "destinationName": {
                        "title": "🔍 Destination name (for Hotel Search)",
                        "type": "string",
                        "description": "City, region, or neighborhood name. Example: \"Paris\", \"Bali\", \"New York\". The actor resolves it to Booking's internal destination ID automatically."
                    },
                    "destinationId": {
                        "title": "Destination ID (optional, for Hotel Search)",
                        "type": "string",
                        "description": "Skip auto-resolution by passing Booking.com's internal `dest_id` directly. Use when you know it; saves one upstream call."
                    },
                    "destinationType": {
                        "title": "Destination type (optional)",
                        "enum": [
                            "city",
                            "region",
                            "district",
                            "landmark",
                            "airport",
                            "hotel"
                        ],
                        "type": "string",
                        "description": "Booking.com's dest type. Defaults to `city`. Other values: `region`, `district`, `landmark`, `airport`, `hotel`.",
                        "default": "city"
                    },
                    "latitude": {
                        "title": "📍 Latitude (for Search by Coordinates)",
                        "type": "string",
                        "description": "Decimal latitude. Example: `48.85668` for central Paris."
                    },
                    "longitude": {
                        "title": "📍 Longitude (for Search by Coordinates)",
                        "type": "string",
                        "description": "Decimal longitude. Example: `2.3514764` for central Paris."
                    },
                    "hotelId": {
                        "title": "🏨 Hotel ID (for Detail / Reviews / Calendar / Forensics)",
                        "type": "string",
                        "description": "Booking.com hotel ID. Find one from a previous Hotel Search run (each row carries `hotelId`). Example: `15854834`."
                    },
                    "checkinDate": {
                        "title": "Check-in date (YYYY-MM-DD)",
                        "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
                        "type": "string",
                        "description": "Check-in date used by search and pricing operations. Defaults to 30 days from today."
                    },
                    "checkoutDate": {
                        "title": "Check-out date (YYYY-MM-DD)",
                        "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
                        "type": "string",
                        "description": "Check-out date used by search and pricing operations. Defaults to 32 days from today (2-night stay)."
                    },
                    "adults": {
                        "title": "Number of adults",
                        "minimum": 1,
                        "maximum": 16,
                        "type": "integer",
                        "description": "Guests per booking. Defaults to 2.",
                        "default": 2
                    },
                    "rooms": {
                        "title": "Number of rooms",
                        "minimum": 1,
                        "maximum": 10,
                        "type": "integer",
                        "description": "Rooms requested. Defaults to 1.",
                        "default": 1
                    },
                    "currency": {
                        "title": "Currency",
                        "type": "string",
                        "description": "3-letter currency code (USD, EUR, GBP, etc.). Defaults to USD.",
                        "default": "USD"
                    },
                    "orderBy": {
                        "title": "Sort order (for Hotel Search)",
                        "enum": [
                            "popularity",
                            "price",
                            "review_score",
                            "distance",
                            "class",
                            "class_descending"
                        ],
                        "type": "string",
                        "description": "How Booking.com should order the results.",
                        "default": "popularity"
                    },
                    "sortType": {
                        "title": "Review sort (for Hotel Reviews)",
                        "enum": [
                            "SORT_MOST_RELEVANT",
                            "SORT_RECENT_DESC",
                            "SORT_RECENT_ASC",
                            "SORT_SCORE_DESC",
                            "SORT_SCORE_ASC"
                        ],
                        "type": "string",
                        "description": "How to sort review results.",
                        "default": "SORT_MOST_RELEVANT"
                    },
                    "maxPages": {
                        "title": "Max pages (for paginated operations)",
                        "minimum": 1,
                        "maximum": 50,
                        "type": "integer",
                        "description": "Cap on pages to fetch for paginated operations (search, reviews). Each page = 1 upstream call. Defaults to 5, max 50.",
                        "default": 5
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
