Google Hotels Search Scraper avatar

Google Hotels Search Scraper

Pricing

from $3.00 / 1,000 hotel results

Go to Apify Store
Google Hotels Search Scraper

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

Khadin Akbar

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

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 caseWhat you get
Hotel price monitoringTrack nightly rates across dates and markets on a schedule
Competitor benchmarkingCompare star ratings and review volumes for properties in a destination
Travel data pipelinesStructured hotel inventory for BI tools, dashboards, or LLM pipelines
Lead generationFind hotels by city for hospitality vendors or tour operators
ResearchPrice and rating datasets for academic or market-research work

What data does it return?

FieldTypeDescription
hotelNamestringProperty name as listed on Google Hotels
ratingnumberAverage guest rating (e.g. 4.3)
reviewsCountnumberTotal guest reviews count
pricestringNightly price (numeric string, no commas)
currencystringCurrency symbol or code (e.g. $, EUR)
checkInstringCheck-in date YYYY-MM-DD (from your input)
checkOutstringCheck-out date YYYY-MM-DD (from your input)
hotelUrlstringGoogle Hotels property page URL
sourceUrlstringSearch page URL the row was extracted from
locationstringCity or locality from structured data
addressstringStreet address from JSON-LD when available
amenitiesarrayUp to 10 amenity labels from structured data
imagestringThumbnail image URL
scrapedAtISO 8601Timestamp of extraction

How to use

  1. Open the Input tab in Apify Console.
  2. Fill in Search query (e.g. boutique hotels) and Location (e.g. London) — or paste a full Google Hotels URL to override both.
  3. Set optional Check-in and Check-out dates (YYYY-MM-DD) and Adults count to get nightly price data.
  4. Set Max results — each saved row triggers one hotel-result Pay per event charge.
  5. 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-scraper Goal: 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 — one hotel-result event per row + platform compute (see Pricing tab for current rates) Dataset readback: Use client.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.

EventWhen charged
apify-actor-startOnce per run
hotel-resultOnce 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 Marrakech works better than just hotels.
  • 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.

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

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.