Free Google Hotels Scraper — Search + Prices
Pricing
Pay per usage
Free Google Hotels Scraper — Search + Prices
Free Google Hotels Scraper — Search, Per-Room Prices & 18-31 OTA Comparison
A Google Hotels scraper that returns structured JSON for hotel search, plus a one-call detail mode that pulls per-room rates and the full Booking.com / Expedia / Hotels.com / Trip.com / Agoda OTA price comparison Google Hotels shows on its property pages. No SerpApi-style markup, no Selenium, no booking.com API key — just the data that already loads in your browser when you open google.com/travel/search.
What you get
- Hotel name, star rating (1-5), star class label, review count, and the structured 5/4/3/2/1-star review breakdown
- Best per-night price as displayed (
€189) plusbest_price_numericandcurrencyparsed for direct filtering - Full OTA price comparison — typically 18-31 booking partners per property (Booking.com, Expedia, Hotels.com, Trip.com, Agoda, Priceline, Hotwire, Vio.com, Travelocity, Orbitz, Kayak, Skyscanner and more), each with its own per-night price, total stay price, and deeplink
- Per-room pricing — every room type Google's mobile property page lists (Deluxe King, Junior Suite, Family Room, etc.) with
room_name,price_display,price_numeric,price_int, and the OTA deeplink - Short and long descriptions, ~24 amenity categories grouped by type (pool, spa, fitness, accessibility, family-friendly, business)
- Photo gallery URLs (typically 30-150 high-resolution images per property)
- Latitude / longitude implicit in the
detail_url, pluscheck_dates(check_in, check_out, nights) so you know exactly which stay window the prices belong to - Search query echoed back on every row so you can join multiple queries into one dataset
Why scrape Google Hotels
Hotel pricing data is the most fragmented surface on the public web. The headline price you see on booking.com/hotel/... is often €15-€50 different from the same room sold on Expedia, Hotels.com, Agoda, or the property's direct site, and the cheapest option on any given night swaps between OTAs unpredictably. There is no single Google Hotels API — Google's official Hotel Center is gated to verified hotel chains and OTAs, Booking.com's affiliate API requires an approved partner agreement that takes weeks, and Expedia's EAN/Rapid API is sales-team-only with a multi-thousand-dollar minimum. For analysts, marketers, travel-tech founders, and meta-search builders, Google Hotels is the one place where 30 OTAs already bid against each other in one HTML page — if you can read that page programmatically, you have the cheapest rate-shopping signal on the internet.
This actor solves that by hitting google.com/travel/search and google.com/travel/hotels/entity/<id> directly with curl_cffi (Chrome TLS fingerprinting), parsing the AF_initDataCallback ds:1 hydration blob the page ships with on every load. Because we hit the same SSR templates Google's web client renders for human users, you get exactly what shows up in the browser — including the OTA rate ladder and the per-room matrix that Google only emits in the mobile SSR variant. No headless browser, no CAPTCHA solver, no $1500/month booking.com API key.
Concrete buyer math: a hotel chain revenue manager rate-shopping 200 competitor properties across 6 OTAs every Monday morning pays $0.012 × 200 = $2.40 per weekly run — versus paid rate-shopping tools like OTA Insight or Lighthouse that start at $400-1200/month flat. A travel-tech founder building a meta-search MVP can ship on $500/month of full-detail scraping and skip the 8-week Booking.com partner application entirely.
Input
| Field | Default | Description |
|---|---|---|
queries | required | Array of hotel search queries ("hotels in Amsterdam", "5-star hotels Tokyo", "beach resorts Bali") |
max_results_per_query | 20 | Cap hotels per query (1-100) |
hl | en | Language code (en, nl, de, es, fr, it, ja, pt, pl, sv) |
gl | us | Two-letter country code controlling currency + market |
use_cookies | true | Use a fresh anonymous Google session — bypasses the EU consent banner |
use_proxy | false | Optional. Apify direct connection works for Google Travel; only enable on rate limits |
fetch_details | false | When true, fetches each hotel's detail page with mobile UA (~1.5-3s per hotel) and adds rooms[], ota_offers[], amenities, photos, descriptions, and review breakdown |
detail_concurrency | 5 | Parallel detail fetches (1-25). Higher = faster, more session pressure |
Output
{"position": 1,"name": "Pulitzer Amsterdam","rating": 4.5,"reviews_count": 4823,"review_breakdown": {"5": 3201, "4": 1102, "3": 312, "2": 121, "1": 87},"star_class": "5-star hotel","star_rating": 5,"price_per_night": "€385","best_price_numeric": 385,"featured_price_display": "€385","featured_price_numeric": 385,"currency": "EUR","check_dates": {"check_in": "2026-05-12", "check_out": "2026-05-13", "nights": 1},"detail_url": "https://www.google.com/travel/hotels/entity/CgsI_K-G…","search_query": "hotels in Amsterdam","description_short": "Refined hotel set in 25 canal houses…","description_long": "The Pulitzer Amsterdam is a luxury 5-star hotel…","amenities": [{"group": "General", "item": "Free Wi-Fi"},{"group": "Wellness", "item": "Spa"},{"group": "Family", "item": "Kid-friendly"}],"photos": ["https://lh3.googleusercontent.com/proxy/abc=w1080-h720", "..."],"ota_offers": [{"ota": "Booking.com", "price_per_night": "€385", "price_total": "€385", "deeplink": "https://www.google.com/travel/clk?..."},{"ota": "Expedia", "price_per_night": "€392", "price_total": "€392", "deeplink": "https://www.google.com/travel/clk?..."},{"ota": "Hotels.com", "price_per_night": "€401", "price_total": "€401", "deeplink": "https://www.google.com/travel/clk?..."}],"rooms": [{"ota": "Booking.com", "room_name": "Deluxe King Room", "price_display": "€385", "price_numeric": 385, "price_int": 385, "deeplink": "https://www.google.com/travel/clk?..."},{"ota": "Booking.com", "room_name": "Junior Suite", "price_display": "€661", "price_numeric": 661, "price_int": 661, "deeplink": "https://www.google.com/travel/clk?..."}]}
ota_offers[] is the full booking-partner ladder; rooms[] is the per-room matrix Google only embeds in the mobile SSR template (the actor switches UA automatically when fetch_details=true). Both are empty arrays when fetch_details=false — that mode returns just the search-results-page summary.
Use cases
Hotel revenue manager rate-shopping competitor properties. You manage a 4-star property in Barcelona and need to know every Monday how Booking.com, Expedia, and Hotels.com are pricing your 12 closest competitors over the next 30 nights. You queue 12 queries × 30 dates × full details = 360 hotel detail fetches, $4.32 a week. The dataset gives you exact OTA-by-OTA undercut margins so you can decide whether to drop your Booking.com rate by €15 or hold.
Travel-tech founder building a hotel meta-search. You want a Trivago / Kayak alternative for boutique hotels. The single hardest unlock is the OTA rate ladder — and Booking.com partner approval takes 8 weeks with sales calls. This actor gives you the same OTA prices Google Hotels already aggregates: 18-31 booking partners per hotel with deeplinks. Ship the MVP in two weeks for $500 of scraping cost, validate demand, then go for partner deals after you have traffic.
Travel agency building corporate hotel-program data. Your client wants to negotiate corporate rates for the 50 hotels their employees stay at most. Pull rooms[] once a week for a year — you have a full per-room price history showing rate seasonality, lead-time premiums, and which OTA consistently wins on each property. Use that as leverage in the corporate-rate RFP.
Hotel-pricing analyst doing market intelligence. You sell a $200/month report on hotel-rate trends in 25 European cities. Each report needs best_price_numeric and star_rating for ~500 hotels per city. Run search-only mode (no details): 25 cities × 100 hotels × $0.003 = $7.50 per refresh, fully automated.
How it compares
| Actor | Price per hotel detail | Per-room pricing | OTA rate ladder | Review breakdown |
|---|---|---|---|---|
| This actor (s-r/free-google-hotels-scraper) | $0.012 (full detail) / $0.003 (search-only) | yes (Deluxe Room, Junior Suite, etc.) | yes (18-31 OTAs) | yes (5/4/3/2/1) |
martin.forejt/google-hotels-scraper (#3 on google hotels scraper SERP) | per-result, similar tier | partial | yes | partial |
webautomation.io/google-hotels-custom-extractor (#4 SERP) | tool subscription | no | no | no |
| Bright Data Google Hotels SERP API (#1 SERP) | $0.50-$0.75 per request | no | yes | partial |
| SerpApi Google Hotels (#6 SERP) | $0.005-$0.025 per query | no | yes (limited) | yes |
The competitive edge here is rooms[] — most Google Hotels scrapers return the OTA list but skip per-room pricing because it only appears in Google's mobile SSR variant. This actor swaps to a mobile UA on detail fetches so you get the full room matrix in one call.
Pricing
This actor uses Apify's pay-per-event monetization with a two-tier model. Search mode ($0.003 per hotel) returns the hotel name, rating, reviews count, summary price, and detail URL — fast and cheap for inventory or list-building tasks. Full-detail mode ($0.012 per hotel, opt in via fetch_details=true) adds the OTA rate ladder, per-room pricing, amenities, descriptions, photos, and review breakdown. All pricing is pay-per-event — you only pay for results you receive. No actor-start fee, no per-compute-unit charges.
Limits and gotchas
fetch_details=trueadds ~1.5-3s per hotel and runs in parallel up todetail_concurrency(capped at 25); a 100-hotel run with details takes ~30-60 seconds end-to-end- Per-room data only loads on Google's mobile SSR template — the actor switches the User-Agent automatically on detail calls, so you don't need to configure anything
- Google Hotels caps each search-results page at 100 hotels; for >100 results in one city, run multiple narrower queries (e.g.
"5-star hotels Amsterdam","3-star hotels Amsterdam") - The OTA rate ladder is sourced from the
ds:1hydration blob — when Google A/B-tests a new layout, expect 1-2 day lag while we update the parser - Apify residential proxy is not required — Apify's default datacenter IPs work fine for Google Travel; leaving
use_proxy=falsesaves you ~$8/GB - Cold-start time is ~3-5 seconds for the first request; subsequent requests in the same run reuse the session pool
- Prices are quoted in the local currency Google Travel renders for the
glcountry code; for cross-currency comparison, convert downstream using thecurrencyfield
FAQ
Can I scrape Google Hotels without an API key?
Yes. This actor calls google.com/travel/search and google.com/travel/hotels/entity/<id> directly with anonymous Google session cookies — no Google API key, Booking.com partner ID, or Expedia EAN credential is needed. You only pay Apify's per-result rate.
How does the per-room pricing work?
When fetch_details=true, the actor fetches the property page with a mobile User-Agent. Google's mobile SSR variant embeds the room matrix (Deluxe King €385, Junior Suite €661, Family Room €420, etc.) inside the ds:1 JSON payload — desktop UA gets a stripped-down version that omits this. The rooms[] array is populated only on detail fetches.
Will Google rate-limit my scraping?
At default settings (5 concurrent detail fetches, fresh session cookies, use_proxy=false) the actor sustains ~150 hotel details per minute on Apify's default IPs without throttling. If you push detail_concurrency to 25 you may see occasional 429s — the actor retries automatically. For sustained >500/min throughput, enable use_proxy=true and supply a residential proxy URL.
Do I need to provide cookies?
No. The actor pulls fresh anonymous Google session cookies from a managed minter pool on every run. Setting use_cookies=true (the default) is the recommended path; turning it off triggers the EU consent banner and reduces success rate.
What's the cost to scrape 1000 hotels with full details?
1000 × $0.012 = $12 per run. For comparison: scraping 1000 hotels with search-only data is 1000 × $0.003 = $3. Most users start with search-only on a broad query, filter the result set down to the 50-100 hotels they actually care about, then re-run those with fetch_details=true — a $3 + $1.20 workflow that gets full OTA pricing for one city for under $5.
Related Actors
- Free Google Maps Scraper — pull places, contact details, hours, and lat/lng for any Google Maps category
- Free Google Maps Reviews Scraper — every review for any place: stars, text, owner reply
- Free Google Shopping Reviews — Google Shopping product reviews and rating breakdown by SKU