Google Hotels Scraper & API — Prices, OTA Rates, $2.50/1K avatar

Google Hotels Scraper & API — Prices, OTA Rates, $2.50/1K

Pricing

from $1.50 / 1,000 hotels

Go to Apify Store
Google Hotels Scraper & API — Prices, OTA Rates, $2.50/1K

Google Hotels Scraper & API — Prices, OTA Rates, $2.50/1K

Google Hotels API and hotel price tracker: up to 500 hotels per search for any city and dates, or one hotel night by night (price calendar, rate shopping). Nightly price, total with taxes, stars, rating, amenities, GPS and every booking site’s price and link. $2.50 per 1,000 hotels; unpriced free.

Pricing

from $1.50 / 1,000 hotels

Rating

0.0

(0)

Developer

Data Fabrik

Data Fabrik

Maintained by Community

Actor stats

1

Bookmarked

2

Total users

1

Monthly active users

20 hours ago

Last modified

Share

Scrape Google Hotels for any city, neighbourhood or landmark and any dates. For each property you get the nightly price and the stay total with taxes, Google's deal label ("35% less than usual"), star class, guest rating and review breakdown, amenities, coordinates, nearby places (airport, transit, sights with walking or driving time), photos, check-in/check-out times and the Google Hotels link.

Turn on one option and you also get every booking site's offer for each hotel — Booking.com, Expedia, Hotels.com, Agoda, Trip.com, the hotel's own website and dozens more — with the nightly price, the stay total with and without taxes, and the booking link.

  • Not just the first 20. Google shows 20 properties per page; this Actor reads the following pages and returns up to 500 hotels per search, without duplicates.
  • Price monitoring built in. Give several check-in dates — or consecutiveDays: 30 for the next 30 nights — and the Actor runs one search per location × date.
  • Track one hotel. Give a hotel (Google Hotels link, Google id or just its name) and get its price for every night of a period, with every booking site's offer: a ready-made rate-shopping calendar.
  • Filters from Google itself: sort order, minimum rating, star class, price range, amenities.
  • Fast and light. Pure HTTP, no browser. A 100-hotel search takes a few seconds.
  • Fair billing. $2.50 per 1,000 hotels on the Free plan, down to $1.50 on Gold — you pay per hotel with a price. Unpriced hotels, failed or empty searches are never charged.
  • A Google Hotels API. Call it over HTTP, from Python or JavaScript, or from Make, Zapier, n8n and MCP clients, and get JSON back.

How it works

Google Hotels loads its results 20 at a time and keeps the data of each page inside the page itself. The Actor opens the same pages a visitor opens, over plain HTTP, reads that data and follows the "next page" link until it has the number of hotels you asked for — up to 500 per search, without duplicates.

  • Searches: one per location × check-in date. Google's own filters (sort, rating, stars, price, amenities) are sent with the search, exactly as when you click them on the website.
  • Booking-site prices: with includeOffers, the Actor also opens each hotel's page, where Google lists every booking site with its price and link.
  • Tracked hotels: a Google Hotels link or id is used as is; a hotel name is looked up once on Google Hotels, then priced for every date.
  • Retries: a page that fails is fetched again from a new IP. A search stopped half-way still delivers the hotels already read.

Quick start

  1. Click Try for free (or Start) on this page.
  2. In Locations, type a city or area as you would in Google Hotels: Rome, Shibuya, Tokyo, hotels near Times Square.
  3. Set the Check-in date and the number of Nights (or leave the date empty for a stay 30 days from today).
  4. Click Start. The hotels appear in the Output tab and can be downloaded as JSON, CSV, Excel or HTML.

To follow one hotel instead, leave Locations empty and put its name or Google Hotels link in Hotels to track.

What can you do with it?

  • Revenue management & rate shopping: compare your hotel's price with the competition in your area for every night of the season.
  • Rate parity: check whether Booking.com, Expedia or the hotel's own site is cheapest for the same stay.
  • Travel apps and AI agents: feed real hotel availability, prices and ratings into your product.
  • Market research: average price per night by city, star class or date; which amenities 5-star hotels offer; how prices move before a big event.
  • Lead lists for hospitality suppliers: hotels of a city with their class, rating, website and location.
  • Event and seasonality studies: run the same city every day of a festival, a trade fair or a holiday period (consecutiveDays) and see how prices and availability change.
  • Short-term rental investors: compare hotel prices per night in a neighbourhood with your own nightly rate, for every night of the year.
  • Corporate travel: check which hotels near an office or a venue fit a travel policy (maxPrice, minRating, hotelClass).

How it compares (public Apify Store data, October 2026)

This ActorMost-used Google Hotels ActorTypical competitors
Price per 1,000 hotels with a price$2.00 (Bronze), $2.50 (Free)$4.32$2.70–$4.49
Hotels without a pricefreechargedcharged
Every booking site's price for one hotel$0.0035not offered$0.002–$0.0072
Runs that fail or time out (30 days)0 %61 %0–5 %
Track one hotel night by night (price calendar, rate parity)yes (hotels + consecutiveDays)noone Actor does, per row
Start fee$0.00005none$0–$0.02

Source: Store API (publicActorRunStats30Days) and pricing pages, 8 Oct 2026.

Input

Google Hotels Scraper input form: locations, hotels to track, check-in and check-out dates and nights

FieldWhat it doesDefault
Locations · locationsOne search per line, as you would type it in Google Hotels: Lisbon, Shinjuku, Tokyo, hotels near the Eiffel Tower, boutique hotels in Rome. A plain place name is searched as "hotels in …". Leave empty to track only hotels.—
Hotels to track · hotelsSpecific hotels to price, one per line: the Google Hotels link (contains /entity/…), the Google id, or the hotel's name (Ritz Paris). One row per hotel × check-in date.—
Check-in date · checkInCheck-in date, YYYY-MM-DD. Empty = a stay 30 days from today (handy for schedules).today + 30
Check-out date · checkOutCheck-out date, YYYY-MM-DD. Empty = checkIn + nights.—
Nights · nightsLength of stay when there is no check-out date (1–30). Also used with checkInDates.1
Extra check-in dates (price monitoring) · checkInDatesMore check-in dates for price monitoring; each location × date is one search.—
Consecutive check-in days · consecutiveDaysAlso search the N-1 days after the check-in date (1–180): a price calendar. Applies to locations and hotels. Each day is a separate search: 30 days × 100 hotels = 3,000 hotel rows ($7.50 on the Free plan). Unpriced hotels are free.1
Adults · adultsNumber of adult guests (1–12).2
Max hotels per search · maxResultsPerSearchHow many hotels to return per search (1–500). Each hotel with a price is one hotel event: 100 hotels ≈ $0.25 on the Free plan, unpriced hotels free.100
Currency · currencyCurrency of every price: USD, EUR, GBP, JPY…USD
Sort by · sortByrelevance, lowest_price, highest_rating, most_reviewed.relevance
Minimum guest rating · minRatingany, 3.5, 4.0, 4.5.any
Hotel class (stars) · hotelClassKeep only these star classes (2–5), e.g. ["4","5"].all
Minimum price per night, Maximum price per night · minPrice / maxPricePrice per night range, in the chosen currency.—
Required amenities · amenitiesRequired amenities: free_parking, pool, indoor_pool, fitness_center, free_breakfast, spa, beach_access, pet_friendly.—
Add every booking site's price · includeOffersAlso return every booking site's offer for each hotel (opens each hotel's page).false
Hotels with booking-site prices (per search) · maxOfferLookupsPerSearchWith includeOffers, how many hotels per search get booking-site prices (first N).20
Language · languageLanguage of names, descriptions and labels (en, fr, de…).en
Country · countryCountry Google prices for (us, gb, fr…). Sellers and prices can differ by country.us
Parallel searches · maxConcurrencySearches running in parallel (1–20).5
Retries per page · maxRetriesRetries per page, each from a new IP.6
Proxy · proxyProxy settings. The default Apify Proxy is enough.Apify Proxy

Example input

{
"locations": ["Lisbon", "hotels near Sagrada Familia"],
"checkIn": "2027-06-13",
"nights": 2,
"checkInDates": ["2027-06-20", "2027-06-27"],
"adults": 2,
"currency": "EUR",
"minRating": "4.0",
"hotelClass": ["4", "5"],
"maxResultsPerSearch": 100,
"includeOffers": true,
"maxOfferLookupsPerSearch": 10
}

Example: cheapest well-rated hotels near a venue

{
"locations": ["hotels near Fira Barcelona Gran Via"],
"checkIn": "2027-02-22",
"nights": 3,
"adults": 1,
"sortBy": "lowest_price",
"minRating": "4.0",
"maxResultsPerSearch": 50,
"currency": "EUR",
"country": "es"
}

Example: prices of a whole city for every night of a month

{
"locations": ["Amsterdam"],
"checkIn": "2027-04-01",
"consecutiveDays": 30,
"nights": 1,
"maxResultsPerSearch": 200,
"currency": "EUR"
}

30 searches (one per night), up to 200 hotels each: a ready-made price calendar for the city, by hotel.

Example: family trip with a pool and free parking

{
"locations": ["Orlando"],
"checkIn": "2027-07-05",
"nights": 7,
"adults": 4,
"amenities": ["pool", "free_parking"],
"hotelClass": ["3", "4"],
"currency": "USD"
}

Output

Google Hotels Scraper output: one row per hotel with stars, rating, reviews, price per night, stay total, deal label and coordinates

One row per hotel (view Hotels), for example:

{
"type": "hotel",
"location": "Lisbon",
"checkIn": "2027-06-10",
"checkOut": "2027-06-12",
"nights": 2,
"adults": 2,
"currency": "USD",
"rank": 1,
"name": "Brown's | Avenue Hotel",
"hotelClass": 5,
"hotelClassLabel": "5-star hotel",
"rating": 4.6,
"reviewCount": 281,
"reviewsBreakdown": { "5star": 222, "4star": 30, "3star": 14, "2star": 7, "1star": 8 },
"pricePerNight": 222.94,
"pricePerNightWithTaxes": 245.41,
"totalPrice": 445.88,
"totalPriceWithTaxes": 490.83,
"taxesAndFees": 44.95,
"dealLabel": null,
"latitude": 38.7220236,
"longitude": -9.1456424,
"amenities": ["Breakfast", "Free Wi-Fi", "Parking ($)", "Outdoor pool", "Air conditioning", "Restaurant", "Airport shuttle"],
"nearbyPlaces": [
{ "name": "Avenida", "kind": "transit", "walk": "5 min" },
{ "name": "Humberto Delgado Airport", "kind": "airport", "drive": "24 min", "transit": "27 min" }
],
"website": "https://www.brownshotelgroup.com/browns-avenue/",
"countryCode": "PT",
"googleHotelsUrl": "https://www.google.com/travel/hotels/entity/ChkIhLCQwvjO2IYWGg0vZy8xMXE0bTZieDkyEAE",
"googleMapsUrl": "https://maps.google.com/?cid=4896003618326261334"
}

Rows of tracked hotels have the same fields, plus hotelInput (your line), matchedName (the hotel Google picked for a name — check it) and rank: null. A hotel name Google cannot match gives a free no-results row.

Other fields: searchedPlace (the place Google understood — check it for unusual queries), entityId, propertyType (hotel, vacation rental or other), phone (on hotel pages), description, checkInTime, checkOutTime, thumbnail, photos, priceDates, scrapedAt.

With includeOffers, each hotel also has offersCount, cheapestOffer and offers (view Booking-site prices):

{
"provider": "Booking.com",
"taxesIncluded": true,
"isOfficialSite": false,
"pricePerNight": 275.23,
"pricePerNightWithTaxes": 300.83,
"totalPrice": 550.46,
"totalPriceWithTaxes": 601.66,
"link": "https://www.google.com/travel/lodging/clk?…"
}

The hotel's own website comes first (isOfficialSite: true), then the other sites from cheapest to most expensive (stay total with taxes). A few sites give Google no price with taxes (taxesIncluded: false); they come last and cheapestOffer only uses them when nothing else is available.

The key-value store also holds SEARCHES — one line per search with the number of hotels, the cheapest and average price per night — and OUTPUT, the run summary.

Output fields

Hotel rows (type: "hotel")

FieldMeaning
searchId, location, checkIn, checkOut, nights, adults, currencyThe search, as you asked for it.
rankPosition in Google's list (1 = first); null for tracked hotels.
name, entityId, propertyTypeHotel name, Google's id (stable, good for joins) and the kind of property as Google classes it: hotel, vacation rental or other.
hotelClass, hotelClassLabelStar class (1–5) and Google's label.
rating, reviewCount, reviewsBreakdownGuest rating out of 5, number of reviews, and the number of 1- to 5-star reviews.
pricePerNight, pricePerNightWithTaxesPrice per night for the room, without and with taxes and fees.
priceCurrencyCurrency actually returned by Google; can differ from the requested currency when Google does not support it.
totalPrice, totalPriceWithTaxes, taxesAndFeesPrice of the whole stay, without and with taxes, and the taxes themselves.
dealLabelGoogle's deal badge, e.g. "35% less than usual", when there is one.
priceDatescheckIn, checkOut and nights the price applies to, as Google reports them.
latitude, longitude, countryCodeLocation.
amenitiesAmenities as Google lists them (Free Wi-Fi, Pool, Breakfast…).
nearbyPlacesAirports, transit stations and sights with walking, driving or transit time.
description, checkInTime, checkOutTime, phone, websitePractical details (phone on hotel pages).
thumbnail, photosImage links.
searchedPlaceThe place Google understood for your location — worth a look for unusual queries.
googleHotelsUrl, googleMapsUrl, googleMapsCid, scrapedAtLinks to the hotel on Google, its Google Maps id, and time of the run.
hotelInput, matchedNameTracked hotels only: your line and the hotel name Google matched to it.

Booking-site offers (includeOffers)

FieldMeaning
offersStatus, offersErrorok, no-offers, failed or skipped-cost-limit; offersError explains a failure.
offersCount, cheapestOfferNumber of booking sites and the cheapest one.
offers[]provider, isOfficialSite, taxesIncluded, pricePerNight, pricePerNightWithTaxes, totalPrice, totalPriceWithTaxes, link.

Search summary (SEARCHES record and dataset rows of searches without hotels)

status (ok, no-results, failed…), searchedPlace, hotelsFound, totalResultsOnGoogle, pagesRead, pricedHotels, cheapestPricePerNight, cheapestHotel, averagePricePerNight, offerLookups, notes, errors.

Track one hotel: hotel price tracker, price calendar and rate parity

The price of one hotel for every night of the next month, on every booking site:

{
"locations": [],
"hotels": ["https://www.google.com/travel/hotels/entity/ChkIhLCQwvjO2IYWGg0vZy8xMXE0bTZieDkyEAE", "Ritz Paris"],
"checkIn": "2027-06-01",
"consecutiveDays": 30,
"nights": 1,
"currency": "EUR",
"includeOffers": true
}

Each hotel × date is one row: the hotel's price for that night, and with includeOffers every booking site (Booking.com, Expedia, Agoda, the hotel's own website…) with its price and link — the official site first. Schedule it daily to watch your own hotel and your competitors. The location filters (sortBy, minRating, hotelClass, prices, amenities) only apply to locations.

Pricing

Pay per event — price per 1,000 hotels on the paid plans:

EventWhenFree planBronzeSilverGold+
hotelOne hotel with a price returned$2.50$2.00$1.80$1.50
hotel-offersOne hotel with every booking site's price (only with includeOffers)$4.00$3.50$3.00$2.50
  • Hotels without a price for your dates (sold out, no availability) are returned for free.
  • hotel-offers is charged for a hotel that has at least one booking-site offer, even if the hotel row itself had no price (free).
  • Apify adds its start fee of $0.00005 per run (apify-actor-start).
  • Searches that fail or return nothing are free and still appear in the dataset with their status, so you always know what happened.
  • A search of 100 hotels costs about $0.20 on the Bronze plan. The Actor stops cleanly when your maximum cost per run is reached.
  • A tracked hotel is charged like one hotel row per date: 30 nights of one hotel with every booking site cost about $0.20 on the Free plan ($0.0025 + $0.004 per night), $0.17 on Bronze.

Use it as an API

Run the Actor and get the hotels in one HTTP call (token from Apify Console → Settings → API & Integrations):

curl -X POST "https://api.apify.com/v2/acts/datafabrik~google-hotels-scraper/run-sync-get-dataset-items?token=<YOUR_API_TOKEN>" \
-H "Content-Type: application/json" \
-d '{"locations": ["Barcelona"], "checkIn": "2027-06-04", "nights": 2, "currency": "EUR", "maxResultsPerSearch": 50}'

Python, with the official apify-client package:

from apify_client import ApifyClient
client = ApifyClient("<YOUR_API_TOKEN>")
run = client.actor("datafabrik/google-hotels-scraper").call(run_input={
"locations": ["Lisbon"],
"checkIn": "2027-06-13",
"checkInDates": ["2027-06-20", "2027-06-27"],
"nights": 2,
"hotelClass": ["4", "5"],
"includeOffers": True,
"maxOfferLookupsPerSearch": 10,
})
for hotel in client.dataset(run.default_dataset_id).iterate_items():
print(hotel.get("name"), hotel.get("checkIn"), hotel.get("pricePerNight"), (hotel.get("cheapestOffer") or {}).get("provider"))

JavaScript / Node.js, with apify-client:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_API_TOKEN>' });
const run = await client.actor('datafabrik/google-hotels-scraper').call({
hotels: ['Ritz Paris'],
checkIn: '2027-03-01',
consecutiveDays: 14,
includeOffers: true,
currency: 'EUR',
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
for (const h of items.filter((i) => i.type === 'hotel')) {
console.log(h.checkIn, h.pricePerNight, h.cheapestOffer?.provider, h.cheapestOffer?.totalPriceWithTaxes);
}

Rate shopping on a schedule: run it every morning in Apify Console with your city and the next weekends in checkInDates, and send the dataset to Google Sheets, Slack or a webhook.

Use it from an AI agent (MCP)

https://mcp.apify.com?tools=datafabrik/google-hotels-scraper

Prompt example: "Find hotels in Lisbon for 2 nights from June 10, rating 4+, under €150, and show the cheapest booking site for the top 5." The agent sets locations, checkIn, nights, minRating, maxPrice, includeOffers, maxOfferLookupsPerSearch: 5. A 40-hotel search answers in about 8 s.

Recipes

Average price per night by star class (Python + pandas)

import pandas as pd
rows = list(client.dataset(run.default_dataset_id).iterate_items())
df = pd.DataFrame([r for r in rows if r["type"] == "hotel" and r.get("pricePerNight")])
print(df.groupby("hotelClass")["pricePerNight"].agg(["count", "median", "min", "max"]))

Rate parity check for your hotel

  1. Put your hotel's Google Hotels link in hotels, the next 30 days in consecutiveDays, and turn on includeOffers.
  2. For each date, compare the official site (isOfficialSite: true) with the cheapest other site in offers.
  3. Dates where an online travel agency is cheaper than your own site are parity issues to raise with that channel.

A competitive set, every morning

  1. Put your hotel and 5 to 10 competitors in hotels (links or names), the next 60 days in consecutiveDays.
  2. Save it as a Task in Apify Console and add a daily Schedule.
  3. Connect the task to Google Sheets or a webhook, and chart pricePerNight by checkIn and name.

More ready-to-run scripts (Python and Node, CSV export, price tracking): github.com/data-fabrik/apify-examples.

Tips for large runs

  • Cost control: set Maximum cost per run in the run options; the Actor stops cleanly and tells you so. Hotels without a price are free.
  • Big cities: one search returns up to 500 hotels. Split a city into neighbourhoods (one line each) and remove duplicates by entityId.
  • Booking-site prices need one extra page per hotel: keep maxOfferLookupsPerSearch at the number of hotels you really compare.
  • Country and currency: country decides which booking sites and taxes Google shows; set it to your market.
  • Prices are for the whole room for the number of adults you set, in the currency you choose.
  • A property with no price for your dates (sold out) still appears, with empty price fields — and is not charged.
  • Booking links go through Google's redirect, as on the website; open them soon after the run.

Limitations

  • One price per hotel, as in the Google Hotels list: room types, cancellation terms and breakfast options are not returned.
  • Review texts are not returned, only the rating and the number of reviews per star.
  • Prices move: they are those Google shows at the time of the run, for the country, currency and number of adults you choose.
  • Booking links go through Google's redirect and are meant to be opened soon after the run.
  • Run timeout: a 500-hotel search with offers can take up to 55 min. For 100+ searches raise the run timeout in Console; the Actor stops offer lookups 90 s before each search's limit so hotels are always delivered.

FAQ

Is there an official Google Hotels API? Google's hotel APIs are for hotels and booking partners that send their own prices to Google, not for reading search results. This Actor returns what the Google Hotels website shows, as JSON.

How many hotels can I get for a city? Up to 500 per search. For more, split the city into neighbourhoods (one line each) and remove hotels found twice by their entityId.

Can I compare Booking.com, Expedia and the hotel's own site? Yes, turn on includeOffers. Each hotel then lists every booking site with its price and link, the official site first.

Does it give room types or reviews text? Not yet: one price per hotel, as in the Google Hotels list, and the rating with its 1–5 star breakdown.

How do I track the price of one hotel? Put its Google Hotels link, id or name in hotels, and the number of nights to follow in consecutiveDays. Check matchedName the first time when you give a name.

Can I monitor hotel prices every day? Yes: schedule the Actor in Apify Console (daily or hourly) with your locations or hotels and checkInDates; every run adds rows with scrapedAt, so you can chart how prices move.

Does it work as a rate shopping tool for my own hotel? Yes: put your hotel and your competitors in hotels, the nights to watch in consecutiveDays, and includeOffers: true to compare every booking site with your own website (rate parity).

Why are some prices empty? The property has no availability or no price for your dates on Google. These rows are free.

Can I use it from an AI assistant? Yes. Add the Apify MCP server to Claude, ChatGPT, Cursor or another MCP client and ask for hotels in plain language.

The Actor reads public pages of Google Hotels, the way a visitor does, without logging in. It collects hotel information (businesses), not personal data. You are responsible for using the data in line with the laws and terms that apply to you.

More from Data Fabrik

ActorWhat you get
Google Trends Scraper & APIInterest over time, by country or region, and related queries for your own keywords
Google Trends Trending Now ScraperWhat a country is searching for right now, as an hourly or daily feed
Google Flights Scraper & APIEvery flight for a route and date, price insights and the cheapest dates

Support

Something missing or not working? Open an issue on the Actor's page — issues are answered quickly.

If this Actor saves you time, a short review on its Store page helps other users find it. If something is not right, open an issue first so it can be fixed.