Google Hotels Scraper

Pay-per-hotel on Apify · no login, no API key

Scrape Google Hotels at scale: hotel discovery, live per-night prices, and the full OTA price ladder - every booking source Google shows (Booking.com, Agoda, Expedia, Hotels.com, Priceline, Trip.com, KAYAK…) with its rate and a direct booking link, plus per-room rates, star class, guest ratings, and optional reviews with exact publish dates and owner responses. One row per hotel - no row-explosion.

Google Hotels Scraper output: the Prices view - one row per booking source with per-night price, total, currency, official-site flag and a booking link
The Prices view: every booking source's rate per hotel and room, with the official-site rate flagged and a direct booking link on each row.

What you get

One row per hotel, with all prices nested on the row so you never explode a property into dozens of rows:

The OTA price ladder, on one row

A single run of hotels in New York City returns each hotel with its complete source ladder. Real sample output (2 hotels, one night):

HotelClassGuest ratingLead / nightBooking sourcesCheapest source
The Manhattan at Times Square Hotel4★3.0 (10,129)$19517Super.com $195
New York Hilton Midtown4★4.0 (12,020)$23524Super.com $235

For the Hilton, the ladder spans Expedia $302, Booking.com $308, Priceline $308, Agoda $308, Hotels.com $302, Trip.com $302 and a dozen more - each nested on the one hotel row, with the official-site rate flagged. Grab the full sample CSV to see all 37 source-price rows.

Sample output

One hotel row (trimmed). Download results as JSON, CSV, Excel, or HTML:

{
  "name": "The Manhattan at Times Square Hotel",
  "starClass": 4, "rating": 3.0, "reviewCount": 10129,
  "propertyType": "hotel", "latitude": 40.7623, "longitude": -73.9826,
  "checkInDate": "2026-08-15", "checkOutDate": "2026-08-16", "nights": 1,
  "currency": "USD", "leadPrice": 195, "leadPriceTotal": 195, "vendorCount": 17,
  "offers": [
    { "source": "Super.com",    "perNight": 195, "total": 195, "roomName": null,            "official": false, "bookingLink": "https://www.google.com/aclk?..." },
    { "source": "Booking.com",   "perNight": 290, "total": 290, "roomName": null,            "official": false, "bookingLink": "https://www.google.com/aclk?..." },
    { "source": "Expedia.com",   "perNight": 292, "total": 292, "roomName": null,            "official": false, "bookingLink": "https://www.google.com/aclk?..." },
    { "source": "Official site", "perNight": 308, "total": 308, "roomName": "Standard room", "official": true,  "bookingLink": "https://www.google.com/aclk?..." }
  ],
  "vendors": [ { "source": "Super.com", "bookingLink": "https://www.google.com/aclk?...", "official": false } ],
  "hotelUrl": "https://www.google.com/travel/hotels/entity/ChkI...",
  "entityToken": "ChkIooCAqvyy0fDgARoML2cvMWhoZ18zbWdzEAE",
  "markdownContent": "# The Manhattan at Times Square Hotel (Google Hotels) ..."
}

Each offers[] row also carries checkInDate, checkOutDate and currency (omitted above for brevity), so every priced row stands on its own.

Output fields

Two datasets: Hotels (one row per hotel, prices nested) and Reviews (one row per guest review). Full dictionary in the GitHub docs.

Hotels fieldTypeWhat it is
namestringHotel name.
starClass / rating / reviewCountnumberHotel-class stars (1–5), average guest score (/5), and total review count.
propertyTypestringhotel, resort, apartment, vacation rental
latitude / longitudenumberCoordinates.
checkInDate / checkOutDate / nightsstring / intStay the prices are for.
currencystringCurrency of all prices in the row.
leadPrice / leadPriceTotalnumberCheapest per-night and total across all sources.
vendorCountintegerHow many booking sources sell the hotel.
offersarrayThe prices table - see below.
vendorsarrayBooking-source directory {source, bookingLink, official} (no prices).
hotelUrl / entityToken / cidstringGoogle Hotels deep link + stable IDs.
markdownContentstringLLM-ready summary block for RAG.
offers[] rowTypeWhat it is
sourcestringBooking source (Booking.com, Agoda…); the hotel's own row is Official site.
checkInDate / checkOutDatestringThe stay dates this priced row is for (base stay or a price-window date).
roomNamestring \| nullRoom type, when the source exposes per-room rates.
perNight / total / currencynumber / stringPer-night price, whole-stay total, and currency.
officialbooleantrue only for the hotel's direct-booking row.
bookingLinkstringDeep link to book on this source.
Reviews fieldTypeWhat it is
reviewerName / rating / ratingMaxstring / numberReviewer and their score (typically out of 5).
reviewTextstringReview body (empty for rating-only reviews).
publishedAtstringExact review date (ISO-8601), decoded from Google's timestamp.
relativeDatestringAs Google shows it, e.g. 2 months ago.
ownerResponseobjectThe hotel's reply {text, date}, when present.
hotelName / hotelUrl / entityTokenstringHotel context merged onto every review row.
markdownContentstringLLM-ready per-review block for RAG.
Google Hotels Scraper Overview: one row per hotel with star class, guest rating, review count, lead price, nested offers and vendors, and coordinates
The Overview: one row per hotel - stars, rating, lead price, the nested price ladder and coordinates.
Google Hotels Scraper Reviews dataset: reviewer name, rating, review text, exact publish date, relative date, owner response and hotel name per row
The separate Reviews dataset: reviewer, rating, text, exact publish date and owner response.

Why this scraper

Who it's for

How it compares

An alternative to enterprise rate-shopping suites and to piecing together official APIs - on pay-per-use pricing, with the raw data you own.

 This scraperEnterprise rate tools
(OTA Insight, Lighthouse, RateGain)
Official Google / OTA APIs
Pricing modelPay-per-use, no licenseAnnual seat licenseLimited / no public price API
Full OTA price ladder✓ every source Google shows
Per-room rates✓ where the source exposes themPartial
Multi-date / forward windows✓ up to 60 days ahead
Guest reviews included✓ exact dates + owner replies
Raw data you own & pipe anywhere✓ JSON/CSV/APIDashboard-lockedVaries
API / AI-agent (MCP) accessLimitedVaries
SetupNone - runs on ApifyOnboarding + contractDev integration

How much does it cost?

Pay only for what you pull - no start fee. Three events: Hotel $0.004 (each hotel returned), Prices $0.005 (each hotel priced - the full OTA ladder plus per-room rates, per date), and Review $0.001 (each review). So a hotel with its full price ladder is $0.009; discovery-only is $0.004. New Apify accounts get $5 in free credit (~555 fully-priced hotels, or ~1,250 discovery-only), and paid plans get a lower per-event rate. See the actor page for current pricing.

Worked examples:

Google Hotels Scraper pricing on Apify: pay-per-event - Hotel $0.004, Prices fetched $5 per 1,000, Review scraped $1 per 1,000, with lower rates on paid plans
Transparent pay-per-event pricing on Apify - and lower per-event rates on paid plans.

How it works

Open the actor on Apify, enter a destination search (or paste hotel URLs/IDs), set your dates and occupancy, toggle prices and reviews, click Start, and download results as JSON, CSV, Excel, or HTML - or pull them from the API on a schedule. The developer docs, full field dictionary, and copy-paste snippets live in the GitHub repo.

Google Hotels Scraper input form on Apify: search a destination or add exact hotels by name or link, dates, guests, and Include prices / Include reviews toggles
One-screen setup: search a destination or add exact hotels, set dates, and toggle prices & reviews.

Frequently asked questions

How much does it cost to scrape Google Hotels?
Pay-per-event, no start fee: Hotel $0.004 each, Prices $0.005 per hotel per date (full OTA ladder + rooms), Review $0.001 each. A fully-priced hotel is $0.009, discovery-only is $0.004. New accounts get $5 free credit (~555 fully-priced hotels); paid plans get a lower rate.
Do I need a Google account or API key?
No. Everything runs inside the actor on Apify - no login, no Google API key, no proxy or anti-bot setup.
Which booking sources does the price ladder include?
Every source Google shows for a hotel - typically 15–25, including Booking.com, Agoda, Expedia, Hotels.com, Priceline, Trip.com and KAYAK - each with its price and, where available, a booking link, all on one row.
Can I price specific hotels instead of a whole city?
Yes - add hotels by name, a Google Hotels/Maps link, a maps.app.goo.gl short link, a ChIJ place-id or a ChkI entity token, and set Track prices until for a multi-date price window.
Does it also scrape Google Hotels reviews?
Yes - turn on Include reviews for one row per guest review with reviewer, rating, review text, exact publish date and owner response, billed at $0.001 per review.
Why do a few hotels have no price ladder?
Almost all do. A property with no bookable offers on your dates still returns its name, rating, star class, coordinates and reviews - just an empty ladder.
Can I schedule daily or continuous price monitoring?
Yes. Run it on an Apify schedule (hourly or daily) and append each run to build a rate history - Apify handles the cron, storage, API and webhooks, with no server to run.
How many hotels can I get for one city?
A destination search paginates and de-duplicates results; set Max hotels (0 = no cap). Very large markets hit Google's per-query ceiling, so split by area, star class or price band for a full-market sweep.
How fresh are the prices?
Live. Prices are fetched from Google at run time for your exact dates and occupancy - the same rates a visitor would see then.
Which countries and currencies are supported?
13 Google country markets, 20 currencies and 9 interface languages. Country changes which hotels appear, the pricing market and the OTA mix.
How does it compare to enterprise rate-shopping tools?
You get the same public rate-parity data - every OTA's price per hotel, across dates - on pay-per-use pricing instead of a fixed monthly seat, and you own the raw data to pipe anywhere.

Try it free on Apify

Read the full guide: step-by-step tutorial → · Expedia scraper → · Hotels.com scraper →