# Google Hotels Prices Scraper (`boncross/google-hotels-prices`) Actor

Scrape Google Hotels price comparisons for any hotel and stay. Just add hotel names, URLs or ids and your dates, and get every provider's nightly and total price, cancellation deadline and booking link, plus hotel details, room rates, guest sentiment and amenities. $10 per 1,000 priced hotel-stays.

- **URL**: https://apify.com/boncross/google-hotels-prices.md
- **Developed by:** [BonCross API](https://apify.com/boncross) (community)
- **Categories:** Travel
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $6.50 / 1,000 hotel-priceds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Google Hotels Prices Scraper

### What is Google Hotels Prices Scraper?

Google Hotels compares one hotel across the sites that sell it, often twenty or more for a large property. Google Hotels Prices Scraper gets you that whole comparison for your dates as a single record: each seller's nightly and total price, the free-cancellation deadline and the booking link. Paste a hotel's Google Hotels link or just type its name.

It's the middle one of three Google Hotels actors. [Google Hotels Search Scraper](https://apify.com/boncross/google-hotels-search) lists the hotels in an area with one price each, and this actor takes a hotel from that list (or any hotel you name) and shows who sells it and for how much. Guest reviews are a third job, done by [Google Hotels Reviews Scraper](https://apify.com/boncross/google-hotels-reviews).

What you get here that a single lowest price can't tell you:

- You pay per hotel and stay, not per seller. On 7 October 2026 one record held 27 sellers for The Plaza in New York and another held 31 for Hotel Adlon Kempinski Berlin. Each cost $0.01.
- The hotel's own rate has a field to itself. That night the Adlon's site asked $417 while the cheapest seller asked $343, which is the parity gap in two numbers.
- A typed name lands on the right hotel or you aren't charged. In our test of 7 October 2026, hotels typed in Japanese, Korean and Chinese resolved, three misspelled names did too, and none of the 4 invented names returned a hotel.
- Prices match the party you're booking for: adults, children by age and up to eight rooms, for as many date ranges as you list.
- The same record has the hotel details, featured room rates, guest sentiment by topic, amenities and a verified Place ID, at no extra charge.

**BonCross Verified** means we tested this actor against the live site before release and kept the record:

- 45 of 45 live checks on its inputs and filters passed on 7 October 2026
- 17 hotel names run the same day, 4 of them invented: 12 hotels, 255 offers, the 4 invented refused
- Charges matched the rows
- A weak name match gets an uncharged row naming both

Revenue and distribution teams use it for rate parity checks each morning, with the seller's deep link as evidence. It also suits best-rate-guarantee checks on a booked stay, metasearch and travel products that need a comparison table, and audits of which sellers list a property at all.

### What data is in a price record?

| | |
|---|---|
| 🏷 Seller name and logo | 💰 Nightly and stay price from each seller |
| Pre-tax price, where shown | 🔗 Booking link and the seller's own deep link |
| Free cancellation and its deadline | 🏨 The hotel's own direct rate |
| 🛏 Featured room rates with bed type | Room features and cancellation terms |
| ⭐ Rating and review count | Rating histogram |
| Guest sentiment by topic | Review sources with a sample review |
| Amenities, including the ones the hotel lacks | Eco certification and sustainability practices |
| 📍 Address, phone, website and coordinates | Verified Place ID, entity id and feature id |
| 🕒 Check-in and check-out times | 📷 Photos |
| Similar hotels and nearby places | 📈 Price change since your last run |

### How much does it cost to scrape Google Hotels prices?

| Event | Free plan | Starter | Scale | Business |
|---|---|---|---|---|
| `actor-start`, per run | $0.002 | $0.002 | $0.002 | $0.002 |
| `hotel-resolved`, per plain name resolved to a hotel | $0.002 | $0.002 | $0.002 | $0.002 |
| `hotel-checked`, per hotel and stay Google answered, with or without offers | $0.0005 | $0.0005 | $0.0005 | $0.0005 |
| `hotel-priced`, per hotel and stay returned with offers, with all providers, hotel record, sentiment, amenities, review sources, similar hotels and nearby places | $0.0095 | $0.0078 | $0.0073 | $0.0065 |
| `hotel-about`, per hotel and stay when `includeAbout` is on | $0.003 | $0.0027 | $0.0024 | $0.0021 |

Enterprise plans pay the Business price.

**$10.00 per 1,000 hotel-stays with the full seller panel** (`hotel-checked` + `hotel-priced`) on the Free plan, $7.00 on Business. Nothing is added on top: proxy usage and platform usage are in that price.

What you pay depends on what Google answered:

- A stay with offers pays `hotel-checked` and `hotel-priced`.
- A stay with no offers pays `hotel-checked` only. That covers a sold-out stay, one where your provider filter left nothing, and one whose price hasn't moved when you're using the price memory.
- An error row is free. You still get the row, and it says what went wrong.

Passing links or entity ids skips the $0.002 name fee.

- 50 hotels by name, three stays each, About tab on: $0.002 + 50 × $0.002 + 150 × $0.0005 + 150 × $0.0095 + 150 × $0.003 = **$2.052** ($1.467 on Business). With entity ids and no About tab that run is $0.002 + 150 × $0.0005 + 150 × $0.0095 = $1.502 ($1.052 on Business).
- A daily monitor of 50 hotels for one stay: day one is $0.002 + 50 × $0.0005 + 50 × $0.0095 = $0.502 ($0.352 on Business). With a price store, a day on which 12 hotels changed costs $0.002 + 50 × $0.0005 + 12 × $0.0095 = **$0.141** ($0.105 on Business).

Apify's Free plan comes with $5 of credits each month. Here that's about 490 priced hotel-stays if you pass links or ids, in runs of ten, or about 400 if you type names.

### How to scrape Google Hotels prices for a hotel

1. [Sign up for a free Apify account](https://console.apify.com/sign-up), then open [Google Hotels Prices Scraper](https://apify.com/boncross/google-hotels-prices).
2. Under Hotels, add one hotel per line: a Google Hotels link, an entity id or a name such as "The Plaza, New York".
3. Set check-in, check-out, guests and currency.
4. Press Start. One record per hotel and stay appears in the Output tab.
5. Download it as JSON, Excel or CSV. JSON keeps the list of sellers nested. The spreadsheet formats flatten it into columns.

### ⬇️ Input

Give it hotels and a stay. A hotel can be a Google Hotels URL, a bare entity id as returned by Google Hotels Search Scraper, or a plain name. If Google doesn't recognise a name alone, add the city after a comma.

Got a long list of links? Start URLs loads them in bulk from a file, a Google Sheet or a remote list. It's combined with whatever is under Hotels.

"Maximum results for the whole run" caps the run across all hotels. A result is one hotel for one stay, which makes three hotels over two stays six results. Nothing past the cap is fetched or charged for.

#### Two hotels, one stay, by name

```json
{
  "hotels": ["The Plaza, New York", "Hotel Adlon Kempinski Berlin"],
  "checkIn": "2026-11-10",
  "checkOut": "2026-11-12",
  "adults": 2,
  "currency": "USD"
}
```

#### A family with children and two rooms

```json
{
  "hotels": ["https://www.google.com/travel/hotels/entity/ChUIneeg3YDGqvthGgkvbS8wNDJ5N2oQAQ"],
  "checkIn": "2026-12-20",
  "checkOut": "2026-12-23",
  "adults": 2,
  "childrenAges": [4, 9],
  "rooms": 2,
  "currency": "USD"
}
```

#### Several stays per hotel, free cancellation only

```json
{
  "hotels": ["ChUIneeg3YDGqvthGgkvbS8wNDJ5N2oQAQ", "ChUI2f3tmL_9t_IZGgkvbS8wOG1mdzIQAQ"],
  "stays": [
    { "checkIn": "2026-11-10", "checkOut": "2026-11-12" },
    { "checkIn": "2026-11-17", "checkOut": "2026-11-19" }
  ],
  "freeCancellationOnly": true,
  "providerInclude": ["Booking.com", "Expedia", "Agoda"]
}
```

#### A daily rate monitor that only reports changes

```json
{
  "hotels": ["ChUI2f3tmL_9t_IZGgkvbS8wOG1mdzIQAQ"],
  "checkInDaysAhead": 30,
  "nights": 2,
  "priceStoreName": "adlon-berlin-30d",
  "onlyNewOrChanged": true,
  "includeImages": false,
  "includeAmenities": false
}
```

#### Prices and nothing else

Switch off amenities and sustainability, and leave similar hotels off, when prices are all you need. The price columns, the hotel record and the Place ID are unchanged. Only the amenity, eco-certification, sustainability and health-and-safety columns are left out.

```json
{
  "hotels": ["ChUIneeg3YDGqvthGgkvbS8wNDJ5N2oQAQ"],
  "checkInDaysAhead": 30,
  "nights": 2,
  "includeAmenities": false,
  "includeSustainability": false
}
```

#### With the About tab, similar hotels and the Maps listing

```json
{
  "hotels": ["Raffles Singapore"],
  "checkIn": "2026-11-10",
  "checkOut": "2026-11-12",
  "includeAbout": true,
  "includeSimilarHotels": true,
  "includeNearbyPlaces": true,
  "includeMapsDetails": true
}
```

#### All inputs

| Field | Notes |
|---|---|
| `hotels`, `startUrls` | The hotels, as links, entity ids or names, and the bulk loader for links. |
| `maxItems` | Run-wide cap on hotel-stays. 0 means no cap. |
| `checkIn`, `checkOut` | The stay, as YYYY-MM-DD. Ignored when `stays` is set. |
| `checkInDaysAhead`, `nights` | A rolling stay for schedules, used when the dates are empty. Defaults: 30 days ahead, 2 nights. |
| `stays` | Several date ranges, each priced for each hotel. |
| `adults`, `childrenAges`, `rooms` | 1 to 8 adults (default 2), one age per child, 1 to 8 rooms. |
| `providerInclude`, `providerExclude` | Case-insensitive pieces of a seller's name to keep (`["Booking.com", "Agoda"]`) or drop (`["Trip.com"]`). Empty keeps them all. |
| `freeCancellationOnly` | Keep only offers Google marks as free cancellation. |
| `includeRates` | Room-level rates with room name, features, per-night and total price. On by default. |
| `includeImages` | Up to 20 photo URLs per hotel. On by default. |
| `includeReviews` | The star histogram and third-party review sources, with one sample review each. On by default. |
| `includeSentiment` | For each topic (Service, Location, Breakfast, Cleanliness and so on), the mentions and how many were positive or negative. On by default, no extra charge. |
| `includeAmenities`, `includeSustainability` | The grouped amenities list, and eco-certification with sustainability and health-and-safety measures. Both on by default. |
| `includeSimilarHotels`, `includeNearbyPlaces` | Similar hotels priced for the same stay, and nearby attractions, transit and restaurants. Off by default. |
| `includeAbout` | Google's description, review summary, typical price range and location score. Off by default, billed as `hotel-about`. |
| `includeMapsDetails` | The hotel's Google Maps listing: plus code, categories, editorial text, Maps amenities, times, phone and website. Off by default, no extra charge. |
| `currency`, `language` | Defaults `USD` and `en`. Language affects names, address formatting and seller labels. |
| `priceStoreName`, `onlyNewOrChanged` | The price memory, and the switch that returns only hotels whose lowest price moved. |
| `strictNameMatch` | On by default. See below. |
| `maxConcurrency`, `delayMs` | Tuning. See below. |

#### For developers

- `strictNameMatch` (default `true`) applies to hotels given by name. The name you typed is compared with the hotel's name in the run's language, its local-script name and its English name, ignoring case, accents and character width. If they don't look alike you get an uncharged error row with `resolvedName` and `nameMatchScore`, and that hotel's other stays aren't fetched. Set it to `false` to accept whatever Google resolves.
- `hotel-resolved` is charged once a stay confirms the match, not when the lookup is made.
- `maxItems` counts hotel-stays. Rows reporting an input that couldn't be resolved aren't counted.
- `stays` also accepts `checkin` and `checkout` in lower case, as do the top-level date inputs.
- `priceStoreName` names a key-value store that remembers the lowest price per hotel, stay, occupancy and currency. With `onlyNewOrChanged`, an unchanged stay is skipped and pays `hotel-checked` only.
- `maxConcurrency` (default `16`, 1 to 32) is how many requests run at once. `delayMs` (default `0`) adds a pause before each. We'd lower the first only if a run reports errors.
- Rows are written in input order. If Apify moves a run to another server, or it restarts, it carries on where it stopped and no hotel-stay is written or charged twice.

### ⬆️ Output

One record per hotel and stay. This is The Plaza from the first example, run on 7 October 2026, with the long lists and links shortened.

```json
{
  "input": "The Plaza, New York",
  "resolvedBy": "entity-page-link",
  "nameMatchScore": 1,
  "id": "ChUIneeg3YDGqvthGgkvbS8wNDJ5N2oQAQ-2026-11-10-2026-11-12",
  "url": "https://www.google.com/travel/hotels/entity/ChUIneeg3YDGqvthGgkvbS8wNDJ5N2oQAQ",
  "name": "The Plaza",
  "hotelClassLabel": "5-star hotel",
  "stars": 5,
  "address": "768 5th Ave, New York, NY 10019",
  "phone": "(212) 759-3000",
  "website": "https://www.theplazany.com/?…",
  "countryCode": "US",
  "lat": 40.7646318,
  "lng": -73.9743251,
  "checkInFrom": "15:00",
  "checkOutUntil": "12:00",
  "rating": 4.5,
  "ratingScale": 5,
  "reviewCount": 6760,
  "ratingHistogram": [ { "stars": 5, "percent": 71, "count": 4699 }, { "stars": 4, "percent": 21, "count": 1429 }, "…" ],
  "images": ["https://lh3.googleusercontent.com/…"],
  "mapsUrl": "https://maps.google.com/maps?…",
  "placeId": "ChIJYaVdffBYwokRnTOoCzCq9mE",
  "placeIdVerified": true,
  "pricesIncludeTax": true,
  "hasPricesExcludingTax": true,
  "offers": [
    { "provider": "The Plaza", "providerId": 76, "isOfficialSite": true, "pricePerNight": 2017, "pricePerNightText": "$2,017", "pricePerNightExcludingTax": 1770, "priceTotal": 4033, "priceTotalText": "$4,033", "priceTotalExcludingTax": 3541, "pricesIncludeTax": true, "isFreeCancellation": false, "freeCancellationUntil": null, "bookingUrl": "https://www.google.com/travel/lodging/clk?…", "partnerUrl": "https://travel-productads.koddi.com/…", "logo": "https://www.gstatic.com/travel-hotels/branding/…" },
    { "provider": "Expedia.com", "providerId": 89, "isOfficialSite": false, "pricePerNight": 2024, "pricePerNightText": "$2,024", "pricePerNightExcludingTax": 1761, "priceTotal": 4048, "priceTotalText": "$4,048", "priceTotalExcludingTax": 3521, "pricesIncludeTax": true, "isFreeCancellation": false, "freeCancellationUntil": null, "bookingUrl": "https://www.google.com/travel/lodging/clk?…", "partnerUrl": "https://www.expedia.com/Hotel-Search?selected=28044&startDate=2026-11-10&endDate=2026-11-12&…" },
    "…",
    { "provider": "Evendo", "providerId": 365615871, "isOfficialSite": false, "pricePerNight": 2336, "pricePerNightText": "$2,336", "pricePerNightExcludingTax": 1918, "priceTotal": 4673, "priceTotalText": "$4,673", "priceTotalExcludingTax": 3837, "pricesIncludeTax": true, "isFreeCancellation": true, "freeCancellationUntil": "Nov 7", "bookingUrl": "https://www.google.com/travel/lodging/clk?…" },
    "…"
  ],
  "offerCount": 27,
  "lowestPerNight": 2017,
  "featuredProviders": [
    { "provider": "Expedia.com", "isOfficialSite": false, "includedAmenities": ["Free Wi-Fi"], "pricePerNightText": "$2,024", "pricePerNight": 2024, "pricePerNightExcludingTax": 1761, "priceTotalText": "$4,048", "pricesIncludeTax": true, "rooms": [ { "roomName": "1 king bed", "features": ["Free cancellation until Nov 8", "2 guests", "…"], "bedType": { "count": 1, "type": "king" }, "isFreeCancellation": true, "pricePerNight": 2367, "priceTotal": 4735, "pricesIncludeTax": true }, "…" ] },
    "…"
  ],
  "rates": [ { "provider": "Expedia.com", "roomName": "1 king bed", "features": ["2 guests", "Free Wi-Fi"], "bedType": { "count": 1, "type": "king" }, "isFreeCancellation": false, "pricePerNightText": "$2,024", "pricePerNight": 2024, "pricePerNightExcludingTax": 1761, "priceTotalText": "$4,048", "priceTotal": 4048, "pricesIncludeTax": true, "bookingUrl": "https://www.google.com/aclk?…" }, "…" ],
  "ecoCertified": true,
  "sustainability": { "ecoCertified": true, "certifications": ["Green Key Eco Rating"], "practices": [ { "group": "Water conservation", "items": ["Water use audited by an independent organization", "Towel and linen reuse program"] }, "…" ] },
  "healthAndSafety": [ { "group": "Personal protection", "items": ["Hand-sanitizer and/or sanitizing wipes in common areas", "Masks and/or gloves available for guests"] }, "…" ],
  "entityId": "ChUIneeg3YDGqvthGgkvbS8wNDJ5N2oQAQ",
  "propertyType": "hotel",
  "fid": "0x0:0x61f6aa300ba8339d",
  "kgId": "/m/042y7j",
  "entityUrl": "https://www.google.com/travel/hotels/entity/ChUIneeg3YDGqvthGgkvbS8wNDJ5N2oQAQ",
  "currency": "USD",
  "checkIn": "2026-11-10",
  "checkOut": "2026-11-12",
  "nights": 2,
  "adults": 2,
  "childrenAges": [],
  "rooms": 1,
  "sentiment": [ { "topic": "Food and Beverage", "shortLabel": "Dining", "mentions": 581, "positive": 447, "negative": 57, "positiveShare": 0.769, "highlighted": true }, "…" ],
  "amenities": {
    "popular": [ { "name": "Wi-Fi", "note": "free" }, { "name": "Air conditioning", "note": null }, "…" ],
    "groups": [ { "group": "Internet", "items": [ { "name": "Wi-Fi", "note": "free", "isAvailable": true }, { "name": "Wi-Fi in public areas", "note": null, "isAvailable": true } ] }, "…" ],
    "all": ["Wi-Fi", "Wi-Fi in public areas", "…"],
    "excluded": ["pools", "hot tub", "spa"]
  },
  "reviewSources": [
    { "source": "Tripadvisor", "rating": 4.5, "ratingScale": 5, "reviewCount": 5721,
      "sampleReview": { "author": "970nguyenc", "when": "a week ago", "rating": 5, "ratingScale": 5, "text": "Very high quality hotel & great service.", "url": "https://www.tripadvisor.com/ShowUserReviews-g60763-d675616-r1079244517?…" } },
    "…"
  ],
  "lowestTotal": 4033,
  "lowestProvider": "The Plaza",
  "officialSiteOffer": { "provider": "The Plaza", "providerId": 76, "isOfficialSite": true, "pricePerNight": 2017, "pricePerNightText": "$2,017", "pricePerNightExcludingTax": 1770, "priceTotal": 4033, "priceTotalText": "$4,033", "priceTotalExcludingTax": 3541, "pricesIncludeTax": true, "isFreeCancellation": false, "freeCancellationUntil": null, "bookingUrl": "https://www.google.com/travel/lodging/clk?…", "partnerUrl": "https://travel-productads.koddi.com/…" },
  "previousLowestPerNight": null,
  "previousScrapedAt": null,
  "priceChange": null,
  "scrapedAt": "2026-10-07T20:26:03.000Z",
  "priceChangePct": null
}
```

How to read it:

| Column | Meaning |
|---|---|
| `offers`, `offerCount` | One entry per seller. `offerCount` is the length of the list. |
| `bookingUrl`, `partnerUrl` | `bookingUrl` is Google's click-through and expires after a while. `partnerUrl` is the seller's own deep link with your dates and occupancy filled in, and it's the durable one. |
| `rates`, `featuredProviders` | The room-level breakdown from the sellers Google features. It's shorter than `offers` because only some sellers publish one. |
| `pricesIncludeTax` | On the hotel row and on each offer, featured provider, room rate and similar hotel. Prices include taxes and fees in any language and country, and the flag is null only where there's no price. It was true on every priced offer, rate and similar hotel checked on 2 October 2026 in English, Japanese, German and British English. |
| `hasPricesExcludingTax` | Whether Google showed pre-tax figures for this hotel on this request. |
| `officialSiteOffer` | The hotel's own direct offer, repeated from `offers` when Google lists one. Null otherwise. |
| `lowestPerNight`, `lowestTotal`, `lowestProvider` | Taken after your provider and free-cancellation filters. They describe the offers you kept. |
| `nameMatchScore`, `resolvedBy` | How closely the resolved hotel matched the name you typed. Null when you gave an id or a URL, because nothing was matched. |
| `previousLowestPerNight`, `previousScrapedAt`, `priceChange`, `priceChangePct` | The price memory. Null until a second run reuses the same `priceStoreName`. |
| `propertyType` | `hotel` or `rental`. |
| `typicalPricePerNight` | With `includeAbout` only. Google prints it before or after tax depending on the page, and its own `pricesIncludeTax` says which. It was before tax on most pages measured. |
| `error` | Present in place of the panel when a hotel can't be resolved, resolves to a different property, or its page can't be read. |

### How many sellers per hotel, and how fast?

Eight hotels for 2 adults and 2 nights, measured on 8 September 2026:

| | |
|---|---|
| Offers returned | 184 across 8 hotels, 1 to 31 per hotel |
| Sellers per hotel | 19 to 31 for large chains, 1 for a single apartment |
| Names resolved | 6 of 6 plain names |

Whole runs on Apify at the default settings, 2 adults:

| Run | Rows | Run time |
|---|---|---|
| 1 hotel, 1 stay | 1 | 4 to 6 s (2 October 2026, two runs) |
| 6 hotels × 3 stays | 18 | 8 to 17 s over four runs (1 October 2026) |
| 12 hotels × 3 stays | 36 | 30 to 36 s (2 October 2026, two runs in a slow minute, and 10 s in a quiet one) |
| 200 hotels, 1 stay | 200 | 1.5 to 2.8 min (2 October 2026, four runs) |

That's about 75 to 130 hotel-stays a minute, and several thousand fit in the default one-hour run. Google answers some hotel pages slowly, which is why run time depends more on the hotels than on how many you send.

### FAQ

#### How many sellers will I get for my hotel?

However many Google lists for it. Large chain hotels gave 19 to 31 in the reference run and a single apartment gave one. Google decides, and small properties often have one or two.

#### I typed a name and got an error row. Why?

Either Google found nothing for the name, or it found a hotel that doesn't look like the one you typed. The row names what you typed and what Google offered, and it isn't charged. Add the city after a comma, or paste the hotel's Google Hotels link. A link never needs matching.

#### Do names in other languages work?

They do. Hotels typed in Japanese, Korean and Chinese matched their hotel in an English run in our test of 7 October 2026. One real name in that test found no hotel at all, a Seoul hotel typed in Korean, because Google's own hotel search returned nothing for it. Use the link for a hotel like that.

#### How do I check rate parity?

Read `officialSiteOffer` against `lowestPerNight` and `lowestProvider`. Each entry in `offers` also has `isOfficialSite`. When the lowest seller isn't the hotel, the `partnerUrl` of that offer is your evidence.

#### Can I price for children, several rooms or several date ranges?

`childrenAges` takes one age per child and `rooms` goes up to eight. Sellers quote for exactly that party. For several date ranges use `stays`: each hotel is priced for each range, and each hotel-stay is charged once.

#### Why is a pre-tax price null?

Google didn't show a pre-tax price for that hotel on that request. The all-in price is always there, and `hasPricesExcludingTax` tells you which case you're in.

#### How do I pay only when a price changes?

Name a price memory store and switch on "Only new or changed prices", then schedule the run. A hotel whose lowest price hasn't moved is skipped and pays the $0.0005 `hotel-checked` fee alone.

#### Do I need proxies or a Google account?

No account, no key and no proxy to arrange. Proxy usage is part of the price.

#### What are the limits?

- Room-level rates come only from the sellers Google features with an expandable room list, typically three or four.
- Google decides which sellers appear. The set follows where the request comes from, not a setting: asking for the Japanese or the US market returned the same 17 sellers at the same prices.
- Pre-tax figures are filled only where Google shows them. `pricePerNight` and `priceTotal` always include taxes and fees.
- Amenities, sustainability, health-and-safety measures, eco certification and the location score are read in English. In another interface language they're `null`, which means "not read", not "none". A room's `isFreeCancellation` is filled in English, Japanese and German and is `null` in other languages unless the room says so.
- Amenities the hotel lacks are in `amenities.excluded`, and each item in `amenities.groups` has `isAvailable` true or false.
- Description, typical price and location score sit on Google's About tab, which is a separate option and a separate charge.
- The name check compares names, not places. A same-brand hotel in another city can still get through when most of the name matches. Add the city, or pass the link.
- Google's own booking links expire after a while.
- Google publishes no official Hotels API, which means there's no first-party feed to compare this against.

#### Is it legal to scrape Google Hotels prices?

The actor reads what Google serves to a logged-out visitor: prices and listings, not personal data. Scraping public data is generally legal. Complying with Google's terms and your local law in how you use it is your responsibility.

### Parity checks on a schedule, or from your code

For a daily parity report, put the monitor example on an Apify Schedule. A webhook can fire when the run ends, and Apify's integrations will pass the changed hotels to Slack, Google Sheets, Zapier or Make.

The API call for a short run is `POST https://api.apify.com/v2/acts/boncross~google-hotels-prices/run-sync-get-dataset-items` with the input JSON as the body, and it returns the records directly. Use the standard run endpoints or `apify-client` (NPM or PyPI) for bigger lists.

Through the Apify MCP server at `mcp.apify.com` the actor is available to AI agents as the tool `google-hotels-prices`. Give an agent a hotel name and dates and it gets the full comparison, direct rate and deep links included.

### More from BonCross

- [Google Hotels Reviews Scraper](https://apify.com/boncross/google-hotels-reviews): Google Hotels reviews from every source Google shows, including the hotel's own site.
- [Google Hotels Search Scraper](https://apify.com/boncross/google-hotels-search): Google Hotels prices for a whole city or map area.
- [Hilton Hotel Details Scraper](https://apify.com/boncross/hilton-hotel-details): Everything a Hilton property publishes about itself: address, coordinates, phone,…
- [Hilton Hotel Search Scraper](https://apify.com/boncross/hilton-hotel-search): Every Hilton hotel for any destination and dates.
- [Hilton Room Rates Scraper](https://apify.com/boncross/hilton-room-rates): Every room Hilton is selling for a hotel and your dates.
- [ikyu.com Room Rates Scraper (一休)](https://apify.com/boncross/ikyu-room-rates): Each room and rate plan ikyu.com (一休) sells for a hotel or ryokan on your dates.

### Your feedback

If a seller is missing from a record, or a price doesn't match what Google shows for the same dates, raise it on the Issues tab in Apify Console with the hotel and stay. BonCross reads each report and answers there.

# Changelog

This Actor's version history is a separate document: https://apify.com/boncross/google-hotels-prices/changelog.md

# Actor input Schema

## `hotels` (type: `array`):

One hotel per entry: a Google Hotels URL (https://www.google.com/travel/hotels/entity/Ch…), a bare entity id (Ch…), or a hotel name. Add the city for names ("The Plaza, New York", "Hotel Adlon Kempinski Berlin"). Entity ids are what the Google Hotels Search Scraper actor returns.

## `startUrls` (type: `array`):

Google Hotels page addresses, with the option to load them in bulk from a file, a Google Sheet or a remote list. Use this when you have more links than you want to paste. Combined with anything in the list above.

## `maxItems` (type: `integer`):

Stop after this many results across the whole run. A result is one hotel for one stay, carrying all of its offers and rates, so three hotels over two stays is six. 0 = no limit. Rows that report an input the actor could not resolve are not counted.

## `checkIn` (type: `string`):

YYYY-MM-DD. Leave empty to use "Check-in days ahead". Ignored when Stays is set. The lowercase spelling checkin still works.

## `checkOut` (type: `string`):

YYYY-MM-DD. Leave empty to use "Nights". Ignored when Stays is set. The lowercase spelling checkout still works.

## `checkInDaysAhead` (type: `integer`):

Only used when Check-in date is empty: check in this many days from today, which suits scheduled runs. The lowercase spelling checkinDaysAhead still works.

## `nights` (type: `integer`):

Used when Check-out date is empty.

## `stays` (type: `array`):

Price every hotel for several date ranges in one run: \[{"checkin":"2026-11-10","checkout":"2026-11-12"}, {"checkin":"2026-11-17","checkout":"2026-11-19"}]. One result per hotel per stay.

## `adults` (type: `integer`):

1 to 8. Providers quote for this occupancy.

## `childrenAges` (type: `array`):

One age per child, e.g. \[4, 9]. Empty = no children.

## `rooms` (type: `integer`):

1 to 8.

## `providerInclude` (type: `array`):

Case-insensitive substrings, e.g. \["Booking.com", "Agoda", "Expedia"]. Empty = all providers.

## `providerExclude` (type: `array`):

Case-insensitive substrings to drop, e.g. \["Trip.com"].

## `freeCancellationOnly` (type: `boolean`):

Keep only offers Google marks as free cancellation.

## `includeRates` (type: `boolean`):

Include the room-level rates Google lists (room name, features, per-night and total price).

## `includeImages` (type: `boolean`):

Include up to 20 photo URLs per hotel.

## `includeReviews` (type: `boolean`):

Include the star histogram and third-party review sources (Tripadvisor, Trip.com, …) with one sample review each.

## `includeSentiment` (type: `boolean`):

Google's "what guests are saying" breakdown: for each topic (Service, Location, Breakfast, Cleanliness, Sleep and so on) the number of mentions and how many were positive or negative. It is on the same page, so it costs nothing extra.

## `includeAmenities` (type: `boolean`):

The full amenities list grouped the way Google shows it (Internet, Services, Wellness, Pets, Pools, Parking, Accessibility and so on) with qualifiers such as "free", "extra charge" or "24 hour", plus the popular-amenities shortlist. Same page, no extra charge.

## `includeSustainability` (type: `boolean`):

Eco-certification, the sustainability practices and the health & safety measures the hotel lists (English pages). Switch this off together with amenities and similar hotels for a lighter, price-focused run: every price column, the hotel record and the Place ID are unchanged.

## `includeSimilarHotels` (type: `boolean`):

The hotels Google lists as similar on the page, each priced for the same stay, with rating, class and coordinates.

## `includeNearbyPlaces` (type: `boolean`):

Attractions, transit hubs and restaurants Google lists near the hotel, with walking / transit times, rating and coordinates.

## `includeAbout` (type: `boolean`):

Also fetch the hotel's About tab, one extra page per hotel and stay billed as hotel-about: Google's description, the AI review summary, the typical nightly price range for your dates with a "prices are low" flag, and the location score with its sub-scores.

## `includeMapsDetails` (type: `boolean`):

Also read the hotel's Google Maps listing, at no extra charge: plus code, categories, Google's editorial tagline and description paragraphs, Maps amenities with available or not-available flags, check-in and check-out times, phone and website.

## `currency` (type: `string`):

ISO code, e.g. USD, EUR, GBP, JPY.

## `language` (type: `string`):

Google interface language code, e.g. en, ja, de. Affects names, address formatting and provider labels.

## `priceStoreName` (type: `string`):

Name of a key-value store. When set, the actor remembers the lowest price per hotel, stay, occupancy and currency, and on later runs adds previousLowestPerNight, priceChange and priceChangePct. Pair it with a schedule for rate monitoring.

## `onlyNewOrChanged` (type: `boolean`):

Needs a price memory store. Skips results whose lowest price is unchanged since last run. A skipped stay is charged only the small hotel-checked fee, not the priced-stay fee.

## `strictNameMatch` (type: `boolean`):

For hotels given by name: if the hotel Google resolves the name to does not look like the one you typed, return an error row naming both instead, uncharged; the rest of that hotel's stays are not fetched. Names are compared across scripts (a Japanese or Korean name matches its hotel in an English run) and ignoring case, accents and character width.

## `maxConcurrency` (type: `integer`):

How many requests run at once across the whole run. The default is the fastest level measured clean; lower it only if a run reports refusals or errors.

## `delayMs` (type: `integer`):

Optional pause before each call, in milliseconds. 0 (the default) runs as fast as the parallel limit allows.

## Actor input object example

```json
{
  "hotels": [
    "The Plaza, New York",
    "Hotel Adlon Kempinski Berlin"
  ],
  "startUrls": [],
  "maxItems": 0,
  "checkIn": "",
  "checkOut": "",
  "checkInDaysAhead": 30,
  "nights": 2,
  "stays": [],
  "adults": 2,
  "childrenAges": [],
  "rooms": 1,
  "providerInclude": [],
  "providerExclude": [],
  "freeCancellationOnly": false,
  "includeRates": true,
  "includeImages": true,
  "includeReviews": true,
  "includeSentiment": true,
  "includeAmenities": true,
  "includeSustainability": true,
  "includeSimilarHotels": false,
  "includeNearbyPlaces": false,
  "includeAbout": false,
  "includeMapsDetails": false,
  "currency": "USD",
  "language": "en",
  "priceStoreName": "",
  "onlyNewOrChanged": false,
  "strictNameMatch": true,
  "maxConcurrency": 16,
  "delayMs": 0
}
```

# Actor output Schema

## `dataset` (type: `string`):

Google Hotels price panel: every row the run returned.

## `stats` (type: `string`):

Counts for the run: what was resolved, fetched, filtered and returned.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "hotels": [
        "The Plaza, New York",
        "Hotel Adlon Kempinski Berlin"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("boncross/google-hotels-prices").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "hotels": [
        "The Plaza, New York",
        "Hotel Adlon Kempinski Berlin",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("boncross/google-hotels-prices").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "hotels": [
    "The Plaza, New York",
    "Hotel Adlon Kempinski Berlin"
  ]
}' |
apify call boncross/google-hotels-prices --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,boncross/google-hotels-prices"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/kGsEh8hU8UhUA3HLb/builds/k52Sz8yQb2xbydecw/openapi.json
