Google Hotels Scraper — Prices, OTA Rates & Reviews
Pricing
from $2.59 / 1,000 hotel scrapeds
Google Hotels Scraper — Prices, OTA Rates & Reviews
Scrape Google Hotels for live nightly prices, guest ratings, amenities, GPS, and optional OTA rate ladders. Search any city or hotel. Export JSON via Python, Node.js, or Apify MCP — a Google Hotels API alternative.
Pricing
from $2.59 / 1,000 hotel scrapeds
Rating
0.0
(0)
Developer
Andrej Kiva
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
Disclaimer: Unofficial tool for publicly visible Google Hotels / Google Travel search results. Google and Google Hotels are trademarks of Google LLC. Not affiliated with, sponsored by, or endorsed by Google. For informational, research, rate-shopping, and market-analysis use only. Respect applicable terms of use and law.
Google Hotels scraper for public hotel search — a practical Google Hotels API alternative. Give it a city, neighborhood, or hotel query plus check-in / check-out dates. Export lead nightly prices, star class, guest ratings, review counts, GPS, amenities, photos, and optional OTA rate ladders (the Booking / Expedia / Hotels.com-style sources Google already shows) as a JSON dataset. Call from Python, Node.js, cURL, or Apify MCP / AI assistants.
Built for hotel revenue managers, OTA / metasearch analysts, travel-tech builders, and ADR researchers. No Google account and no official Hotel Center access required.
| Google Hotels (OTA rate shop) | Airbnb occupancy (STR calendars) | Idealista (long-term rentals) |
|---|---|---|
| Google Hotels Scraper ◄── you are here | Airbnb Occupancy Scraper | Idealista Scraper |
When to use this Actor
- You need a Google Hotels scraper / Google Travel hotel scraper that returns structured JSON
- You want live prices for a destination and stay dates, not a static hotel directory
- You compare OTA prices Google already aggregates, without Booking.com or Expedia partner APIs
- You want to scrape Google Hotels with Python, Node.js, or MCP and export a dataset
When not to use this Actor
- Official Google Hotel Ads / Travel Partner APIs — those are for approved chains and OTAs submitting their own rate feeds
- Guaranteed last-room inventory — Google shows public comparison prices; checkout on the OTA can still differ
- Full city dumps of thousands of hotels in one run — cap with
maxItemsand split queries (neighborhood, star class) - Short-term rental occupancy calendars — use Airbnb Occupancy Scraper
Key Features
- Destination search —
hotels in Paris,Tokyo 4-star hotels, or a city inlocation - Stay dates — check-in / check-out encoded the same way Google Travel's own URLs encode them
- Lead price + rating — nightly rate, currency, deal badge, overall rating, review count, star class
- GPS, photos, amenities, nearby places from the public search card
- Optional OTA ladder —
includeDetailsfetches the property page for per-vendor prices and room names when Google exposes them - Exact property tokens — paste a Google Hotels entity token or entity URL
- Vacation rentals toggle — search holiday rentals on the same Google Hotels index
- Price monitor — scheduled runs attach
monitor.priceChangevs the previous run - HTTP path — Chrome TLS impersonation, no Playwright
- MCP / AI ready — call from assistants via Apify MCP
Use Cases
| Use case | What you get |
|---|---|
| Comp-set rate shop | Lead nightly prices for hotels in a city on chosen dates |
| OTA ladder | Per-source prices Google shows (Booking, Expedia, Hotels.com, …) |
| ADR / market snapshot | Ratings, stars, GPS, amenities for a destination |
| Travel-tech MVP | JSON hotel inventory without a Hotel Center partnership |
| Scheduled monitor | Price deltas on the same query and dates vs last run |
| STR vs hotel mix | Hotels here, then Airbnb occupancy on the sibling Actor |
Quick Start
{"searchQueries": ["hotels in Paris"],"checkInDate": "2026-09-11","checkOutDate": "2026-09-12","adults": 2,"currency": "EUR","country": "fr","maxItems": 20,"includeDetails": false}
OTA ladder (extra request per hotel):
{"searchQueries": ["hotels in Prague"],"checkInDate": "2026-10-01","checkOutDate": "2026-10-03","includeDetails": true,"maxItems": 10}
Input
| Field | Description |
|---|---|
searchQueries | Destinations or hotel keywords (or entity tokens) |
location | City used when queries are empty (hotels in {location}) |
startUrls | Google Hotels search or entity URLs |
checkInDate / checkOutDate | YYYY-MM-DD stay window |
adults / children | Occupancy (Google default is 2 adults) |
currency / language / country | curr, hl, gl — set country to match the currency market |
maxItems | Row cap (first search page is typically ~20 organic hotels) |
sortBy | Empty = relevance; 3 lowest price; 8 highest rating; 13 most reviewed |
minPrice / maxPrice / minRating / hotelClass | Post-filters on scraped rows |
vacationRentals | Search vacation rentals instead of hotels |
includeDetails | Fetch OTA ladder + rooms on the entity page |
includeAds | Keep sponsored hotels (isAd=true) |
monitorMode | Attach price-change vs previous run |
proxyConfiguration | Optional; residential if consent/empty results |
Output
One dataset row per hotel.
| Field | Description |
|---|---|
name | Property name |
starRating / hotelClass | Official stars and label when Google shows them |
overallRating / reviewCount | Guest rating and volume |
pricePerNight / pricePerNightDisplay / currency | Lead nightly rate |
checkInDate / checkOutDate / nights | Stay window used for the price |
gpsLatitude / gpsLongitude | Coordinates |
amenities / images / nearbyPlaces | Search-card extras |
propertyToken / entityUrl / cid | Google identity |
bookingSources | Per-OTA prices (when includeDetails) |
rooms | Per-room rates when the mobile entity page includes them |
vendorCount | How many booking sources Google listed |
monitor | Previous price + delta when monitorMode is on |
{"type": "hotel","name": "Hôtel Mercure Paris Porte d'Orléans","starRating": 4,"overallRating": 4,"reviewCount": 1710,"pricePerNight": 85.06,"pricePerNightDisplay": "$85","currency": "USD","checkInDate": "2026-09-11","checkOutDate": "2026-09-12","nights": 1,"gpsLatitude": 48.81763,"gpsLongitude": 2.3292313,"propertyToken": "ChgIk_yPrdu8xKuuARoLL2cvMXY4Z2JiOTIQAQ","vendorCount": 12,"searchQuery": "hotels in Paris"}
With includeDetails: true, bookingSources looks like:
{"bookingSources": [{ "vendorName": "Booking.com", "ratePerNight": 85, "ratePerNightDisplay": "$85" },{ "vendorName": "Expedia", "ratePerNight": 89, "ratePerNightDisplay": "$89" }]}
Integration examples
Node.js
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('crawloop/google-hotels-scraper').call({searchQueries: ['hotels in Paris'],checkInDate: '2026-09-11',checkOutDate: '2026-09-12',currency: 'EUR',country: 'fr',maxItems: 20,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items[0]);
Python
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("crawloop/google-hotels-scraper").call(run_input={"searchQueries": ["hotels in Paris"],"checkInDate": "2026-09-11","checkOutDate": "2026-09-12","currency": "EUR","country": "fr","maxItems": 20,})for hotel in client.dataset(run["defaultDatasetId"]).iterate_items():print(hotel["name"], hotel.get("pricePerNight"), hotel.get("currency"))
cURL
curl -X POST "https://api.apify.com/v2/acts/crawloop~google-hotels-scraper/runs?token=$APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"searchQueries":["hotels in Paris"],"checkInDate":"2026-09-11","checkOutDate":"2026-09-12","currency":"EUR","country":"fr","maxItems":20}'
MCP and AI assistants
Use this Actor from AI tools via Apify MCP. Connect your Apify account, then call this Actor by its Store ID / name (crawloop/google-hotels-scraper).
Example prompts:
- "Run Google Hotels Scraper for hotels in Paris, check-in 2026-09-11, check-out 2026-09-12, EUR, country fr, max 20 rows, and return JSON"
- "Scrape 4-star hotels in Lisbon for next Friday–Sunday and summarize lead prices, ratings, and GPS"
- "Chain Google Hotels Scraper then Airbnb Occupancy Scraper for the same city to compare hotel ADR vs STR occupancy"
Suite next step
After hotel rates, pull short-term rental occupancy for the same destination with Airbnb Occupancy Scraper. For long-term listings in Spain, Italy, or Portugal, use Idealista Scraper.
FAQ
Does Google Hotels have a public API?
No self-serve API returns the public comparison results visitors see. Hotel Ads / Travel Partner APIs are for approved partners submitting their own feeds. This Actor is a Google Hotels API alternative that reads the public Travel search page.
Do I need a Google login or API key?
No. You can scrape Google Hotels from Python, Node.js, cURL, or MCP with an Apify token only.
How many hotels per search?
The first results page is typically about 20 organic properties. Raise maxItems only after you add more queries (neighborhoods, star class). Pagination beyond the first page is not guaranteed.
Why are prices in USD when I asked for EUR?
Displayed currency follows Google's market: set both currency and country (gl) to the same region (for example EUR + fr), and use a matching proxy country when you enable Apify Proxy.
Why enable a residential proxy?
Direct datacenter IPs often work. If you hit a consent interstitial or zero cards, switch the proxy to Apify RESIDENTIAL.
Are OTA prices the final checkout price?
They are the public rates Google shows for your dates. The booking site can still change taxes, packages, or availability at checkout.
Can I monitor the same hotels over time?
Yes. Turn on monitorMode and schedule the Actor. Each row gets a monitor object with the previous lead price and the delta.
Related Actors
- Airbnb Occupancy Scraper — STR calendars, occupancy %, booking pace
- Idealista Scraper — long-term listings ES/IT/PT
- ImmobilienScout24 Scraper — DE long-term listings