Google Hotels Search Scraper
Pricing
from $3.00 / 1,000 hotel results
Google Hotels Search Scraper
Scrape Google Hotels search results — hotel name, rating, reviews count, price, check-in/out dates, URL, address. Search by query+location+dates or direct URL. MCP-ready.
Pricing
from $3.00 / 1,000 hotel results
Rating
0.0
(0)
Developer
Khadin Akbar
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Share
Extract hotel listings from Google Hotels — names, star ratings, review counts, nightly prices, check-in/check-out dates, property URLs, addresses, amenities, and thumbnail images. Search by keyword + location + dates, or paste a direct Google Hotels URL. Cookieless, no login required. MCP-ready.
Best fit for this actor
Use this actor when you need structured hotel data from Google Hotels: price monitoring, destination research, competitor rating analysis, travel inventory pipelines, or AI-agent hotel lookups.
For reviews and sentiment analysis of specific hotels, pair this actor with tripadvisor-scraper — run this actor first to discover hotels, then feed the property names to TripAdvisor for review data.
Workflow story
A travel startup monitors hotel prices for 10 destination cities weekly. They run this actor once per city (query: hotels, location: Barcelona, checkIn/Out for the target weekend, maxResults: 40). The output dataset is piped via Make into Google Sheets, where a formula flags properties with price changes above 15% from the prior week. The whole flow runs in under 3 minutes per city; see the Pricing tab for current event and compute rates.
Why use this actor?
Google Hotels aggregates live prices across dozens of OTAs and brand sites in one place. This actor gives you that data programmatically for price monitoring, competitor benchmarking, travel market research, and AI-agent pipelines — without a browser or Google account.
| Use case | What you get |
|---|---|
| Hotel price monitoring | Track nightly rates across dates and markets on a schedule |
| Competitor benchmarking | Compare star ratings and review volumes for properties in a destination |
| Travel data pipelines | Structured hotel inventory for BI tools, dashboards, or LLM pipelines |
| Lead generation | Find hotels by city for hospitality vendors or tour operators |
| Research | Price and rating datasets for academic or market-research work |
What data does it return?
| Field | Type | Description |
|---|---|---|
hotelName | string | Property name as listed on Google Hotels |
rating | number | Average guest rating (e.g. 4.3) |
reviewsCount | number | Total guest reviews count |
price | string | Nightly price (numeric string, no commas) |
currency | string | Currency symbol or code (e.g. $, EUR) |
checkIn | string | Check-in date YYYY-MM-DD (from your input) |
checkOut | string | Check-out date YYYY-MM-DD (from your input) |
hotelUrl | string | Google Hotels property page URL |
sourceUrl | string | Search page URL the row was extracted from |
location | string | City or locality from structured data |
address | string | Street address from JSON-LD when available |
amenities | array | Up to 10 amenity labels from structured data |
image | string | Thumbnail image URL |
scrapedAt | ISO 8601 | Timestamp of extraction |
How to use
- Open the Input tab in Apify Console.
- Fill in Search query (e.g.
boutique hotels) and Location (e.g.London) — or paste a full Google Hotels URL to override both. - Set optional Check-in and Check-out dates (YYYY-MM-DD) and Adults count to get nightly price data.
- Set Max results — each saved row triggers one
hotel-resultPay per event charge. - Click Start. Download results from the Dataset tab in JSON, CSV, Excel, or XML.
Input example
{"query": "hotels","location": "New York","checkIn": "2026-10-01","checkOut": "2026-10-03","adults": 2,"maxResults": 20,"maxPages": 2,"language": "en","countryCode": "us","useApifyProxy": true,"apifyProxyGroups": ["RESIDENTIAL"]}
Or supply a direct URL and omit query/location:
{"googleHotelsUrl": "https://www.google.com/travel/hotels?hl=en&gl=us&q=hotels+in+paris&checkin=2026-12-20&checkout=2026-12-23&adults=2"}
Output example
[{"hotelName": "The Plaza Hotel","rating": 4.5,"reviewsCount": 8423,"price": "795","currency": "$","checkIn": "2026-10-01","checkOut": "2026-10-03","hotelUrl": "https://www.google.com/travel/hotels/entity/...","sourceUrl": "https://www.google.com/travel/hotels?q=hotels+New+York&...","location": "New York","address": "768 5th Ave, New York","amenities": ["Free WiFi", "Pool", "Spa"],"image": "https://lh3.googleusercontent.com/...","scrapedAt": "2026-10-01T09:23:14.000Z"}]
API example
Run via curl (replace YOUR_API_TOKEN):
curl -X POST \"https://api.apify.com/v2/acts/khadinakbar~google-hotels-search-scraper/runs?token=YOUR_API_TOKEN" \-H "Content-Type: application/json" \-d '{"query": "boutique hotels","location": "Paris","checkIn": "2026-12-20","checkOut": "2026-12-23","adults": 2,"maxResults": 20,"useApifyProxy": true}'
Or via the JavaScript client:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });const run = await client.actor('khadinakbar/google-hotels-search-scraper').call({query: 'boutique hotels',location: 'Paris',checkIn: '2026-12-20',checkOut: '2026-12-23',adults: 2,maxResults: 20,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
AI agent / MCP prompt card
When calling this actor as a tool in Claude, ChatGPT, or another AI agent:
Tool:
khadinakbar/google-hotels-search-scraperGoal: Get hotel listings with prices for a destination and dates Input:{ "query": "luxury hotels", "location": "Tokyo", "checkIn": "YYYY-MM-DD", "checkOut": "YYYY-MM-DD", "adults": 2, "maxResults": 30 }Returns: Array of hotel rows — name, rating, reviewsCount, price, currency, hotelUrl, location, scrapedAt Billing: Pay per event — onehotel-resultevent per row + platform compute (see Pricing tab for current rates) Dataset readback: Useclient.dataset(run.defaultDatasetId).listItems()after the actor finishes; allow 5-10 seconds for data to be fully available Empty result:VALID_EMPTY— Google served no structured hotel data for this query/date combination; try a broader query or different dates
Pricing
This actor uses Pay per event + Apify platform usage compute (billed at standard rates). The Pricing tab on the actor page is always the live source of truth for current event prices and compute rates.
| Event | When charged |
|---|---|
apify-actor-start | Once per run |
hotel-result | Once per saved hotel row |
You can set a maxTotalChargeUsd cap in the API call options to bound total spend per run.
Builder's Note
I built this actor around a discovery from testing Google Hotels directly: search result pages served to crawlers embed @type: Hotel JSON-LD structured data, which is the richest extraction path (hotel name, rating, review count, full address, and amenity list all arrive in one block). In my testing across 22 cloud runs on 20+ destinations, the JSON-LD path fired on the majority of responses, and the DOM fallback ([role="heading"] inside card containers + aria-label price/rating regex) caught the rest — New York runs filled price and rating on 18 of 18 rows, and even Japanese- and Spanish-language runs parsed prices correctly because the currency-symbol regex is language-independent. I learned two things the hard way: Google silently redirects the initial google.com/travel/hotels request to google.com/travel/search with hotel-mode parameters intact (the crawler follows it transparently), and deep-pagination links are embedded in JS rather than plain anchors, so large-capped runs in a single city often surface the first page's inventory — set a higher maxPages and re-run with varied queries for full coverage. Both extraction paths write to the same output schema, so downstream pipelines stay simple regardless of which path produced a given row.
Extraction approach
The actor uses JSON-LD structured data (@type: Hotel) as the primary extraction path — richer, with name, rating, address, and amenities. When JSON-LD is absent, it falls back to DOM card parsing for name, rating, price, and image. Both paths write to the same output schema.
Proxy requirements
Google Hotels requires residential proxies for reliable access. Default group: RESIDENTIAL. Keep useApifyProxy: true in production; set false only for local testing without a proxy subscription.
Tips for best results
- Specific queries return sharper results.
boutique hotel Marrakechworks better than justhotels. - Add dates for price data. Without checkIn/checkOut, Google may omit nightly prices.
- Raise
maxPages(up to 20) to capture deep destination inventories. - Set low
maxResults(5-10) for quick scheduled price-check scripts.
Scope and how it handles edge cases
- HTTP-only, no browser required. Fast and lightweight. For most Google Hotels queries, the actor retrieves server-rendered HTML directly. If Google returns a JavaScript-only page for a particular query, the run reports
VALID_EMPTY— try RESIDENTIAL proxy or broader search terms. - Price data is best-effort. When structured data is absent, DOM regex may miss some prices.
- Amenities come from JSON-LD only. The DOM fallback does not extract amenities.
- EU and UK markets route through US proxy exits. Google applies a consent wall to EU exit IPs; US exits combined with market-specific URL parameters keep result lists localized to the selected market, though nightly prices for EU markets may quote in USD.
- RESIDENTIAL proxy delivers consistent access. Residential IPs succeed reliably against Google; datacenter IPs see far lower success rates.
Related actors
For a full travel data workflow, combine this actor with:
- tripadvisor-scraper — Hotel and restaurant reviews from TripAdvisor for sentiment analysis on properties found here
- airbnb-scraper — Short-term rental listings for price comparison alongside hotels
- google-maps-leads-scraper — B2B leads from nearby businesses when researching hotel destinations
Legal disclaimer
This actor extracts publicly visible data from google.com/travel/hotels in the same way a user would browse the site. It does not bypass authentication, login walls, or paywalls, and does not access private or personally identifiable data. Use is subject to Google's Terms of Service. The actor author and Apify bear no responsibility for how extracted data is used. Always verify compliance with applicable laws and regulations before production use.