# Booking Scraper Pro (`webdatalabs/booking-scraper-pro`) Actor

Extract hotel data, guest reviews, and sentiment insights from Booking.com. Search any destination, get comprehensive hotel information including ratings, facilities, photos, and analyze review sentiment

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

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-usage

## 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 Pro - Hotels, Reviews & Sentiment Analysis

**Extract hotel data, guest reviews, and sentiment insights from Booking.com.** Search any destination, get comprehensive hotel information including ratings, facilities, photos, and analyze review sentiment with AFINN-165 NLP.

[![Apify Actor](https://img.shields.io/badge/Apify-Actor-blue)](https://apify.com)
[![Sentiment Analysis](https://img.shields.io/badge/Sentiment-AFINN--165-brightgreen)]()
[![Reviews](https://img.shields.io/badge/Reviews-GraphQL%20API-orange)]()

### ✨ Features

#### Hotel Data
- Complete hotel details (name, description, property type)
- Location data (address, city, country, GPS coordinates, location score)
- Check-in/check-out times and cancellation policy
- Category scores (Staff, Cleanliness, Comfort, Location, Facilities, Value, WiFi)
- Popular facilities (WiFi, Parking, Pool, Spa, etc.)
- Photo gallery extraction (up to 20 photos with captions)
- Price information with multi-currency support (14 currencies)

#### Review Analysis
- **Guest reviews** via Booking.com's GraphQL API (overcomes 30-review limit)
- Guest details (name, country, traveler type)
- Positive and negative review text
- Room type and stay duration
- **Hotel replies** to guest reviews
- Review scores (0-10 scale)

#### Sentiment Analysis
- **AFINN-165 NLP** analysis on review text
- Sentiment score and label (positive/negative/neutral)
- Aggregated sentiment distribution per hotel
- Average sentiment across all reviews

### 🎯 Use Cases

#### Hotel Market Research
```json
{
  "destination": "Munich, Germany",
  "maxHotels": 50,
  "includeReviews": true,
  "maxReviewsPerHotel": 100,
  "analyzeSentiment": true
}
````

**Result:** Comprehensive data on 50 Munich hotels with review sentiment analysis.

#### Competitor Analysis

```json
{
  "destination": "Paris, France",
  "maxHotels": 20,
  "includeReviews": true,
  "maxReviewsPerHotel": 50
}
```

**Result:** Compare hotel ratings, facilities, and guest feedback for competitive benchmarking.

#### Guest Feedback Monitoring

```json
{
  "destination": "Barcelona, Spain",
  "maxHotels": 10,
  "includeReviews": true,
  "maxReviewsPerHotel": 200,
  "analyzeSentiment": true
}
```

**Result:** Deep analysis of guest sentiment with positive/negative review breakdown.

#### Location-Based Analysis (Multi-Currency)

```json
{
  "destination": "Tokyo, Japan",
  "checkIn": "2025-06-01",
  "checkOut": "2025-06-05",
  "adults": 2,
  "rooms": 1,
  "maxHotels": 30,
  "language": "en-us",
  "currency": "JPY"
}
```

**Result:** Hotel availability with prices in Japanese Yen for specific dates.

#### German Market Research

```json
{
  "destination": "Berlin, Germany",
  "maxHotels": 40,
  "includeReviews": true,
  "maxReviewsPerHotel": 100,
  "language": "de",
  "currency": "EUR"
}
```

**Result:** Hotels with German descriptions and reviews, prices in Euros.

### 📊 Output Data

#### Sample Hotel Record

```json
{
  "hotelId": "grand-hotel-munich",
  "name": "Grand Hotel Munich",
  "url": "https://www.booking.com/hotel/de/grand-hotel-munich.html",
  "description": "Located in the heart of Munich, this elegant hotel offers...",
  "propertyType": "Hotel",
  "address": "Maximilianstrasse 15, 80539 Munich, Germany",
  "city": "Munich",
  "country": "Germany",
  "postalCode": "80539",
  "latitude": 48.1351,
  "longitude": 11.5820,
  "neighborhood": "Altstadt-Lehel",
  "locationScore": 9.4,
  "reviewScore": 8.7,
  "reviewScoreWord": "Fabulous",
  "totalReviewCount": 2341,
  "categoryScores": [
    {"category": "Staff", "score": 9.2},
    {"category": "Facilities", "score": 8.5},
    {"category": "Cleanliness", "score": 9.0},
    {"category": "Comfort", "score": 8.8},
    {"category": "Value for money", "score": 8.1},
    {"category": "Location", "score": 9.4},
    {"category": "Free Wifi", "score": 8.7}
  ],
  "popularFacilities": ["Free WiFi", "Parking", "Restaurant", "Spa", "Fitness center"],
  "checkInTime": "3:00 PM",
  "checkOutTime": "11:00 AM",
  "cancellationPolicy": "Free cancellation before March 1, 2025",
  "mainPhoto": "https://cf.bstatic.com/xdata/images/hotel/max1280/...",
  "photos": [
    {"url": "https://cf.bstatic.com/xdata/images/hotel/max1280/...", "caption": "Hotel exterior"}
  ],
  "priceFrom": 189,
  "currency": "EUR",
  "sentiment": {
    "avgScore": 3.2,
    "avgComparative": 0.28,
    "distribution": {"positive": 42, "negative": 5, "neutral": 3}
  },
  "reviewCount": 50,
  "reviews": [
    {
      "guestName": "Marco",
      "guestCountry": "Italy",
      "guestCountryCode": "IT",
      "guestType": "Couple",
      "positiveText": "Excellent location, friendly staff, beautiful rooms",
      "negativeText": "Breakfast could be more varied",
      "title": "Amazing stay!",
      "score": 9.0,
      "roomType": "Deluxe Double Room",
      "numNights": 3,
      "checkinDate": "2025-01-12",
      "checkoutDate": "2025-01-15",
      "hotelReply": "Thank you for your wonderful review, Marco!",
      "sentimentScore": 4,
      "sentimentComparative": 0.35,
      "sentimentLabel": "positive",
      "reviewDate": "2025-01-15T10:30:00Z",
      "helpfulVotes": 5,
      "reviewUrl": "https://www.booking.com/reviews/..."
    }
  ],
  "scrapedAt": "2025-01-31T12:00:00Z"
}
```

#### Sentiment Analysis Fields

- **sentimentScore**: AFINN-165 score (negative = bad, positive = good)
- **sentimentLabel**: Classification (`positive`, `negative`, or `neutral`)
- **avgComparative**: Normalized score per word for comparison

### 🚀 Quick Start

#### Basic Destination Search

```json
{
  "destination": "Berlin, Germany",
  "maxHotels": 20
}
```

#### With Reviews and Sentiment

```json
{
  "destination": "London, UK",
  "maxHotels": 30,
  "includeReviews": true,
  "maxReviewsPerHotel": 50,
  "analyzeSentiment": true
}
```

#### Custom Date Range

```json
{
  "destination": "Amsterdam, Netherlands",
  "checkIn": "2025-03-15",
  "checkOut": "2025-03-18",
  "adults": 2,
  "rooms": 1,
  "maxHotels": 25
}
```

### ⚙️ Input Parameters

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `destination` | string | **required** | City, region, or country (e.g., "Munich, Germany") |
| `checkIn` | string | tomorrow | Check-in date (YYYY-MM-DD format) |
| `checkOut` | string | day after check-in | Check-out date (YYYY-MM-DD format) |
| `adults` | integer | `2` | Number of adults per room (1-10) |
| `rooms` | integer | `1` | Number of rooms needed (1-10) |
| `maxHotels` | integer | `20` | Maximum hotels to scrape (1-100) |
| `includeReviews` | boolean | `true` | Extract guest reviews |
| `maxReviewsPerHotel` | integer | `50` | Reviews per hotel (0-500) |
| `analyzeSentiment` | boolean | `true` | Enable AFINN-165 sentiment analysis |
| `language` | string | `en-us` | Content language (en-us, en-gb, de, fr, es, it, pt-pt, nl, pl, ru, ja, zh-cn, ko, ar) |
| `currency` | string | `USD` | Price currency (USD, EUR, GBP, JPY, CNY, AUD, CAD, CHF, INR, BRL, MXN, KRW, SGD, THB) |

### 🔧 Technical Details

#### GraphQL Review Extraction

- Uses Booking.com's internal GraphQL API
- Overcomes the 30-review pagination limit on web pages
- Extracts hotel replies (partner responses)
- Captures review metadata (dates, room types, stay duration)

#### Anti-Bot Protection

- **Playwright** with Stealth plugins
- **Residential proxies** (required)
- Session management and cookie persistence
- Headed browser mode for reliability

#### Data Quality

- Comprehensive hotel details from multiple page sections
- Structured JSON output for easy integration
- ISO 8601 timestamps
- Null handling for missing fields

### 💡 Integration Examples

#### Zapier - Weekly Market Report

1. Schedule Booking.com Scraper weekly
2. Filter hotels by `reviewScore > 8.0`
3. Send top-rated hotels to Google Sheets
4. Create weekly PDF report via Zapier

#### n8n - Sentiment Alert Workflow

1. Run scraper daily for your target market
2. Filter reviews where `sentimentLabel === "negative"`
3. Send alerts to Slack for negative sentiment spikes
4. Store data in Airtable for trend analysis

#### Make.com - Competitor Tracking

1. Scrape competitor destinations monthly
2. Compare average review scores over time
3. Track facility changes and pricing
4. Update competitive analysis dashboard

### ⚠️ Requirements

#### Residential Proxies Required

Booking.com blocks datacenter IPs. **Residential proxies are automatically used** by this scraper for reliability.

**Cost**: Residential proxies add costs depending on data volume (see current proxy pricing in Apify Console).

#### Rate Limits

- Respectful scraping with delays between requests
- Session warmup for anti-bot compliance
- Automatic retry with error handling

### 📈 Output Formats

Export scraped data in multiple formats:

- **JSON** - For API integrations and databases
- **CSV** - For Excel/Google Sheets analysis
- **Excel** - For advanced data analysis
- **HTML Table** - For quick viewing

### ❓ FAQ

#### Do I need a Booking.com account?

No! This scraper extracts publicly available data from Booking.com search results and hotel pages. No account or API key required.

#### Can I scrape specific hotel URLs?

This scraper is optimized for destination-based search. Enter a city or region, and it will find and scrape hotels in that area.

#### How does the sentiment analysis work?

We use AFINN-165, a research-validated lexicon of ~2,500 words with sentiment scores. It analyzes the combined positive and negative review text to determine overall sentiment.

#### Can I get more than 30 reviews per hotel?

Yes! Unlike web scraping that's limited to 30 visible reviews, we use Booking.com's GraphQL API to fetch up to 500 reviews per hotel.

#### What data is included in hotel replies?

When hotel management responds to a review, we capture their response text in the `hotelReply` field. Great for analyzing customer service responsiveness.

#### How accurate are the review scores?

Review scores are extracted directly from Booking.com's data (0-10 scale). The `reviewScore` field shows the official Booking.com rating.

#### Can I filter by review score or price?

The scraper extracts all hotels matching your destination search. You can filter the output data by `reviewScore`, `priceFrom`, or `categoryScores` in your automation workflow.

#### Can I get data in different languages?

Yes! Set the `language` parameter to get hotel descriptions and reviews in your preferred language. Supported: English (US/UK), German, French, Spanish, Italian, Portuguese, Dutch, Polish, Russian, Japanese, Chinese, Korean, Arabic.

#### Can I get prices in my local currency?

Yes! Set the `currency` parameter to get prices in any of 14 supported currencies: USD, EUR, GBP, JPY, CNY, AUD, CAD, CHF, INR, BRL, MXN, KRW, SGD, THB.

#### How fast is the scraper?

\~2-5 hotels per minute depending on review count. A 20-hotel search with 50 reviews each takes approximately 10-15 minutes.

#### What if I get blocked?

Residential proxies are automatically enabled. If issues persist, try reducing `maxHotels` or `maxReviewsPerHotel` to lower request volume.

### 🆘 Support

- **Email**: via Apify
- **Response Time**: < 24 hours
- **Documentation**: This README + inline help

***

### 🔗 Explore More of Our Actors

#### 🛒 E-commerce & Reviews

| Actor | Description |
|-------|-------------|
| [Amazon Reviews Scraper](https://apify.com/webdatalabs/amazon-reviews-scraper) | Extract Amazon customer reviews for sentiment analysis |
| [eBay Scraper Pro](https://apify.com/webdatalabs/ebay-scraper-pro) | Product and seller data from eBay marketplaces |
| [Etsy Scraper Pro](https://apify.com/webdatalabs/etsy-scraper-pro) | Fast Etsy product scraper with ratings and reviews |

#### 💬 Social Media & Brand Monitoring

| Actor | Description |
|-------|-------------|
| [Reddit Scraper Pro](https://apify.com/webdatalabs/reddit-scraper-pro) | Monitor subreddits with sentiment analysis |
| [Discord Scraper Pro](https://apify.com/webdatalabs/discord-scraper-pro) | Extract Discord messages for community insights |
| [YouTube Comments Harvester](https://apify.com/webdatalabs/youtube-comments-harvester) | Comprehensive YouTube comments scraper |

#### 🏢 Business Intelligence

| Actor | Description |
|-------|-------------|
| [Indeed Salary Analyzer](https://apify.com/webdatalabs/indeed-salary-analyzer) | Salary data for compensation benchmarking |
| [Shopify Scraper Pro](https://apify.com/webdatalabs/shopify-scraper-pro) | Extract Shopify product data for market research |

***

***

### 📬 Custom Solutions & Enterprise

Need a custom data feed, modified output format, or enterprise integration?

**Contact:** Furkanc58@gmail.com

I offer:

- Daily/weekly data feeds (Snowflake, S3, BigQuery, Google Sheets)
- Custom scrapers for platforms not yet covered
- White-label solutions for agencies
- Priority support and SLAs

*Response within 24-48 hours.*

### Legal Disclaimer

This actor is a general-purpose tool for analyzing publicly accessible web data. The user bears sole responsibility for ensuring their specific use complies with:

- Applicable laws (GDPR/DSGVO, copyright law)
- The target website's Terms of Service
- Apify's Terms of Service

The provider (webdatalabs) expressly disclaims liability for any unauthorized or unlawful use. By using this actor, the user agrees to indemnify the provider against any third-party claims arising from their use of the data.

***

*This tool is not affiliated with Booking.com. All trademarks belong to their respective owners.*

### 🔍 SEO Keywords

Booking.com scraper, Booking.com data extractor, hotel scraper, Booking.com API alternative, scrape Booking.com hotels, hotel reviews scraper, Booking.com sentiment analysis, hotel data extraction, Booking.com automation, extract hotel reviews, Booking.com web scraping, hotel market research, Booking.com competitor analysis, hotel rating scraper, how to scrape Booking.com, n8n Booking.com integration, Zapier hotel scraper, Make Booking.com automation, hotel price monitor, guest review analysis, travel data scraper, accommodation scraper

# Actor input Schema

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

City, region, or country to search for hotels (e.g., 'Berlin, Germany', 'Paris', 'Tokyo, Japan')

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

Check-in date in YYYY-MM-DD format. Defaults to tomorrow if not specified.

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

Check-out date in YYYY-MM-DD format. Defaults to day after check-in.

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

Number of adults per room

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

Number of rooms needed

## `maxHotels` (type: `integer`):

Maximum number of hotels to scrape (1-100)

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

Extract guest reviews for each hotel

## `maxReviewsPerHotel` (type: `integer`):

Maximum number of reviews to extract per hotel (0-500)

## `analyzeSentiment` (type: `boolean`):

Analyze review sentiment using AFINN-165 NLP algorithm

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

Language for hotel descriptions and reviews

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

Currency for prices

## Actor input object example

```json
{
  "destination": "Munich, Germany",
  "adults": 2,
  "rooms": 1,
  "maxHotels": 3,
  "includeReviews": true,
  "maxReviewsPerHotel": 5,
  "analyzeSentiment": true,
  "language": "en-us",
  "currency": "USD"
}
```

# Actor output Schema

## `hotels` (type: `string`):

Complete hotel data including reviews, ratings, facilities, and sentiment analysis

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "destination": "Munich, Germany"
};

// Run the Actor and wait for it to finish
const run = await client.actor("webdatalabs/booking-scraper-pro").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "destination": "Munich, Germany" }

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

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Booking Scraper Pro",
        "description": "Extract hotel data, guest reviews, and sentiment insights from Booking.com. Search any destination, get comprehensive hotel information including ratings, facilities, photos, and analyze review sentiment",
        "version": "1.0",
        "x-build-id": "6gxhCaMY7ZDzHTyCW"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/webdatalabs~booking-scraper-pro/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-webdatalabs-booking-scraper-pro",
                "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/webdatalabs~booking-scraper-pro/runs": {
            "post": {
                "operationId": "runs-sync-webdatalabs-booking-scraper-pro",
                "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/webdatalabs~booking-scraper-pro/run-sync": {
            "post": {
                "operationId": "run-sync-webdatalabs-booking-scraper-pro",
                "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": [
                    "destination"
                ],
                "properties": {
                    "destination": {
                        "title": "Destination",
                        "type": "string",
                        "description": "City, region, or country to search for hotels (e.g., 'Berlin, Germany', 'Paris', 'Tokyo, Japan')"
                    },
                    "checkIn": {
                        "title": "Check-in Date",
                        "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
                        "type": "string",
                        "description": "Check-in date in YYYY-MM-DD format. Defaults to tomorrow if not specified."
                    },
                    "checkOut": {
                        "title": "Check-out Date",
                        "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
                        "type": "string",
                        "description": "Check-out date in YYYY-MM-DD format. Defaults to day after check-in."
                    },
                    "adults": {
                        "title": "Adults",
                        "minimum": 1,
                        "maximum": 10,
                        "type": "integer",
                        "description": "Number of adults per room",
                        "default": 2
                    },
                    "rooms": {
                        "title": "Rooms",
                        "minimum": 1,
                        "maximum": 10,
                        "type": "integer",
                        "description": "Number of rooms needed",
                        "default": 1
                    },
                    "maxHotels": {
                        "title": "Max Hotels",
                        "minimum": 1,
                        "maximum": 100,
                        "type": "integer",
                        "description": "Maximum number of hotels to scrape (1-100)",
                        "default": 3
                    },
                    "includeReviews": {
                        "title": "Include Reviews",
                        "type": "boolean",
                        "description": "Extract guest reviews for each hotel",
                        "default": true
                    },
                    "maxReviewsPerHotel": {
                        "title": "Max Reviews Per Hotel",
                        "minimum": 0,
                        "maximum": 500,
                        "type": "integer",
                        "description": "Maximum number of reviews to extract per hotel (0-500)",
                        "default": 5
                    },
                    "analyzeSentiment": {
                        "title": "Sentiment Analysis",
                        "type": "boolean",
                        "description": "Analyze review sentiment using AFINN-165 NLP algorithm",
                        "default": true
                    },
                    "language": {
                        "title": "Language",
                        "enum": [
                            "en-us",
                            "en-gb",
                            "de",
                            "fr",
                            "es",
                            "it",
                            "pt-pt",
                            "nl",
                            "pl",
                            "ru",
                            "ja",
                            "zh-cn",
                            "ko",
                            "ar"
                        ],
                        "type": "string",
                        "description": "Language for hotel descriptions and reviews",
                        "default": "en-us"
                    },
                    "currency": {
                        "title": "Currency",
                        "enum": [
                            "USD",
                            "EUR",
                            "GBP",
                            "JPY",
                            "CNY",
                            "AUD",
                            "CAD",
                            "CHF",
                            "INR",
                            "BRL",
                            "MXN",
                            "KRW",
                            "SGD",
                            "THB"
                        ],
                        "type": "string",
                        "description": "Currency for prices",
                        "default": "USD"
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
