# Google Hotels Scraper - 54 Fields, 90-Date Price Curve (`zen-studio/google-hotels-scraper`) Actor

Scrape Google Hotels with 54 fields per hotel and every booking site's price nested inside the row. Price the same hotels across up to 90 check-in dates in one run. $0.99 per 1,000 hotels.

- **URL**: https://apify.com/zen-studio/google-hotels-scraper.md
- **Developed by:** [Zen Studio](https://apify.com/zen-studio) (community)
- **Categories:** Travel, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.69 / 1,000 hotels

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 Scraper | Live Prices from Every Booking Site, Ratings & Amenities (2026)

[![Compare hotel rates. Across 90 check-in dates. Booking.com. Expedia. Agoda. And more.](https://api.apify.com/v2/key-value-stores/pJ7iaZsTFhR3k9tjV/records/google-hotels-scraper-readme-hero-v3.png)](https://console.apify.com/actors/LVhra6loOsBkf4eKg/input)

From <strong>Zen Studio</strong>, creators of <a href="https://apify.com/zen-studio/google-maps-scraper">Google Maps Scraper</a> and <a href="https://apify.com/zen-studio/google-maps-reviews-scraper">Google Maps Reviews Scraper</a>. Extend your hotel research with business details and guest review histories from the same studio.

### Why choose this actor?

<strong>Compare booking sites and check-in dates together.</strong> Collect the offers Google shows from Booking.com, Expedia, Agoda and hotel websites. Price stays across up to 90 consecutive check-in dates in one run, keeping the same stay length. Use relative dates to keep scheduled comparisons moving forward.

<strong>See what each rate includes.</strong> Export nightly prices, taxes and fees, room options, perks and cancellation terms where available. Booking-site offers stay grouped under their hotel, with a separate dataset view for comparing sites.

<strong>Add the context behind the price.</strong> Hotel records include amenities, rating breakdowns and guest-review topics with positive and negative mention counts. Enable booking-site comparison for available hotel addresses and phone numbers, too.

<a href="https://console.apify.com/actors/LVhra6loOsBkf4eKg/input" data-demo-cta="true"><img src="https://api.apify.com/v2/key-value-stores/pJ7iaZsTFhR3k9tjV/records/google-hotels-scraper-readme-cta-v1.svg" width="234" height="48" alt="Compare your hotel rates"/></a>

### Quick start

Start with up to three hotels across three check-in dates, each for a two-night stay. Change the destination, then increase <code>sweepDays</code> up to 90 when you are ready.

```json
{
  "searchQueries": [
    "hotels in Lisbon"
  ],
  "checkIn": "30",
  "checkOut": "32",
  "sweepDays": 3,
  "currency": "EUR",
  "countryCode": "pt",
  "maxResultsPerQuery": 3,
  "includeRates": true,
  "includeSponsored": false
}
```

<a href="https://console.apify.com/actors/LVhra6loOsBkf4eKg/input">Open actor input</a> to choose your destination and dates. Booking-site comparison is optional and charged separately per hotel/date with returned offers. The example enables it; partner availability varies by hotel and stay. JSON preserves nested offers; the Booking sites view makes them easier to compare.

<table><tr><td colspan="5" style="background:#1A73E8;color:white;padding:10px 14px;font-size:13px;font-weight:700">Zen Studio · Travel, Maps &amp; Reviews</td></tr><tr><td style="background:#D2E3FC;padding:8px 10px;border:1px solid #CADAF4;vertical-align:top"><span style="white-space:nowrap"><img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/NWYsOG96fMDy8ycdf-actor-LVhra6loOsBkf4eKg-ket8ohFjul-google-ads-transparency-scraper.png" width="20" height="20" alt="" style="display:inline-block;vertical-align:middle;margin:0"/>&nbsp;<a href="https://console.apify.com/actors/LVhra6loOsBkf4eKg/input" style="color:#174EA6;text-decoration:none;font-weight:700;font-size:13px">Google Hotels</a></span><br><span style="color:#29486D;font-size:12px;white-space:nowrap">You are here</span></td><td style="background:#E8F0FE;padding:8px 10px;border:1px solid #CADAF4;vertical-align:top"><span style="white-space:nowrap"><img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/NWYsOG96fMDy8ycdf-actor-vBUd2ObzJUemitHHP-IYaavrd0t8-google-maps-directions-api-logo.png" width="20" height="20" alt="" style="display:inline-block;vertical-align:middle;margin:0"/>&nbsp;<a href="https://apify.com/zen-studio/google-maps-scraper" style="color:#174EA6;text-decoration:none;font-weight:700;font-size:13px">Google Maps</a></span><br><span style="color:#29486D;font-size:12px;white-space:nowrap">Business details</span></td><td style="background:#E8F0FE;padding:8px 10px;border:1px solid #CADAF4;vertical-align:top"><span style="white-space:nowrap"><img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/NWYsOG96fMDy8ycdf-actor-ojjo6BxQiOiLYRca1-RU3DuH650K-google-maps-directions-api-logo.png" width="20" height="20" alt="" style="display:inline-block;vertical-align:middle;margin:0"/>&nbsp;<a href="https://apify.com/zen-studio/google-maps-reviews-scraper" style="color:#174EA6;text-decoration:none;font-weight:700;font-size:13px">Google Reviews</a></span><br><span style="color:#29486D;font-size:12px;white-space:nowrap">Guest reviews</span></td><td style="background:#E8F0FE;padding:8px 10px;border:1px solid #CADAF4;vertical-align:top"><span style="white-space:nowrap"><img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/NWYsOG96fMDy8ycdf-actor-y6Jak0F6vxdZew3b2-HljeTJZkhm-google-maps-directions-api-logo.png" width="20" height="20" alt="" style="display:inline-block;vertical-align:middle;margin:0"/>&nbsp;<a href="https://apify.com/zen-studio/google-hotel-prices-scraper" style="color:#174EA6;text-decoration:none;font-weight:700;font-size:13px">Hotel Prices</a></span><br><span style="color:#29486D;font-size:12px;white-space:nowrap">Track every booking site</span></td><td style="background:#E8F0FE;padding:8px 10px;border:1px solid #CADAF4;vertical-align:top"><span style="white-space:nowrap"><img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/NWYsOG96fMDy8ycdf-actor-2EJcvIYcO9H0KQOIO-r9WyLYmWGc-place-review-aggregator.png" width="20" height="20" alt="" style="display:inline-block;vertical-align:middle;margin:0"/>&nbsp;<a href="https://apify.com/zen-studio/place-review-aggregator" style="color:#174EA6;text-decoration:none;font-weight:700;font-size:13px">Review Aggregator</a></span><br><span style="color:#29486D;font-size:12px;white-space:nowrap">Yelp &amp; Tripadvisor too</span></td></tr></table>

### Key Features

- **Every booking site's price, per hotel** — the whole comparison Google shows, not just the few it features above the fold: a New York search returned between 6 and 40 sites per hotel. Each carries its price per night and for the stay, before and after taxes, the tax split, free-cancellation terms, perks, what's included, the rooms behind it, and the booking site's own link for that rate.
- **A price curve, not a snapshot** — `sweepDays` prices the same hotels across up to 90 consecutive check-in dates in one run, one row per hotel per date. Write the dates relatively and a scheduled run rolls forward on its own.
- **A market summary with every search** — how many hotels Google reports for the area (far more than any one search hands out), every hotel brand present, and the price distribution. Free: it rides a page already fetched.
- **One row per hotel, not one row per page** — opens in a spreadsheet and sorts by price on the first try.
- **54 fields on every hotel**, including the full 5→1 rating histogram, review topics with positive and negative mention counts and a sentiment score, amenities, check-in and check-out times, and travel times to nearby airports and transit.
- **No rating floor imposed** — Google's own site quietly hides everything under 4.0, which is about a fifth of a large market. This returns all of it unless you ask for a floor.
- **Sponsored listings kept and labelled** — paid placements come back flagged, in the same columns as organic results, so you can study them or filter them out. Google publishes far less about a paid listing than an organic one: expect a name, price, rating, star class, amenities and the advertiser's logo, and no address, coordinates or Maps id.
- **Vacation rentals included** — they arrive in the same stream, labelled, with their layout: sleeps, bedrooms, bathrooms, beds and floor area.
- **72 currencies, any language, any country** — verified end to end in Tokyo, Seoul, Cairo, Moscow, São Paulo and Bangkok.
- **Free tier** — 10 lifetime runs with up to 10 rows per run. No credit card required.

#### Copy to your AI assistant

```
zen-studio/google-hotels-scraper on Apify. Google Hotels search priced for a stay window, one row per hotel, with every booking site's rate nested as rates[]. Call ApifyClient("TOKEN").actor("zen-studio/google-hotels-scraper").call(run_input={...}), then client.dataset(run["defaultDatasetId"]).list_items().items. Provide searchQueries + checkIn + checkOut, OR propertyUrls (hotel name, Google Hotels link or hotel id) + checkIn + checkOut, OR autocompleteQueries (no dates). Dates accept "2026-11-20" or a number of days from today like "30". sweepDays:N repeats the search across N consecutive check-in dates for a price curve, one row per hotel per date. includeRates:true adds rates[], address and phone; each rates[] entry carries nightlyRate/stayTotal before and after taxes and partnerUrl, the booking site's own link for that rate. Rows where recordType=="market" are per-search summaries (totalResults, brands, priceDistribution), not hotels; filter them out if you only want hotels. About 1,000 hotels max per search query - split a large city by district. Full spec: GET https://api.apify.com/v2/acts/zen-studio~google-hotels-scraper/builds/default (Bearer TOKEN) → inputSchema, actorDefinition.storages.dataset, readme. Token: https://console.apify.com/account/integrations
```

### How to Scrape Google Hotels Data

#### Basic — every hotel in a city for your dates

```json
{
  "searchQueries": ["hotels in Barcelona"],
  "checkIn": "2026-11-20",
  "checkOut": "2026-11-23",
  "currency": "EUR",
  "countryCode": "es",
  "maxResultsPerQuery": 200
}
```

#### Price comparison — every booking site, per hotel

```json
{
  "searchQueries": ["hotels in Lisbon"],
  "checkIn": "2026-11-20",
  "checkOut": "2026-11-23",
  "currency": "EUR",
  "countryCode": "pt",
  "maxResultsPerQuery": 100,
  "includeRates": true
}
```

Each row gains `rates[]` — one entry per booking site — plus the hotel's `address`, `phone`, `placeId`, its full photo gallery with attribution, and the nearby and similar hotels Google lists beside it. Switch to the **Booking sites** dataset view for one line per site.

#### Price curve — the same hotels across many dates

```json
{
  "searchQueries": ["hotels in Barcelona"],
  "checkIn": "30",
  "checkOut": "32",
  "sweepDays": 30,
  "currency": "EUR",
  "countryCode": "es",
  "maxResultsPerQuery": 100
}
```

`sweepDays` repeats the whole search for that many consecutive check-in dates, keeping the stay length. One run, one dataset, one row per hotel per date — a month-long price curve you can pivot straight away, instead of thirty scheduled runs stitched together afterwards.

Dates can be written as a number of days from today (`"30"`) as well as a calendar date (`"2026-11-20"`). Use the relative form in a scheduled run and it never goes stale; a pinned date would price the same night forever.

#### Specific hotels — no search

```json
{
  "propertyUrls": [
    "Park Hyatt Tokyo",
    "https://www.google.com/travel/hotels/entity/ChcIhMamuuLmz70BGgsvZy8xdGttbmdnYhAB"
  ],
  "checkIn": "2026-11-20",
  "checkOut": "2026-11-23",
  "includeRates": true
}
```

A hotel **name** works, as well as a Google Hotels link or a `propertyToken` from an earlier run — paste your competitor list straight in. Each name is resolved to a single property and billed as one hotel, so you are not paying for a whole city to reach the one you wanted. No search runs in this mode.

#### Search suggestions — keyword research, no dates needed

```json
{
  "autocompleteQueries": ["hotels in par", "park hyatt tok", "maui res"]
}
```

Returns the suggestions Google offers a real visitor, ranked as they appear. Some of the ones that name a property also carry its street address and a Google Maps link; which ones do varies with the country you search from, so treat those fields as a bonus rather than a guarantee.

#### Filtered — five stars, spa, best rated first

```json
{
  "searchQueries": ["hotels in Dubai"],
  "checkIn": "2026-12-10",
  "checkOut": "2026-12-14",
  "currency": "AED",
  "countryCode": "ae",
  "hotelClass": ["5"],
  "amenities": ["spa", "outdoor_pool", "free_wifi"],
  "minRating": "4.5",
  "sortBy": "highestRating",
  "maxResultsPerQuery": 100
}
```

#### Budget band — under €150 a night, free cancellation

```json
{
  "searchQueries": ["hotels in Prague"],
  "checkIn": "2026-11-20",
  "checkOut": "2026-11-22",
  "currency": "EUR",
  "countryCode": "cz",
  "maxPrice": 150,
  "freeCancellation": true,
  "sortBy": "lowestPrice",
  "maxResultsPerQuery": 150
}
```

#### Vacation rentals only

```json
{
  "searchQueries": ["vacation rentals in Algarve"],
  "checkIn": "2026-11-20",
  "checkOut": "2026-11-27",
  "currency": "EUR",
  "countryCode": "pt",
  "propertyTypes": ["vacation_rental"],
  "maxResultsPerQuery": 100
}
```

Rentals carry `rentalDetails` — sleeps, bedrooms, bathrooms, beds, floor area — and their own labelled amenities. They are sold on one site, so they have no price comparison and are skipped when `includeRates` is on.

#### Whole city, past the per-search ceiling

One search query tops out around 1,000 hotels no matter how many Google claims to have. Split by district:

```json
{
  "searchQueries": [
    "hotels in Midtown Manhattan",
    "hotels in Lower Manhattan",
    "hotels in Upper East Side New York",
    "hotels in Brooklyn",
    "hotels in Queens New York"
  ],
  "checkIn": "2026-11-20",
  "checkOut": "2026-11-23",
  "maxResultsPerQuery": 1000
}
```

Searches run in parallel and hotels are deduplicated across them, so overlapping districts never bill twice.

#### Trim the export

```json
{
  "searchQueries": ["hotels in Rome"],
  "checkIn": "2026-11-20",
  "checkOut": "2026-11-23",
  "excludeFields": ["images", "travelTimes", "reviewTopics", "ratingHistogram"],
  "maxResultsPerQuery": 500
}
```

### What Data Can You Extract from Google Hotels?

**Identity** — `name`, `propertyType` (hotel or vacation rental), `category` (hotel, resort, motel, hostel, inn, extended stay), `hotelClass` (localised), `stars`, `description`, `sponsored`, `position`.

**Price for your stay** — `currency`, `nightlyRate` and `nightlyRateValue`, `stayTotal` and `stayTotalValue`, `stayBeforeTaxes`, `taxesAndFees`, `otherFees`, `dealLabel` ("18% less than usual"), `checkIn`, `checkOut`, `nights`.

**Every booking site** (with `includeRates`) — `rates[]`, each entry carrying `partner`, `officialSite`, the price per night and for the whole stay both before and after taxes (`nightlyRate`, `nightlyRateWithTaxes`, `stayTotal`, `stayTotalWithTaxes`, each with a numeric twin), `taxesAndFees`, `freeCancellation` and `freeCancellationUntil`, `perks`, `includes`, `logo`, `rooms[]` with the bed type and what each room includes, and `partnerUrl` — the booking site's own link for that rate, carrying your dates, the room and the rate code. A site Google only shows above the fold is quoted per night without a stay total, because the figure it publishes beside that price does not count nights.

**Reputation** — `rating`, `reviewsCount`, `ratingHistogram` (the full 5→1 counts, not just the average), `reviewTopics` (topic, mentions, positive and negative counts, and Google's own signed sentiment score), `categoryScores`, `ratingSources` (in practice Google's own score; Google rarely puts a review partner on a search card).

**Practical** — `address`, `phone`, `phoneLink` (a dialable `tel:` link), `website`, `checkInTime`, `checkOutTime`, `amenities` (named) and `amenityIds`, `travelTimes` to nearby airports, stations and landmarks with the travel mode, `latitude`, `longitude`, `countryCode`.

**Media** — `images` (about ten per hotel), `thumbnail`, `gallery` (the property's own photo set, roughly twice the strip a search card carries, each shot with the name of whoever took it), `logo` on sponsored rows.

**Beyond this hotel** — `nearbyProperties` and `similarProperties`, each with a name, how far away it is and its own hotel id, so you can feed one straight back in as a lookup. `attributeGroups` carries Google's own labelled groups, such as Crowd → LGBTQ+ friendly.

**Rentals** — `rentalDetails` with `sleeps`, `bedrooms`, `bathrooms`, `beds`, `area`, `layout` and the raw facts strip.

**Joins and provenance** — `bookingUrl` (the hotel's own Google page), `propertyToken`, `hexId`, `placeId`, `googleMapsUrl`, `searchQuery`, `searchLocation`.

Two notes worth knowing before you build on the numbers:

- **Compute on `stayTotalValue`, not on `stayTotal`.** `stayTotal` is the string Google displays, and in US results it usually shows the room rate before tax: across 40 New York hotels only 2 matched the full total, while 14 matched the pre-tax figure exactly. `stayBeforeTaxes + taxesAndFees + otherFees` always equals `stayTotalValue`, so that is the number to sum, compare and chart. Both are published because the display string is what a guest sees on the page.
- **`categoryScores` are published under Google's own numeric ids.** Google ships five scores per hotel with no labels attached anywhere on any of its surfaces, so inventing names for them would be a guess. The ids are stable across every hotel.

#### Output Example

One hotel, every column the Actor publishes. Nothing is omitted — a key that is
empty here is empty because that hotel has no such thing (`logo` belongs to
sponsored rows, `rentalDetails` to vacation rentals), not because it was left out.

```json
{
  "position": 1,
  "name": "Hyatt Grand Central New York",
  "propertyType": "hotel",
  "category": "hotel",
  "sponsored": false,
  "hotelClass": "3-star hotel",
  "stars": 3,
  "description": "Sleek property offering polished rooms with Wi-Fi access, plus a fitness center.",
  "latitude": 40.7520617,
  "longitude": -73.9762995,
  "countryCode": "US",
  "website": "https://www.hyatt.com/hyatt-hotels/en-US/nycgh-hyatt-grand-cen…",
  "rating": 3.9,
  "reviewsCount": 8729,
  "ratingHistogram": {
    "5": 4007,
    "4": 2399,
    "3": 992,
    "2": 502,
    "1": 829
  },
  "categoryScores": {
    "4": 4.8,
    "1": 4.9,
    "5": 4.7,
    "2": 4.8,
    "3": 4.5
  },
  "ratingSources": [
    {
      "rating": 3.9,
      "reviewsCount": 8729,
      "icon": "https://www.gstatic.com/images/branding/product/1x/googleg_48d…"
    }
  ],
  "reviewTopics": [
    {
      "topic": "Location",
      "mentions": 1476,
      "positive": 1149,
      "negative": 202,
      "sentiment": 0.57
    },
    {
      "topic": "Service",
      "mentions": 1615,
      "positive": 896,
      "negative": 633,
      "sentiment": 0
    },
    "… 4 more"
  ],
  "currency": "USD",
  "nightlyRate": "$221",
  "nightlyRateValue": 220.5,
  "stayTotal": "$662",
  "stayTotalValue": 769.62,
  "stayBeforeTaxes": 541.53,
  "taxesAndFees": 108.12,
  "otherFees": 119.97,
  "dealLabel": null,
  "bookingUrl": "https://www.google.com/travel/hotels/entity/ChYImeqn5sP5xYFQGg…",
  "checkIn": "2026-11-20",
  "checkOut": "2026-11-23",
  "nights": 3,
  "checkInTime": "4:00 PM",
  "checkOutTime": "11:00 AM",
  "amenities": [
    "Free Wi-Fi",
    "Parking ($)",
    "Air conditioning",
    "Fitness center",
    "Bar",
    "Restaurant",
    "Room service",
    "Full-service laundry",
    "Accessible",
    "Business center",
    "Smoke-free property"
  ],
  "amenityIds": [
    29,
    17,
    2,
    8,
    4,
    23,
    24,
    31,
    27,
    7,
    25
  ],
  "rentalDetails": null,
  "images": [
    "https://lh3.googleusercontent.com/grass-cs/ACvplmPf6xNstv9uUC-…",
    "… 8 more"
  ],
  "thumbnail": "https://lh3.googleusercontent.com/grass-cs/ACvplmPf6xNstv9uUC-…",
  "travelTimes": [
    {
      "name": "Grand Central",
      "durations": [
        "2 min"
      ],
      "mode": null
    },
    {
      "name": "Grand Central-42 St",
      "durations": [
        "1 min"
      ],
      "mode": "Subway"
    },
    "… 2 more"
  ],
  "searchLocation": "New York",
  "propertyToken": "ChYImeqn5sP5xYFQGgovbS8wOXJ0bXZ2EAE",
  "hexId": "0x89c259022d712db1:0x500317cc3cc9f519",
  "googleMapsUrl": "https://www.google.com/maps?cid=5765478113925002521",
  "address": "at Grand Central Terminal, 109 E 42nd St, New York, NY 10017",
  "phone": "(212) 883-1234",
  "phoneLink": "tel:+12128831234",
  "placeId": "ChIJsS1xLQJZwokRGfXJPMwXA1A",
  "rates": [
    {
      "partner": "Hyatt Grand Central New York",
      "officialSite": true,
      "nightlyRate": "$278",
      "nightlyRateValue": 278.0,
      "nightlyRateWithTaxes": "$323",
      "nightlyRateWithTaxesValue": 323.0,
      "stayTotal": "$835",
      "stayTotalValue": 835.0,
      "stayTotalWithTaxes": "$969",
      "stayTotalWithTaxesValue": 969.0,
      "taxesAndFees": 134.0,
      "freeCancellation": null,
      "freeCancellationUntil": "Nov 16",
      "perks": [
        "Get a lower price with free enrollment"
      ],
      "includes": null,
      "rooms": null,
      "logo": "https://www.gstatic.com/travel-hotels/branding/139419535942450…",
      "partnerUrl": "https://www.hyatt.com/shop/NYCGH?rooms=1&adults=2&checkinDate=…"
    },
    {
      "partner": "KAYAK.com",
      "officialSite": false,
      "nightlyRate": "$221",
      "nightlyRateValue": 221.0,
      "nightlyRateWithTaxes": "$257",
      "nightlyRateWithTaxesValue": 257.0,
      "stayTotal": "$662",
      "stayTotalValue": 662.0,
      "stayTotalWithTaxes": "$770",
      "stayTotalWithTaxesValue": 770.0,
      "taxesAndFees": 108.0,
      "freeCancellation": null,
      "freeCancellationUntil": null,
      "perks": null,
      "includes": null,
      "rooms": null,
      "logo": "https://www.gstatic.com/travel-hotels/branding/6417d44c-c676-4…",
      "partnerUrl": "https://www.kayak.com/semi/ha/hotel_ads/33380/en.html?utm_sour…"
    },
    "… 36 more"
  ],
  "searchQuery": "hotels in New York",
  "gallery": [
    {
      "url": "https://lh3.googleusercontent.com/gps-cs-s/AHRPTWls6AGW0eB6B4e…",
      "width": 252,
      "height": 308,
      "author": "Hyatt Grand Central New York",
      "authorProfile": "https://maps.google.com/maps/contrib/105556881347805005639"
    },
    "… 15 more"
  ],
  "attributeGroups": null,
  "nearbyProperties": [
    {
      "name": "Hotel Riu Plaza New York Times Square",
      "distance": "0.8 mi away",
      "latitude": null,
      "longitude": null,
      "propertyToken": "CgoIvcPg9peb2pNSEAE"
    },
    {
      "name": "New York Marriott Marquis",
      "distance": "0.7 mi away",
      "latitude": null,
      "longitude": null,
      "propertyToken": "CgoIksaK9_ij5_kYEAE"
    },
    "… 4 more"
  ],
  "similarProperties": [
    {
      "name": "Chic 1 Bedroom Apartment in Midtown Manhattan - One-Bedroom Apartment",
      "distance": "0.1 mi away",
      "latitude": 40.752708,
      "longitude": -73.97438799999999,
      "propertyToken": "CiQIpem7_f2Es8NtEIqc6bS6nY_4vAEaDS9nLzExenltcGYwcW4QAg"
    },
    {
      "name": "Delightful 2-bedroom apartment with AC, fitness room in vibrant New York",
      "distance": "0.75 mi away",
      "latitude": 40.755092999999995,
      "longitude": -73.981049,
      "propertyToken": "CiUIuOybgoyRvK6TARCEoYz7zc7X8dkBGg0vZy8xMXg3Z3RnYmxjEAI"
    },
    "… 4 more"
  ],
  "logo": null
}
```

Long lists are abbreviated above only for reading; a real row carries every entry.

#### Other record types in the same dataset

A **market summary**, one per search, delivered free because it rides a page already fetched:

```json
{
  "recordType": "market",
  "searchQuery": "hotels in lisbon",
  "searchLocation": "hotels in lisbon",
  "checkIn": "2026-11-20",
  "checkOut": "2026-11-23",
  "currency": "EUR",
  "totalResults": 11413,
  "priceDistribution": [
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    1,
    5,
    8,
    18,
    43,
    72,
    92,
    100,
    86,
    65,
    61,
    47,
    35,
    30,
    15,
    68
  ],
  "priceBandTop": 150,
  "brands": [
    {
      "brand": "Accor Live Limitless",
      "brandId": 33
    },
    {
      "brand": "Andaz",
      "brandId": 116
    },
    {
      "brand": "Autograph Collection",
      "brandId": 59
    },
    {
      "brand": "B&B Hotels",
      "brandId": 98
    },
    {
      "brand": "Curio Collection",
      "brandId": 151
    },
    {
      "brand": "Design Hotels",
      "brandId": 287
    },
    "… 38 more"
  ],
  "brandsCount": 44
}
```

A **search suggestion**, from `autocompleteQueries`:

```json
{
  "recordType": "suggestion",
  "typed": "park hyatt tok",
  "position": 1,
  "suggestion": "Park Hyatt Tokyo",
  "normalisedQuery": "park hyatt tokyo",
  "address": "2, 3 Chome-7-1 Nishishinjuku, Shinjuku City",
  "thumbnail": "https://encrypted-tbn3.gstatic.com/images?q=tbn:ANd9GcSk…",
  "entityId": "/g/120ylk23",
  "cid": "3231512592087154070",
  "googleMapsUrl": "https://www.google.com/maps?cid=3231512592087154070"
}
```

A **vacation rental** carries the same columns, with `rentalDetails` filled in and no rate comparison — rentals sell on one site:

```json
{
  "name": "Lisbon Lodge 2 - Double Room",
  "propertyType": "vacation_rental",
  "category": null,
  "nightlyRate": "€45",
  "stayTotalValue": 134.74,
  "rentalDetails": {
    "facts": [
      "Entire house",
      "Sleeps 2",
      "1 bedroom",
      "2 bathrooms",
      "1 bed"
    ],
    "sleeps": 2,
    "bedrooms": 1,
    "beds": 1,
    "bathrooms": 2.0,
    "layout": "House"
  },
  "amenities": [
    "Air conditioning",
    "Kid-friendly",
    "Crib",
    "Elevator",
    "Heating",
    "Kitchen",
    "Microwave",
    "Oven stove",
    "Smoke-free",
    "Cable TV",
    "Wheelchair accessible",
    "Free Wi-Fi"
  ],
  "bookingUrl": "https://www.google.com/travel/hotels/entity/ChkQ44-ZmLTyx9JGGg0vZy8xMXZ5X2ZncXFfEAI",
  "propertyToken": "ChkQ44-ZmLTyx9JGGg0vZy8xMXZ5X2ZncXFfEAI"
}
```

### Dataset Views

| View | What it shows |
|------|---------------|
| **Hotels** | One row per hotel, commercial columns first. |
| **Booking sites** | One line per booking site, with the hotel repeated beside it. Ready for a price-comparison pivot. |
| **Suggestions** | Autocomplete rows. |
| **Market summary** | One row per search: how many hotels Google reports for the area, every hotel brand present, and the price distribution. Costs nothing — it rides a page already fetched. |

### Advanced Usage

#### Competitor rate monitoring

Name your competitors, turn on `includeRates`, and sweep the dates you care about. One run gives you every hotel against every booking site across the whole window.

```json
{
  "propertyUrls": [
    "Park Hyatt Tokyo",
    "Mandarin Oriental Tokyo",
    "Aman Tokyo"
  ],
  "checkIn": "7",
  "checkOut": "9",
  "sweepDays": 30,
  "includeRates": true
}
```

Relative dates plus `sweepDays` is what makes this schedulable: run it weekly and every run re-prices the next 30 nights from that day, so the table rolls forward by itself. Every row carries its own `checkIn` and `propertyToken`, so it appends cleanly.

Partner counts move over the course of a day — a New York search returned between 6 and 40 booking sites per hotel, and the same hotel varies between runs — so treat a rates table as a point-in-time snapshot rather than a fixed list.

#### Study the paid placements

```json
{
  "searchQueries": ["hotels in Las Vegas"],
  "checkIn": "2026-11-20",
  "checkOut": "2026-11-23",
  "includeSponsored": true,
  "maxResultsPerQuery": 100
}
```

Up to nine sponsored rows per search, flagged with `sponsored: true` and carrying the advertising partner's `logo`. They come back in the same columns as organic results, so a filter on one boolean separates them. Google says much less about a paid listing than an organic one, so most columns are empty on these rows, and a paid listing states no kind of property — `propertyTypes` therefore does not filter them. Set `includeSponsored: false` to drop them.

#### Multilingual run

```json
{
  "searchQueries": ["hotels in Tokyo"],
  "checkIn": "2026-11-20",
  "checkOut": "2026-11-23",
  "language": "ja",
  "countryCode": "jp",
  "currency": "JPY",
  "includeRates": true
}
```

`language` localises the free text — description, star class, some review topics. Numbers, amenity ids and the star count stay stable, and `stars` sits next to the localised `hotelClass` string so you never have to parse it.

#### Join to reviews and photos

Every organic hotel row carries `hexId` and `googleMapsUrl`. Feed either to [Google Maps Reviews Scraper](https://apify.com/zen-studio/google-maps-reviews-scraper) for the hotel's full review history, sorted and unlimited, or to [Google Maps Scraper](https://apify.com/zen-studio/google-maps-scraper) for its complete photo library. A hotel page shows a handful of each; the Maps pipelines return everything.

### Pricing — Pay Per Event (PPE)

**$0.99 per 1,000 hotels.** Subscription plans pay less per hotel, down to $0.69.

| Event | Per call | Per 1,000 |
|-------|----------|-----------|
| Hotel scraped (54 fields) | $0.00099 | $0.99 |
| Booking-site comparison (per hotel) | $0.00399 | $3.99 |
| Sponsored listing | $0.00019 | $0.19 |
| Search suggestion | $0.00099 | $0.99 |

A 1,000-hotel search is $0.99 in hotel charges. The same search with every booking site's price is $4.98. A 30-day price curve over 200 hotels is 6,000 hotel rows, $5.94. Apify's own platform charges are listed separately in the Console.

The booking-site comparison is charged only for hotels that came back with one, and only when you asked for it. Sponsored listings — at most nine per search — are charged at a fifth of a hotel, because Google publishes about a fifth as much about them; set `includeSponsored` to false and they cost nothing.

**Free tier:** 10 lifetime runs, up to 10 rows per run. No credit card required.

### How it compares

| | This Actor | Typical alternative |
|---|---|---|
| Row shape | One row per hotel, every booking site nested inside it | One row per price, so a hotel repeats and a spreadsheet explodes |
| Price curve | `sweepDays` prices every hotel across up to 90 consecutive dates in one run | One stay window per run |
| Scheduling | Relative dates (`"30"`), so a saved schedule never goes stale | A pinned date that prices the same night forever |
| Rating floor | None. You get hotels under 4.0, roughly a fifth of a large market | Google's own 4.0 default, applied silently |
| Starting point | Hotel name, Google Hotels link, hotel id, or a search | Usually a link or an id |
| Market context | A summary row per search: how many hotels Google reports for the area, the brands present, the price distribution | Not published |

### FAQ

**Can I get prices for a range of dates, not just one stay?**
Yes — that is what `sweepDays` is for. Set it to 30 and every search is repeated across 30 consecutive check-in dates, keeping your stay length, giving one row per hotel per date in a single dataset. Write the dates relatively (`"30"` rather than `2026-11-20`) and a scheduled run keeps producing a rolling curve instead of re-pricing one fixed night forever.

**How many hotels can I get from one search?**
About 1,000. Google stops handing out results near that point no matter how many it reports for the area, so a large city needs splitting by district or neighbouring town. The `searchQueries` list takes as many as you like and deduplicates hotels across them.

**Are the prices live?**
Yes. Every run asks Google for your exact stay window at run time. Nothing is cached, and each row echoes back the dates that were actually priced.

**Why does a hotel show a different price than the booking sites under it?**
The headline `nightlyRate` is Google's lead offer for the stay; `rates[]` is the full list behind it, and the cheapest entry is often lower. Both are captured so you can compare them.

**Does party size change the price?**
No. Google quotes the same nightly rate whatever `adults` and `rooms` are set to, on the search card and on every booking site. The values are recorded on the stay so your export documents what was asked for.

**Do I get hotels rated below 4.0?**
Yes, unless you set `minRating`. Google's own site applies a 4.0 floor by default, which hides roughly a fifth of a large market. This returns everything.

**What happens to vacation rentals?**
They come back in the same stream, labelled `vacation_rental`, with their layout and named amenities. They sell on a single site, so they have no price comparison and are skipped when `includeRates` is on — you are never billed for a comparison that does not exist.

**Can I get a specific hotel without searching?**
Yes. Put its Google Hotels link in `propertyUrls`, or its `propertyToken` from an earlier run in `propertyTokens`. Searching by name alone is unreliable — Google answers some hotel names with an article instead of a property.

**What is the search-suggestions mode for?**
Travel keyword research, and resolving a half-remembered property name. It returns the ranked suggestions Google shows a real visitor. Some of the ones that name a property also carry its address and a Maps link, though which ones do varies by country, so that part is a bonus rather than a guarantee. It needs no dates.

**What languages, countries and currencies are supported?**
Any Google language and country code, and the 72 currencies Google itself prices stays in. Verified end to end in Tokyo, Seoul, Cairo, Moscow, São Paulo and Bangkok.

**What's the free tier?**
10 lifetime runs with up to 10 rows per run. No credit card required. Upgrade to a paid Apify plan for full runs.

**Can I run this on a schedule?**
Yes. Apify schedules run this hourly, daily or on cron — the usual setup for rate monitoring. Push results onward with webhooks or pull them from the dataset API.

### More Zen Studio scrapers for travel & local data

- [Google Maps Scraper](https://apify.com/zen-studio/google-maps-scraper) — 40+ fields per place, past Google's 250-per-view ceiling
- [Google Maps Reviews Scraper](https://apify.com/zen-studio/google-maps-reviews-scraper) — unlimited review histories, one row per review
- [Google Hotel Prices Scraper](https://apify.com/zen-studio/google-hotel-prices-scraper) — one row per booking site per date, with the cheapest named for you
- [Google Maps Directions & Routes API](https://apify.com/zen-studio/google-maps-directions-api) — routes, ETA and turn-by-turn steps
- [Place Review Aggregator](https://apify.com/zen-studio/place-review-aggregator) — one place, five review platforms, one export

### Support

- **Bugs**: Issues tab
- **Features**: Issues tab

### Legal Compliance

Extracts publicly available data. Users must comply with Google's terms of service and data protection regulations (GDPR, CCPA).

***

*One row per hotel, priced for your dates, with every booking site's offer nested inside it — plus the full rating histogram, review topics, amenities and photos. $0.99 per 1,000 hotels.*

# Actor input Schema

## `searchQueries` (type: `array`):

What and where to search, one per line, for example "hotels in Barcelona" or "resorts in Cancun". A hotel name works too. Google serves up to about 1,000 hotels per search, so split large cities by district for full coverage.

## `propertyUrls` (type: `array`):

One per line: a hotel name ("Park Hyatt Tokyo"), a Google Hotels link, or a hotel id from an earlier run. Names are resolved to a single property and charged as one hotel. Each comes back with its address and phone number, and with every booking site's price when that is switched on.

## `propertyTokens` (type: `array`):

Hotel ids from an earlier run, one per line, as an alternative to pasting links. Every hotel found by a search carries one; sponsored listings do not.

## `autocompleteQueries` (type: `array`):

Type a partial phrase and get the suggestions Google offers a real visitor, ranked as they appear. Useful for travel keyword research and for finding the exact name of a property. Some suggestions that name a property also carry its street address and a Google Maps link, though which ones do varies with the country you search from. No dates needed.

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

First night of the stay, as a date (2026-11-20) or a number of days from today ("30"). Use the relative form in a schedule so it never goes stale.

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

Departure date, at least one day after check-in. Same formats: a date, or a number of days from today ("33").

## `sweepDays` (type: `integer`):

Repeat the whole search for each of this many check-in dates in a row, keeping the stay length. 1 is a single snapshot; 30 gives you a month-long price curve for every hotel. Each date is charged as its own set of hotels.

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

Party size the stay is recorded for. Google quotes the same nightly price whatever you set here.

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

Rooms the stay is recorded for. Google quotes the same nightly price whatever you set here.

## `maxResultsPerQuery` (type: `integer`):

Stop each search after this many hotels. Sponsored listings, up to nine per search, are delivered on top of this number. The most Google will serve for one search is about 1,000.

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

Adds each hotel's full price comparison for your dates: every booking site with its nightly price, taxes and fees, free cancellation deadline and the rooms on offer, plus the hotel's address and phone number. Vacation rentals are booked on one site only, so they are skipped.

## `includeSponsored` (type: `boolean`):

Paid listings are marked with a sponsored flag. Up to nine per search, on top of the hotel count set above.

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

Currency every price is quoted in.

## `sortBy` (type: `string`):

Order hotels are returned in. Leave empty for Google's own ranking.

## `minRating` (type: `string`):

Only hotels rated at or above this. Leave empty to include every hotel, which is what Google's own site does not do.

## `hotelClass` (type: `array`):

Restrict to these star classes.

## `amenities` (type: `array`):

Only hotels offering all of these.

## `minPrice` (type: `integer`):

In the currency selected above.

## `maxPrice` (type: `integer`):

In the currency selected above.

## `freeCancellation` (type: `boolean`):

Only stays that can be cancelled for free.

## `specialOffers` (type: `boolean`):

Only hotels currently running a deal.

## `ecoCertified` (type: `boolean`):

Only hotels with a recognised sustainability certification.

## `propertyTypes` (type: `array`):

Keep only these kinds of property. Leave empty to keep them all. Sponsored listings state no kind at all, so they are not filtered here; use the sponsored setting to drop those.

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

Language descriptions and labels come back in.

## `countryCode` (type: `string`):

Country to search from. Affects availability, ranking and which booking sites appear.

## `excludeFields` (type: `array`):

Drop these columns from every row to keep exports small.

## Actor input object example

```json
{
  "searchQueries": [
    "hotels in Barcelona"
  ],
  "checkIn": "30",
  "checkOut": "33",
  "sweepDays": 1,
  "adults": 2,
  "rooms": 1,
  "maxResultsPerQuery": 100,
  "includeRates": false,
  "includeSponsored": true,
  "currency": "USD",
  "freeCancellation": false,
  "specialOffers": false,
  "ecoCertified": false,
  "language": "en",
  "countryCode": "us"
}
```

# Actor output Schema

## `hotels` (type: `string`):

No description

## `rates` (type: `string`):

No description

## `suggestions` (type: `string`):

No description

## `market` (type: `string`):

No description

# 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 = {
    "searchQueries": [
        "hotels in Barcelona"
    ],
    "checkIn": "30",
    "checkOut": "33",
    "sweepDays": 1,
    "adults": 2,
    "rooms": 1,
    "maxResultsPerQuery": 100,
    "currency": "USD",
    "language": "en",
    "countryCode": "us"
};

// Run the Actor and wait for it to finish
const run = await client.actor("zen-studio/google-hotels-scraper").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 = {
    "searchQueries": ["hotels in Barcelona"],
    "checkIn": "30",
    "checkOut": "33",
    "sweepDays": 1,
    "adults": 2,
    "rooms": 1,
    "maxResultsPerQuery": 100,
    "currency": "USD",
    "language": "en",
    "countryCode": "us",
}

# Run the Actor and wait for it to finish
run = client.actor("zen-studio/google-hotels-scraper").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 '{
  "searchQueries": [
    "hotels in Barcelona"
  ],
  "checkIn": "30",
  "checkOut": "33",
  "sweepDays": 1,
  "adults": 2,
  "rooms": 1,
  "maxResultsPerQuery": 100,
  "currency": "USD",
  "language": "en",
  "countryCode": "us"
}' |
apify call zen-studio/google-hotels-scraper --silent --output-dataset

```

## MCP server setup

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

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/LVhra6loOsBkf4eKg/builds/ZXehxPgnsag6Dvtu3/openapi.json
