Google Hotels Fast Search Scraper
Pricing
from $25.00 / 1,000 hotel results
Google Hotels Fast Search Scraper
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.
Pricing
from $25.00 / 1,000 hotel results
Rating
0.0
(0)
Developer

Juyeop Park
Actor stats
0
Bookmarked
5
Total users
1
Monthly active users
5 days ago
Last modified
Categories
Share
Google Hotels Fast Search - Multi-Query Scraper with Full Detail
Fast Search multiple hotel queries in parallel 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. Two queries complete in roughly the same time as one.
What does Google Hotels Fast Search Scraper do?
Google Hotels Fast Search 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 |
| Fast Search | Parallel query execution, smart timeouts, content-aware waiting, and retry deduplication — 2 queries complete in roughly the same time as 1 |
| 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 Yorkhotels in Tokyo Shibuyaluxury hotels Singapore Marina Baybudget 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
{"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": "2026-03-06","checkOut": "2026-03-07","adults": 2,"dealText": null,"scrapedAt": "2026-03-05T09: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 — Fast Search Engine
This Actor is optimized for fast, parallel hotel data collection. Multiple search queries run simultaneously, and smart timeout management eliminates wasted retry cycles — so you get complete results in a fraction of the time.
How Fast Search Works
- Parallel query execution — all your queries (up to 5) run at the same time, not one after another
- Smart timeout calculation — the Actor dynamically adjusts timeouts based on the number of hotels you're scraping, preventing unnecessary retries that double run time
- Content-aware waiting — instead of fixed delays, the Actor detects when page content is actually loaded and moves on immediately
- Retry deduplication — if a query needs to be retried, hotels already collected are skipped automatically, saving time and cost
Speed Benchmarks
| Scenario | Hotels | Approximate Time |
|---|---|---|
| 1 query, 20 hotels, all 5 sections | 20 | ~5-7 min |
| 2 queries, 20 hotels each, all 5 sections | 40 | ~9-12 min |
| 1 query, 20 hotels, Overview + Prices only | 20 | ~3-4 min |
Quick metadata scan (scrapeOtaPrices: false) | 20 | ~10 sec |
Tip: Adding more queries does not multiply the run time linearly — thanks to parallel execution, 2 queries take roughly the same time as 1 query on a 4 GB memory configuration.
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.
Timeout is auto-calculated — no manual tuning needed
The Actor automatically calculates the optimal timeout based on your maxResults setting. For most runs, you can leave requestHandlerTimeoutSecs at the default value. The Actor will use whichever is larger: your specified value or the dynamically calculated minimum.
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:
# Start a runcurl -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": "2026-04-01","checkOut": "2026-04-02","maxResults": 20,"dataSections": ["overview", "prices", "reviews"]}'
# Retrieve results from the datasetcurl "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.