Free Google Hotels Scraper — Search + Prices avatar

Free Google Hotels Scraper — Search + Prices

Pricing

Pay per usage

Go to Apify Store
Free Google Hotels Scraper — Search + Prices

Free Google Hotels Scraper — Search + Prices

Pricing

Pay per usage

Rating

0.0

(0)

Developer

SR

SR

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 hours ago

Last modified

Categories

Share

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) plus best_price_numeric and currency parsed 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, plus check_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

FieldDefaultDescription
queriesrequiredArray of hotel search queries ("hotels in Amsterdam", "5-star hotels Tokyo", "beach resorts Bali")
max_results_per_query20Cap hotels per query (1-100)
hlenLanguage code (en, nl, de, es, fr, it, ja, pt, pl, sv)
glusTwo-letter country code controlling currency + market
use_cookiestrueUse a fresh anonymous Google session — bypasses the EU consent banner
use_proxyfalseOptional. Apify direct connection works for Google Travel; only enable on rate limits
fetch_detailsfalseWhen 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_concurrency5Parallel 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

ActorPrice per hotel detailPer-room pricingOTA rate ladderReview 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 tierpartialyespartial
webautomation.io/google-hotels-custom-extractor (#4 SERP)tool subscriptionnonono
Bright Data Google Hotels SERP API (#1 SERP)$0.50-$0.75 per requestnoyespartial
SerpApi Google Hotels (#6 SERP)$0.005-$0.025 per querynoyes (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=true adds ~1.5-3s per hotel and runs in parallel up to detail_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:1 hydration 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=false saves 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 gl country code; for cross-currency comparison, convert downstream using the currency field

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.