Google Hotels Scraper: Prices & OTA Offers avatar

Google Hotels Scraper: Prices & OTA Offers

Pricing

from $0.75 / 1,000 hotels

Go to Apify Store
Google Hotels Scraper: Prices & OTA Offers

Google Hotels Scraper: Prices & OTA Offers

Scrape Google Hotels by city or hotel: prices from every provider (Booking.com, Expedia, Agoda, official site), ratings, amenities, price calendar and alerts.

Pricing

from $0.75 / 1,000 hotels

Rating

0.0

(0)

Developer

Lighthouse Data

Lighthouse Data

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

1

Monthly active users

2 days ago

Last modified

Share

Get hotel prices from Google Hotels for any destination and dates, with every booking provider's price side by side (Booking.com, Expedia, Agoda, Hotels.com, Trip.com, the hotel's official site and 20–40 more). You also get ratings, star class, amenities and coordinates. Add a price calendar for the next 90 check-in dates, or schedule it to alert you when prices change. Export to JSON, CSV or Excel, or use the API.

What does Google Hotels Scraper do?

  • Searches Google Hotels by destination ("Prague", "Lisbon, Portugal", "hotels near Eiffel Tower") for your check-in date, nights, adults, children's ages and currency, in Google's ranking order, up to 500 hotels per destination.
  • Looks up specific hotels by name, Google Hotels URL or hotel ID. This suits a competitive set or a first-pass rate-parity screen.
  • Returns each provider's offer: nightly price, total for the stay, price including taxes and fees, free cancellation, and whether it is the hotel's own site.
  • Returns hotel details: rating, number of reviews and their star distribution, star class, property type, address, phone, website, coordinates, Google Maps link, amenities, check-in/out times and a photo.
  • Price calendar: the lowest price and cheapest provider for up to 90 consecutive check-in dates.
  • Price-change monitoring: remembers the last price per hotel, stay and provider, and reports what went up, went down, appeared or disappeared since the previous run.
  • 72 currencies, any Google language and country.

Why use it?

  • Built for reliability. It reads the same structured data the Google Hotels page loads, over plain HTTP. There is no headless browser to break and no HTML guessing. Blocks are retried on a fresh IP, with automatic fallback to residential proxies. In our tests, 1,368 of 1,368 requests succeeded.
  • Fails loudly, never silently. Google quietly swaps an unknown destination for "United States" and past dates for tomorrow. This Actor detects both and tells you, instead of handing you the wrong hotels or the wrong dates.
  • One flat price per hotel, however many offers it has. A hotel with 30 provider offers costs the same as one with 3.
  • Made for scheduled monitoring. The change-detection mode, the calendar and the stable hotel IDs are designed for daily runs.
  • Friendly to AI agents and MCP. Every input and output field is documented with types and examples.

Use cases

  • Hotel revenue management: a daily rate shop of your hotel and your competitive set across every OTA for the next 30–90 nights.
  • Rate-parity screening: spot booking sites that show a lower price than your official site on Google (isOfficialSite vs. everyone else), then verify the room type, cancellation terms and inclusions on the booking site.
  • Travel agencies and TMCs: watch quoted or booked stays and act when the price drops.
  • OTAs, metasearch and travel startups: price benchmarks and coverage by city, and seed data for new markets.
  • Analysts and researchers: city price indices, seasonality, and event-driven price spikes.
  • AI travel agents: "the cheapest 4-star hotel near the venue on these dates, and where to book it".

How to use it

  1. Click Try for free.
  2. Enter one or more Destinations (e.g. Prague), or Specific hotels by name or Google Hotels URL.
  3. Set the Check-in date (e.g. 2026-11-10, or +14 days for scheduled runs), Nights, Adults and Currency.
  4. Turn on Include every provider's price for the per-OTA price ladder.
  5. Click Start. Download the results as JSON, CSV or Excel, or read them through the API. Use the Offers by provider, Price calendar and Price changes tabs for one row per offer, date or change.

Input example (the prefilled input: 5 hotels in Prague with all offers, about $0.013):

{
"destinations": ["Prague"],
"checkIn": "2026-11-10",
"nights": 2,
"adults": 2,
"currency": "EUR",
"maxHotelsPerDestination": 5,
"includeOffers": true
}

Watch your competitive set every morning and receive only what changed:

{
"hotels": [
"Hotel NH Collection Prague Carlo IV",
"Hilton Prague Old Town",
"https://www.google.com/travel/hotels/entity/ChgI9pq7z4m4m4KvARoLL2cvMXYwbGpoNGIQAQ"
],
"checkIn": "+1 day",
"nights": 1,
"calendarDays": 30,
"currency": "EUR",
"monitorPrices": true,
"monitorStoreName": "prague-comp-set",
"minChangePercent": 2
}
  1. Save this as a task, then add a schedule (for example daily at 07:00) in Apify Console under Schedules.
  2. Each run checks the next 30 check-in dates for the three hotels, with every provider on the first date.
  3. The Price changes tab lists every move of 2% or more since the previous run: previous price, current price, delta and percent.
  4. Connect an integration (Slack, email, Google Sheets, Zapier, Make or a webhook) to get the changes pushed to you.

This costs about $0.23 per day (3 hotels × ($0.0025 + 30 × $0.0025)), or roughly $7 a month.

The relative check-in date (+1 day) moves forward with every run. Changes are compared for the same stay dates, so with a calendar each date is tracked day after day until it passes. Use a separate monitorStoreName for each independent watch list.

API

curl -X POST "https://api.apify.com/v2/acts/<username>~google-hotels/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \
-H "Content-Type: application/json" \
-d '{"destinations":["Lisbon"],"checkIn":"+30 days","nights":2,"maxHotelsPerDestination":10,"includeOffers":true}'

Input

FieldTypeDescriptionExample
destinationsarray of stringsPlaces to search, as typed into Google Hotels. Unknown places fail with a clear message["Prague", "hotels near Eiffel Tower"]
hotelsarray of stringsHotel names (with the city), Google Hotels URLs or hotel IDs. Always include offers["Hilton Prague Old Town"]
checkInstringYYYY-MM-DD, or relative (+14 days, +2 weeks, tomorrow). Empty = 14 days from today. At most 365 days ahead"2026-11-10"
nightsinteger1–30 (default 1)2
adultsinteger1–12 (default 2)2
childrenAgesarray of integersOne age (0–17) per child, up to 6[5, 8]
maxHotelsPerDestinationinteger1–500 (default 20)20
includeOffersbooleanAdd every provider's price, address, phone and full amenities for destination results (default false)true
calendarDaysinteger0 = off; otherwise the number of consecutive check-in dates to price (up to 90)30
monitorPricesbooleanReport changes since the previous run (default false)true
monitorStoreNamestringKey-value store that keeps the last prices"prague-comp-set"
minChangePercentintegerIgnore smaller moves (default 0)2
onlyChangedHotelsbooleanWith monitoring, save only hotels with a changefalse
currencystringISO 4217 code, 72 supported (default USD)"EUR"
languagestringGoogle language (hl, default en)"de"
countrystringSearcher's country (gl, default us)"gb"
proxyConfigurationobjectDefault: Apify datacenter proxy{ "useApifyProxy": true }
residentialFallbackbooleanSwitch to residential proxy after repeated blocks (default true, no extra charge)true
maxConcurrencyintegerParallel requests, 1–20 (default 5)5

With an empty input, the Actor searches the example destination "Prague".

Output

See real output: 20 records from a real run (JSON). This is the built-in example (empty input), run on 2026-10-06 with build 1.0.9.

Each hotel is one record. Offers, the calendar and changes are nested arrays; the dataset tabs Offers by provider, Price calendar and Price changes flatten them into one row each. A SUMMARY record in the key-value store lists per-destination counts, a completeness object, any inputs that failed and why, and the request statistics.

{
"hotelId": "ChcIrK78kOba8qxYGgsvZy8xdmZwMmJwdxAB",
"name": "Czech Inn, Prague",
"url": "https://www.google.com/travel/hotels/entity/ChcIrK78kOba8qxYGgsvZy8xdmZwMmJwdxAB/prices?hl=en&gl=us&curr=USD&ts=…",
"googleMapsUrl": "https://maps.google.com/?cid=11139706250922420949",
"propertyType": "hostel",
"hotelClass": null,
"rating": 4.4,
"reviewCount": 2354,
"ratingDistribution": { "1": 87, "2": 64, "3": 160, "4": 533, "5": 1510 },
"latitude": 50.0718358,
"longitude": 14.4464348,
"address": "Francouzská 240/76, 101 00 Praha 10-Vršovice, Czechia",
"phone": "+420 210 011 100",
"website": "http://www.czechinn.com/",
"description": "Stylish dorms & rooms in a comfortable hostel offering a shared kitchen & a cool basement bar.",
"amenities": ["Wi-Fi (free)", "Bar", "Breakfast (extra charge)", "Smoke-free property", "Front desk (24 hour)"],
"checkInTime": "15:00",
"checkOutTime": "12:00",
"thumbnailUrl": "https://lh3.googleusercontent.com/…",
"searchQuery": "Prague",
"resolvedLocation": "Prague",
"position": 2,
"checkIn": "2026-10-13",
"checkOut": "2026-10-15",
"nights": 2,
"adults": 2,
"childrenAges": [],
"currency": "USD",
"lowestPricePerNight": 20.43,
"lowestPricePerNightWithTaxes": 27.52,
"lowestTotalPrice": 40.85,
"lowestTotalPriceWithTaxes": 55.04,
"cheapestProvider": "Booking.com",
"offersCount": 4,
"offers": [
{
"provider": "Booking.com",
"isOfficialSite": false,
"pricePerNight": 20.43,
"pricePerNightWithTaxes": 27.52,
"totalPrice": 40.85,
"totalPriceWithTaxes": 55.04,
"freeCancellation": false,
"bookingUrl": "https://www.google.com/travel/lodging/clk?pc=…"
}
],
"priceCalendar": null,
"priceChanges": null,
"lowestPrice": null,
"lowestPriceAt": null,
"isLowestPrice": null,
"isComplete": true,
"incompleteReason": null,
"scrapedAt": "2026-09-29T22:04:38.912Z"
}

A price-change entry (monitoring mode):

{ "scope": "provider", "provider": "Booking.com", "checkIn": "2026-10-29", "checkOut": "2026-10-31", "status": "changed",
"previousPrice": 379.55, "currentPrice": 354.55, "priceDelta": -25, "priceDeltaPercent": -6.59, "changePercent": -6.6,
"previousScrapedAt": "2026-09-28T06:00:00.000Z" }

In monitoring mode each record also carries its price history for the stay: lowestPrice (the lowest nightly price seen since tracking began in this monitor store, this run included), lowestPriceAt (when it was first seen) and isLowestPrice (true when today's price is at or below every earlier price; null on the first run or when there is no price today). Each price-calendar date has the same three fields. Outside monitoring mode they are null.

Completeness and rerunning failures

  • Every record has isComplete. It is false when part of what you asked for could not be read, with the reason in incompleteReason: for example the hotel page was blocked after all retries, so the hotel is saved from the search results only (no offers, address or phone), or some price-calendar dates could not be fetched. Incomplete records are free.
  • SUMMARY.completeness counts the run's hotels: { "unit": "hotels", "requested": 20, "delivered": 18, "incomplete": 1, "failed": 1, "ratio": 0.9 }. requested is the hotels the run attempted, plus one for each destination or hotel name that failed as a whole (unknown destination, no hotels on Google, blocked search); delivered is complete hotels; ratio is delivered / requested.
  • When anything failed or was incomplete, the key-value store also gets FAILED_INPUT: your input with every setting kept and the target lists reduced to what failed. Hotels found through a destination are listed by hotel ID in hotels (so they are looked up directly, with offers); failed destinations and hotel names are kept as you typed them. Start a new run with FAILED_INPUT as the input to fetch just those.
  • The run's status message sums it up, e.g. Saved 18 of 20 hotel(s); 1 incomplete (saved free of charge); 1 failed (blocked by Google or unavailable); rerun input saved as FAILED_INPUT. A run with some failures still succeeds.

Field notes

  • All prices are numbers in currency. "Per night" is Google's nightly average before taxes. The totals are the nightly price × nights, which is how Google shows its totals; the …WithTaxes fields include taxes and fees when the provider reports them.
  • A missing value is null, never 0 or "". null prices mean Google shows no price (sold out, or dates too far ahead).
  • hotelId is stable. Pass it back in hotels for fast, exact lookups.
  • Hotels are saved as they finish, in parallel; sort by position for Google's ranking order.

Pricing

Pay per event: you pay only for results. Prices below are the FREE-tier prices; paid Apify plans get lower per-event prices (shown on the Pricing tab).

EventPriceWhen
Actor start$0.00005Once per run (per GB of memory)
Hotel$0.001Each hotel saved
Hotel offers$0.0015Each hotel with every provider's price (destination results with offers on; all direct hotel lookups)
Calendar date$0.0025Each hotel × check-in date in price-calendar mode

What counts as complete. You pay only for complete hotel records, and an incomplete one (isComplete: false) is free: no hotel, offers or calendar events.

  • A hotel is complete when everything requested for it was read: the search listing (listing-only runs), or the hotel page with its offers when offers or a calendar were requested, and every calendar date that was fetched.
  • A real state is still complete and charged. That includes a hotel that is sold out or has no price for your dates (null prices), a hotel with no offers, and a calendar date for which Google shows no price. A date with no price is left out of the calendar and not charged.
  • A hotel is incomplete (free) when we could not read part of it. That happens when the hotel page was blocked or failed after all retries and the hotel was saved from the search results only, or when one or more calendar dates could not be fetched. Incomplete and failed hotels go into FAILED_INPUT for a rerun.
  • Hotels that fail completely, and destinations or hotel names Google does not recognise, produce no record and cost nothing.

Examples

  • 100 hotels in a city, listing only: $0.10.
  • 100 hotels with every provider's offer: $0.25.
  • A daily rate shop of 5 hotels × 30 nights: 5 × ($0.0025 + 30 × $0.0025) = $0.39 per day.
  • The prefilled input (5 hotels with offers): about $0.013.

Higher Apify subscription plans get tiered discounts on these prices automatically. Set a maximum cost per run in the run options, and the Actor stops cleanly when it reaches it, keeping what it has already scraped. Proxy costs are included; you pay nothing extra for them.

Ready-made tasks

One-click examples with the input already filled in. Open one, adjust it and run:

Use it from an AI agent (MCP)

AI agents can run this Actor through Apify's MCP server. Add this server to Claude, Cursor, VS Code or any MCP client:

{
"mcpServers": {
"apify": { "url": "https://mcp.apify.com?tools=cylindrical_lighthouse/google-hotels" }
}
}

You sign in to Apify in the browser on first use, or you can send the header Authorization: Bearer <APIFY_TOKEN>. VS Code's mcp.json names the top-level key servers instead of mcpServers. With the Apify CLI you can also run apify mcp install cursor (other clients are supported). Then just ask, for example: "Find 2-night hotel prices in Paris for 2 adults and show the cheapest booking site".

Integrations

  • Make, Zapier and n8n: use the Apify app or node, choose Run an Actor and pick cylindrical_lighthouse/google-hotels, then send the dataset to Google Sheets, Airtable, Slack or a database.
  • Google Drive and webhooks: in the Actor's Integrations tab, upload each run's results to a Drive folder or call your own URL when a run finishes.
  • Schedules: in Apify Console, go to Schedules, then Create new, and pick this Actor or one of its saved tasks to compare hotel rates automatically.
  • API: POST https://api.apify.com/v2/acts/cylindrical_lighthouse~google-hotels/run-sync-get-dataset-items?token=<APIFY_TOKEN> runs it and returns the results in one call.

From the same publisher:

FAQ

Is it legal to scrape Google Hotels? This Actor extracts only publicly available data: hotel listings, prices and aggregate ratings that anyone can see without logging in. It does not collect individual reviews or reviewers' names, and it solves no CAPTCHAs. Automated access may conflict with Google's Terms of Service, so use the data responsibly. Your results could in principle contain personal data (for example, a phone number of a private vacation rental host), which is protected by GDPR and other regulations. Do not process personal data unless you have a legitimate reason. If you are unsure, consult your lawyers.

Are the prices exact? They are the prices Google shows at the moment of the run, provided by the booking sites. Hotel prices change constantly and depend on the searcher's country (country), so treat them as indicative and confirm on the booking site.

Why do some hotels have no price? Google shows no price when a hotel is sold out for your dates, or when the dates are too far ahead (usually beyond about 11 months). The record is still saved, with null prices.

Why is hotelClass often null? Google shows an official star class for only some hotels. We never guess it.

What happens with a typo in the destination? Google silently falls back to a whole country. This Actor detects that and fails that destination with a message, while your other destinations still run.

Can I get more than 20 hotels? Yes, up to 500 per destination; the Actor pages through Google's results. Google itself lists only its most relevant hotels for very large cities.

Do you support vacation rentals? When Google lists them in hotel results, yes. They have propertyType: null and usually a single offer.

How do I use it from an AI agent? Call it through the Apify MCP server or API. Use hotels for exact lookups and destinations for discovery; hotelId values round-trip between runs.

Limitations

  • Prices come from Google's metasearch and can differ slightly from the booking site's final checkout price.
  • Each provider's price is the lowest one Google displays for that stay. Room type, cancellation terms and inclusions (such as breakfast) can differ between providers, so a lower price is not always a like-for-like rate. Room-level rates are not included.
  • Room-level rates (for example "Deluxe King, non-refundable") are not included in v1; offers are per provider.
  • Check-in must be within 365 days, stays 1–30 nights, at most 12 adults and 6 children.
  • Amenity labels are in English whatever the language.
  • The price calendar makes one request per date per hotel, so large calendars take longer (about 1 s per date per hotel, 3 in parallel).
  • Individual reviews are out of scope; only aggregate ratings are provided.

Changelog

See the ./CHANGELOG.md tab.

Support

Found a bug or need a field? Open an issue on the Issues tab. We reply within 48 hours. When Google changes its pages, our daily health check usually catches it before you do.

Did this Actor save you time? A short review on the Store helps other people find it and tells us what to improve. If something didn't work, please open an issue first, so we can fix it for you.