Google Hotels Scraper - Hotel Prices, Ratings & Booking Offers
Pricing
$3.00 / 1,000 hotel results
Google Hotels Scraper - Hotel Prices, Ratings & Booking Offers
Google Hotels scraper for hotel prices on your exact dates: search any city or look up hotels and get the lowest rate, every booking site's price (Booking.com, Agoda, Trip.com), ratings, amenities and coordinates. Hotel price tracking and comparison over plain HTTP, no browser, no login.
Pricing
$3.00 / 1,000 hotel results
Rating
0.0
(0)
Developer
Data Gleaner
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
Google Hotels API - Hotel Price Comparison, Ratings & Booking Offers
Scrape Google Hotels prices for your exact dates: search any city or hotel and get the lowest rate plus every booking site's price and link (Booking.com, Agoda, Trip.com, Hostelworld and more), with ratings, star class, amenities, photos and coordinates, as one clean JSON record per hotel.
It works as a Google Hotels API for hotel price tracking and Booking.com price comparison: filter by rating, stars and price, and skipped hotels are free. It calls Google Travel over plain HTTP: no browser, no login, no Google account. A 100-hotel search takes about 7 requests; full details add one request per hotel.
What does Google Hotels Scraper do?
It reads the same results a visitor sees on Google Hotels for a city, neighbourhood or hotel name, and returns them as JSON, CSV or Excel through the Apify dataset and API. Typical uses:
- Hotel price tracking: run daily for the same dates and track a city or a hotel set over time.
- Hotel price comparison: see which provider is cheapest for each hotel, and the spread between providers.
- Market research: map hotel supply, ratings and price levels in any neighbourhood.
- Travel apps and AI agents: feed date-specific hotel prices into an itinerary tool or an LLM agent.
Input
| Field | Meaning |
|---|---|
locations | Free text: Tokyo, Paris 8e, Waikiki, Honolulu, hostels in Berlin. Plain place names are searched as "hotels in ...". |
hotelUrls | Detail mode. Google Hotels hotel URLs or the bare entityId from earlier results. |
checkIn, checkOut | YYYY-MM-DD. Default: 30 days from today, 2 nights. Prices are for these dates. |
adults | 1 to 8. Default 2. |
currency | ISO code, default USD. |
maxHotelsPerLocation | Default 20, max 1000. Pages are followed until reached or Google has no more. |
minRating | 1 to 5, e.g. 4.2. Hotels with no rating are skipped. |
hotelClass | Star classes to keep, e.g. ["4", "5"]. Unclassed guest houses, hostels and apartments are skipped. |
minPrice, maxPrice | Lowest nightly price for your dates, in your currency. Hotels with no price for your dates are skipped when either is set. |
sortBy | lowestPrice, highestRating or mostReviewed. Off by default (Google's order, kept in position). When set, the Actor first collects about three times maxHotelsPerLocation matching hotels per location (at least 60, at most 200, and never fewer than you asked for) and returns the best maxHotelsPerLocation by that order, so you get the cheapest or best-rated of the area, not of the first page. Hotels without the value come last. |
includeDetails | Default on. One extra request per hotel adds address, check-in times, website and the provider offers. Off gives a fast list with only the lowest price. |
language, countryCode | Interface language (en) and market (us). |
requestDelaySecs | Pacing between requests, default 1.5. |
proxyConfiguration | Optional, off by default. |
Filters and sortBy apply to locations searches only, not to hotelUrls lookups. Hotels skipped by a filter are not charged. If you already call another Google Hotels Actor, these input names are also accepted: checkInDate, checkOutDate, maxResults (same as maxHotelsPerLocation, and it wins if both are set) and searchQuery (a location string). With no input at all, the Actor runs a built-in example of 5 hotels in Paris.
{"locations": ["Tokyo", "Paris 8e"],"checkIn": "2026-11-10","checkOut": "2026-11-12","adults": 2,"currency": "USD","maxHotelsPerLocation": 50,"minRating": 4.2,"hotelClass": ["4", "5"],"sortBy": "lowestPrice"}
Output
{"name": "Le Tsuba Hotel","position": 1,"entityId": "ChkI8bPIkrOozLonGg0vZy8xMWNseWdzeDVmEAE","url": "https://www.google.com/travel/hotels/entity/ChkI8bPIkrOozLonGg0vZy8xMWNseWdzeDVmEAE?hl=en&gl=us&ts=...","address": "45 Rue des Acacias, 75017 Paris, France","latitude": 48.877756,"longitude": 2.2930822,"countryCode": "FR","starClass": 4,"propertyType": "4-star tourist hotel","rating": 4.6,"reviewCount": 1590,"amenities": ["Free Wi-Fi", "Air conditioning", "Pet-friendly", "Fitness center", "Parking"],"thumbnail": "https://lh3.googleusercontent.com/...","website": "http://www.tsubahotel.com/","phone": "+33 1 ...","checkInTime": "3:00 PM","checkOutTime": "12:00 PM","lowestPrice": 185.28,"cheapestProvider": "Bluepillow.tw","offersCount": 2,"currency": "USD","lowestPriceDisplay": "$185","totalPriceDisplay": "$371","pricesForDates": true,"offers": [{"provider": "Bluepillow.tw", "pricePerNight": 185.28, "priceDisplay": "$185", "totalPrice": 370.56, "totalPriceDisplay": "$371", "isSponsored": false, "link": "https://www.google.com/travel/lodging/clk?..."},{"provider": "Amimir.com", "pricePerNight": 193.7, "priceDisplay": "$194", "totalPrice": 387.4, "totalPriceDisplay": "$387", "isSponsored": false, "link": "https://www.google.com/travel/lodging/clk?..."}],"searchLocation": "Paris 8e","checkIn": "2026-11-10","checkOut": "2026-11-12","nights": 2,"adults": 2,"source": "search","scrapedAt": "2026-10-07T15:59:05+00:00"}
position is the hotel's 1-based rank in Google's results for that location, useful for rank tracking (null for hotelUrls lookups). cheapestProvider and offersCount summarize offers; each offer has isSponsored, true when the offer's link is a Google ad click-through (shown as Sponsored on Google). With full details on, records also carry tagline, description (Google's longer text; some hotels have none) and ratingsBreakdown (per-star percent and count, 5 stars first). Prices are as Google Hotels shows them for your market (countryCode); whether taxes and fees are included follows Google's display for that market.
The dataset has two views: Hotels (one row per hotel with the lowest price and cheapest site) and Offers (one row per booking-site offer, for every hotel).
Records also carry imageUrls (up to 5 photos) and googlePlaceId when Google provides them. lowestPrice and each pricePerNight are per night; totalPrice is for the whole stay. pricesForDates confirms Google priced the exact dates you asked for. A hotel with no availability on those dates is still returned, with lowestPrice: null and empty offers.
Pricing
Pay per result: $3.00 per 1,000 hotels ($0.003 per hotel). You pay only for hotels pushed to the dataset (hotels skipped by your filters cost nothing, so filtered runs are cheaper), and the run stops at your maximum charge. A 10-hotel test run costs $0.03.
Worked example: 5 cities at 100 hotels each is 500 hotels, which costs $1.50. Re-running the same set every day for 30 days costs $45.
Use it from the API
Run it synchronously and get the hotels back as JSON. Replace <YOUR_APIFY_TOKEN> with your token.
curl -X POST "https://api.apify.com/v2/acts/datagleaner~google-hotels-scraper/run-sync-get-dataset-items?token=<YOUR_APIFY_TOKEN>" \-H "Content-Type: application/json" \-d '{"locations": ["Tokyo"], "checkIn": "2026-11-10", "checkOut": "2026-11-12", "maxHotelsPerLocation": 20}'
It also works from n8n, Make or Zapier through the Apify integrations, since the output is a flat JSON record per hotel.
Use with Python
pip install apify-client, set the APIFY_TOKEN environment variable, and run. This input returns at most 10 hotels, about $0.03.
import osfrom apify_client import ApifyClientclient = ApifyClient(os.environ["APIFY_TOKEN"])run = client.actor("datagleaner/google-hotels-scraper").call(run_input={"locations": ["Tokyo"],"checkIn": "2026-11-10","checkOut": "2026-11-12","currency": "USD","maxHotelsPerLocation": 10,})for hotel in client.dataset(run.default_dataset_id).iterate_items():print(hotel["name"], hotel.get("rating"), hotel.get("lowestPrice"), hotel.get("currency"))
Use with JavaScript / Node.js
npm install apify-client, set APIFY_TOKEN, and run it as an ES module (.mjs).
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('datagleaner/google-hotels-scraper').call({locations: ['Tokyo'],checkIn: '2026-11-10',checkOut: '2026-11-12',currency: 'USD',maxHotelsPerLocation: 10,});const { items } = await client.dataset(run.defaultDatasetId).listItems();for (const hotel of items) console.log(hotel.name, hotel.rating, hotel.lowestPrice, hotel.currency);
Use it from n8n, Make, Zapier or an AI agent
Actor ID: datagleaner/google-hotels-scraper
Minimal input:
{"locations": ["Tokyo"], "checkIn": "2026-11-10", "checkOut": "2026-11-12", "maxHotelsPerLocation": 10}
Each tool below runs this Actor with your own Apify API token.
-
n8n: add the Apify node (
@apify/n8n-nodes-apify). On n8n Cloud you install it from the community node registry. Choose Run an Actor and get dataset, set Actor todatagleaner/google-hotels-scraperand paste the input above. -
Make: use the Apify app's Run an Actor module, then Get Dataset Items to read the results. Watch Actor Runs can trigger a scenario when a run finishes.
-
Zapier: use the Apify action Run Actor, then the search Fetch dataset items. The trigger Finished Actor run starts a Zap when a run ends.
-
AI agents (MCP): connect to
https://mcp.apify.com?tools=datagleaner/google-hotels-scraper. In Claude Code:claude mcp add --transport http apify "https://mcp.apify.com?tools=datagleaner/google-hotels-scraper"Then run
/mcpto sign in to Apify in your browser. Then ask in plain language, for example: "Find 10 hotels in Shinjuku, Tokyo for 2 adults from November 10 to 12, prices in USD, and tell me which booking site is cheapest for each." An agent without the Actor preloaded can find it with Apify'ssearch-actorstool by searching "google hotels". -
LangChain (Python):
# pip install langchain-apify, then set APIFY_TOKEN in your environmentimport jsonfrom langchain_apify import ApifyActorsTooltool = ApifyActorsTool("datagleaner/google-hotels-scraper")result = tool.invoke({"run_input": json.loads('{"locations": ["Tokyo"], "checkIn": "2026-11-10", "checkOut": "2026-11-12", "maxHotelsPerLocation": 10}')})
Limits
- Google lists around 500 distinct hotels per query at most. For more coverage, search sub-areas (
hotels in Shinjuku,hotels in Asakusa). amenitiesare the highlight amenities Google shows on the result card (about 6 to 9 per hotel), not the complete list. Hotels fetched byhotelUrlsalone carry noamenities.- Providers differ by market; set
countryCodeto the market you care about. - Dates must be today or later with check-out after check-in.
- At very high volume Google may start refusing requests. The Actor backs off, refreshes its connection and finishes what it has. Enable
proxyConfigurationif that happens.
FAQ
Is there a Google Hotels API? Google offers no public API for hotel prices. This Actor works as one: you call the Apify API with places and dates, it fetches the Google Hotels results and returns JSON.
How do I track Google Hotels prices over time? Schedule the Actor daily for the same locations and dates and compare lowestPrice, or each provider's pricePerNight, between runs. Each record carries scrapedAt.
Which booking sites does it compare? Every provider Google Hotels lists for that hotel in your market, such as Booking.com, Agoda, Trip.com and Hostelworld, each with its per-night price, total price and link. Provider offers need includeDetails on (the default).
Are the prices real? They are what Google Hotels shows for your dates, currency and market, and pricesForDates confirms Google priced the exact dates you asked for. Each offer links through Google to the provider's booking page.
Can I get reviews or room types? Not in this version.
Responsible use
This Actor reads publicly visible Google Hotels pages without logging in. Use the data in line with Google's terms and the providers' terms. Hotel records are business data, not personal data; if you combine them with anything about individuals, the data-protection obligations are yours.