Google Hotels Price Comparison avatar

Google Hotels Price Comparison

Pricing

from $2.80 / 1,000 results

Go to Apify Store
Google Hotels Price Comparison

Google Hotels Price Comparison

Compare hotel prices across booking sites on Google Hotels. For your dates, guests and currency, get every site's offer with nightly and total price and booking link, plus the cheapest site, rating, reviews, star class and address. No login. The first 10 results of every run are free.

Pricing

from $2.80 / 1,000 results

Rating

0.0

(0)

Developer

Axiom Works

Axiom Works

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

7 days ago

Last modified

Share

Returns: one row per hotel with id, name, pricePerNight, priceTotal, currency, rating, address and offers. Input: {"queries":["hotels in Paris"],"adults":2,"currency":"USD","maxItems":20,"includeOffers":false} Best for: hotel rate comparisons, city price monitoring, hospitality lead lists.

This Google Hotels scraper provides Google Hotels API access through Apify. One record from a local run on 2026-10-16 is shown below; availability and rates change with the stay dates and market.

{
"id": "ChkIy5q-tZ-KsLYZGg0vZy8xMWd5MXR3Y2d6EAE",
"name": "JO&JOE Paris Gentilly",
"rating": 4.4,
"pricePerNight": 84.66,
"currency": "USD",
"checkIn": "2026-10-23",
"checkOut": "2026-10-24"
}

What does Google Hotels Prices Scraper do?

Google Hotels Prices Scraper collects hotel prices from the public Google Hotels pages (the hotel search at google.com/travel). You give it one or more search phrases, such as "hotels in Paris", or direct links and entity IDs for hotel pages. It returns one clean record per hotel.

Each record holds the nightly price Google shows for your stay and the total price. When available, records also include booking sites that offer the room, each with its own price and a direct booking link, plus the hotel's address and phone number. Records also include star class, guest rating, review count, coordinates, check-in and check-out times, a short description and photos.

The Actor reads the data that Google embeds in its public pages. It does not need a Google account, cookies or any login, and it does not open a browser. It is not affiliated with Google.

What data can you get from Google Hotels?

Every hotel record contains the fields below. Fields that Google does not show for a given hotel (for example, a star class for a holiday apartment) are returned as null.

FieldDescription
idStable record ID (the Google Hotels entity ID). Unique within a run.
sourceUrlThe Google page the record was read from.
entityIdGoogle Hotels entity ID of the property.
nameHotel or property name.
googleHotelUrlLink to the hotel's page on Google Hotels.
queryThe search phrase or hotel URL that produced this record.
positionRank of the hotel within its search results (1 = first).
latitude, longitudeMap coordinates.
hotelClassStar class as a number, e.g. 4. null for rentals.
hotelClassTextStar class as shown, e.g. "4-star hotel".
ratingAverage guest rating out of 5.
reviewsCountNumber of guest reviews.
descriptionShort description of the property.
checkInTime, checkOutTimeCheck-in and check-out times, e.g. "3:00 PM".
thumbnailMain photo URL.
imagesPhoto URLs from the listing (usually 8 to 10).
pricePerNightNightly price in your currency, rounded to 2 decimals. When offers exist, it is the cheapest offer's nightly price.
pricePerNightTextThe price as displayed, e.g. "171 USD".
priceTotalPrice for the whole stay, rounded to 2 decimals.
currencyCurrency of all prices, e.g. USD.
checkIn, checkOutThe stay dates the prices belong to.
adultsNumber of adults the prices are for.
googleMapsFeatureIdGoogle Maps feature ID, useful for joining with Google Maps data.
addressStreet address from the hotel page .
phonePhone number from the hotel page .
offersList of booking sites with provider, pricePerNight, priceTotal and bookingUrl. null when the hotel page has no offers.
cheapestProviderName of the booking site with the lowest nightly price .
scrapedAtTime the record was collected (ISO 8601).

How to use Google Hotels Prices Scraper

  1. Open the Actor in Apify Console and go to the Input tab.
  2. In Search, type one or more search phrases, such as hotels in Paris or hotels near Times Square. You can also paste Google Hotels hotel page links into Hotel URLs to price specific properties.
  3. Set Maximum hotels across all targets to your total result budget. Searches run first, followed by direct hotel URLs.
  4. In Stay, pick the check-in and check-out dates and the number of adults. If you leave the dates empty, the Actor prices a one-night stay starting 7 days from today.
  5. In Currency and language, set the currency (for example EUR) and the interface language (for example en).
  6. Keep the default proxy selection in Proxy for datacenter requests with residential fallback on Apify.
  7. Click Start. When the run finishes, open the Output tab to view the results as a table, or download them as JSON, CSV, Excel or XML.

Every hotel page is opened for address, phone and provider offers. includeOffers controls the separate hotel-offers event. Hotels without available prices remain in the dataset with nullable price fields. Duplicate hotels are saved once per run. Schedule the same input to compare scrapedAt, checkIn and checkOut over time.

Input

FieldTypeDescription
queriesarray of stringsSearch phrases, e.g. ["hotels in Paris"]. Provide this or hotelUrls.
hotelUrlsarray of stringsGoogle Hotels hotel page URLs, e.g. https://www.google.com/travel/hotels/entity/ChkI....
hotelIdsarray of stringsGoogle Hotels entityId values from earlier output. Empty by default; shares the total limit with other targets.
pricedOnlybooleanKeep search listings with a positive pricePerNight; default false retains unpriced listings. Direct hotel targets bypass this filter.
minReviewsCountintegerMinimum Google review count for searches; default 0 disables filtering. Combine with minRating.
maxItemsintegerMaximum unique hotels across all targets, 1 to 1000. Default 50.
checkInstringCheck-in date, YYYY-MM-DD. Default: 7 days from today.
checkOutstringCheck-out date, YYYY-MM-DD, 1 to 30 nights after check-in. Default: one night.
adultsintegerNumber of adults, 1 to 12. Default 2.
currencystringISO 4217 currency code, e.g. USD, EUR, GBP. Default USD.
languagestringGoogle interface language, e.g. en or de. Default en.
includeOffersbooleanBill the hotel-offers event for hotels with page details. Hotel pages are always opened. Default false.
minRatingnumberKeep only hotels rated at least this, 0 to 5, e.g. 4.3. Default: no filter.
hotelClassesarray of stringsKeep only these star classes, "1" to "5", e.g. ["4", "5"].
minPricePerNightnumberDrop hotels listed below this nightly price. Default: no minimum.
maxPricePerNightnumberDrop hotels listed above this nightly price. Default: no maximum.
countrystringTwo-letter Google market code, e.g. us or gb.
proxyConfigurationobjectApify Proxy settings. Default on Apify: datacenter proxy with residential fallback; explicit proxy groups keep your selection.

Filters apply before detail requests and before a search listing counts toward the shared maxItems limit. Direct entity hotelUrls and hotelIds bypass search filters. Positive minReviewsCount excludes missing or smaller review counts.

Set pricedOnly: true for rate comparisons: listings with missing or zero pricePerNight are excluded. Leave it false for discovery that includes unpriced properties. A quoted rate does not guarantee booking availability. Combining filters may return fewer hotels; when none match, the run completes with an empty dataset and a message suggesting other dates or relaxed filters. Invalid input stops immediately with a clear error.

Example input:

{
"queries": ["hotels in Paris", "hotels near Times Square"],
"maxItems": 40,
"checkIn": "2026-11-12",
"checkOut": "2026-11-14",
"adults": 2,
"currency": "EUR",
"language": "en",
"includeOffers": true,
"proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }
}

Output

Results are stored in the run's dataset. Here is a real record from a local test run (photo and offer lists shortened):

{
"id": "ChkI1N6v0cC4pfmpARoML2cvMTJxNHhyNHh0EAE",
"sourceUrl": "https://www.google.com/travel/hotels/entity/ChkI1N6v0cC4pfmpARoML2cvMTJxNHhyNHh0EAE/prices?hl=en&ts=CAESDgoCCAMKAggDCgIIAxAAGhgSFhIUCgcI6g8QChgUEgcI6g8QChgWGAIqCQoFOgNHQlAaAA",
"entityId": "ChkI1N6v0cC4pfmpARoML2cvMTJxNHhyNHh0EAE",
"name": "Novotel Suites Paris Stade de France",
"googleHotelUrl": "https://www.google.com/travel/hotels/entity/ChkI1N6v0cC4pfmpARoML2cvMTJxNHhyNHh0EAE",
"query": "https://www.google.com/travel/hotels/entity/ChkI1N6v0cC4pfmpARoML2cvMTJxNHhyNHh0EAE",
"position": 1,
"latitude": 48.923648199999995,
"longitude": 2.3629501000000004,
"hotelClass": 4,
"hotelClassText": "4-star tourist hotel",
"rating": 4.3,
"reviewsCount": 1431,
"description": "Contemporary all-suite lodging with Wi-Fi, a bar & a 24/7 pantry, plus parking.",
"checkInTime": "4:00 PM",
"checkOutTime": "12:00 PM",
"thumbnail": "https://lh3.googleusercontent.com/grass-cs/AABkmLfOSWryWzCIqfEyCyrBUGFB2UmPzU4wAEvy24Wy0trDadO6ropUlz9l1Us-1vdkR1-WQOeiTX6Tc-GNUZXCRGmMvPj-_-_ekXcwfzDxhW9qnnIumQ26wn3b_5kKILQLKSJsZJRS=s150-w92-h150-n-k-no",
"images": [
"https://lh3.googleusercontent.com/grass-cs/AABkmLfOSWryWzCIqfEyCyrBUGFB2UmPzU4wAEvy24Wy0trDadO6ropUlz9l1Us-1vdkR1-WQOeiTX6Tc-GNUZXCRGmMvPj-_-_ekXcwfzDxhW9qnnIumQ26wn3b_5kKILQLKSJsZJRS=s287-w287-h192-n-k-no-v1"
],
"pricePerNight": 247.83,
"pricePerNightText": "£248",
"priceTotal": 495.66,
"currency": "GBP",
"checkIn": "2026-10-20",
"checkOut": "2026-10-22",
"adults": 3,
"googleMapsFeatureId": "0x47e66ea52218c2af:0xa9f295c40a2bef54",
"address": "31 Avenue Jules Rimet St Denis, 93210 Saint-Denis, France",
"phone": "+33 1 49 46 54 54",
"offers": [
{
"provider": "Priceline",
"pricePerNight": 247.83,
"priceTotal": 495.66,
"bookingUrl": "https://www.priceline.com/r/?channel=meta&product=hotel&hotelid=3540105&checkin=20261020&checkout=20261022&rooms=1&cur=GBP&adults=3"
}
],
"cheapestProvider": "Priceline",
"scrapedAt": "2026-09-29T20:06:02.820Z"
}

The Output tab shows an overview table with the most useful columns: name, nightly and total price, currency, cheapest site, rating, reviews, star class, address, dates and the Google Hotels link. The full records, including all offers and photos, are available through the "All fields" view and the API.

How much does it cost to scrape Google Hotels?

The first 10 results of every run are free. Starting with result 11, each hotel record saved to the dataset is charged once through the result event. A run returning 12 hotels produces two charged result events. Deduplicated hotels are not charged again.

Check the Actor's Pricing tab for current terms. Set maxItems to limit the total hotels returned across the run. The log reports FREE_TRIAL first=10 charged=<n> with the charged result count.

Use with AI agents (MCP)

Use it from an AI agent

Connect your agent to Apify's hosted MCP server at https://mcp.apify.com using OAuth. Use https://mcp.apify.com/?tools=axiomworks/google-hotels-prices-scraper, supply queries, hotelUrls or hotelIds, and set the shared maxItems budget. Search phrases run before direct entity URLs, followed by hotelIds. Copy the entityId field from an earlier dataset into hotelIds to monitor the same hotels on new stay dates without rebuilding URLs. Duplicate IDs across target forms produce one record per run. These are Google Hotels entity IDs, not Google Maps place IDs. Each supplied ID also appears in RUN_SUMMARY. Ask the agent to read the RUN_SUMMARY key-value record as well as the dataset: each supplied input has a status (ok, 0-items, blocked or invalid), saved-result count and short reason. An exhausted budget, duplicate hotel, filter or unavailable target can explain a zero count. Summary records are uncharged and never appear as hotel rows.

For API orchestration, cap spending with the run option maxTotalChargeUsd. This option belongs in the API request URL, not in the Actor input. Set RUN_SPEND_CAP to your desired cap before making the request:

curl -X POST \
"https://api.apify.com/v2/acts/axiomworks~google-hotels-prices-scraper/runs?maxTotalChargeUsd=${RUN_SPEND_CAP}" \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"queries":["hotels in Paris"],"maxItems":7}'

Malformed input fails validation and is recorded as invalid when its targets can be identified. A valid target that is blocked or empty produces no error rows; other targets continue. If a target saves hotels before a later page fails, its summary remains ok and explains the partial result.

Integrations and API

You can run the Actor and read its results from your own code through the Apify API. Set your Apify API token (Console, Settings, API & Integrations) in the APIFY_TOKEN environment variable.

Python:

import os
from apify_client import ApifyClient
client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("axiomworks/google-hotels-prices-scraper").call(run_input={
"queries": ["hotels in Paris"],
"maxItems": 20,
"checkIn": "2026-11-12",
"checkOut": "2026-11-14",
"adults": 2,
"currency": "USD",
})
for hotel in client.dataset(run["defaultDatasetId"]).iterate_items():
print(hotel["name"], hotel["pricePerNight"], hotel["cheapestProvider"])

JavaScript:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('axiomworks/google-hotels-prices-scraper').call({
queries: ['hotels in Paris'],
maxItems: 20,
checkIn: '2026-11-12',
checkOut: '2026-11-14',
adults: 2,
currency: 'USD',
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
const lines = items.map((h) => `${h.name}: ${h.pricePerNight} ${h.currency}`);
process.stdout.write(lines.join("\n"));

cURL (starts a run and returns the dataset items when it finishes):

curl -X POST "https://api.apify.com/v2/acts/axiomworks~google-hotels-prices-scraper/run-sync-get-dataset-items" \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"queries": ["hotels in Paris"], "maxItems": 10, "currency": "USD"}'

Use Apify integrations to send results to Google Sheets or trigger webhooks.

Hotel pages without provider offers are retained after the bounded offer retry. The Actor reuses the last valid hotel page rather than downloading it again, so unavailable offers remain empty while address and phone data can still be returned. Each HTTP operation has a 75-second retry budget, and successful requests reuse their proxy session until a failure rotates it.

FAQ

Why are some prices null? Google shows no price when a hotel is sold out for your dates, when it has not published rates yet, or when no booking site covers it. The hotel is still returned so you can see it exists, but pricePerNight, priceTotal and cheapestProvider are null.

Why do my prices differ slightly from what I see in my browser? Google adjusts prices and booking sites by country, device and sign-in state. Proxy location can affect results. Check the returned currency and dates before comparing rates.

Are prices per night or for the whole stay? Both. pricePerNight is the nightly price and priceTotal is the price for the whole stay. With includeOffers on, both come from the cheapest offer, and each offer has its own per-night and total price. Whether taxes are included follows Google's display for the exit country.

How many hotels can I get per search? Up to 1,000 across all targets (the shared maxItems limit), as long as Google has that many for the area. Google shows about 20 hotels per results page, and the Actor follows the pages for you and removes duplicates.

Can I add children? Not yet. The current version prices stays for adults only.

Does the Actor need my Google account? No. It only reads public Google Hotels pages and never logs in.

What happens if Google blocks a request? The Actor waits, switches to a new proxy session and retries. If a whole search fails after several attempts, the run continues with other targets. When none returns hotels, it finishes successfully with a status suggesting another place or dates, relaxed filters, or checking proxyConfiguration. RUN_SUMMARY records each target outcome.

The Actor only collects publicly available information about businesses: hotel names, prices, addresses, public phone numbers and ratings. It does not collect personal data about individuals and does not access anything behind a login.

Google's terms restrict automated access, and its robots.txt disallows travel search crawling. Review the rules that apply to your use and location. Respect Google's and booking providers' trademarks. This Actor is not affiliated with, endorsed by or sponsored by Google.

Feedback

Need guest reviews for the same hotels? Try our sister Actor Booking Reviews Scraper.

Found a bug, missing field or a page that does not parse? Open an issue on the Actor's Issues tab in Apify Console and include the run ID and your input.