# Google Hotels Scraper — Prices, Offers, Reviews & Amenities (`logiover/google-hotels-scraper`) Actor

Google Hotels scraper: every hotel in any city with nightly and total prices for your dates, all booking offers (Booking.com, Expedia, official site…) with links, address, phone, stars, rating, reviews, amenities, photos and deal flags. Big cities split automatically, no login.

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

## Pricing

from $2.00 / 1,000 results

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

**Every hotel Google Hotels lists in a city — with tonight's (or any night's) price before and after taxes, every booking offer from Booking.com, Expedia, Hotels.com, Agoda, Trip.com and the hotel's own website with its link, plus address, phone, stars, rating, reviews, amenities, photos and deal flags.**

**Google Hotels Scraper** is a Google Hotels data extractor that turns any Google Hotels search into a clean spreadsheet. Type a destination ("Paris", "Shibuya, Tokyo", "Bali", "hotels near Times Square") and your dates, and the Actor scrapes Google Hotels (google.com/travel/hotels) for every matching hotel: name, Google hotel ID, place ID and CID, street address, phone, website, latitude and longitude, star class, guest rating and review count with the 1–5 star breakdown, location score, check-in and check-out times, the **price per night before taxes and with taxes and fees, the total for the whole stay, taxes and fees**, "GREAT DEAL – 31 % less than usual" badges, the full amenity list by category, photos — and, for each hotel, **every booking offer Google shows: one row per site with its nightly price, total price and a direct link** (the official site is flagged). It works as a **Google Hotels API alternative** and **hotel price API** with **no API key, no login, no cookies and no browser** on your side, and you can **export Google Hotels data to CSV, Excel or JSON**, or pull it straight into Google Sheets, a database or your own app.

Google's own hotel list stops after a few hundred results and shuffles on every request, so this **Google Hotels crawler** splits a big city into map areas and price bands until every part can be read to the end, then removes duplicates by Google hotel ID — **10,925 unique hotels from seven cities in one run, measured**, with no duplicates. Use it as a **hotel rate shopping tool**, for **rate parity monitoring** (your official site vs the online travel agencies), as a **hotel price tracker** with scheduled runs, to build an OTA or metasearch inventory, for hospitality market research (supply, star mix, ADR by neighborhood), for hotel lead lists with phone and website, or as a live hotel-search tool for an AI agent. Works in 31 languages and 42 currencies, for any Google country: Hotelpreise vergleichen, prix des hôtels, precios de hoteles, prezzi hotel, otel fiyatları — one Actor.

All numbers on this page were measured on the Apify platform on **2026-10-20** (see [Scale and speed](#scale-and-speed-measured-on-2026-10-20)).

***

### Table of contents

- [At a glance](#at-a-glance)
- [What you get: the Google Hotels data fields](#what-you-get-the-google-hotels-data-fields)
- [Who uses this Google Hotels scraper](#who-uses-this-google-hotels-scraper)
- [Cookbook: 18 ready-to-run inputs](#cookbook-18-ready-to-run-inputs)
- [Tutorial: scrape Google Hotels in the Apify Console](#tutorial-scrape-google-hotels-in-the-apify-console)
- [Tutorial: the Google Hotels API from your own code](#tutorial-the-google-hotels-api-from-your-own-code)
- [Input reference](#input-reference)
- [Output data dictionary with measured fill rates](#output-data-dictionary-with-measured-fill-rates)
- [Real output sample](#real-output-sample)
- [How it gets every hotel in a city](#how-it-gets-every-hotel-in-a-city)
- [How prices are reported (before taxes, with taxes, totals)](#how-prices-are-reported-before-taxes-with-taxes-totals)
- [Scale and speed (measured on 2026-10-20)](#scale-and-speed-measured-on-2026-10-20)
- [What you pay](#what-you-pay)
- [Integrations](#integrations)
- [Performance tips](#performance-tips)
- [Troubleshooting: every status message explained](#troubleshooting-every-status-message-explained)
- [Honest limits](#honest-limits)
- [Comparison: official hotel APIs, manual copying and this Actor](#comparison-official-hotel-apis-manual-copying-and-this-actor)
- [FAQ](#faq)
- [Glossary](#glossary)
- [Is it legal to scrape Google Hotels?](#is-it-legal-to-scrape-google-hotels)
- [Changelog](#changelog)
- [Support](#support)

***

### At a glance

| | |
|---|---|
| **What you type** | Destinations (city, district, region, island, "hotels near …") and dates — or Google Hotels hotel links / hotel IDs to price specific hotels |
| **What you get** | One row per hotel: Google hotel ID, place ID, CID, name, star class, address, city, neighborhood, phone, website, lat/lng, rating, reviews, 1–5 star breakdown, review topics, location scores, check-in/out times, price per night before taxes and with taxes, total for the stay, taxes, fees, deal badge, **every booking offer with price and link**, room options, amenities by category, languages spoken, photos, nearby transit and airports, third-party ratings |
| **Filters** | Price range, guest rating, hotel class, 19 amenities, 10 property types, free cancellation, special offers, eco-certified; order by Google's ranking, lowest price, highest rating or most reviewed |
| **Guests & money** | Any dates (or rolling "+14 days"), 1–30 nights, adults and children with ages, 42 currencies, 31 languages, any Google country |
| **Scale** | Not capped by Google's list: big cities are split into map areas and price bands. Measured: 10,925 unique hotels (7 cities) in one run; 12,000 hotels incl. unbookable ones (3 cities) in another — 0 duplicates in both |
| **Speed** | First rows after ~5 s; 1,000 hotels **with all booking offers** in 88–112 s; list-only export of 1,000 hotels in 38 s |
| **Quality** | Every field checked by hand against the live Google Hotels page on 38 hotels in 8 countries; nightly prices identical to the page on 16 of 18 hotels checked in the same minute |
| **Formats** | JSON, CSV, Excel, XML, HTML table, RSS; API, webhooks, Make, Zapier, n8n, Google Sheets |
| **Price** | Pay per hotel: $3.00 per 1,000 on the Free plan, down to $2.00 per 1,000 — the hotel pages with all offers are included |
| **Needs** | Nothing: no Google account, no API key, no proxy setup |

***

### What you get: the Google Hotels data fields

Every hotel is one row. Fields Google has no value for are `null` (never an empty string, never a guessed 0); lists are empty lists. The full dictionary with types and measured fill rates is [further down](#output-data-dictionary-with-measured-fill-rates); this is the tour with real values.

#### Identity and links

| Field | Example | |
|---|---|---|
| `hotelId` | `ChgI5pvksvOe1IUjGgwvZy8xMnE0cW1tdjAQAQ` | Google Hotels' own hotel ID — stable; paste it into "Hotel links or IDs" to price the same hotel again |
| `placeId` | `ChIJRflDt1hgLxMR5g1ZNvdQCyM` | Google place ID — the key of the Google Places API and Google Maps |
| `cid` | `2525201038770245094` | Google Maps CID (opens `maps.google.com/?cid=…`) |
| `featureId` | `0x132f6058b743f945:0x230b50f736590de6` | Google's feature ID |
| `kgmid` | `/g/12q4qmmv0` | Google Knowledge Graph ID |
| `googleHotelsUrl` | `https://www.google.com/travel/hotels/entity/…?ts=…` | Opens the hotel on Google Hotels **with the same dates, guests and currency** the row was priced for |
| `googleMapsUrl` | `https://www.google.com/maps/place/?q=place_id:ChIJ…` | The hotel on Google Maps |

(Values of Relais Cola di Rienzo, Rome, from the run of 2026-10-20.)

#### Hotel profile

`name`, `type` (`hotel`, or `vacation_rental` when you include rentals), `hotelClass` (official stars, 1–5) and `hotelClassText` ("4-star tourist hotel"), `categories` (Google's place types: hotel, hostel, resort hotel, extended stay hotel…), `description` (Google's one-line summary) and `descriptionLong` (the "About this hotel" paragraph), `checkInTime` / `checkOutTime` ("3:00 PM" / "11:00 AM"), `languagesSpoken` (English, French, Spanish…), `website`, `phone` (international format, e.g. `+33 1 43 31 70 06`).

#### Location

`address` (full street address, e.g. "Piazza Cola di Rienzo, 69/Sc 3 Piano 4, 00192 Roma RM, Italy"), `city`, `neighborhood` ("Prati") and `neighborhoodDescription` (Google's description of the area), `countryCode` (ISO 3166-1, e.g. `FR`), `latitude`, `longitude`, `locationScore` (Google's 1–5 location score) and `locationScores` (`thingsToDo`, `restaurants`, `transit`, `airportAccess`), `nearbyPlaces` (top sights, transit stations, airports and restaurants with travel time and mode, e.g. "Lepanto · Subway · 5 min walking", "Roma Termini · Train · 16 min driving / 52 min walking").

#### Guest ratings and reviews

`rating` (1–5, Google), `reviewsCount`, `ratingHistogram` (`{"5": 111, "4": 14, "3": 3, "2": 1, "1": 1}`), `reviewMentions` (what guests talk about: topic, mentions, positive, negative — e.g. "Breakfast · 72 mentions · 66 positive · 5 negative"), `otherRatings` (Tripadvisor, Trip.com, Expedia and other sites Google shows: rating, scale, review count, link).

#### Prices for your dates

`currency`, `pricePerNight` (before taxes — fees included, as Google displays in the US), `pricePerNightWithTaxes` (all-in), `totalPrice` (the whole stay with taxes and fees), `totalPriceBeforeTaxes`, `taxes`, `fees`, `dealBadge` (`GREAT DEAL`, `DEAL`, `GREAT PRICE`), `dealText` ("31% less than usual", "for a 4-star hotel", "with a pool"), `dealPercentBelowUsual` (31). Prices are for the whole party you set (adults, children with ages) and the exact dates; see [how prices are reported](#how-prices-are-reported-before-taxes-with-taxes-totals).

#### Booking offers (one per site)

`offers` is the hotel's "All options" list on Google Hotels — one entry per booking site, cheapest first as Google sorts them — plus the sponsored "Featured options":

```json
{
  "provider": "Relais Cola di Rienzo",
  "providerId": 131349316,
  "pricePerNight": 168,
  "pricePerNightWithTaxes": 180,
  "totalPrice": 359,
  "isOfficialSite": true,
  "isSponsored": false,
  "url": "https://webhooks.amenitiz.io/google_hotel/landing-page?partner_hotel_id=7n4dbCKMRhVUACOI8vnV&checkin_date=2026-10-30&checkout_date=2026-11-01&num_adults=2&num_children=0&locale=en"
}
```

A sponsored "Featured option" of the same hotel, with its rooms:

```json
{
  "provider": "Booking.com",
  "providerId": 184,
  "pricePerNight": 141.4,
  "pricePerNightWithTaxes": 166.75,
  "totalPrice": null,
  "isOfficialSite": false,
  "isSponsored": true,
  "url": null,
  "rooms": [
    { "name": "Standard Double or Twin Room", "pricePerNight": 141.4, "pricePerNightWithTaxes": 166.76 },
    { "name": "Triple Room with City View", "pricePerNight": 152.82, "pricePerNightWithTaxes": 179.33 }
  ]
}
```

`offersCount` and `lowestOfferProvider` (the site with the lowest all-in price) summarise the list. The official website is flagged `isOfficialSite: true` — the basis of every **rate parity check**. Paid placements are flagged `isSponsored: true`; their tracking links are not passed on.

#### Amenities

`amenities` (everything the hotel offers, e.g. "Free Wi-Fi", "Breakfast ($)", "Outdoor pool", "Spa", "Pet-friendly", "EV charger"), `amenitiesUnavailable` (what Google says the hotel does **not** have: "Pool", "Air conditioning"…), `amenitiesByCategory` (exactly as the hotel page groups them: Internet, Food & drink, Pools, Wellness, Parking & transportation, Pets, Children, Accessibility, Services, Rooms, Bathrooms, Policies & payments, Business & events, Activities, Public bath — with "free", "extra charge", "24 hour" notes).

#### Photos

`imageUrl` (main photo, 1200 × 800), `images` (all photos Google shows in the result card, 1200 × 800), `imagesCount`.

#### Search context

`checkInDate`, `checkOutDate`, `nights`, `adults`, `children`, `searchDestination`, `searchQuery` (what was sent to Google, e.g. "hotels in Paris"), `rank` (position in Google's order for the first few hundred hotels of each destination), `detailsStatus` (`ok`, or why a hotel page could not be read), `scrapedAt`.

***

### Who uses this Google Hotels scraper

**1. Hotel revenue manager — daily rate shopping.** Put your hotel and five competitors into "Hotel links or IDs", set check-in `+1`, `+7`, `+14` and `+30` in four saved tasks, schedule them daily, and you get each competitor's nightly rate on every booking site for each lead time. A Google Sheet with conditional formatting turns it into a rate grid; when a competitor drops 15 % on Booking.com you see it the next morning.

**2. Distribution / rate-parity manager.** Every offer carries `isOfficialSite`. Filter the dataset to your hotels and compare `pricePerNightWithTaxes` of the official site against Expedia, Booking.com, Agoda and the long tail of small sites. Rows where an OTA undercuts your own site by more than 2 % are parity breaches — the `url` field is the exact page the guest would land on.

**3. OTA, metasearch or travel-app builder.** Collect every bookable hotel of your launch cities with coordinates, photos, amenities, ratings and the full offer list, de-duplicated by Google hotel ID and joinable to Google Maps by place ID. One run per city per day refreshes prices; the `hotelId` stays the same between runs.

**4. Travel agency or travel-management company.** Build hotel programs for corporate clients: 4-star hotels near the client's office (`hotels near …`), free cancellation only, rated 4.0+, with the average all-in rate for the travel dates and the sites that offer it.

**5. Hospitality market analyst.** Supply by city and neighborhood (`neighborhood`, `hotelClass`, `categories`), rating distribution, ADR proxies by star class (`pricePerNight` per `hotelClass`), share of hotels with deals, share selling on their own website. Turn off "Only hotels with prices" to count unbookable properties too.

**6. Hotel investor or asset manager.** Screen a city for acquisition targets: independent 3-star hotels (no brand) with high ratings and few reviews, their neighborhood, nightly prices over several dates and how many sites distribute them.

**7. Tourism board / destination marketing organisation.** Track the destination's lodging inventory, price levels before and during big events, and how much of it is bookable directly — monthly, with the same saved task.

**8. Event and conference organiser.** Search "hotels near <venue>" for the event dates months ahead, then again closer to the date: room-block negotiations start from real market rates, and attendees get a list with links.

**9. Agency selling to hotels (web design, marketing, booking engines).** Lead lists with phone, website and the booking engine visible in the official-site offer link (in the 10,925-hotel run: official-rates.com, DerbySoft, Koddi, secure-hotel-tracker.com, Mirai, Reseliva, The Booking Button, Cloudbeds, TravelClick …); hotels without an official-site offer are prospects for a direct-booking engine.

**10. Hotel tech vendor (channel manager, PMS, RMS).** Which hotels sell through which OTAs, how many offers each has, which ones show a "GREAT DEAL" badge, and which have no website at all.

**11. Data scientist / pricing researcher.** Daily price panels for thousands of hotels with taxes and fees separated, deal flags, ratings and amenities as features; `hotelId` makes the panel join cleanly over time.

**12. Travel content site or blogger.** "Best boutique hotels in Lisbon under $150 rated 4.5+" — one filtered run gives the shortlist with photos, prices, ratings and the Google Hotels link for each.

**13. Price-comparison app or browser extension.** The `offers` list is a ready price comparison: site, nightly price, total, direct link — for the exact dates and party size.

**14. Corporate travel manager.** Duty-of-care and policy checks: approved hotels near offices, their current rates against the travel policy cap (`maxPrice`), rating floor (`minRating`).

**15. Academic researcher.** Studies of drip pricing and fee transparency (`taxes` vs `fees`), price dispersion across booking sites, platform competition — reproducible with saved inputs and dates.

**16. Supplier or recruiter for the hotel industry.** Lists of hotels by class, brand-name keywords, city and size proxies (review counts), with phone and website.

**17. AI agent and chatbot builder.** Give an LLM a live hotel search tool through Apify's MCP server: "find me a 4-star hotel near the Colosseum under €200 with free cancellation for 12–14 March" becomes one Actor call returning structured rows.

**18. Vacation-package and airline ancillary builder.** Pull hotels with all-in prices for the same dates as a flight search, filter by stars and rating, and bundle the cheapest offer with a link.

***

### Cookbook: 18 ready-to-run inputs

Every recipe below was run on the platform on 2026-10-20 with exactly this input (dates default to the coming weekend unless set). Copy the JSON into the **JSON** tab of the input form, or send it as the request body to the API.

#### 1. Every bookable hotel in a city

```json
{ "destinations": ["Lisbon"], "maxItems": 0 }
```

Lisbon, 30 Oct – 1 Nov 2026: **714 hotels with prices in 85.8 s**, each with its booking offers. `maxItems: 0` means "no limit" — the run reads Google's list, then the map areas and price bands, until no new hotel appears.

#### 2. Cheapest hotels first, for exact dates

```json
{ "destinations": ["Paris"], "checkInDate": "2026-12-04", "checkOutDate": "2026-12-06", "sortBy": "lowest_price", "maxItems": 100 }
```

100 cheapest Paris hotels for the first weekend of December in 19.5 s. `rank` 1–100 follows Google's lowest-price order.

#### 3. Luxury: 5-star hotels with spa and pool, rated 4.5+

```json
{ "destinations": ["Dubai"], "hotelClass": ["5"], "minRating": "4.5", "amenities": ["spa", "pool"], "maxItems": 100 }
```

100 hotels in 19.4 s (Google counted 124 for these filters).

#### 4. Family stay with two children

```json
{ "destinations": ["Orlando"], "adults": 2, "children": 2, "childrenAges": ["5", "9"], "amenities": ["kid_friendly", "pool"], "nights": 4, "maxItems": 100 }
```

100 kid-friendly hotels with a pool, priced for 2 adults + 2 children for 4 nights, in 25.2 s. Prices change with the party: the same hotel costs more for four than for two.

#### 5. Price specific hotels (rate parity, competitor tracking)

```json
{ "hotelUrls": ["https://www.google.com/travel/hotels/entity/ChkI7_q93r2s8vwRGg0vZy8xMWI2d20xeTBqEAE", "https://www.google.com/travel/hotels/entity/ChgI2ajtweSK7ZPpARoLL2cvMXR2M21fZnAQAQ", "ChkI0dygrsWg9qIGGg0vZy8xMWM1dDAzMnhsEAE"], "checkInDate": "+14", "nights": 1 }
```

3 hotels (Generator Paris, Hôtel d'Orsay, HOSHINOYA Tokyo) with all their offers, 14 days ahead, in 3.2 s. Links copied from Google Hotels work, and so does the `hotelId` of an earlier run.

#### 6. Hostels under $40

```json
{ "destinations": ["Berlin"], "propertyTypes": ["hostel"], "maxPrice": 40, "maxItems": 100 }
```

12 hostels — everything Google had under $40 per night that weekend — in 11.3 s.

#### 7. Free cancellation only

```json
{ "destinations": ["Barcelona"], "freeCancellation": true, "maxItems": 100 }
```

100 hotels with a free-cancellation rate in 17.2 s.

#### 8. Many cities in one run, 100 hotels each

```json
{ "destinations": ["Rome", "Madrid", "Vienna", "Prague", "Budapest"], "maxItemsPerDestination": 100, "maxItems": 500 }
```

500 hotels (100 per city) in 61.3 s. "Max hotels per destination" stops one big city from taking the whole budget.

#### 9. Hotels near a landmark

```json
{ "destinations": ["hotels near Times Square"], "maxItems": 100 }
```

100 hotels in 35.0 s, in Google's order for that search. Any free text works: "hotels near Disneyland Paris", "hotels near Heathrow airport", "beach resorts in Phuket".

#### 10. Local currency, language and Google country

```json
{ "destinations": ["Tokyo"], "currency": "JPY", "language": "ja", "countryCode": "jp", "maxItems": 50 }
```

50 Tokyo hotels in yen with Japanese descriptions in 17.4 s.

#### 11. Market sizing: every hotel, bookable or not, without hotel pages

```json
{ "destinations": ["Lisbon"], "onlyWithPrices": false, "includeDetails": false, "maxItems": 0 }
```

**1,601 lodging places in Lisbon in 77.7 s** — including those Google shows without a price for these dates (sold out or not on any booking site). Without hotel pages the rows have no address, phone or offers, but name, class, rating, reviews, coordinates, amenities, photos and (where available) the lowest price.

#### 12. Fastest list export

```json
{ "destinations": ["Paris"], "includeDetails": false, "maxItems": 1000 }
```

1,000 Paris hotels with nightly price, rating, class, coordinates and photos in 38.4 s.

#### 13. Eco-certified hotels

```json
{ "destinations": ["Amsterdam"], "ecoCertified": true, "maxItems": 100 }
```

100 hotels with an independent sustainability certification in 17.8 s.

#### 14. Long stays: 7 nights

```json
{ "destinations": ["Lisbon"], "nights": 7, "maxItems": 50 }
```

50 hotels priced for a week in 16.5 s. `totalPrice` is the whole week; `pricePerNight` the average night.

#### 15. Pet-friendly with free parking

```json
{ "destinations": ["London"], "amenities": ["pet_friendly", "free_parking"], "maxItems": 100 }
```

36 hotels — all Google had in London with both — in 22.8 s.

#### 16. All-inclusive beach resorts

```json
{ "destinations": ["Cancun"], "amenities": ["all_inclusive", "beach_access"], "propertyTypes": ["resort"], "maxItems": 100 }
```

58 resorts in 16.1 s (Google counted 64).

#### 17. The most-reviewed hotels of a city

```json
{ "destinations": ["Istanbul"], "sortBy": "most_reviewed", "maxItems": 200 }
```

200 hotels in 26.0 s, ranked by number of Google reviews — the city's best-known hotels.

#### 18. German Google, euro prices

```json
{ "destinations": ["Munich"], "currency": "EUR", "countryCode": "de", "language": "de", "maxItems": 50 }
```

50 Munich hotels with German descriptions and euro prices in 14.4 s; the offers include German sites such as CHECK24 and HolidayCheck.

***

### Tutorial: scrape Google Hotels in the Apify Console

1. **Open the Actor** and press **Try for free** (an Apify account is free; the Free plan includes monthly credit).
2. **Destinations** — type one destination per line: a city ("Rome"), a district ("Shinjuku, Tokyo"), a region ("Algarve"), an island ("Mallorca") or a free-text search ("hotels near the Colosseum"). A plain place name is searched as "hotels in <place>".
3. **Dates** — leave check-in empty for the coming weekend (the Friday at least 7 days ahead, 2 nights), type a date (`2026-12-04`), or a relative date (`+14` = 14 days from the day the run starts — ideal for schedules).
4. **Guests and currency** — adults, children with their ages, currency. Prices are always for exactly this party.
5. **Max hotels** — 20 for a first look, 1,000 for a city's best-known hotels, 0 for everything.
6. **Filters** (optional) — price per night, guest rating, stars, amenities, property types, free cancellation, eco-certified.
7. Press **Start**. Rows appear in the **Output** tab within seconds; the **Prices & deals** and **Contacts & location** views show the most-used columns.
8. **Export** — Excel, CSV, JSON, XML or HTML from the Output tab, or **Integrations** to send each run to Google Sheets, Slack, email or a webhook.
9. **Save as a task** and add a **Schedule** (e.g. every morning at 7:00) for daily price tracking.

***

### Tutorial: the Google Hotels API from your own code

Every Apify Actor is an API. Replace `YOUR_TOKEN` with your token from **Settings → Integrations**.

**Run and get the rows in one call (up to 5 minutes):**

```bash
curl -X POST "https://api.apify.com/v2/acts/logiover~google-hotels-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"destinations":["Paris"],"checkInDate":"+14","nights":2,"maxItems":100}'
```

**Start a long run, then read the dataset:**

```bash
curl -X POST "https://api.apify.com/v2/acts/logiover~google-hotels-scraper/runs?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" -d '{"destinations":["Rome","Madrid"],"maxItems":0}'
## -> data.id (run ID) and data.defaultDatasetId
curl "https://api.apify.com/v2/datasets/DATASET_ID/items?format=csv&token=YOUR_TOKEN" > hotels.csv
```

**Node.js (apify-client):**

```js
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('logiover/google-hotels-scraper').call({
    destinations: ['Lisbon'], checkInDate: '+7', nights: 2, maxItems: 500, minRating: '4',
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
for (const h of items) console.log(h.name, h.pricePerNightWithTaxes, h.currency, h.lowestOfferProvider);
```

**Python (apify-client):**

```python
from apify_client import ApifyClient
client = ApifyClient("YOUR_TOKEN")
run = client.actor("logiover/google-hotels-scraper").call(run_input={
    "hotelUrls": ["https://www.google.com/travel/hotels/entity/ChkI7_q93r2s8vwRGg0vZy8xMWI2d20xeTBqEAE"],
    "checkInDate": "+1", "nights": 1,
})
for hotel in client.dataset(run["defaultDatasetId"]).iterate_items():
    for offer in hotel["offers"]:
        print(offer["provider"], offer["pricePerNightWithTaxes"], offer["isOfficialSite"])
```

Useful dataset parameters: `format=csv|xlsx|json|xml`, `fields=name,pricePerNight,totalPrice` (only these columns), `omit=offers,images` (drop heavy columns), `unwind=offers` (one row per offer — a ready rate-parity table), `clean=true`.

***

### Input reference

| Field | Type | Default | What it does |
|---|---|---|---|
| `destinations` | list of text | — (prefill "Paris") | Where to search: city, district, region, island, or free text ("hotels near …", "resorts in …"). A plain place name becomes "hotels in <place>". Google Hotels search links are accepted too. |
| `checkInDate` | text | next Friday ≥ 7 days ahead | `YYYY-MM-DD` or `+N` (N days from the day of the run). A date in the past is replaced by the default and the run says so. |
| `checkOutDate` | text | check-in + nights | `YYYY-MM-DD` or `+N`. Must be after check-in; at most 30 nights. |
| `nights` | integer 1–30 | 2 | Length of stay when no check-out date is given. |
| `adults` | integer 1–12 | 2 | Adult guests. |
| `children` | integer 0–8 | 0 | Children; give their ages below (a child without an age counts as 12). |
| `childrenAges` | list | \[] | One age (0–17) per child. |
| `currency` | select | USD | One of 42 currencies for every price and offer. |
| `sortBy` | select | relevance | `relevance` (Google's order), `lowest_price`, `highest_rating`, `most_reviewed`. Decides which hotels come first and the `rank` column. |
| `maxItems` | integer | 1,000 (prefill 20) | Total hotels across all destinations; 0 = no limit. |
| `maxItemsPerDestination` | integer | 0 | Cap per destination (0 = none). |
| `onlyWithPrices` | boolean | true | Only hotels Google can price for your dates. Off = also every unbookable place (sold out, or on no booking site) — often 40–60 % of a big city. |
| `includeDetails` | boolean | true | Opens each hotel's Google page: address, phone, all offers with links, rooms, amenities by category, languages, neighborhood, nearby places, other ratings. One extra request per hotel, included in the price. |
| `splitArea` | boolean | true | Splits big destinations into map areas and price bands to get past Google's list limit. Off = read Google's list only. |
| `minPrice` / `maxPrice` | integer | 0 (no limit) | Price per night in the chosen currency (Google's nightly price); 0 = no minimum / maximum. |
| `minRating` | select | any | 3.5+, 4.0+, 4.5+. |
| `hotelClass` | multi-select | any | 2-, 3-, 4-, 5-star. |
| `amenities` | multi-select | none | free_wifi, free_breakfast, restaurant, bar, kid_friendly, pet_friendly, free_parking, parking, ev_charger, room_service, fitness_center, spa, pool, indoor_pool, outdoor_pool, air_conditioned, wheelchair_accessible, beach_access, all_inclusive — a hotel must have all selected. |
| `propertyTypes` | multi-select | all | bed_and_breakfast, hostel, boutique_hotel, spa_hotel, inn, resort, motel, beach_hotel, apartment_hotel, other. |
| `freeCancellation` | boolean | false | Only hotels with a free-cancellation rate. |
| `specialOffers` | boolean | false | Only hotels Google flags with a special offer. |
| `ecoCertified` | boolean | false | Only hotels with an independent sustainability certification. |
| `includeVacationRentals` | boolean | false | Keep the few vacation rentals Google mixes into its default order (`type: "vacation_rental"`). |
| `hotelUrls` | list | \[] | Google Hotels hotel links (`…/travel/hotels/entity/…`) or hotel IDs: each comes back with all offers for your dates. |
| `language` | select | en | 31 languages for descriptions and labels. Amenity names stay in English. |
| `countryCode` | text | us | Google country (gl), e.g. `gb`, `de`, `fr`, `jp` — decides which booking sites appear. |
| `proxyConfiguration` | proxy | Apify Proxy | Fallback only — see [Troubleshooting](#troubleshooting-every-status-message-explained). |

***

### Output data dictionary with measured fill rates

Fill rate = share of rows where the field has a value, measured on the 10,925-row run of 2026-10-20 (7 cities, default settings: only hotels with prices, hotel pages on). "Unbookable" rows (with `onlyWithPrices: false`) have no prices and fewer details.

| Field | Type | Meaning | Fill rate | Example |
|---|---|---|---|---|
| `hotelId` | string | Google Hotels' hotel ID (stable; usable in "Hotel links or IDs") | 100.0 % | ChoIhsKBrtH4oq72ARoNL2cvMTFiNmc5NW41YhAB |
| `name` | string | Hotel name | 100.0 % | Suite Fontana di Trevi |
| `type` | string | `hotel` or `vacation_rental` | 100.0 % | hotel |
| `hotelClass` | number | Official star class 1–5 | 78.2 % | 4 |
| `hotelClassText` | string | Google's class label | 78.2 % | 4-star hotel |
| `categories` | array | Google place types (first = primary) | 99.9 % | \["hotel", "bed and breakfast"] |
| `description` | string | Google's one-line summary | 59.7 % | Contemporary rooms, some with living rooms, … |
| `descriptionLong` | string | "About this hotel" paragraph | 57.8 % | This down-to-earth guesthouse in the city ce… |
| `address` | string | Full street address | 100.0 % | Via in Arcione, 92, 00187 Roma RM, Italy |
| `city` | string | City (from Google's area hierarchy) | 96.6 % | Rome |
| `neighborhood` | string | Neighborhood Google assigns | 78.4 % | Trevi |
| `neighborhoodDescription` | string | Google's description of the neighborhood | 79.2 % | Busy tourist destination with the Trevi Foun… |
| `countryCode` | string | ISO 3166-1 alpha-2 country | 100.0 % | IT |
| `latitude` | number | Latitude (WGS84) | 100.0 % | 41.9016836 |
| `longitude` | number | Longitude (WGS84) | 100.0 % | 12.485358 |
| `phone` | string | Phone, international format | 95.3 % | +39 333 922 5790 |
| `website` | string | Hotel's website | 88.0 % | http://www.suitefontanaditrevi.com/ |
| `rating` | number | Google guest rating 1–5 | 98.5 % | 4.7 |
| `reviewsCount` | number | Number of Google reviews | 98.5 % | 59 |
| `ratingHistogram` | object | Reviews per star, "1"–"5" | 98.5 % | {"1": 2, "2": 0, "3": 1, "4": 5, "5": 51} |
| `reviewMentions` | array | Review topics: topic, mentions, positive, negative | 80.9 % | 5 items |
| `otherRatings` | array | Other sites: source, rating, ratingScale, reviewsCount, url | 82.4 % | 2 items |
| `locationScore` | number | Google's location score 1–5 | 99.7 % | 4.8 |
| `locationScores` | object | thingsToDo, restaurants, transit, airportAccess | 99.7 % | {"thingsToDo": 4.9, "restaurants": 4.8, "tra… |
| `checkInTime` | string | Check-in from | 60.0 % | 12:00 PM |
| `checkOutTime` | string | Check-out until | 60.6 % | 11:00 AM |
| `currency` | string | Currency of every price in the row | 100.0 % | USD |
| `pricePerNight` | number | Per night before taxes (fees included) | 100.0 % | 264.7 |
| `pricePerNightWithTaxes` | number | Per night, all-in | 100.0 % | 306.88 |
| `totalPrice` | number | Whole stay, all-in | 100.0 % | 613.75 |
| `totalPriceBeforeTaxes` | number | Whole stay before taxes | 100.0 % | 529.41 |
| `taxes` | number | Taxes for the stay | 100.0 % | 84.34 |
| `fees` | number | Hotel/resort fees for the stay (inside both prices) | 100.0 % | 0 |
| `dealBadge` | string | GREAT DEAL / DEAL / GREAT PRICE | 21.2 % | DEAL |
| `dealText` | string | Deal reason | 21.2 % | 20% less than usual |
| `dealPercentBelowUsual` | number | % below the usual price | 14.9 % | 20 |
| `offersCount` | number | Booking offers found | 100.0 % | 10 |
| `lowestOfferProvider` | string | Site with the lowest all-in price | 99.2 % | Booking.com |
| `offers` | array | One per booking site: provider, providerId, pricePerNight, pricePerNightWithTaxes, totalPrice, isOfficialSite, isSponsored, url, rooms | 99.2 % | 10 items |
| `amenities` | array | Amenities the hotel has | 89.9 % | \["Free breakfast", "Free Wi-Fi", "Air condit… |
| `amenitiesUnavailable` | array | Amenities Google says it lacks | 87.4 % | \["Pool", "Hot tub", "Fitness center", "Spa",… |
| `amenitiesByCategory` | object | Amenities grouped as on the hotel page, with notes | 89.3 % | 8 groups |
| `languagesSpoken` | array | Languages the staff speak | 42.7 % | \["English", "French", "Italian", "Japanese",… |
| `imageUrl` | string | Main photo, 1200×800 | 100.0 % | https://lh3.googleusercontent.com/grass-cs/A… |
| `images` | array | Photo URLs, 1200×800 | 100.0 % | 9 items |
| `imagesCount` | number | Number of photos | 100.0 % | 9 |
| `nearbyPlaces` | array | Sights, transit, airports: category, name, travelTime, travelMode | 99.7 % | 22 items |
| `placeId` | string | Google place ID | 100.0 % | ChIJ00_mv6xhLxMRBmHAFcWLXPY |
| `cid` | string | Google Maps CID | 100.0 % | 17752217509777400070 |
| `featureId` | string | Google feature ID | 100.0 % | 0x132f61acbfe64fd3:0xf65c8bc515c06106 |
| `kgmid` | string | Knowledge Graph ID | 100.0 % | /g/11b6g95n5b |
| `googleHotelsUrl` | string | Hotel on Google Hotels with the same dates/guests/currency | 100.0 % | https://www.google.com/travel/hotels/entity/… |
| `googleMapsUrl` | string | Hotel on Google Maps | 100.0 % | https://www.google.com/maps/place/?q=place_i… |
| `checkInDate` | string | Check-in (YYYY-MM-DD) | 100.0 % | 2026-10-30 |
| `checkOutDate` | string | Check-out (YYYY-MM-DD) | 100.0 % | 2026-11-01 |
| `nights` | number | Nights | 100.0 % | 2 |
| `adults` | number | Adults | 100.0 % | 2 |
| `children` | number | Children | 100.0 % | 0 |
| `detailsStatus` | string | Hotel page: ok / ok (no prices…) / not loaded (…) | 100.0 % | ok |
| `searchDestination` | string | Destination as typed | 100.0 % | Rome |
| `searchQuery` | string | Query sent to Google | 100.0 % | hotels in Rome |
| `rank` | number | Position in Google's order (first few hundred per destination) | 21.9 % | 11 |
| `scrapedAt` | string | ISO timestamp of the run | 100.0 % | 2026-10-20T13:55:48.700Z |

***

### Real output sample

One row from a run on 2026-10-20 (`{"destinations": ["Rome"], "maxItems": 40}`, final build), exactly as stored — nothing masked, nothing shortened:

```json
{
  "hotelId": "ChgIxOaY-NiHvu9_GgwvZy8xMWh2NDRxNWsQAQ",
  "name": "Hotel San Anselmo",
  "type": "hotel",
  "hotelClass": 4,
  "hotelClassText": "4-star hotel",
  "categories": [
    "hotel"
  ],
  "description": "Elegant quarters in a refined hotel featuring a warmly furnished bar, plus free breakfast & Wi-Fi.",
  "descriptionLong": "This upscale hotel is an 11-minute walk from a metro stop and 4 km from St. Peter's Basilica.",
  "address": "Piazza di Sant'Anselmo, 2, 00153 Roma RM, Italy",
  "city": "Rome",
  "neighborhood": "Ripa",
  "neighborhoodDescription": "Ruins of Circus Maximus & the Knights of Malta Priory, plus summer concerts & films on Tiber Island.",
  "countryCode": "IT",
  "latitude": 41.8821217,
  "longitude": 12.479415099999999,
  "phone": "+39 06 570057",
  "website": "https://www.aventinohotels.com/",
  "rating": 4.6,
  "reviewsCount": 701,
  "ratingHistogram": {
    "1": 21,
    "2": 9,
    "3": 33,
    "4": 117,
    "5": 521
  },
  "reviewMentions": [
    {
      "topic": "Breakfast",
      "mentions": 58,
      "positive": 46,
      "negative": 7
    },
    {
      "topic": "Property",
      "mentions": 86,
      "positive": 79,
      "negative": 3
    },
    {
      "topic": "Location",
      "mentions": 74,
      "positive": 66,
      "negative": 3
    },
    {
      "topic": "Service",
      "mentions": 65,
      "positive": 58,
      "negative": 4
    },
    {
      "topic": "Atmosphere",
      "mentions": 27,
      "positive": 27,
      "negative": 0
    },
    {
      "topic": "Bar or lounge",
      "mentions": 17,
      "positive": 13,
      "negative": 2
    }
  ],
  "otherRatings": [
    {
      "source": "Tripadvisor",
      "rating": 4.7,
      "ratingScale": 5,
      "reviewsCount": 1422,
      "url": "https://www.tripadvisor.com/Hotel_Review-g187791-d237189-r1079500382?m=68573&staydates=2026_11_01_2026_11_02&uguests=1_2_0&supdv=desktop&supuc=US&supul=en"
    }
  ],
  "locationScore": 4.3,
  "locationScores": {
    "thingsToDo": 4.7,
    "restaurants": 3.9,
    "transit": 4.6,
    "airportAccess": 3.2
  },
  "checkInTime": "2:00 PM",
  "checkOutTime": "12:00 PM",
  "currency": "USD",
  "pricePerNight": 160.68,
  "pricePerNightWithTaxes": 193.58,
  "totalPrice": 387.16,
  "totalPriceBeforeTaxes": 321.37,
  "taxes": 65.79,
  "fees": 0,
  "dealBadge": null,
  "dealText": null,
  "dealPercentBelowUsual": null,
  "offersCount": 11,
  "lowestOfferProvider": "Tripadvisor.com",
  "offers": [
    {
      "provider": "Hotel San Anselmo",
      "providerId": 1162481814,
      "pricePerNight": 161,
      "pricePerNightWithTaxes": 194,
      "totalPrice": 387,
      "isOfficialSite": true,
      "isSponsored": false,
      "url": "https://www.hoteleasyreservations.it/herx/client/index.html?form=search&hotel=32&hlang=en&dtfrom=20261030&numnotti=2&numpersone=2&utm_source=Google&utm_medium=localuniversal&utm_term=&user_country=US&utm_campaign=desktop-Free-Link-Hotel&gclid=(GCLID)"
    },
    {
      "provider": "Booking.com",
      "providerId": 184,
      "pricePerNight": 373,
      "pricePerNightWithTaxes": 427,
      "totalPrice": 854,
      "isOfficialSite": false,
      "isSponsored": false,
      "url": "https://www.booking.com/searchresults.en.html?dest_id=87798&highlighted_hotels=87798&dest_type=hotel&checkin=2026-10-30&checkout=2026-11-01&group_adults=2&req_adults=2&show_room=8779803_366113580_0_1_0&lang=en&selected_currency=USD&exrt=1.12220502&ext_price_total=854.00&ext_price_tax=108.26&xfc=EUR&hca=m&group_children=0&req_children=0&&ts=1792492798&no_rooms=1&edgtid=zcEKuMTdRxqWGGZs3Cl9Sw&efpc=cxsAp2GwCh8&utm_source=metagha&utm_medium=localuniversal&utm_campaign=US&utm_term=hotel-87798&utm_content=dev-desktop_los-2_bw-10_dow-Friday_defdate-1_room-0_gstadt-2_rateid-public_aud-0_gacid-_mcid-10_ppa-0_clrid-0_ad-0_gstkid-0_checkin-20261030_ppt-0&aid=2127486&label=metagha-link-LUUS-hotel-87798_dev-desktop_los-2_bw-10_dow-Friday_defdate-1_room-0_gstadt-2_rateid-public_aud-0_gacid-_mcid-10_ppa-0_clrid-0_ad-0_gstkid-0_checkin-20261030_ppt-0",
      "rooms": [
        {
          "name": "Economy Double or Twin Room",
          "pricePerNight": 111.86,
          "pricePerNightWithTaxes": 139.88
        },
        {
          "name": "Double or Twin Room",
          "pricePerNight": 118.44,
          "pricePerNightWithTaxes": 147.12
        },
        {
          "name": "Deluxe Double or Twin Room",
          "pricePerNight": 172.41,
          "pricePerNightWithTaxes": 206.49
        }
      ]
    },
    {
      "provider": "KAYAK.com",
      "providerId": 100979605,
      "pricePerNight": 373,
      "pricePerNightWithTaxes": 427,
      "totalPrice": 854,
      "isOfficialSite": false,
      "isSponsored": false,
      "url": "https://www.kayak.com/semi/ha/hotel_ads/605101/en.html?utm_source=google&utm_medium=cpc&utm_term=605101&adType=0&utm_content=localuniversal&utm_campaign=HotelAds&ci=2026-10-30&co=2026-11-01&gs=localuniversal&l=2&pc=USD&rid=&pdtax=108.19&pdtotal=853.62&rpid=&uc=US&ucuc=USD&d=desktop&lc=en&v=false&rrid=UFJJQ0VMSU5FQ09SRQ&k_pc=~UFJJQ0VMSU5FQ09SRQ&k_rt=&k_sid=2RBkEaXLNf&k_kct=1792500127&k_gct=1792500505&g=2&r=1&ac=2&k_cc=us&dt=default&cmpid=&cmptrack="
    },
    {
      "provider": "Amimir.com",
      "providerId": 1397608158,
      "pricePerNight": 373,
      "pricePerNightWithTaxes": null,
      "totalPrice": null,
      "isOfficialSite": false,
      "isSponsored": false,
      "url": "https://www.amimir.com/en/book/?start=30%2F10%2F2026&end=01%2F11%2F2026&hotelId=57300&highlightHotel=true&hab1=2&ehab1=&metasearch&utm_content=57300&checkV=false&totalPrice=746.27&userCountry=US&utm_source=googleMetasearch&utm_medium=organic&currency=USD"
    },
    {
      "provider": "Priceline",
      "providerId": 220,
      "pricePerNight": 373,
      "pricePerNightWithTaxes": 427,
      "totalPrice": 854,
      "isOfficialSite": false,
      "isSponsored": false,
      "url": "https://www.priceline.com/r/?channel=meta&product=hotel&theme=Google-L&refid=PLGOOGLEMSS&refclickid=US_HP%7C7592403_localuniversal_2%7C20261030%7Cdesktop%7Cdefaultdate|public|||10%7C2%7C0|0|EN&hotelid=7592403&checkin=20261030&checkout=20261101&rooms=1&cur=USD&POSCountryCode=US&taxDisplayMode=BP&cityID=3000035823&adults=2&land=L&metaid=s_dhWb5Vx79eDCOh6jzF_fIt9t_UeqNMiLuc8zDlgyPBxE2ARBGMIzW2tHHtxCu69MnUXarKZbX0khvUXe2cJ3QtUnnKX_2PAmrE2TKcnKi81f43Lhl-msFkEUBzgPSlCO2kFxGMyqEshjHWETYlmw4SYkMAOz_B7XetIP9163-x4-asoJZIFToGllmInL_NwjhqzIid57WbHwdj8Hq0phLAx_gLlVFV5zYBrA4VH2kDvmqqlG8LCl_wza6OONuyZ9yVJAEXYAWO1iihrusUCPa37y6-9O_g2111TTCudmLvaUwupJGuDNw5VTsgkRlaXhB0xjor-149bDAsm3UGEOZggKJW7SI9A9vB7UOO7RcNWH38eVun9l-bIyebEwjpeqDvWO1jWdkS7QD8Ekd7n7VqRVvv91MV-dw-y2K2hGpIgtz4dQNpxFxU_Yh2kouy&dblcnt=true&hc=1&pdtax=108.26&pdf=0.00&pdt=854.00&locale=en-us&ad-src=&numChild=0&aid=&selAdults=2"
    },
    {
      "provider": "Agoda",
      "providerId": 100337601,
      "pricePerNight": 362,
      "pricePerNightWithTaxes": 415,
      "totalPrice": 830,
      "isOfficialSite": false,
      "isSponsored": false,
      "url": "https://www.agoda.com/partners/partnersearch.aspx?site_id=1917614&CkInDay=30&CkInMonth=10&CkInYear=2026&CkOutDay=01&campaignid=&CkOutMonth=11&CkOutYear=2026&SearchDateType=default&NumberOfAdults=2&LT=10&NumberOfChildren=0&childages=&NumberOfRooms=1&gsite=localuniversal&los=2&PartnerCurrency=EUR&hid=10256597&RoomID=6109142&masterRoomId=126125587&PriceTotal=830.43&PriceTax=106.12&PriceFee=0.00&RatePlan=c632bbfe-5d97-b961-bba3-a09b1fee8430&UserCountry=US&Currency=USD&UserDevice=desktop&Verif=false&rr=US&audience_list=&mcid=3038&booking_source=cpc&adType=0&mpt=TzBmbXRzRmJwZU16U2FncHhud3hGbmlFL2NuNE1pRnNLblZ2VEFLcmVvSUN6eHJTQk53bXc4aCtIOXF0WGg1ZTl3RXJEUlQ2VTFoT1Vqdz0&original_rr=US&gaClickSrc=&clickType=hotel&lang=en&pkgId=Breakfast_NoDinner_false",
      "rooms": [
        {
          "name": "Economy Double or Twin Room",
          "pricePerNight": 111.86,
          "pricePerNightWithTaxes": 139.88
        },
        {
          "name": "Double or Twin Room",
          "pricePerNight": 118.45,
          "pricePerNightWithTaxes": 147.12
        },
        {
          "name": "Deluxe Double or Twin Room",
          "pricePerNight": 172.42,
          "pricePerNightWithTaxes": 206.49
        }
      ]
    },
    {
      "provider": "Michelin Guide Hotels",
      "providerId": 68,
      "pricePerNight": 439,
      "pricePerNightWithTaxes": 499,
      "totalPrice": 999,
      "isOfficialSite": false,
      "isSponsored": false,
      "url": "https://guide.michelin.com/hotel-search?hotelId=353&currency=USD&user_language=en&arr=2026-10-30&dep=2026-11-01&nA=2&google_ads=1&utm_medium=referral&utm_campaign=hotelads&utm_source=google&utm_content=koddi_HPA_30-10-2026_01-11-2026_64464_localuniversal_2_desktop_US_default___michelin_organic&alternativehotelcode=353"
    },
    {
      "provider": "Bluepillow.com",
      "providerId": 599653573,
      "pricePerNight": 390,
      "pricePerNightWithTaxes": 427,
      "totalPrice": 854,
      "isOfficialSite": false,
      "isSponsored": false,
      "url": "https://www.bluepillow.com/search/58c6bb707c00cb04dc14d0a8?begin=2026-10-30&end=2026-11-01&block_id=-b,5CPT76dQsRpTwRT-c35jBMixQNQ3FjD1E0QMJ2PtQZdDzFBmNabzF6tWCvfvQqJU9v6FNVNAVPC_i2cc0j4fig,-bkng-Hotel&fees=33.66&tax=108.19&total=853.59&adults=2&childs=0&infants=0&childrens=0&country=US&currency=USD&language=en&source=localuniversal&utm_campaign=hotel&prid=foreign"
    },
    {
      "provider": "Hotelscombined.com",
      "providerId": 651449338,
      "pricePerNight": 373,
      "pricePerNightWithTaxes": 427,
      "totalPrice": 854,
      "isOfficialSite": false,
      "isSponsored": false,
      "url": "https://www.hotelscombined.com/semi/ha/hotel_ads/605101/en.html?utm_source=google&utm_medium=cpc&utm_term=605101&adType=0&utm_content=localuniversal&utm_campaign=HotelAds&ci=2026-10-30&co=2026-11-01&gs=localuniversal&l=2&pc=USD&rid=&pdtax=108.19&pdtotal=853.62&rpid=&uc=US&ucuc=USD&d=desktop&lc=en&v=false&rrid=UFJJQ0VMSU5FQ09SRQ&k_pc=~UFJJQ0VMSU5FQ09SRQ&k_rt=&k_sid=2RDkEl0zuJ&k_kct=1792500127&k_gct=1792500504&g=2&r=1&ac=2&k_cc=us&dt=default&cmpid=&cmptrack="
    },
    {
      "provider": "momondo.com",
      "providerId": 970163321,
      "pricePerNight": 373,
      "pricePerNightWithTaxes": 427,
      "totalPrice": 854,
      "isOfficialSite": false,
      "isSponsored": false,
      "url": "https://www.momondo.com/semi/ha/hotel_ads/605101/en.html?utm_source=google&utm_medium=cpc&utm_term=605101&adType=0&utm_content=localuniversal&utm_campaign=HotelAds&ci=2026-10-30&co=2026-11-01&gs=localuniversal&l=2&pc=USD&rid=&pdtax=108.19&pdtotal=853.62&rpid=&uc=US&ucuc=USD&d=desktop&lc=en&v=false&rrid=UFJJQ0VMSU5FQ09SRQ&k_pc=~UFJJQ0VMSU5FQ09SRQ&k_rt=&k_sid=2RBkHXTrUm&k_kct=1792500127&k_gct=1792500520&g=2&r=1&ac=2&k_cc=us&dt=default&cmpid=&cmptrack="
    },
    {
      "provider": "Tripadvisor.com",
      "providerId": 100532569,
      "pricePerNight": 112.73,
      "pricePerNightWithTaxes": 137.48,
      "totalPrice": null,
      "isOfficialSite": false,
      "isSponsored": true,
      "url": null
    }
  ],
  "amenities": [
    "Free breakfast",
    "Free Wi-Fi",
    "Parking ($)",
    "Hot tub",
    "Air conditioning",
    "Pet-friendly",
    "Bar",
    "Restaurant",
    "Room service",
    "Airport shuttle",
    "Full-service laundry",
    "Accessible",
    "Kid-friendly",
    "Smoke-free property",
    "Wi-Fi",
    "Breakfast",
    "Breakfast buffet",
    "Credit cards",
    "Debit cards",
    "Bicycle rental",
    "Front desk",
    "Baggage storage",
    "Concierge",
    "Elevator",
    "Social hour",
    "Wake up calls",
    "Housekeeping",
    "Massage",
    "Hair salon",
    "Doctor on call",
    "Dogs allowed",
    "Cats allowed",
    "Parking",
    "EV charger",
    "Accessible parking",
    "Accessible elevator",
    "Private bathroom",
    "Bathtub in some rooms",
    "Shower in some rooms"
  ],
  "amenitiesUnavailable": [
    "Fitness center",
    "Spa",
    "Pool"
  ],
  "amenitiesByCategory": {
    "Internet": [
      "Wi-Fi (free)"
    ],
    "Food & drink": [
      "Restaurant",
      "Bar",
      "Room service",
      "Breakfast (free)",
      "Breakfast buffet"
    ],
    "Policies & payments": [
      "Smoke-free property",
      "Credit cards",
      "Debit cards"
    ],
    "Activities": [
      "Bicycle rental"
    ],
    "Services": [
      "Front desk (24 hour)",
      "Baggage storage",
      "Concierge",
      "Full-service laundry",
      "Elevator",
      "Social hour",
      "Wake up calls",
      "Housekeeping (daily)"
    ],
    "Children": [
      "Kid-friendly"
    ],
    "Wellness": [
      "No fitness center",
      "Massage",
      "No spa",
      "Hair salon",
      "Doctor on call"
    ],
    "Pools": [
      "No pools",
      "Hot tub"
    ],
    "Pets": [
      "Pet-friendly (free)",
      "Dogs allowed",
      "Cats allowed"
    ],
    "Parking & transportation": [
      "Parking (extra charge)",
      "EV charger",
      "Airport shuttle (extra charge)"
    ],
    "Rooms": [
      "Air conditioning"
    ],
    "Accessibility": [
      "Accessible",
      "Accessible parking",
      "Accessible elevator"
    ],
    "Bathrooms": [
      "Private bathroom",
      "Bathtub in some rooms",
      "Shower in some rooms"
    ]
  },
  "languagesSpoken": [
    "English",
    "Filipino",
    "French",
    "German",
    "Italian",
    "Russian",
    "Spanish"
  ],
  "imageUrl": "https://lh3.googleusercontent.com/grass-cs/AABkmLdVmlGDhqjEHr12QYWUCSq9efWi3YdY-YmJSAMEnwQWO5qWfOcxVn72SnFNk4xVZ4EZZAgXouaes3x0Ycg9iyRZnOsBsHzWtOQIW-8G2rtsvzU-BDY216-KXYw0ZiFn9a4HBh1EiA=w1200-h800-k-no",
  "images": [
    "https://lh3.googleusercontent.com/grass-cs/AABkmLdVmlGDhqjEHr12QYWUCSq9efWi3YdY-YmJSAMEnwQWO5qWfOcxVn72SnFNk4xVZ4EZZAgXouaes3x0Ycg9iyRZnOsBsHzWtOQIW-8G2rtsvzU-BDY216-KXYw0ZiFn9a4HBh1EiA=w1200-h800-k-no",
    "https://lh3.googleusercontent.com/grass-cs/AABkmLfsDKL8Pwv8XLf28PGE-DILIGk9c1BMasnFA5zTHxNR-M-gZwAKyz_ANm8pKOq_uZf4iDX8F4gpu8IMyVHj1LSRkUxF1vxsVBGQtuYzk0fP9BMxKwdz4UbyL7JcEcUB0w2H83cC=w1200-h800-k-no",
    "https://lh3.googleusercontent.com/grass-cs/AABkmLdaLEXntRLTJWa03X3lVYE8IBugoTsYxXMAUORkzWsgG9oTW6eYSGd4aopPaL7adXIwU_bPLbEh2QcwlBFkjPjDQyusBsEoMXjFfpGmibW1IxnVXVa2kn-i3le2mDzrCUtjuKw=w1200-h800-k-no",
    "https://lh3.googleusercontent.com/grass-cs/AABkmLcWKf34cmCbN05tAHfHXLW7CP3BmIqGRYzpOUJtWx7CzO5ZDLXvnw7m5EOHX8HZDj25QAlO50SmjrPjMq-1jLO8XzUdaSKXhJsU-_3gYadIz-01_JWsX_wVzARHAaXj22XDEa1_Hw=w1200-h800-k-no",
    "https://lh3.googleusercontent.com/grass-cs/AABkmLcsdq1Mm_NGvbZr67_9P5vCXAIr2I4NvHmXDpvNAis0FExe4dSn4oNazebt-bocMxiHUVEvpwdd7QPDnVy3ZG5BduN_RjKChuMEWajs17o9QdlaNmOK_H27Zr2llJ50FG3jS3qo=w1200-h800-k-no",
    "https://lh3.googleusercontent.com/grass-cs/AABkmLf6NO8TEW0tJJdfhGU2N8xh4Nt8sOrQ66q7GRHdnQsH_LU9RsKOHTLRA5ogWALG1LgVks7hwBOYkJZhkUXHhodIoa1Hf6MAY7WUn2wI8jRA3T4n6MH2uOm6Zkt4vNQCRXnu6CF3=w1200-h800-k-no",
    "https://lh3.googleusercontent.com/grass-cs/AABkmLdVtFGsp2JgCwW239ES4M2jSHuADLe0eW4dcA1goM23rnDokFipheAV9Kg_yQ2-QRZ9-3Mizw3yxTTRwEPdGnL1N8i9vTENxBWrVjZGs9g-LMgcKNeu2wZwvkebSi9XJN0cMZaemw=w1200-h800-k-no",
    "https://lh3.googleusercontent.com/grass-cs/AABkmLd5S2oFQcg-jSzCNquRwpw43ool2mkT2ZwmC-fvhW4h6YfyYJ5HBkI6e5D_JZSZGsMpKMrE3GPeRi2MMYPVTs57qKSHqh9luKtciPvgIcU321bBP4mz6jhCO1qnbjlT6NdeRBKP=w1200-h800-k-no",
    "https://lh3.googleusercontent.com/grass-cs/AABkmLcVq8-KkiIIuVeVQ1zVaIlOaq0Ezw1f70H4a04-p0fy8SI8wsJJe-wHkvkULoZT98g8DRo8WZCc_Nty4a3O0DxgDKfvIItr19yib2-GsAT2kJkuPZi3gm4359VJBXtduPs3fS1z=w1200-h800-k-no"
  ],
  "imagesCount": 9,
  "nearbyPlaces": [
    {
      "category": "Top sight",
      "name": "Colosseum",
      "travelTime": "11 min",
      "travelMode": "driving",
      "otherTravelTimes": [
        {
          "mode": "public transport",
          "time": "17 min"
        }
      ]
    },
    {
      "category": "Top sight",
      "name": "Roman Forum",
      "travelTime": "7 min",
      "travelMode": "driving",
      "otherTravelTimes": [
        {
          "mode": "public transport",
          "time": "17 min"
        }
      ]
    },
    {
      "category": "Top sight",
      "name": "Pantheon",
      "travelTime": "12 min",
      "travelMode": "driving",
      "otherTravelTimes": [
        {
          "mode": "public transport",
          "time": "19 min"
        }
      ]
    },
    {
      "category": "Top sight",
      "name": "Trevi Fountain",
      "travelTime": "17 min",
      "travelMode": "driving",
      "otherTravelTimes": [
        {
          "mode": "public transport",
          "time": "22 min"
        }
      ]
    },
    {
      "category": "Top sight",
      "name": "Saint Peter’s Basilica",
      "travelTime": "16 min",
      "travelMode": "driving",
      "otherTravelTimes": [
        {
          "mode": "public transport",
          "time": "24 min"
        }
      ]
    },
    {
      "category": "Top sight",
      "name": "Piazza Navona",
      "travelTime": "13 min",
      "travelMode": "driving",
      "otherTravelTimes": [
        {
          "mode": "public transport",
          "time": "18 min"
        }
      ]
    },
    {
      "category": "Top sight",
      "name": "Spanish Steps",
      "travelTime": "18 min",
      "travelMode": "driving",
      "otherTravelTimes": [
        {
          "mode": "public transport",
          "time": "30 min"
        }
      ]
    },
    {
      "category": "Top sight",
      "name": "Castel Sant'Angelo",
      "travelTime": "15 min",
      "travelMode": "driving",
      "otherTravelTimes": [
        {
          "mode": "public transport",
          "time": "24 min"
        }
      ]
    },
    {
      "category": "Top sight",
      "name": "Sistine Chapel",
      "travelTime": "18 min",
      "travelMode": "driving",
      "otherTravelTimes": [
        {
          "mode": "public transport",
          "time": "33 min"
        }
      ]
    },
    {
      "category": "Top sight",
      "name": "Vatican Museums",
      "travelTime": "18 min",
      "travelMode": "driving",
      "otherTravelTimes": [
        {
          "mode": "public transport",
          "time": "33 min"
        }
      ]
    },
    {
      "category": "Top sight",
      "name": "Villa Borghese",
      "travelTime": "18 min",
      "travelMode": "driving",
      "otherTravelTimes": [
        {
          "mode": "public transport",
          "time": "39 min"
        }
      ]
    },
    {
      "category": "Top sight",
      "name": "Monument to Victor Emmanuel II",
      "travelTime": "7 min",
      "travelMode": "driving",
      "otherTravelTimes": [
        {
          "mode": "public transport",
          "time": "12 min"
        }
      ]
    },
    {
      "category": "Top sight",
      "name": "Galleria Borghese",
      "travelTime": "19 min",
      "travelMode": "driving",
      "otherTravelTimes": [
        {
          "mode": "public transport",
          "time": "44 min"
        }
      ]
    },
    {
      "category": "Top sight",
      "name": "Papal Basilica of Saint Mary Major",
      "travelTime": "14 min",
      "travelMode": "driving",
      "otherTravelTimes": [
        {
          "mode": "public transport",
          "time": "28 min"
        }
      ]
    },
    {
      "category": "Top sight",
      "name": "Capitoline Museums",
      "travelTime": "6 min",
      "travelMode": "driving",
      "otherTravelTimes": [
        {
          "mode": "public transport",
          "time": "12 min"
        }
      ]
    },
    {
      "category": "Transit",
      "name": "Basilica S. Paolo",
      "transitType": "Train",
      "travelTime": "12 min",
      "travelMode": "driving",
      "otherTravelTimes": [
        {
          "mode": "walking",
          "time": "44 min"
        }
      ]
    },
    {
      "category": "Transit",
      "name": "Ostiense",
      "transitType": "Train",
      "travelTime": "5 min",
      "travelMode": "driving",
      "otherTravelTimes": [
        {
          "mode": "walking",
          "time": "22 min"
        }
      ]
    },
    {
      "category": "Transit",
      "name": "Roma Trastevere",
      "transitType": "Train",
      "travelTime": "14 min",
      "travelMode": "driving",
      "otherTravelTimes": [
        {
          "mode": "walking",
          "time": "28 min"
        }
      ]
    },
    {
      "category": "Transit",
      "name": "EUR Magliana",
      "transitType": "Train",
      "travelTime": "14 min",
      "travelMode": "driving",
      "otherTravelTimes": [
        {
          "mode": "walking",
          "time": "1 hr 38 min"
        }
      ]
    },
    {
      "category": "Transit",
      "name": "Roma Termini",
      "transitType": "Train",
      "travelTime": "18 min",
      "travelMode": "driving",
      "otherTravelTimes": [
        {
          "mode": "walking",
          "time": "50 min"
        }
      ]
    },
    {
      "category": "Airport",
      "name": "Leonardo da Vinci International Airport",
      "travelTime": "44 min",
      "travelMode": "driving",
      "otherTravelTimes": [
        {
          "mode": "public transport",
          "time": "47 min"
        }
      ]
    },
    {
      "category": "Airport",
      "name": "Giovan Battista Pastine International Airport",
      "travelTime": "35 min",
      "travelMode": "driving",
      "otherTravelTimes": [
        {
          "mode": "public transport",
          "time": "41 min"
        }
      ]
    }
  ],
  "placeId": "ChIJLzOzyDNgLxMRRDMGjz343n8",
  "cid": "9214074830922855236",
  "featureId": "0x132f6033c8b3332f:0x7fdef83d8f063344",
  "kgmid": "/g/11hv44q5k",
  "googleHotelsUrl": "https://www.google.com/travel/hotels/entity/ChgIxOaY-NiHvu9_GgwvZy8xMWh2NDRxNWsQAQ?hl=en&gl=us&curr=USD&ts=CAESCgoCCAMKAggDEAAaIAoCGgASGhIUCgcI6g8QChgeEgcI6g8QCxgBGAIyAhAAKgkKBToDVVNEGgA",
  "googleMapsUrl": "https://www.google.com/maps/place/?q=place_id:ChIJLzOzyDNgLxMRRDMGjz343n8",
  "checkInDate": "2026-10-30",
  "checkOutDate": "2026-11-01",
  "nights": 2,
  "adults": 2,
  "children": 0,
  "detailsStatus": "ok",
  "searchDestination": "Rome",
  "searchQuery": "hotels in Rome",
  "rank": 13,
  "scrapedAt": "2026-10-20T14:16:19.970Z"
}
```

**CSV / Excel columns** (nested fields are flattened by Apify: `offers/0/provider`, `locationScores/transit`, …):

`hotelId`, `name`, `type`, `hotelClass`, `hotelClassText`, `categories`, `description`, `descriptionLong`, `address`, `city`, `neighborhood`, `neighborhoodDescription`, `countryCode`, `latitude`, `longitude`, `phone`, `website`, `rating`, `reviewsCount`, `ratingHistogram`, `reviewMentions`, `otherRatings`, `locationScore`, `locationScores`, `checkInTime`, `checkOutTime`, `currency`, `pricePerNight`, `pricePerNightWithTaxes`, `totalPrice`, `totalPriceBeforeTaxes`, `taxes`, `fees`, `dealBadge`, `dealText`, `dealPercentBelowUsual`, `offersCount`, `lowestOfferProvider`, `offers`, `amenities`, `amenitiesUnavailable`, `amenitiesByCategory`, `languagesSpoken`, `imageUrl`, `images`, `imagesCount`, `nearbyPlaces`, `placeId`, `cid`, `featureId`, `kgmid`, `googleHotelsUrl`, `googleMapsUrl`, `checkInDate`, `checkOutDate`, `nights`, `adults`, `children`, `detailsStatus`, `searchDestination`, `searchQuery`, `rank`, `scrapedAt`

Tip: for a one-row-per-offer table add `unwind=offers` to the dataset export URL — each row then holds one booking site's price for one hotel.

***

### How it gets every hotel in a city

Google Hotels was built for people, not datasets. Three things stop a naive scraper — each measured on 2026-10-20:

1. **The list ends early.** Google's default list stops after about 1,000 positions, the lowest-price list after 500 and the most-reviewed list after about 640 — then Google simply answers page 1 again ("fake pagination"). Rome has more than 8,000 lodging places.
2. **The default order reshuffles on every request.** Reading Rome's default list page by page gave 790 different hotels for 1,009 positions — the same hotel shows up on page 3 and again on page 9, others never.
3. **Big boxes leave hotels out.** A map area Google counts at 362 hotels listed only 256; its four quarters listed 94 + 156 + 35 + 87 = 372, every one.

So the Actor works in three passes and removes duplicates by Google hotel ID:

- **Google's own list** in the order you chose, for the first few hundred hotels (this also fills `rank`).
- **Map areas**: the destination's map area (Google's own viewport, widened while that adds hotels — and, for sprawling cities where Google ignores a box that is too big, the eight same-size boxes around it) is split into four, again and again, until every box holds at most 100 hotels — a list that short is read to its end in the stable most-reviewed order.
- **Price bands**: Google's lowest-price list, cut into bands of at most ~450 hotels by the price of the 432nd hotel of each band — a second, independent way through the same city that finds the hotels the map boxes leave out.

Measured result, hotels with prices for 30 Oct – 1 Nov 2026 (one run per line):

| City | Hotels saved | Google's count | From Google's list | From map areas | From price bands |
|---|---|---|---|---|---|
| Rome | 2,094 | 2,029 | 340 | 1,643 | 111 |
| Paris | 2,025 | 2,029 | 343 | 1,556 | 126 |
| London | 1,468 | 1,681 | 350 | 766 | 352 |
| Istanbul | 2,667 | 2,643 | 328 | 2,267 | 72 |
| Tokyo | 1,134 | 1,106 | 336 | 742 | 56 |
| New York | 748 | 612 | 354 | 367 | 27 |
| Madrid | 789 | 726 | 347 | 405 | 37 |

"Google's count" is the number Google itself gives for the city with prices; it moves with availability and is approximate, so a little above 100 % is normal. Without "Only hotels with prices", the same method returned 12,000 lodging places for Rome, Paris and Milan in one run.

***

### How prices are reported (before taxes, with taxes, totals)

Google shows hotel prices in one of two ways depending on the visitor's country: before taxes with a second "with taxes and fees" figure (the US way), or only the all-in price (the European way). The Actor always asks as a US visitor and stores both, with fixed meanings in every row:

| Field | Meaning | Example (2 nights) |
|---|---|---|
| `pricePerNight` | Nightly price **before taxes** (resort and service fees included, like Google's US display) | 168.33 |
| `pricePerNightWithTaxes` | Nightly price **all-in** (taxes and fees) | 179.55 |
| `totalPriceBeforeTaxes` | Whole stay before taxes | 336.66 |
| `totalPrice` | Whole stay, all-in — what the guest pays | 359.11 |
| `taxes` | Taxes for the whole stay | 22.44 |
| `fees` | Hotel/resort fees for the whole stay (already inside both prices) | 0 |

Each offer carries the same three: `pricePerNight`, `pricePerNightWithTaxes`, `totalPrice` (a site that shows only one figure leaves the other `null`; sponsored "Featured options" give Google a nightly price only, so their `totalPrice` is `null` for stays longer than one night). Prices are in `currency` (the one you chose), for your exact dates and party. They are Google's prices at the moment of the run — hotel prices change several times a day.

***

### Scale and speed (measured on 2026-10-20)

| Run | Input | Result |
|---|---|---|
| Daily-check prefill | Paris, 20 hotels, hotel pages on | 12.4 s end to end; first rows after ~5 s |
| 1,000 hotels, default settings | one city, hotel pages with all offers on | Paris 88.1 s · New York 97.3 s · London 104.5 s and 111.7 s |
| 1,000 hotels, list only | Paris, `includeDetails: false` | 38.4 s |
| 7 cities, every bookable hotel | Rome, Paris, London, Istanbul, Tokyo, New York, Madrid, `maxItems: 0` | **10,925 hotels in 752 s, 0 duplicates, 12,389 requests, 12,389 answered** |
| 5 capitals, every bookable hotel | Rome, Paris, London, Madrid, Vienna | 7,091 hotels in 599 s |
| 3 cities incl. unbookable places | Rome, Paris, Milan, `maxItems: 12000` (before "Only hotels with prices" existed) | 12,000 hotels in 830 s, 0 duplicates (checked on hotel ID, place ID, CID and feature ID), 12,972 requests, all answered |

Throughput with hotel pages on is about 10–16 hotels per second; without hotel pages about 26 per second. The work is spread over the direct connection and Apify's datacenter proxies (US exits), so no single address is pushed hard: in the runs above Google answered every request (0 captchas, 0 failed pages).

***

### What you pay

Pay per result: one result = one hotel row (with its offers, rooms, amenities and photos — no extra charge for hotel pages, proxies or compute).

| Your Apify plan | Price per 1,000 hotels |
|---|---|
| Free | $3.00 |
| Starter (Bronze) | $2.67 |
| Scale (Silver) | $2.33 |
| Business (Gold) and higher | $2.00 |

**Examples:** 1,000 hotels = $3.00 on the Free plan, $2.00 on Business. 10,000 hotels (every bookable hotel in Rome, Paris, London, Istanbul and Tokyo) = $30.00 / $20.00. 100,000 hotels (a daily price panel of 10,000 hotels for 10 days) = $300 / $200. A daily rate-shopping task for 6 hotels × 4 lead times costs 24 results = 7.2 cents a day on the Free plan.

**Maximum cost per run.** Every run has a cost limit — the one you set in the run options ("Maximum cost per run"), or the platform's default. The Actor reads it before it starts and stops cleanly when it is reached, with the rows collected so far and its own status message. Measured on 2026-10-20: a Paris run with a $0.05 limit (Starter-plan price, $2.67 per 1,000) saved exactly 18 hotels, was charged for exactly 18, ended **SUCCEEDED** and said *"Saved 18 hotels — this run's maximum cost ($0.05) covers 18 results at the current price. Raise "Maximum cost per run" to get more."* It never collects rows it cannot deliver. For `maxItems: 0` on a big city, set the limit high enough (e.g. $25 for 8,000 hotels on the Free plan).

***

### Integrations

- **REST API / curl** — see the [API tutorial](#tutorial-the-google-hotels-api-from-your-own-code); `run-sync-get-dataset-items` returns rows directly.
- **Node.js and Python** — official `apify-client` packages (examples above).
- **Google Sheets** — Integrations → Google Sheets: each run appends or replaces a sheet; or use `=IMPORTDATA("https://api.apify.com/v2/datasets/…/items?format=csv&token=…")`.
- **Make (Integromat)** — "Run an Actor" + "Get dataset items" modules; map `name`, `pricePerNightWithTaxes`, `lowestOfferProvider` into your scenario.
- **Zapier** — "Run Actor" action, "Finished Actor run" trigger → Google Sheets, Airtable, Slack, email.
- **n8n** — Apify node (run Actor, get dataset) or HTTP Request node with the API URL.
- **Airtable** — via Make/Zapier, or CSV import; `hotelId` as the primary key keeps daily imports clean.
- **Webhooks** — Integrations → Webhooks: POST to your endpoint when a run succeeds, with the dataset ID.
- **Scheduling** — Schedules: cron-style ("every day at 06:00 UTC"); combine with relative dates (`+7`) so each run prices "a week from today".
- **AI agents (MCP)** — Apify's MCP server exposes this Actor as a tool to Claude, ChatGPT-compatible clients and agent frameworks; the input schema doubles as the tool description.
- **Data warehouses** — export JSON/CSV to S3, BigQuery, Snowflake or Postgres from a webhook or a scheduled script; `hotelId` + `checkInDate` + `scrapedAt` is a natural composite key for price panels.

***

### Performance tips

- **Need prices, not contacts?** Keep hotel pages on — the offers and all-in prices come from them — but drop heavy columns at export (`omit=images,nearbyPlaces,amenitiesByCategory`).
- **Need only names, ratings and coordinates?** `includeDetails: false` is about 2.5× faster (1,000 hotels in 38 s).
- **Many cities?** One run with all of them and `maxItemsPerDestination` is faster than one run per city.
- **Daily tracking of specific hotels** — use `hotelUrls` with the `hotelId`s from a first run: a hotel takes about one second.
- **Rolling dates** — `checkInDate: "+30"` in a scheduled task always prices 30 days ahead.
- **Top N only?** Keep `splitArea` on but set `maxItems`; the Actor reads Google's own order first, so the first rows are the ones a visitor sees first.
- **Filters are applied by Google** — a filtered run reads fewer pages and finishes sooner than filtering afterwards.

***

### Troubleshooting: every status message explained

| Status message / log line | What it means | What to do |
|---|---|---|
| `Saved 1,000 hotels (max results reached) · 997 with booking offers for … in 110 s.` | Finished; "Max hotels" reached. | Raise "Max hotels" for more. |
| `Saved 2,098 hotels (every hotel Google listed was read) …` | Finished; everything Google lists for the destination was read. | — |
| `Saved … (stopped at the run time limit) …` | The run's timeout came first; rows so far are saved. | Raise the timeout in run options or split the destinations over several runs. |
| `… N page(s) could not be read.` (outcome PARTIAL) | A few pages failed even after retries; the rest is complete. | Usually fine; run again for the missing part. |
| `No hotels matched — Google Hotels answered but listed 0 hotels for "…" …` | A real empty answer (e.g. a tiny town, strict filters, a sold-out date). The run succeeds. | Broaden filters, check the destination text, try other dates. |
| `Saved N hotels — this run's maximum cost ($X) covers N results at the current price …` | The run's cost limit was reached; it stopped cleanly. | Raise "Maximum cost per run". |
| `Saved 0 hotels — this run's maximum cost … does not cover a single result …` | The limit is below one result. | Raise "Maximum cost per run". |
| `Nothing to search. Add a destination …` (FAILED) | No destination and no hotel link in the input. | Add at least one. |
| `No hotels collected: no page could be fetched (…) …` (FAILED, outcome BLOCKED or FETCH_FAILED) | Google refused every route. Rare; the run fails instead of pretending "0 results". | Run again later; or pick a RESIDENTIAL proxy in "Proxy configuration". |
| `No hotels collected and N page(s) could not be read …` (FAILED) | Nothing saved and pages failed, so "empty" cannot be confirmed. | Run again. |
| Log: `Google refused the direct connection (captcha) — pausing it for 60 s; requests go through the datacenter proxy meanwhile.` | Normal self-healing; the run continues. | — |
| Log: `The residential rescue route reached its cap (150 requests) …` | The free routes were refused for a long time; a long run needs a proxy. | Set a proxy in "Proxy configuration". |
| Log: `Check-in date … is in the past — the next weekend was used instead.` | Your date had passed. | Use `+N` dates in saved tasks. |
| Log: `Resumed after a platform restart: N hotel(s) were already saved and are not written or charged again.` | Apify moved the run to another server mid-run; it continued where it was. | — |
| Log: `Not a Google Hotels hotel link or ID: …` / `No hotel found for …` | The link was not a hotel page or the hotel no longer exists. | Copy the link from the hotel's page on google.com/travel. |
| `detailsStatus: "ok (no prices for these dates)"` | The hotel page was read but no site sells it for these dates. | Normal for sold-out dates. |
| `detailsStatus: "not loaded (Google refused)"` | That hotel's page failed after retries; the row has the list data. | Run that hotel again via `hotelUrls`. |

Every run also writes a **SUMMARY** record (Storage → Key-value store) with per-destination numbers: Google's count, hotels from the list, from map areas and from price bands, boxes read, duplicates skipped, and request statistics.

***

### Honest limits

- **Prices are a snapshot.** Hotel prices change during the day and by the visitor's country; checked in the same minute from the same place, 16 of 18 nightly prices were identical to the page (the other two within rounding); re-checked 1–3 hours later from another country, 6 of 9 were identical to the dollar and three had moved 3–6 %.
- **"Only hotels with prices" means Google's prices.** A hotel sold out on every booking site Google works with is left out (or has no price with the option off).
- **Coverage is complete as far as Google lists hotels.** Measured at 87–122 % of Google's own count per city; Google's count itself is approximate and moves with availability.
- **Offers are the sites Google shows** — Google decides which booking sites appear for which country (`countryCode`).
- **Amenity names are in English** in every language; descriptions, addresses and labels follow `language`.
- **Rank** exists only for the first few hundred hotels of each destination (Google's own list); hotels found through the map split have `rank: null`.
- **Room options** appear for sites that give them to Google (about one offer in seven).
- **No reviews text** — ratings, review counts, the star breakdown and review topics, not the reviews themselves.
- **Sponsored offer links** (Google ad clicks) are not passed on; the offer's price and site are.

***

### Comparison: official hotel APIs, manual copying and this Actor

| | Hotel supplier / OTA affiliate APIs | Copying from Google Hotels by hand | This Actor |
|---|---|---|---|
| Access | Partner contract, approval, often minimum volumes | Anyone | Anyone with an Apify account |
| Prices from many sites at once | No — one supplier per API | Yes, slowly | Yes — every site Google shows, in one row |
| Whole city | Their inventory only | Impractical | Yes — map areas + price bands, measured 87–122 % of Google's count |
| Taxes and fees separated | Varies | Visible, not structured | Always: before taxes, with taxes, taxes, fees |
| Join keys | Supplier IDs | — | Google hotel ID, place ID, CID, feature ID |
| Cost | Contract-dependent | Staff time | $2–3 per 1,000 hotels |
| Effort | Integration project | Hours per city | One input, minutes per city |

***

### FAQ

#### How do I scrape Google Hotels?

Put a destination into "Destinations" (for example "Paris"), choose your dates, and press Start. The Actor returns one row per hotel with prices, booking offers, address, rating and amenities. No code, no Google account and no proxy setup are needed.

#### Is there a Google Hotels API?

Google does not offer a public API for Google Hotels search results; its Hotel Center APIs are for hotels and partners managing their own listings. This Actor works as a Google Hotels API alternative: you call it with a destination and dates (REST API, Node.js, Python, Make, Zapier, n8n) and get structured JSON back.

#### How do I get hotel prices from Google Hotels into Excel or Google Sheets?

Run the Actor, open the Output tab and export as Excel (XLSX) or CSV — or connect the Google Sheets integration so every run writes to a sheet. `pricePerNightWithTaxes`, `totalPrice` and `lowestOfferProvider` are the usual columns for a price sheet.

#### Can I get the price from every booking site (Booking.com, Expedia, Hotels.com, Agoda…)?

Yes. With "Open each hotel's page" on (the default), each row has an `offers` list with one entry per site Google shows: price per night before and with taxes, total for the stay, whether it is the hotel's official site, and a direct link. In the 10,925-hotel run hotels had 14.2 offers on average.

#### Does it show the hotel's official website price?

Yes — the official site's offer has `isOfficialSite: true`. In the 10,925-hotel run 49 % of hotels had an official-site offer — the price rate-parity checks compare against the OTAs.

#### How many hotels can I scrape per city?

Every hotel Google Hotels lists. Google's own list stops after a few hundred, so the Actor splits the city into map areas and price bands. Measured: Rome 2,094 hotels with prices (Google counts 2,029), Paris 2,025 hotels with prices (Google counts 2,029), London 1,468 hotels with prices (Google counts 1,681), Istanbul 2,667 hotels with prices (Google counts 2,643).

#### Why does Google Hotels show "15,000 results" but I get fewer?

That number includes vacation rentals and places with no price for your dates, and it is rounded. With "Only hotels with prices" on you get the hotels Google can price; turn it off to also get unbookable places (Lisbon: 1,601 lodging places vs 714 bookable ones on the same dates).

#### Can I scrape Google Hotels without getting blocked?

The Actor spreads requests over the direct connection and Apify's datacenter proxies with a new IP per request, pauses any route Google refuses and comes back to it later. In the measured runs Google answered every one of the 12,389 requests of the 10,925-hotel run. You do not need to configure a proxy.

#### How fast is it?

About 10–16 hotels per second with all booking offers, about 26 per second without hotel pages. 1,000 hotels with offers took 88–112 s; 1,000 without hotel pages 38 s; the first rows appear after about 5 seconds.

#### How much does it cost to scrape 10,000 hotels?

$30 on the Free plan, $20 on Business and higher plans ($3.00 → $2.00 per 1,000 results). Hotel pages, proxies and compute are included; there is nothing else to pay.

#### Are the prices per night or for the whole stay?

Both. `pricePerNight` (before taxes) and `pricePerNightWithTaxes` (all-in) are per night; `totalPrice` and `totalPriceBeforeTaxes` are for the whole stay; `taxes` and `fees` are listed separately.

#### Do the prices include taxes and fees?

`pricePerNightWithTaxes` and `totalPrice` do; `pricePerNight` and `totalPriceBeforeTaxes` are before taxes (with any resort fee included, as Google shows them in the US). The split is the same in every row and every country.

#### Can I choose the currency?

Yes, 42 currencies (USD, EUR, GBP, JPY, AUD, CAD, CHF, CNY, INR, TRY, AED, BRL, MXN …). Every price and every offer comes in that currency.

#### Can I set the number of guests and children?

Yes — adults (1–12), children (0–8) and each child's age. Google's prices and offers are for exactly that party.

#### How do I track hotel prices every day?

Save your input as a task with relative dates (`"checkInDate": "+7"`), add a schedule (daily at 07:00), and connect Google Sheets or a webhook. For specific hotels use `hotelUrls` with their `hotelId`s — a hotel takes about a second.

#### How do I monitor rate parity for my hotel?

Add your hotel's Google Hotels link (and competitors') to "Hotel links or IDs", schedule daily, and compare the official-site offer (`isOfficialSite: true`) with the other offers. Export with `unwind=offers` for one row per site.

#### Can I scrape hotels near a landmark or an address?

Yes — type it as a destination: "hotels near Times Square", "hotels near Heathrow airport", "hotels near the Colosseum".

#### Can I scrape a whole country or region?

Use regions and islands as destinations ("Algarve", "Bali", "Tuscany"), or list the cities you need in one run. Each destination is split into map areas automatically.

#### Does it work for vacation rentals?

Google mixes a few vacation rentals into its default order; turn on "Include vacation rentals" to keep them (`type: "vacation_rental"`). Google's separate vacation-rental search is not covered.

#### Can I filter by star rating, guest rating, price, amenities?

Yes: hotel class (2–5 stars), minimum guest rating (3.5/4.0/4.5), price per night range, 19 amenities, 10 property types, free cancellation, special offers and eco-certified. Google applies the filters, so filtered runs are faster.

#### Can I sort Google Hotels results by price?

Yes — `"sortBy": "lowest_price"` (also `highest_rating`, `most_reviewed`, or Google's own order). The `rank` column follows that order.

#### What is the Google hotel ID and how do I use it?

`hotelId` is Google Hotels' identifier for a hotel. It stays the same between runs, so it is the key for daily price panels, and you can paste it into "Hotel links or IDs" to price that hotel again for other dates.

#### Can I join the data with Google Maps or the Places API?

Yes — every row has `placeId` (ChIJ…), `cid` and `featureId`, the same keys Google Maps and the Places API use, plus `latitude`/`longitude`.

#### Does it get the hotel's phone number and website?

Yes, from the hotel's Google page: phone in international format (93–99 % of hotels in the measured runs) and website (88–98 %).

#### Does it scrape hotel reviews?

It returns the rating, number of reviews, the 1–5 star breakdown, review topics with positive and negative mentions, and ratings from other sites (Tripadvisor, Trip.com …). It does not return review texts.

#### What amenities does it return?

All amenities on the hotel's page, grouped as Google groups them (Internet, Pools, Wellness, Food & drink, Parking, Pets, Children, Accessibility, Services, Rooms, Bathrooms, Policies & payments …), with "free" / "extra charge" notes, plus what the hotel does not have and the languages its staff speak.

#### What is the location score?

Google's 1–5 score for the hotel's location, with sub-scores for things to do, restaurants, transit and airport access — the same numbers as the hotel's Location tab.

#### Can I get prices for specific dates in the future?

Yes, any check-in up to a year ahead that Google prices, for 1 to 30 nights.

#### What happens with past dates?

A check-in date in the past is replaced by the coming weekend, and the run log says so. Use `+N` dates in saved tasks so they never go stale.

#### Why do some hotels have no price?

No booking site Google works with sells them for your dates (sold out, minimum stay, closed). With "Only hotels with prices" on (default) such hotels are left out; with it off they are included with `pricePerNight: null`.

#### Why do prices differ from what I see on Google Hotels?

Prices change during the day, and Google shows prices by the visitor's country: European visitors see all-in prices (compare with `pricePerNightWithTaxes`), US visitors see prices before taxes (`pricePerNight`). Check the same dates, party and currency — the `googleHotelsUrl` opens exactly those.

#### Can I scrape Google Hotels in other languages?

Yes, 31 languages — descriptions, class text, addresses and labels follow the language; amenity names stay English so columns stay comparable.

#### Does it need a Google account, cookies or an API key?

No. It reads what Google shows any visitor, without logging in.

#### Can I use my own proxies?

You can set any proxy in "Proxy configuration"; it is used as a fallback when the built-in routes are refused. For most runs no proxy is needed.

#### How do I scrape thousands of hotels across many cities in one run?

List the cities in "Destinations", set "Max hotels" to 0 (no limit) or a number, and optionally "Max hotels per destination". Measured: 7 cities, 10,925 hotels, one run.

#### What does "Maximum cost per run" do?

It caps what a run may cost. The Actor reads it first and stops cleanly when it is reached, keeping the rows collected and saying why in the status message.

#### Can I export one row per booking site?

Yes — add `unwind=offers` to the dataset export URL (API or Console "Export" → advanced): every offer becomes its own row with the hotel fields repeated.

#### Can an AI agent use this Actor?

Yes. Through Apify's MCP server an agent can call it as a tool ("find 4-star hotels in Rome under €200 for these dates") and read structured rows back.

#### Does it work with Make, Zapier and n8n?

Yes — use the Apify modules/nodes ("Run an Actor", "Get dataset items") or plain HTTP calls to the API.

#### Is the data deduplicated?

Yes, by Google hotel ID across all destinations and passes. The measured runs had 0 duplicates on hotel ID, place ID, CID and feature ID.

#### How do I scrape Google Hotels with Python?

Use `apify-client` (`pip install apify-client`) and call `client.actor("logiover/google-hotels-scraper").call(run_input={...})` — see the API tutorial above.

#### Can I get room types and room prices?

When a site gives Google its room list, the offer has `rooms` with each room's name and nightly price before and with taxes (about 16 % of offers in the 10,925-hotel run).

#### What deal flags does Google Hotels show?

`GREAT DEAL` / `DEAL` with "N% less than usual" (`dealPercentBelowUsual`), and `GREAT PRICE` with a reason ("for a 4-star hotel", "with a pool"). 21 % of the hotels in the 10,925-hotel run had one.

#### What if Google shows a captcha?

The Actor treats it as a refusal: that route pauses, others carry on, and the run continues. A run fails only if no route can reach Google at all — never as a silent "0 results".

***

### Glossary

- **Google Hotels** — Google's hotel search at google.com/travel/hotels, also shown inside Google Search and Maps.
- **Hotel ID (`hotelId`)** — Google Hotels' own identifier of a hotel; stable between runs.
- **Place ID** — Google's identifier of a place across Maps, Search and the Places API (`ChIJ…`).
- **CID** — the numeric Google Maps customer ID of a place.
- **OTA** — online travel agency (Booking.com, Expedia, Agoda…).
- **Metasearch** — a site comparing OTAs' prices for the same hotel (Google Hotels is one).
- **Rate parity** — the same room costing the same on the hotel's site and on OTAs.
- **Rate shopping** — collecting competitors' prices for the same dates.
- **ADR** — average daily rate, the average price of a sold room night.
- **Lead time** — days between the search and check-in.
- **All-in price** — price including taxes and fees.
- **Map split** — dividing a destination's map area into smaller boxes so each box's list can be read to the end.
- **Price band** — a price range (e.g. $100–$130) used as a second way through the same destination.
- **PPE (pay per event)** — Apify pricing where you pay per result row.

***

### Is it legal to scrape Google Hotels?

This Actor reads publicly available information that Google shows to any visitor without logging in: hotel names, addresses, public business phone numbers, ratings, amenities and the prices booking sites publish. Web scraping of public data is generally lawful in many jurisdictions, but how you use the data matters: respect Google's and the booking sites' terms where they apply to you, do not republish copyrighted photos or descriptions as your own, and handle any personal data (for example a phone number that belongs to a private host) according to GDPR, CCPA and similar laws. If you are unsure, ask a lawyer about your specific use. The Actor does not log in, does not bypass paywalls and does not collect reviewer identities.

***

### Changelog

### 1.0 (2026-10-20)

- First release.
- Google Hotels result lists read through the same request Google Hotels' own page uses (18 hotels per request), with every filter of the "All filters" panel: price per night, guest rating, hotel class, 19 amenities, 10 property types, free cancellation, special offers, eco-certified; four orders (Google's, lowest price, highest rating, most reviewed); 42 currencies, 31 languages, any Google country; adults and children with ages; dates as YYYY-MM-DD or rolling +N days.
- Whole cities: Google's list stops after ~500–1,000 hotels and re-ranks on every request, so a destination is read three ways and de-duplicated by Google hotel ID — Google's own list (rank), map boxes (the destination's map area, widened while that adds hotels, plus the surrounding boxes for sprawling cities, split until each box holds at most 100 hotels) and price bands of the lowest-price list.
- "Only hotels with prices" (default on) keeps the hotels Google can price for the dates; off returns every lodging place Google lists.
- Hotel pages: street address, phone, every booking offer with nightly price before and with taxes, total and link (official site flagged, sponsored offers flagged, ad-click links not passed on), room options, full amenity list by category, languages spoken, neighborhood, nearby sights, transit and airports with travel times, third-party ratings, place ID.
- Fixed price meanings in every row and offer: per night before taxes, per night all-in, totals for the stay, taxes and fees separately — independent of how Google displays prices in the visitor's country.
- Hotel links and IDs: price specific hotels (rate-parity checks, daily tracking). Google Hotels links in the rows open the same dates, guests and currency.
- IDs for joining other data: Google hotel ID, place ID (ChIJ…), CID, feature ID, Knowledge Graph ID.
- Network: direct connection and Apify datacenter proxy (US exits) side by side, refused routes paused and retried, a capped residential rescue route when the input has no proxy; every request bounded by the run's own deadline.
- Platform restarts (migrations): hotels already written are remembered in the run's key-value store, so a restarted run neither writes nor charges them twice.
- Pay-per-result budget: stops cleanly at the run's maximum cost with a clear message (SUMMARY `stoppedBy: MAX_COST`); SUMMARY record per destination (Google's count, hotels from the list, map boxes and price bands).

***

### Support

Questions, a field you need, a destination that behaves oddly? Open an issue on the Actor's **Issues** tab — we reply within 24 hours, usually much sooner. Tell us the run ID and what you expected; we read the run's SUMMARY and fix what we find.

***

*Google Hotels Scraper is an independent tool and is not affiliated with, endorsed by or sponsored by Google LLC. "Google" and "Google Hotels" are trademarks of Google LLC, used here only to describe the data source. Booking-site names belong to their owners.*

# Changelog

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

# Actor input Schema

## `destinations` (type: `array`):

Where to look for hotels, as you would type it into Google Hotels: a city ("Paris"), a district ("Shibuya, Tokyo"), a region or island ("Bali", "Tuscany"), or a free-text search ("hotels near Times Square", "resorts in Cancun", "hostels in Berlin"). A plain place name becomes "hotels in <place>". Google Hotels search links work too.

## `checkInDate` (type: `string`):

YYYY-MM-DD, or +N for N days from the day of the run (e.g. +14 — handy for scheduled runs). Empty = the next Friday at least 7 days ahead, so a saved task never goes stale.

## `checkOutDate` (type: `string`):

YYYY-MM-DD or +N. Empty = check-in + "Nights".

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

Length of stay when no check-out date is given (1–30). Prices come per night and for the whole stay.

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

Number of adult guests (1–12). Prices and offers are for this party.

## `children` (type: `integer`):

Number of children (0–8). Give their ages below; a child without an age counts as 12.

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

One age per child, 0–17 (e.g. 4 and 9).

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

Currency for every price and offer.

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

Which hotels come first (and the "rank" column). Google's own order mixes popularity and price; the other three sort the list. When a destination holds more hotels than Google's list shows, the rest is collected area by area after the ranked part.

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

Stop after this many unique hotels across all destinations and links. 0 = no limit (every hotel Google Hotels lists — a big city has 5,000–15,000). Big runs need a big enough "Maximum cost per run".

## `maxItemsPerDestination` (type: `integer`):

Optional cap per destination, so one big city does not take the whole "Max hotels". 0 = no per-destination limit.

## `onlyWithPrices` (type: `boolean`):

On: only places Google can price for your dates (what rate shopping and price monitoring need). Off: every hotel Google Hotels lists in the area — also the 40–60 % of a big city that shows no price for these dates (sold out, or no booking site has rates) — with name, rating, reviews, address, phone and amenities.

## `includeDetails` (type: `boolean`):

Adds the street address, phone, every booking offer with its price and link (Booking.com, Expedia, Hotels.com, Agoda, Trip.com, the hotel's official site…), room options, full amenity list by category, neighborhood, nearby transit and third-party ratings. One extra request per hotel, included in the price. Turn off for the fastest export of the result list only.

## `splitArea` (type: `boolean`):

Google's result list stops after ~500–1,000 hotels. With this on, a destination with more hotels is split into map boxes until every box's list can be read to the end — so a city returns thousands of hotels. Turn off to read only Google's list.

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

Only hotels from this nightly price, in the chosen currency. 0 = no minimum. Hotels without a price for your dates are left out when a price filter is set.

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

Only hotels up to this nightly price, in the chosen currency. 0 = no maximum.

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

Only hotels rated at least this many stars by guests.

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

Only hotels with these official star classes. Empty = any.

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

Only hotels that have all of these amenities.

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

Only these kinds of places. Empty = all hotels and similar places.

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

Only hotels with at least one free-cancellation rate for your dates.

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

Only hotels Google flags with a special offer.

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

Only hotels with an independent sustainability certification recognised by Google.

## `includeVacationRentals` (type: `boolean`):

Google mixes a few vacation rentals (apartments, houses) into its default order. Off = hotels and similar places only.

## `hotelUrls` (type: `array`):

Optional: specific hotels to price — Google Hotels hotel links (https://www.google.com/travel/hotels/entity/…) or hotel IDs (the "hotelId" column of an earlier run). Each comes back with all its offers for your dates; ideal for rate-parity checks and daily price tracking.

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

Language of descriptions, amenities and labels (hotel names stay as they are).

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

Two-letter country Google uses for the search (gl), e.g. "us", "gb", "de". It decides which booking sites appear. Default "us".

## `proxyConfiguration` (type: `object`):

Used only as a fallback. The scraper talks to Google over a direct connection first (no proxy cost); if Google slows it down or shows a captcha, it switches to Apify datacenter proxies (a new IP per request) and then to the proxy chosen here.

## Actor input object example

```json
{
  "destinations": [
    "Paris"
  ],
  "nights": 2,
  "adults": 2,
  "children": 0,
  "childrenAges": [],
  "currency": "USD",
  "sortBy": "relevance",
  "maxItems": 20,
  "maxItemsPerDestination": 0,
  "onlyWithPrices": true,
  "includeDetails": true,
  "splitArea": true,
  "minPrice": 0,
  "maxPrice": 0,
  "minRating": "",
  "hotelClass": [],
  "amenities": [],
  "propertyTypes": [],
  "freeCancellation": false,
  "specialOffers": false,
  "ecoCertified": false,
  "includeVacationRentals": false,
  "hotelUrls": [],
  "language": "en",
  "countryCode": "us",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (type: `string`):

All hotels collected in this run.

# 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 = {
    "destinations": [
        "Paris"
    ],
    "maxItems": 20,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("logiover/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 = {
    "destinations": ["Paris"],
    "maxItems": 20,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("logiover/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 '{
  "destinations": [
    "Paris"
  ],
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call logiover/google-hotels-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,logiover/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/7n6wTNRE4W7GgsQPc/builds/ZFgVg4RvhkjmdbAVg/openapi.json
