# Expedia  Hotels + Reviews (`abotapi/expedia-universal-scraper`) Actor

From $1/1K. Extract hotel listings and reviews from Expedia.com. Get comprehensive data, including prices, ratings, review text, photos, and location details for any destination.

- **URL**: https://apify.com/abotapi/expedia-universal-scraper.md
- **Developed by:** [AbotAPI](https://apify.com/abotapi) (community)
- **Categories:** Travel, Developer tools, Automation
- **Stats:** 4 total users, 2 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $1.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

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

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

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

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

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

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

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

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## Expedia Hotel Scraper

Extract hotel listings and reviews from **Expedia.com**, the world's largest online travel marketplace with millions of properties across 200+ countries. Get comprehensive data including prices, ratings, review text, photos, and location details for any destination.

### What does Expedia Hotel Scraper do?

This Actor collects hotel data from Expedia in two ways:

1. **Search by destination.** Paste a city name, get back a paginated list of hotels with prices, ratings, and photos for your selected dates.
2. **Fetch by URL.** Paste Expedia hotel or search URLs, get the matching hotel cards. Search URLs auto paginate through all pages.

A single toggle switches the output between aggregate hotel cards and individual review records (one row per review).

#### Key Features

| Feature | Description |
|---------|-------------|
| **Destination search** | Type any city; the Actor resolves it to the correct Expedia region |
| **URL mode** | Accepts hotel URLs and search URLs; search URLs auto paginate |
| **Deeplink support** | Expedia share links (expe.onelink.me and similar) are auto-resolved to the canonical hotel URL |
| **Reviews only toggle** | Output individual review records instead of hotel cards |
| **Date and guest filters** | Check in/out dates, adults, rooms, children with ages |
| **Price and rating filters** | Min/max price, star ratings, sort order |
| **29 locales, 36 currencies** | Localized content and prices |
| **Photos and pricing** | Up to 4 images per hotel, nightly price, strikeout discounts |
| **Per hotel review cap** | Cap reviews per hotel to control cost on high volume properties |

### What data can you extract?

#### Hotel card (Search mode or URL mode)

<table>
<tr><td>

**Identity and location**
- Property ID and URL
- Name and description
- Star rating
- Destination context

</td><td>

**Pricing**
- Nightly price (numeric and formatted)
- Strikeout price when discounted
- Currency

</td></tr>
<tr><td>

**Reviews (aggregate)**
- Overall rating (0 to 10)
- Rating label (Good, Excellent, etc.)
- Total review count

</td><td>

**Media and dates**
- Gallery image URLs
- Check in and check out dates
- Adult count used for search

</td></tr>
</table>

#### Review record (Reviews Only mode)

- Review ID, title, text
- Rating value (0 to 10) and label
- Author name
- Review and stay date
- Sentiment: liked and disliked lists
- Guest photo URLs
- Linked hotel ID and URL

### How to use the Expedia Hotel Scraper

#### Search by destination

```json
{
  "mode": "search",
  "destination": "Paris",
  "adults": 2,
  "currency": "USD",
  "locale": "en_US",
  "maxItems": 50
}
````

#### Filter by price and star rating

```json
{
  "mode": "search",
  "destination": "Tokyo",
  "checkIn": "2026-09-10",
  "checkOut": "2026-09-13",
  "adults": 2,
  "starRatings": ["4", "5"],
  "minPrice": 150,
  "maxPrice": 400,
  "sortBy": "REVIEW"
}
```

#### Fetch specific hotels by URL

```json
{
  "mode": "url",
  "startUrls": [
    { "url": "https://www.expedia.com/Example-City-Hotels-Sample-Hotel.h11111.Hotel-Information" },
    { "url": "https://www.expedia.com/Example-City-Hotels-Another-Sample.h22222.Hotel-Information" }
  ]
}
```

#### Paste a deeplink (expe.onelink.me share link)

Share links generated by the Expedia mobile app's "Share" button, as well as marketing and social deeplinks, are accepted as is. The Actor follows the redirect, identifies the hotel, and scrapes it like any other URL.

```json
{
  "mode": "url",
  "startUrls": [
    { "url": "https://expe.onelink.me/hnLd/9o2lnq8o" }
  ]
}
```

Supported deeplink hosts: `expe.onelink.me` (primary), `expe.app.link`, `trip.expedia.com`. Only Expedia hotel deeplinks are handled. Hotels.com and Vrbo short links are out of scope for this release.

#### Auto paginate a search URL

Paste an Expedia search URL with your filters already applied. The Actor walks every page until `maxItems` is reached.

```json
{
  "mode": "url",
  "startUrls": [
    { "url": "https://www.expedia.com/Hotel-Search?destination=Barcelona&d1=2026-07-01&d2=2026-07-05&adults=2" }
  ],
  "maxItems": 200
}
```

#### Scrape reviews only

```json
{
  "mode": "search",
  "destination": "New York",
  "reviewsOnly": true,
  "maxReviewsPerHotel": 50,
  "maxItems": 500
}
```

Or supply hotel URLs directly:

```json
{
  "mode": "url",
  "startUrls": [
    { "url": "https://www.expedia.com/Example-City-Hotels-Sample-Hotel.h11111.Hotel-Information" }
  ],
  "reviewsOnly": true,
  "maxReviewsPerHotel": 100
}
```

#### Family travel with children

```json
{
  "mode": "search",
  "destination": "Orlando",
  "adults": 2,
  "children": ["5", "10"],
  "rooms": 1
}
```

### Input Parameters

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `mode` | string | `search` | `search` or `url` |
| `destination` | string | | City name (Search mode) |
| `startUrls` | object\[] | | Expedia URLs (URL mode) |
| `destinationId` | string | | Optional numeric region ID. Skips auto resolution |
| `reviewsOnly` | boolean | `false` | Output reviews instead of hotel cards |
| `checkIn` | string | tomorrow | YYYY-MM-DD or a relative offset like `1 day` |
| `checkOut` | string | day after tomorrow | YYYY-MM-DD or a relative offset like `2 days` |
| `adults` | integer | `2` | Adult guests, 1 to 14 |
| `children` | string\[] | `[]` | Ages of children, 0 to 17 (one entry per child) |
| `rooms` | integer | `1` | Rooms to book, 1 to 8 |
| `minPrice` | integer | | Minimum nightly price |
| `maxPrice` | integer | | Maximum nightly price |
| `starRatings` | string\[] | `[]` | One or more of `1`, `2`, `3`, `4`, `5` |
| `sortBy` | string | `RECOMMENDED` | `RECOMMENDED`, `PRICE_LOW_TO_HIGH`, `PRICE_HIGH_TO_LOW`, `DISTANCE`, `PROPERTY_CLASS`, `REVIEW` |
| `currency` | string | `USD` | 3 letter ISO code from the dropdown |
| `locale` | string | `en_US` | Language and region locale from the dropdown |
| `maxItems` | integer | `50` | Hard cap on total records |
| `maxReviewsPerHotel` | integer | `25` | Cap reviews per hotel |
| `maxConcurrency` | integer | `5` | Parallel requests |
| `proxy` | object | Apify Residential | Proxy configuration |

### Output Example

#### Hotel card

```json
{
  "mode": "search",
  "placeName": "Example Hotel Paris",
  "hotelId": "11111",
  "hotelUrl": "https://www.expedia.com/Example-City-Hotels-Sample-Hotel.h11111.Hotel-Information",
  "hotelOverallRating": 9.2,
  "hotelRatingLabel": "Wonderful",
  "hotelTotalReviews": 1843,
  "provider": "expedia",
  "scrapedAt": "2026-04-18T07:30:00.000Z",
  "extra": {
    "searchDestination": "Paris",
    "starRating": 5,
    "description": "Recently renovated boutique hotel steps from the city center",
    "priceFrom": 420,
    "priceFormatted": "$420 nightly",
    "priceStrikeout": "$600",
    "currency": "USD",
    "images": [
      "https://images.example.com/lodging/sample-1.jpg",
      "https://images.example.com/lodging/sample-2.jpg"
    ],
    "checkIn": "2026-07-01",
    "checkOut": "2026-07-03",
    "adults": 2
  }
}
```

#### Review record

```json
{
  "mode": "reviews",
  "placeName": "Example Hotel Paris",
  "hotelId": "11111",
  "hotelUrl": "https://www.expedia.com/Example-City-Hotels-Sample-Hotel.h11111.Hotel-Information",
  "hotelOverallRating": 9.2,
  "hotelRatingLabel": "Wonderful",
  "hotelTotalReviews": 1843,
  "hotelCategoryRatings": {
    "Cleanliness": 9.4,
    "Staff": 9.3
  },
  "locale": "en_US",
  "provider": "expedia",
  "reviewId": "abc123def456",
  "reviewTitle": "Memorable stay",
  "reviewText": "Beautiful hotel with great service and a convenient location.",
  "reviewRating": 10,
  "reviewRatingLabel": "Excellent",
  "reviewDate": "Oct 14, 2025",
  "stayDuration": "Stayed 3 nights in Oct 2025",
  "authorName": "Sarah",
  "sentiment": {
    "liked": ["Cleanliness", "staff and service", "location"],
    "disliked": []
  },
  "photos": [
    "https://images.example.com/ugc/review-photo-1.jpg"
  ],
  "scrapedAt": "2026-04-18T07:30:00.000Z",
  "extra": {}
}
```

### Tips

- **Pagination is automatic.** The Actor walks pages until `maxItems` is reached or the site reports no more results.
- **`destinationId` speeds up search.** Pass the numeric ID from any Expedia URL (the segment after `.d`) to skip the name resolution round trip.
- **Reviews mode respects `maxItems`.** If you cap at 500, the Actor stops at 500 total reviews across all hotels.
- **Run in residential proxy for best results.** Expedia rate limits aggressively on datacenter IPs.

# Actor input Schema

## `mode` (type: `string`):

Search mode runs a destination query and paginates results. URL mode fetches hotels by property or search URL.

## `reviewsOnly` (type: `boolean`):

When enabled, the output is individual review records (one row per review) instead of hotel cards. Works in both Search and URL input types.

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

When enabled, each hotel card gets up to Max Reviews per Hotel reviews embedded under extra.reviews. Ignored if Scrape reviews only is on.

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

Search mode only. Type a city (for example Paris, New York, Tokyo).

## `startUrls` (type: `array`):

URL mode only. Paste Expedia property URLs (Hotel-Information pages) or Expedia Hotel-Search URLs. Search URLs are auto paginated.

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

Numeric region ID from an Expedia URL (for example 2734 for Paris, 178293 for New York). It is the number after .d in any Expedia URL. If left empty, the Actor resolves it from the Destination text above.

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

Required. Pick a date, or type a relative value such as 1 day (tomorrow) or 7 days.

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

Required. Pick a date, or type a relative value such as 2 days (day after tomorrow).

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

Number of adult guests. Affects pricing and availability in the results.

## `children` (type: `array`):

Add one entry per child and type the age in years (0 to 17). Two kids age 5 and 10? Add 5 and 10. Two 5 year olds? Add 5 twice.

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

Number of rooms to book. Each room uses the same adult and children configuration.

## `minPrice` (type: `integer`):

Minimum nightly price filter in the selected currency. Leave empty for no minimum.

## `maxPrice` (type: `integer`):

Maximum nightly price filter in the selected currency. Leave empty for no maximum.

## `starRatings` (type: `array`):

Filter by star rating. Select one or more. Leave empty to include all star ratings.

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

Order in which hotels are returned.

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

Currency for prices shown on hotel cards.

## `locale` (type: `string`):

Language and region for content on hotel cards and for review language.

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

Hard cap on the total number of records saved to the dataset across all pages and hotels.

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

Cap on reviews embedded in each hotel card. Only applies when Include reviews in hotel cards is on. Ignored in Scrape reviews only mode (Max Items caps the overall total).

## `reviewsFrom` (type: `string`):

YYYY-MM-DD. Only keep reviews on or after this date. Speeds up runs when you only need recent reviews.

## `includeCategoryRatings` (type: `boolean`):

Attach hotel level aggregate ratings (cleanliness, staff, location, and similar categories) to each review record.

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

Number of parallel HTTP requests. Higher values are faster but more likely to trigger site rate limits.

## `proxy` (type: `object`):

Proxy settings. Residential proxies are recommended for reliable access.

## Actor input object example

```json
{
  "mode": "search",
  "reviewsOnly": false,
  "includeReviews": false,
  "destination": "Paris",
  "startUrls": [
    {
      "url": "https://www.expedia.com/Paris-Hotels-Hotel-Trianon-Rive-Gauche.h891081.Hotel-Information"
    }
  ],
  "checkIn": "1 day",
  "checkOut": "2 days",
  "adults": 2,
  "children": [],
  "rooms": 1,
  "starRatings": [],
  "sortBy": "RECOMMENDED",
  "currency": "USD",
  "locale": "en_US",
  "maxItems": 50,
  "maxReviewsPerHotel": 25,
  "includeCategoryRatings": true,
  "maxConcurrency": 5,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `results` (type: `string`):

Records matching the selected mode

# 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 = {
    "mode": "search",
    "destination": "Paris",
    "startUrls": [
        {
            "url": "https://www.expedia.com/Paris-Hotels-Hotel-Trianon-Rive-Gauche.h891081.Hotel-Information"
        }
    ],
    "checkIn": "1 day",
    "checkOut": "2 days",
    "proxy": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("abotapi/expedia-universal-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 = {
    "mode": "search",
    "destination": "Paris",
    "startUrls": [{ "url": "https://www.expedia.com/Paris-Hotels-Hotel-Trianon-Rive-Gauche.h891081.Hotel-Information" }],
    "checkIn": "1 day",
    "checkOut": "2 days",
    "proxy": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("abotapi/expedia-universal-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 '{
  "mode": "search",
  "destination": "Paris",
  "startUrls": [
    {
      "url": "https://www.expedia.com/Paris-Hotels-Hotel-Trianon-Rive-Gauche.h891081.Hotel-Information"
    }
  ],
  "checkIn": "1 day",
  "checkOut": "2 days",
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call abotapi/expedia-universal-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Expedia  Hotels + Reviews",
        "description": "From $1/1K. Extract hotel listings and reviews from Expedia.com. Get comprehensive data, including prices, ratings, review text, photos, and location details for any destination.",
        "version": "0.1",
        "x-build-id": "kzLDvdriZdfUHlyyZ"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/abotapi~expedia-universal-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-abotapi-expedia-universal-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/abotapi~expedia-universal-scraper/runs": {
            "post": {
                "operationId": "runs-sync-abotapi-expedia-universal-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/abotapi~expedia-universal-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-abotapi-expedia-universal-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": [
                    "checkIn",
                    "checkOut"
                ],
                "properties": {
                    "mode": {
                        "title": "Scraping mode",
                        "enum": [
                            "search",
                            "url"
                        ],
                        "type": "string",
                        "description": "Search mode runs a destination query and paginates results. URL mode fetches hotels by property or search URL.",
                        "default": "search"
                    },
                    "reviewsOnly": {
                        "title": "Scrape reviews only",
                        "type": "boolean",
                        "description": "When enabled, the output is individual review records (one row per review) instead of hotel cards. Works in both Search and URL input types.",
                        "default": false
                    },
                    "includeReviews": {
                        "title": "Include reviews in hotel cards",
                        "type": "boolean",
                        "description": "When enabled, each hotel card gets up to Max Reviews per Hotel reviews embedded under extra.reviews. Ignored if Scrape reviews only is on.",
                        "default": false
                    },
                    "destination": {
                        "title": "Destination",
                        "type": "string",
                        "description": "Search mode only. Type a city (for example Paris, New York, Tokyo)."
                    },
                    "startUrls": {
                        "title": "Hotel URLs",
                        "type": "array",
                        "description": "URL mode only. Paste Expedia property URLs (Hotel-Information pages) or Expedia Hotel-Search URLs. Search URLs are auto paginated.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "destinationId": {
                        "title": "Destination ID (optional)",
                        "type": "string",
                        "description": "Numeric region ID from an Expedia URL (for example 2734 for Paris, 178293 for New York). It is the number after .d in any Expedia URL. If left empty, the Actor resolves it from the Destination text above."
                    },
                    "checkIn": {
                        "title": "Check in Date",
                        "type": "string",
                        "description": "Required. Pick a date, or type a relative value such as 1 day (tomorrow) or 7 days.",
                        "default": "1 day"
                    },
                    "checkOut": {
                        "title": "Check out Date",
                        "type": "string",
                        "description": "Required. Pick a date, or type a relative value such as 2 days (day after tomorrow).",
                        "default": "2 days"
                    },
                    "adults": {
                        "title": "Adults",
                        "minimum": 1,
                        "maximum": 14,
                        "type": "integer",
                        "description": "Number of adult guests. Affects pricing and availability in the results.",
                        "default": 2
                    },
                    "children": {
                        "title": "Children Ages",
                        "type": "array",
                        "description": "Add one entry per child and type the age in years (0 to 17). Two kids age 5 and 10? Add 5 and 10. Two 5 year olds? Add 5 twice.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "rooms": {
                        "title": "Rooms",
                        "minimum": 1,
                        "maximum": 8,
                        "type": "integer",
                        "description": "Number of rooms to book. Each room uses the same adult and children configuration.",
                        "default": 1
                    },
                    "minPrice": {
                        "title": "Min Price per Night",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Minimum nightly price filter in the selected currency. Leave empty for no minimum."
                    },
                    "maxPrice": {
                        "title": "Max Price per Night",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Maximum nightly price filter in the selected currency. Leave empty for no maximum."
                    },
                    "starRatings": {
                        "title": "Star Ratings Filter",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Filter by star rating. Select one or more. Leave empty to include all star ratings.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "1",
                                "2",
                                "3",
                                "4",
                                "5"
                            ],
                            "enumTitles": [
                                "1 star",
                                "2 stars",
                                "3 stars",
                                "4 stars",
                                "5 stars"
                            ]
                        },
                        "default": []
                    },
                    "sortBy": {
                        "title": "Sort",
                        "enum": [
                            "RECOMMENDED",
                            "PRICE_LOW_TO_HIGH",
                            "PRICE_HIGH_TO_LOW",
                            "DISTANCE",
                            "PROPERTY_CLASS",
                            "REVIEW"
                        ],
                        "type": "string",
                        "description": "Order in which hotels are returned.",
                        "default": "RECOMMENDED"
                    },
                    "currency": {
                        "title": "Currency",
                        "enum": [
                            "USD",
                            "EUR",
                            "GBP",
                            "JPY",
                            "AUD",
                            "CAD",
                            "NZD",
                            "CHF",
                            "SEK",
                            "NOK",
                            "DKK",
                            "PLN",
                            "CZK",
                            "HUF",
                            "RUB",
                            "TRY",
                            "CNY",
                            "HKD",
                            "TWD",
                            "KRW",
                            "SGD",
                            "THB",
                            "MYR",
                            "IDR",
                            "PHP",
                            "INR",
                            "AED",
                            "SAR",
                            "ILS",
                            "ZAR",
                            "MXN",
                            "BRL",
                            "ARS",
                            "CLP",
                            "COP",
                            "PEN"
                        ],
                        "type": "string",
                        "description": "Currency for prices shown on hotel cards.",
                        "default": "USD"
                    },
                    "locale": {
                        "title": "Locale",
                        "enum": [
                            "en_US",
                            "en_GB",
                            "en_AU",
                            "en_CA",
                            "en_IN",
                            "en_SG",
                            "fr_FR",
                            "fr_CA",
                            "de_DE",
                            "de_AT",
                            "es_ES",
                            "es_MX",
                            "it_IT",
                            "nl_NL",
                            "pt_BR",
                            "pt_PT",
                            "ja_JP",
                            "ko_KR",
                            "zh_CN",
                            "zh_HK",
                            "zh_TW",
                            "sv_SE",
                            "da_DK",
                            "nb_NO",
                            "fi_FI",
                            "pl_PL",
                            "ru_RU",
                            "th_TH",
                            "tr_TR",
                            "ar_SA"
                        ],
                        "type": "string",
                        "description": "Language and region for content on hotel cards and for review language.",
                        "default": "en_US"
                    },
                    "maxItems": {
                        "title": "Max Items",
                        "minimum": 1,
                        "maximum": 100000,
                        "type": "integer",
                        "description": "Hard cap on the total number of records saved to the dataset across all pages and hotels.",
                        "default": 50
                    },
                    "maxReviewsPerHotel": {
                        "title": "Max Reviews per Hotel",
                        "minimum": 1,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "Cap on reviews embedded in each hotel card. Only applies when Include reviews in hotel cards is on. Ignored in Scrape reviews only mode (Max Items caps the overall total).",
                        "default": 25
                    },
                    "reviewsFrom": {
                        "title": "Reviews From Date",
                        "type": "string",
                        "description": "YYYY-MM-DD. Only keep reviews on or after this date. Speeds up runs when you only need recent reviews."
                    },
                    "includeCategoryRatings": {
                        "title": "Include Category Ratings",
                        "type": "boolean",
                        "description": "Attach hotel level aggregate ratings (cleanliness, staff, location, and similar categories) to each review record.",
                        "default": true
                    },
                    "maxConcurrency": {
                        "title": "Max Concurrency",
                        "minimum": 1,
                        "maximum": 20,
                        "type": "integer",
                        "description": "Number of parallel HTTP requests. Higher values are faster but more likely to trigger site rate limits.",
                        "default": 5
                    },
                    "proxy": {
                        "title": "Proxy Configuration",
                        "type": "object",
                        "description": "Proxy settings. Residential proxies are recommended for reliable access."
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
