# Google Hotels Multi-Query Scraper & Price Comparison (`jy-labs/google-hotels-multi-query-scraper`) Actor

Search multiple hotel queries at once and compare prices across 30+ OTAs. Collect 5 data sections per hotel — Overview, Prices, Reviews, Photos, About — all from Google Hotels.

- **URL**: https://apify.com/jy-labs/google-hotels-multi-query-scraper.md
- **Developed by:** [Juyeop Park](https://apify.com/jy-labs) (community)
- **Categories:** Automation, Developer tools, Travel
- **Stats:** 95 total users, 19 monthly users, 86.8% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $25.00 / 1,000 hotel results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

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

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

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

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

# README

## Google Hotels Multi-Query Scraper & Price Comparison

Search multiple hotel queries at once and compare prices across 30+ Online Travel Agencies (OTAs). Collect 5 rich data sections per hotel — **Overview, Prices, Reviews, Photos, and About** — all from Google Hotels in a single run.

***

### What does Google Hotels Multi-Query Scraper do?

Google Hotels Multi-Query Scraper uses Google Hotels as a meta-search layer to aggregate live pricing data from every major OTA simultaneously. Run multiple search queries (e.g., "hotels in New York", "hotels in Tokyo") in a single Actor run. Instead of visiting Booking.com, Hotels.com, Expedia, and Agoda separately, this Actor queries Google Hotels and extracts the full OTA comparison table plus 5 detailed data sections from each hotel's detail page.

The Actor is built on Crawlee's `PlaywrightCrawler` with a hybrid data extraction strategy: API interception for structured search data combined with DOM scraping for detail page content. This approach maximizes both data reliability and extraction completeness.

Each hotel result includes:

- **OTA price comparison** — up to 30+ providers with individual prices, direct booking URLs, and cancellation policies
- **Overview** — hotel description, address, phone number, highlights, and nearby places
- **Guest reviews** — individual review text with rating, author, and date; plus aggregated third-party ratings from Tripadvisor, Priceline, Trip.com, and Hotels.com
- **Hotel photos** — full photo gallery URLs
- **About / Amenities** — check-in/out times and full amenities organized by category

***

### Use Cases

**1. Travel Price Comparison Platforms**
Aggregate live OTA prices across multiple cities or hotel chains, then surface the cheapest booking option to end users — without building direct integrations with each OTA.

**2. Revenue Management and Rate Parity Monitoring**
Track competitor hotel prices across OTAs in real time. Detect rate parity violations and identify when specific OTAs undercut your contracted rates.

**3. Automated Deal Alert Systems**
Schedule daily runs for target hotels. Trigger notifications when prices drop below a defined threshold using Apify webhooks combined with the `maxPrice` filter.

**4. Travel Data Research and Analytics**
Build datasets covering price distributions, seasonal trends, and OTA markup patterns. Supports 22 countries and 22 currencies for global market coverage.

**5. Hotel Booking Aggregators**
Power a meta-search engine or hotel booking widget with structured pricing and availability data across all major OTAs for any destination.

**6. Business Travel Management**
Extract hotel options within rating and price constraints for a given city. Use `minRating` and `maxPrice` filters to enforce corporate travel policy compliance automatically.

***

### Key Features

| Feature                    | Details                                                                                                                                                                                          |
| -------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| Multi-OTA price comparison | 30+ providers per hotel including Booking.com, Hotels.com, Agoda, Expedia, Trip.com, Klook, Vio.com, eDreams, and more                                                                           |
| 5 data sections            | Overview and Prices always included; optionally add Reviews, Photos, About                                                                                                                       |
| Smart currency detection   | Automatic detection from currency symbols; 22 currencies supported                                                                                                                               |
| 22 countries               | US, UK, Singapore, Japan, South Korea, Germany, France, Australia, Canada, India, Thailand, Brazil, Italy, Spain, Netherlands, UAE, Hong Kong, Taiwan, Malaysia, Indonesia, Philippines, Vietnam |
| Flexible sorting           | Sort output by price (low/high), rating, review count, or hotel name                                                                                                                             |
| Filtering                  | Filter results by minimum Google rating and maximum price per night                                                                                                                              |
| Scale                      | Up to 100 hotels per query, 5 queries per run                                                                                                                                                    |
| Anti-detection             | Browser fingerprinting with Chrome/Windows profile, residential proxy support, and resource blocking for performance                                                                             |
| Hybrid extraction          | API interception for reliable structured data + DOM scraping for detail content                                                                                                                  |

***

### How to Use

#### Step 1 - Set your search queries

Enter one or more natural-language queries in the **Search Queries** field. Examples:

- `hotels in New York`
- `hotels in Tokyo Shibuya`
- `luxury hotels Singapore Marina Bay`
- `budget hotels Paris near Eiffel Tower`

You can run up to **5 queries per run**, each returning up to 100 hotels.

#### Step 2 - Set your travel dates

Enter **Check-in Date** and **Check-out Date** in `YYYY-MM-DD` format. If left empty, the Actor defaults to tomorrow and the following day.

#### Step 3 - Configure guests and locale

Set **Number of Adults** (1-10), **Country** (affects which OTAs appear and local pricing), and **Currency** (the currency for all displayed prices).

#### Step 4 - Choose data sections

The Actor always collects **Overview** and **Prices** (OTA comparison table) — these cannot be deselected. Optionally add:

- **Guest Reviews** — individual guest reviews plus third-party aggregated ratings
- **Hotel Photos** — full photo gallery
- **About / Amenities** — check-in times, check-out times, and categorized amenities

More sections increase run time but provide richer data.

#### Step 5 - Apply filters and sorting

Use **Minimum Rating** (0-5) and **Maximum Price Per Night** to narrow results. Set both to `0` (default) to disable filtering. Choose a sort order for the output dataset.

#### Step 6 - Run and export

Click **Save & Run**. Results appear in the **Dataset** tab as structured JSON records. Export to JSON, CSV, Excel, or XML. Connect to downstream systems via the Apify API.

***

### Input Parameters

| Parameter                   | Type       | Default                  | Description                                                                                   |
| --------------------------- | ---------- | ------------------------ | --------------------------------------------------------------------------------------------- |
| `queries`                   | `string[]` | required                 | Hotel search queries (max 5). E.g., `["hotels in New York"]`                                  |
| `checkIn`                   | `string`   | tomorrow                 | Check-in date in `YYYY-MM-DD` format                                                          |
| `checkOut`                  | `string`   | day after tomorrow       | Check-out date in `YYYY-MM-DD` format                                                         |
| `adults`                    | `integer`  | `2`                      | Number of adult guests (1-10)                                                                 |
| `country`                   | `string`   | `"us"`                   | Country code for localized results (22 options)                                               |
| `currency`                  | `string`   | `"USD"`                  | Currency code for displayed prices (22 options)                                               |
| `maxResults`                | `integer`  | `20`                     | Maximum hotels per query (1-100)                                                              |
| `scrapeOtaPrices`           | `boolean`  | `true`                   | Visit each hotel's detail page to collect OTA prices, reviews, photos, and about data         |
| `dataSections`              | `string[]` | `["overview", "prices"]` | Data sections to collect: `overview`, `prices`, `reviews`, `photos`, `about`                  |
| `sortBy`                    | `string`   | `"price_low"`            | Sort order: `price_low`, `price_high`, `rating`, `reviews`, `name`                            |
| `minRating`                 | `number`   | `0`                      | Minimum Google rating filter — set to `0` to disable                                          |
| `maxPrice`                  | `integer`  | `0`                      | Maximum nightly price filter — set to `0` to disable                                          |
| `proxy`                     | `object`   | Apify Residential        | HTTP proxy configuration. Residential proxies strongly recommended for Google Hotels scraping |
| `requestHandlerTimeoutSecs` | `integer`  | `600`                    | Maximum seconds allowed per request (120-1800)                                                |

#### Supported Countries

`us`, `gb`, `sg`, `jp`, `kr`, `de`, `fr`, `au`, `ca`, `in`, `th`, `br`, `it`, `es`, `nl`, `ae`, `hk`, `tw`, `my`, `id`, `ph`, `vn`

#### Supported Currencies

`USD`, `EUR`, `GBP`, `JPY`, `KRW`, `SGD`, `AUD`, `CAD`, `INR`, `THB`, `BRL`, `TWD`, `MYR`, `IDR`, `PHP`, `VND`, `AED`, `HKD`, `CHF`, `SEK`, `NOK`, `DKK`

#### Data Sections

| Value      | Always Included         | Description                                                                          |
| ---------- | ----------------------- | ------------------------------------------------------------------------------------ |
| `overview` | Yes (cannot be removed) | Hotel description, address, phone number, highlights, and nearby places              |
| `prices`   | Yes (cannot be removed) | Full OTA price comparison table (30+ providers, booking URLs, cancellation policies) |
| `reviews`  | No                      | Individual guest reviews, star rating breakdown, and third-party review site ratings |
| `photos`   | No                      | Hotel photo gallery URLs                                                             |
| `about`    | No                      | Full hotel description, check-in/out times, address, and amenities by category       |

***

### Output

Each hotel is saved as a single JSON object in the dataset. Optional fields are present only when the corresponding `dataSections` entry is selected.

#### Base Fields (always present)

| Field         | Type              | Description                                     |
| ------------- | ----------------- | ----------------------------------------------- |
| `query`       | `string`          | The search query that returned this hotel       |
| `hotelName`   | `string`          | Hotel name                                      |
| `address`     | `string \| null`  | Hotel address or location description           |
| `rating`      | `number \| null`  | Google rating score (e.g., 4.2)                 |
| `reviewCount` | `integer \| null` | Total number of reviews                         |
| `starRating`  | `integer \| null` | Hotel star classification (2-5)                 |
| `lowestPrice` | `number \| null`  | Lowest nightly price found across all OTAs      |
| `currency`    | `string`          | Currency code for all prices                    |
| `prices`      | `OtaPrice[]`      | OTA price comparison array                      |
| `amenities`   | `string[]`        | Hotel amenities list                            |
| `imageUrl`    | `string \| null`  | Hotel thumbnail image URL                       |
| `latitude`    | `number \| null`  | Latitude coordinate (from API intercept)        |
| `longitude`   | `number \| null`  | Longitude coordinate (from API intercept)       |
| `checkIn`     | `string`          | Check-in date in `YYYY-MM-DD` format            |
| `checkOut`    | `string`          | Check-out date in `YYYY-MM-DD` format           |
| `adults`      | `integer`         | Number of adult guests                          |
| `dealText`    | `string \| null`  | Special deal text (e.g., "25% less than usual") |
| `url`         | `string`          | Google Hotels URL for this hotel                |
| `scrapedAt`   | `string`          | ISO 8601 timestamp of when data was scraped     |

#### OTA Price Object (`prices[]`)

| Field          | Type             | Description                                      |
| -------------- | ---------------- | ------------------------------------------------ |
| `provider`     | `string`         | OTA provider name (e.g., "Booking.com")          |
| `price`        | `number`         | Nightly price from this provider                 |
| `currency`     | `string`         | Currency code                                    |
| `bookingUrl`   | `string`         | Direct link to book at this provider             |
| `cancellation` | `string \| null` | Cancellation policy (e.g., "Free cancellation")  |
| `features`     | `string[]`       | Additional features (e.g., "Breakfast included") |

#### Optional Nested Objects

**`overview`** (when `overview` section selected)

| Field          | Type             | Description                              |
| -------------- | ---------------- | ---------------------------------------- |
| `description`  | `string \| null` | Hotel description and highlights summary |
| `address`      | `string \| null` | Hotel address                            |
| `phone`        | `string \| null` | Hotel phone number                       |
| `highlights`   | `string[]`       | Key highlights and features              |
| `nearbyPlaces` | `string[]`       | Nearby points of interest                |

**`reviews`** (when `reviews` section selected)

| Field               | Type                 | Description                                           |
| ------------------- | -------------------- | ----------------------------------------------------- |
| `overallRating`     | `number \| null`     | Overall review score                                  |
| `totalReviews`      | `string \| null`     | Total review count text                               |
| `ratingBreakdown`   | `object`             | Star rating distribution (1-5 stars)                  |
| `reviews`           | `ReviewItem[]`       | Individual guest reviews (text, rating, date, author) |
| `thirdPartyReviews` | `ThirdPartyReview[]` | Aggregated ratings from Tripadvisor, Priceline, etc.  |

**`photos`** (when `photos` section selected)

| Field    | Type       | Description               |
| -------- | ---------- | ------------------------- |
| `photos` | `string[]` | Array of hotel photo URLs |

**`about`** (when `about` section selected)

| Field                 | Type             | Description                          |
| --------------------- | ---------------- | ------------------------------------ |
| `description`         | `string \| null` | Full hotel description               |
| `checkInTime`         | `string \| null` | Check-in time (e.g., "3:00 PM")      |
| `checkOutTime`        | `string \| null` | Check-out time (e.g., "12:00 PM")    |
| `address`             | `string \| null` | Hotel address                        |
| `amenitiesByCategory` | `object`         | Amenities organized by category name |

***

### Sample Output

The following data is from an actual test run searching `"hotels in New York"` with all 5 data sections enabled.

#### The Manhattan at Times Square Hotel

```json
{
    "query": "hotels in New York",
    "hotelName": "The Manhattan at Times Square Hotel",
    "address": "790 7th Ave, New York, NY 10019",
    "rating": 4.2,
    "reviewCount": 8547,
    "starRating": 4,
    "lowestPrice": 259,
    "currency": "USD",
    "prices": [
        {
            "provider": "Vio.com",
            "price": 259,
            "currency": "USD",
            "bookingUrl": "https://...",
            "cancellation": "Free cancellation",
            "features": []
        },
        {
            "provider": "Booking.com",
            "price": 271,
            "currency": "USD",
            "bookingUrl": "https://...",
            "cancellation": "Free cancellation",
            "features": []
        },
        {
            "provider": "Hotels.com",
            "price": 285,
            "currency": "USD",
            "bookingUrl": "https://...",
            "cancellation": "Free cancellation",
            "features": []
        },
        {
            "provider": "eDreams",
            "price": 377,
            "currency": "USD",
            "bookingUrl": "https://...",
            "cancellation": null,
            "features": []
        }
    ],
    "amenities": ["Free Wi-Fi", "Parking ($)", "Air conditioning", "Pet-friendly", "Fitness center", "Restaurant"],
    "checkIn": "2025-12-01",
    "checkOut": "2025-12-02",
    "adults": 2,
    "dealText": null,
    "scrapedAt": "2025-12-01T09:15:22.000Z",
    "overview": {
        "description": "Located in the heart of Midtown Manhattan, steps from Times Square...",
        "address": "790 7th Ave, New York, NY 10019",
        "phone": "+1 212-581-3300",
        "highlights": ["Prime Times Square location", "Recently renovated rooms"],
        "nearbyPlaces": ["Times Square (0.1 mi)", "Central Park (1.2 mi)", "Empire State Building (0.8 mi)"]
    },
    "reviews": {
        "overallRating": 4.2,
        "totalReviews": "8,547",
        "ratingBreakdown": { "5": 3200, "4": 2800, "3": 1500, "2": 700, "1": 347 },
        "reviews": [
            {
                "text": "Great location, clean rooms, friendly staff. Would stay again.",
                "rating": 5,
                "date": "2025-07-15",
                "author": "John D."
            }
        ],
        "thirdPartyReviews": [
            { "siteName": "Tripadvisor", "rating": "4.0", "reviewCount": "4,200" },
            { "siteName": "Priceline", "rating": "8.2", "reviewCount": "1,100" },
            { "siteName": "Trip.com", "rating": "4.1", "reviewCount": "980" },
            { "siteName": "Hotels.com", "rating": "8.4", "reviewCount": "2,300" }
        ]
    },
    "photos": {
        "photos": ["https://lh5.googleusercontent.com/p/AF1QipN...", "https://lh5.googleusercontent.com/p/AF1QipN..."]
    },
    "about": {
        "checkInTime": "4:00 PM",
        "checkOutTime": "12:00 PM",
        "address": "790 7th Ave, New York, NY 10019",
        "amenitiesByCategory": {
            "Connectivity": ["Free Wi-Fi", "Business center"],
            "Dining": ["Restaurant", "Bar/Lounge", "Room service"],
            "Fitness": ["Fitness center"],
            "Policies": ["Pet-friendly", "Parking ($)", "Air conditioning"]
        }
    }
}
```

**26 unique OTA providers** found — prices ranged from $259 (Vio.com) to $377 (eDreams).
**10 guest reviews** + **4 third-party rating sources** (Tripadvisor, Priceline, Trip.com, Hotels.com).
**277 hotel photos** collected.

#### Pod 51

- 19 unique OTA providers
- 10 guest reviews + 3 third-party rating sources
- 214 hotel photos

#### DoubleTree by Hilton Hotel New York Times Square West

- 27 unique OTA providers
- Check-in: 3:00 PM / Check-out: 11:00 AM
- 10 guest reviews + 3 third-party rating sources
- 218 hotel photos

***

### How Much Will It Cost?

This Actor uses **Pay-Per-Event (PPE)** pricing.

| Event          | Price                | Description                                         |
| -------------- | -------------------- | --------------------------------------------------- |
| `hotel-result` | **$0.025 per hotel** | Charged once per hotel result pushed to the dataset |

You are charged only for hotels that are actually extracted and delivered to your dataset. No charge for queries that return zero results.

#### Cost Examples

| Scenario                               | Hotels     | Estimated Cost |
| -------------------------------------- | ---------- | -------------- |
| Single city, 20 hotels                 | 20         | $0.50          |
| 3-city comparison, 20 hotels each      | 60         | $1.50          |
| Full 5-query run, 50 hotels each       | 250        | $6.25          |
| Daily monitoring, 5 cities × 10 hotels | 50 per day | $1.25 / day    |

#### Value Comparison

Each hotel result includes cross-OTA price comparison from 30+ providers — data that would require scraping each OTA separately with other tools. At $0.025 per hotel with full OTA breakdown, this is significantly more cost-effective than aggregating data from individual OTA scrapers.

***

### Performance

| Task                               | Approximate Time          |
| ---------------------------------- | ------------------------- |
| Search extraction for 20 hotels    | 5-8 seconds per query     |
| Per hotel — Overview + Prices only | 5-10 seconds              |
| Per hotel — all 5 sections         | 10-20 seconds             |
| 3 hotels with all sections         | approximately 2 minutes   |
| 20 hotels with all sections        | approximately 3-4 minutes |

***

### Tips and Best Practices

**Use residential proxies**
Google Hotels blocks datacenter IP addresses. The Actor defaults to Apify Residential proxies. Switching to datacenter proxies or disabling the proxy configuration will result in bot detection and empty results.

**Start with a small test run**
Set `maxResults` to 5-10 and `dataSections` to `["overview", "prices"]` for your first run to validate your queries and date range before scaling up.

**Enable only the sections your pipeline uses**
Each additional data section adds 5-15 seconds per hotel. For runs with 50-100 hotels, collecting all sections significantly increases total run time. Select only the sections you will actually consume downstream.

**Use specific, location-aware queries**
More specific queries return more relevant results. `"hotels in Tokyo Shibuya near station"` is more precise than `"hotels in Japan"`. Google Hotels returns city-level results — overly broad geographic queries may not return useful data.

**Disable `scrapeOtaPrices` for fast metadata runs**
When you only need hotel names, ratings, and summary prices from the search results page, set `scrapeOtaPrices: false`. This reduces run time by approximately 80% and still provides basic pricing data.

**Schedule daily runs for price monitoring**
Use Apify Scheduling to run this Actor on a daily cadence with the same queries. Use the Apify API to compare datasets across runs and detect price changes over time.

**Increase `requestHandlerTimeoutSecs` for large runs**
When scraping 50+ hotels with all data sections, consider increasing the timeout to 1200-1800 seconds to avoid timeout errors on slow proxy connections.

***

### Limitations

- **Maximum 5 queries per run** — each query is a separate Google Hotels search
- **Maximum 100 hotels per query** — capped by Google Hotels' result set pagination
- **Display prices only** — prices reflect what Google Hotels shows at scrape time and do not include taxes, fees, or member-only discounts applied during checkout
- **Dynamic DOM dependency** — Google Hotels updates its frontend periodically; minor extraction issues may occur after major UI changes
- **OTA coverage varies by hotel** — smaller or boutique properties may have fewer OTA partnerships and fewer prices in the comparison table
- **Residential proxies required** — datacenter proxies will result in bot detection and empty results; this Actor defaults to Apify Residential proxies
- **Adults-only occupancy** — currently supports adult guest count only; children and multi-room configurations are not supported

***

### Integrations

#### Apify API

Trigger runs and retrieve results programmatically:

```bash
## Start a run
curl -X POST \
  "https://api.apify.com/v2/acts/YOUR_ACTOR_ID/runs?token=YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "queries": ["hotels in Singapore"],
    "checkIn": "2025-09-01",
    "checkOut": "2025-09-02",
    "maxResults": 20,
    "dataSections": ["overview", "prices", "reviews"]
  }'
```

```bash
## Retrieve results from the dataset
curl "https://api.apify.com/v2/datasets/DATASET_ID/items?token=YOUR_API_TOKEN&format=json"
```

#### Webhooks

Configure webhooks in the Actor settings to receive a POST notification when a run completes. Use this to trigger downstream processing — for example, loading price data into a database, calculating savings, or sending deal alerts via Slack or email.

#### Scheduled Runs

Use Apify Scheduling to run this Actor on a daily or weekly cadence. Combine with webhooks to build fully automated price monitoring pipelines without additional infrastructure.

#### Data Export Formats

Results can be exported directly from the Dataset tab:

- **JSON** — full structured data, ideal for API consumers and data pipelines
- **CSV** — flat format for spreadsheet analysis (nested objects are serialized)
- **Excel (.xlsx)** — for manual review and reporting
- **XML** — for legacy system integration

#### Zapier and Make

Connect Actor runs to Zapier or Make (Integromat) workflows via the native Apify integration. Push hotel price data automatically to Google Sheets, Airtable, Slack, or any connected service.

***

### FAQ

**Does this Actor require a Google account or API key?**

No. The Actor accesses Google Hotels as a standard browser session. No Google account, API key, or special credentials are required.

**How accurate are the prices?**

Prices reflect what Google Hotels displays at scrape time for the specified dates and guest count. They are display prices before taxes and fees. Actual checkout prices on OTA sites may differ due to taxes, service charges, or member-only discounts.

**Can I search for a specific hotel by name?**

Yes. Use a precise query such as `"Marriott Marquis Times Square New York"` to target a specific property. Note that Google may still return nearby alternatives. You can filter by `hotelName` in post-processing.

**Why do some hotels have fewer OTA providers?**

Smaller or boutique hotels may have fewer OTA partnerships. If a hotel has no price comparison data on Google Hotels, `prices` will be an empty array and `lowestPrice` will be `null`.

**Can I run multiple queries to compare prices across different date ranges?**

Yes. Create a separate entry in `queries` for each date or destination combination. You are charged per hotel result ($0.025/hotel), not per query.

**What happens if Google updates its UI?**

The Actor uses a hybrid approach: API interception (more stable, unaffected by UI changes) combined with DOM selectors (less stable). If Google updates its frontend, the DOM-based extraction may need selector updates. Check the Apify Store listing for version updates.

**Why is `scrapeOtaPrices` enabled by default?**

OTA price comparison is the primary purpose of this Actor. Disabling it returns only basic search-result data (hotel name, summary rating, thumbnail price) without the full OTA breakdown. For most use cases, the default setting is correct.

**Can I use custom proxies instead of Apify Residential?**

Yes. Set `proxy.useApifyProxy: false` and provide your proxy URLs in `proxy.proxyUrls`. Residential or mobile proxies are strongly recommended. Datacenter proxies will typically be blocked by Google Hotels.

**Why is `starRating` null for some hotels?**

Star rating is extracted from Google Hotels search results. Some hotels — particularly smaller or unclassified properties — do not have a star classification displayed by Google, resulting in a `null` value.

# Actor input Schema

## `queries` (type: `array`):

List of hotel search queries (e.g., 'hotels in New York', 'hotels in Singapore Orchard Road', 'luxury hotels Tokyo Shinjuku'). Each query runs a separate search. Maximum 5 queries per run.

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

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

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

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

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

Number of adult guests per room.

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

Country code for localized results. Affects hotel availability, pricing, and OTA options shown.

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

Currency code for prices.

## `maxResults` (type: `integer`):

Maximum number of hotels to extract per search query. Higher values require more scrolling and take longer.

## `scrapeOtaPrices` (type: `boolean`):

When enabled, visits each hotel's detail page to extract OTA prices, reviews, photos, and about data. When disabled, only extracts basic info from search results (faster, cheaper).

## `dataSections` (type: `array`):

Select which data sections to collect from each hotel's detail page. Overview and Prices are always included. More sections = slower but richer data.

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

How to sort the final output.

## `minRating` (type: `number`):

Only include hotels with this minimum Google rating (0-5). Set to 0 for no filter.

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

Only include hotels at or below this nightly price (in selected currency). Set to 0 for no limit.

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

HTTP proxy configuration. Residential proxies strongly recommended for Google Hotels scraping.

## `requestHandlerTimeoutSecs` (type: `integer`):

Maximum time allowed per request (search page or detail page). Increase for slow proxies or large result sets.

## Actor input object example

```json
{
  "queries": [
    "hotels in New York"
  ],
  "adults": 2,
  "country": "us",
  "currency": "USD",
  "maxResults": 20,
  "scrapeOtaPrices": true,
  "dataSections": [
    "overview",
    "prices"
  ],
  "sortBy": "price_low",
  "minRating": 0,
  "maxPrice": 0,
  "requestHandlerTimeoutSecs": 600
}
```

# Actor output Schema

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

No description

# API

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

## JavaScript example

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

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

// Prepare Actor input
const input = {
    "queries": [
        "hotels in New York"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("jy-labs/google-hotels-multi-query-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 = { "queries": ["hotels in New York"] }

# Run the Actor and wait for it to finish
run = client.actor("jy-labs/google-hotels-multi-query-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 '{
  "queries": [
    "hotels in New York"
  ]
}' |
apify call jy-labs/google-hotels-multi-query-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=jy-labs/google-hotels-multi-query-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/st8tljbwv7rdc2EYZ/builds/HlFfLh5UnnPSuxaLI/openapi.json
