Google Hotels Scraper — Prices, OTA Rates & Reviews avatar

Google Hotels Scraper — Prices, OTA Rates & Reviews

Pricing

from $2.59 / 1,000 hotel scrapeds

Go to Apify Store
Google Hotels Scraper — Prices, OTA Rates & Reviews

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

Andrej Kiva

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

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 hereAirbnb Occupancy ScraperIdealista 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 maxItems and split queries (neighborhood, star class)
  • Short-term rental occupancy calendars — use Airbnb Occupancy Scraper

Key Features

  • Destination searchhotels in Paris, Tokyo 4-star hotels, or a city in location
  • 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 ladderincludeDetails fetches 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.priceChange vs the previous run
  • HTTP path — Chrome TLS impersonation, no Playwright
  • MCP / AI ready — call from assistants via Apify MCP

Use Cases

Use caseWhat you get
Comp-set rate shopLead nightly prices for hotels in a city on chosen dates
OTA ladderPer-source prices Google shows (Booking, Expedia, Hotels.com, …)
ADR / market snapshotRatings, stars, GPS, amenities for a destination
Travel-tech MVPJSON hotel inventory without a Hotel Center partnership
Scheduled monitorPrice deltas on the same query and dates vs last run
STR vs hotel mixHotels 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

FieldDescription
searchQueriesDestinations or hotel keywords (or entity tokens)
locationCity used when queries are empty (hotels in {location})
startUrlsGoogle Hotels search or entity URLs
checkInDate / checkOutDateYYYY-MM-DD stay window
adults / childrenOccupancy (Google default is 2 adults)
currency / language / countrycurr, hl, gl — set country to match the currency market
maxItemsRow cap (first search page is typically ~20 organic hotels)
sortByEmpty = relevance; 3 lowest price; 8 highest rating; 13 most reviewed
minPrice / maxPrice / minRating / hotelClassPost-filters on scraped rows
vacationRentalsSearch vacation rentals instead of hotels
includeDetailsFetch OTA ladder + rooms on the entity page
includeAdsKeep sponsored hotels (isAd=true)
monitorModeAttach price-change vs previous run
proxyConfigurationOptional; residential if consent/empty results

Output

One dataset row per hotel.

FieldDescription
nameProperty name
starRating / hotelClassOfficial stars and label when Google shows them
overallRating / reviewCountGuest rating and volume
pricePerNight / pricePerNightDisplay / currencyLead nightly rate
checkInDate / checkOutDate / nightsStay window used for the price
gpsLatitude / gpsLongitudeCoordinates
amenities / images / nearbyPlacesSearch-card extras
propertyToken / entityUrl / cidGoogle identity
bookingSourcesPer-OTA prices (when includeDetails)
roomsPer-room rates when the mobile entity page includes them
vendorCountHow many booking sources Google listed
monitorPrevious 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 ApifyClient
client = 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.