# Google Hotels Prices Scraper: Booking.com, Expedia, Agoda Rates (`themineworks/google-hotels-prices-scraper`) Actor

Scrape Google Hotels prices for your dates: one row per hotel with every booking site's price per night and for the stay, taxes in and out, free cancellation and a booking link, plus address, coordinates, stars, rating, reviews and amenities. Search a city or name hotels. No login.

- **URL**: https://apify.com/themineworks/google-hotels-prices-scraper.md
- **Developed by:** [The Mine Works](https://apify.com/themineworks) (community)
- **Categories:** Travel, E-commerce, MCP servers
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.49 / 1,000 hotel with prices

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

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

## What's an Apify Actor?

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

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

## How to integrate an Actor?

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

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

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

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

# README

## Google Hotels Prices Scraper: Booking.com, Expedia, Agoda Rates

[![20 Barcelona hotels priced in 16 seconds](https://api.apify.com/v2/key-value-stores/cUXz95yxflDho41nn/records/google-hotels-prices-scraper-hero.png)](https://console.apify.com/actors/I2AZJ7VSDiMNsNaDs/input)

From **The Mine Works**, makers of [Threads Scraper](https://apify.com/themineworks/threads-scraper) and [B2B Leads Finder](https://apify.com/themineworks/b2b-leads-finder), with over 140,000 runs across 170+ public actors.

### Why choose this actor?

- **Every booking site's price for your dates, in one row per hotel.** Booking.com, Expedia, Hotels.com, Agoda, Trip.com, the hotel's own website and the rest Google Hotels lists, each with its price per night and for the whole stay, before and with taxes, free cancellation terms and its own booking link. Our proof run priced **20 Barcelona hotels in 16 seconds**, with 16 to 30 booking sites per hotel (24 on average). No Google account, no API key, no cookies of yours.
- **Only your exact stay, checked before delivery.** Google quietly answers dates it will not price with other dates. The actor compares the stay Google priced with the one you asked for and never delivers a mismatch as yours, and never charges for it.
- **You pay only for hotels that have prices.** One charge per hotel row, all booking sites included. Hotels Google shows no price for, places that are not hotels, names Google cannot find, duplicates and refused pages are never charged.

[![Run it on Apify](https://api.apify.com/v2/key-value-stores/cUXz95yxflDho41nn/records/button-run.png)](https://console.apify.com/actors/I2AZJ7VSDiMNsNaDs/input)

**Part of The Mine Works More tools family:** [Tennis Match & Player Data Scraper](https://apify.com/themineworks/tennis-match-data), [LandWatch Scraper](https://apify.com/themineworks/landwatch-land-for-sale-scraper).

### Try it in one minute

Paste this input and press Start. It prices about 10 Lisbon hotels for a two night stay 30 days from today:

```json
{
  "locations": ["Lisbon"],
  "checkIn": "30",
  "checkOut": "32",
  "currency": "EUR",
  "maxHotels": 10
}
```

You can say what to price in four ways, and mix them in one run:

- **Cities, districts or landmarks** (`locations`): `Lisbon`, `Shoreditch London`, `near Eiffel Tower`. Each is searched as "hotels in ..."; text that already names a kind of stay, such as `hostels in Berlin` or `resorts near Cancun`, is searched as typed.
- **Hotel names** (`hotels`): `Park Hyatt Tokyo`. Add the city when the name is common. The first hotel Google Maps finds for the name is priced, and the row shows which one.
- **Google Hotels links or hotel ids** (`hotels`): a link such as `https://www.google.com/travel/hotels/entity/ChcI1b68wq3V66lAGgsvZy8xdHRkbTljaxAB`, or a `hotel_id` from an earlier run.
- **Google Maps links** (`hotels`): a link to the hotel's place on Google Maps.

Dates are either a calendar date (`2026-11-20`) or a number of days from today (`30`), so a scheduled run keeps pricing the same distance ahead.

Apify's free plan includes $5 of credit every month, which covers about 1,000 hotels at this actor's Free plan price.

#### Copy to your AI assistant

```text
themineworks/google-hotels-prices-scraper on Apify. Returns one row per hotel with every booking site Google Hotels lists for your dates (price per night and for the stay, before and with taxes, free cancellation, booking link), plus address, coordinates, star class, rating, reviews and amenities. Call ApifyClient("TOKEN").actor("themineworks/google-hotels-prices-scraper").call(run_input={"locations": ["Lisbon"], "checkIn": "2026-11-20", "checkOut": "2026-11-22", "currency": "EUR", "maxHotels": 20}), then client.dataset(run["defaultDatasetId"]).list_items().items. Required: locations (cities or areas) or hotels (names, Google Hotels links, hotel ids or Google Maps links). Optional: checkIn (YYYY-MM-DD or days from today; default 14 days from today), checkOut (default one night after check-in; up to 30 nights), adults (default 2, 1 to 10), currency (default USD), country (Google country code, default us), maxHotels (per city, default 20, up to 300), includeHotelsWithoutPrices (default false). Skip the last row if it has "_type": "info". Full spec: GET https://api.apify.com/v2/acts/themineworks~google-hotels-prices-scraper/builds/default (Bearer TOKEN), which returns inputSchema and readme. Token: https://console.apify.com/account/integrations
```

### Key features

- **47 fields per hotel**, grouped as the stay, the price summary (lowest price per night and for the stay, with and without taxes, the cheapest site and its link, the hotel's own site price), every booking site's offer, the hotel (address, coordinates, star class, rating, reviews per star, phone, website, description, photo), amenities and check-in times, and Google ids and links.
- **13 fields per booking site offer**: position, site name and id, official site or not, ad or not, price per night and for the stay before and with taxes, free cancellation and its deadline, the booking link and the site's logo.
- **Up to 50 cities and 500 named hotels per run**, and up to 300 hotels with prices per city, in Google's order. A hotel found twice in a run is priced and charged once.
- **Any stay up to 30 nights, up to 365 days ahead, 1 to 10 adults.** 54 currencies in the Console list, and any 3 letter code Google Hotels supports through the API.
- **Google country versions** (`country`): `gb`, `in`, `de` and so on change which booking sites Google lists for the same hotel.
- **Plain HTTP, no browser**, 512 MB of memory, five hotel pages at a time. A run summary (status per city and hotel, pages read, attempts, robots.txt state, the dates check) is saved as the `OUTPUT` record.

### How to use it

#### Basic: one city

```json
{
  "locations": ["Barcelona"],
  "checkIn": "2026-11-13",
  "checkOut": "2026-11-15",
  "currency": "EUR",
  "maxHotels": 20
}
```

This is the input of our proof run: 20 hotels, all priced for 13 to 15 November, in 16 seconds.

#### Several cities and named hotels at once

Every city and hotel in a run is priced for the same stay:

```json
{
  "locations": ["Lisbon", "Shoreditch London", "hostels in Berlin"],
  "hotels": ["Park Hyatt Tokyo", "https://www.google.com/travel/hotels/entity/ChcI1b68wq3V66lAGgsvZy8xdHRkbTljaxAB"],
  "checkIn": "2026-11-20",
  "checkOut": "2026-11-22",
  "adults": 2,
  "currency": "EUR",
  "maxHotels": 50
}
```

`maxHotels` counts per city: this run returns up to 50 hotels for each of the three areas, plus the two named hotels.

#### Rate parity check for your hotel

Revenue managers compare the hotel's own website price with what the travel agencies show. Put the hotel in `hotels` and read its `providers`: `official_site_price_per_night` is what your own site asks, and every agency's price for the same stay sits next to it.

```json
{
  "hotels": ["Hotel Adlon Kempinski Berlin"],
  "checkIn": "2026-11-20",
  "checkOut": "2026-11-21",
  "currency": "EUR",
  "country": "de"
}
```

Any offer cheaper than `official_site_price_per_night` is a parity gap. Schedule it daily and you have a parity log.

#### Daily price tracking for a city, 30 days ahead

Analysts and travel startups build price histories by pricing the same distance ahead every day. Write the dates as days from today and add a schedule (Apify Console, Schedules, Add schedule):

```json
{
  "locations": ["Barcelona"],
  "checkIn": "30",
  "checkOut": "31",
  "currency": "EUR",
  "maxHotels": 100
}
```

Each run prices the night 30 days ahead, so the datasets build a calendar of prices over time. Join them on `hotel_id`.

#### Watch a competitive set

List your hotel and the hotels you compete with, same dates for all:

```json
{
  "hotels": ["The Savoy London", "The Ritz London", "Claridge's London", "The Langham London"],
  "checkIn": "45",
  "checkOut": "47",
  "currency": "GBP",
  "country": "gb"
}
```

Sort by `lowest_price_per_night_with_taxes` to see where you sit in the set, and by `rating` and `review_count` to see why.

#### Prices around an event

Hotels reprice for conferences, concerts and holidays. Run the event week and a normal week side by side, one run each, and compare `lowest_total_price_with_taxes` per `hotel_id`:

```json
{
  "locations": ["Las Vegas Strip"],
  "checkIn": "2027-01-05",
  "checkOut": "2027-01-08",
  "currency": "USD",
  "maxHotels": 60
}
```

#### One row per booking site, for a spreadsheet

Ask Apify's dataset API to unwind the offers: `https://api.apify.com/v2/datasets/<DATASET_ID>/items?format=csv&unwind=providers`. Each booking site becomes its own line, with the hotel's columns repeated.

### Input parameters

| Parameter | Type | Default | What it does |
|---|---|---|---|
| `locations` | array of strings | none (Console prefill `Lisbon`) | Cities, districts or landmarks, one per line. Each is searched as "hotels in ..." unless it already names a kind of stay (hostels, resorts, inns and so on). Up to 50 per run. |
| `hotels` | array of strings | none | One hotel per line: a name, a Google Hotels link, a `hotel_id` from an earlier run, or a Google Maps link to the hotel. Up to 500 per run. |
| `checkIn` | string | 14 days from today (Console prefill `30`) | A date such as `2026-11-20`, or a number of days from today such as `30`. Up to 365 days ahead. |
| `checkOut` | string | one night after check-in (Console prefill `32`) | A date, or a number of days from today. Up to 30 nights after check-in. |
| `adults` | integer | `2` | Guests the room is priced for, 1 to 10. |
| `currency` | string | `USD` | Currency for every price. The Console offers 54 codes; through the API any 3 letter code Google Hotels supports works. |
| `country` | string | `us` | Two letter Google country version (`us`, `gb`, `in`, `de`, `fr` ...). It changes which booking sites Google lists; `in`, for example, adds Indian sites. |
| `maxHotels` | integer | `20` | Most hotels with prices per city or area, 1 to 300, in the order Google Maps lists them. Hotels without a price do not count toward it. Named hotels are not limited by it. |
| `includeHotelsWithoutPrices` | boolean | `false` | Also add a free row for each hotel Google shows no price for on your dates (sold out, no room for your party, or not bookable through Google). |

Give `locations`, `hotels` or both; a run with neither stops at once with a note and charges nothing for hotels. A date that is in the past, a check-out before check-in, a stay over 30 nights or a check-in over 365 days ahead stops the run the same way, with the reason in the note.

Input names used by other hotel scrapers are understood too: `searchQueries`, `checkInDate`, `checkOutDate`, `entity`, `maxResults` and `countryCode`.

### What data do you get?

One row per hotel. Fields Google has no value for are left out of the row instead of being sent as null; empty lists stay as `[]`.

**The stay**

- `check_in`, `check_out`, `nights`, `adults`, `currency` (the stay and currency Google actually priced, which the actor has checked against yours)

**The price summary**

- `prices_found`, `lowest_price_per_night`, `lowest_price_per_night_with_taxes`, `lowest_total_price`, `lowest_total_price_with_taxes` (each the lowest of that column across all booking sites, so two of them can come from different sites)
- `cheapest_provider` and `cheapest_booking_url` (the site with the lowest price per night with taxes and fees; the lowest price before taxes when no site gives taxes)
- `official_site_price_per_night`, `official_site_price_per_night_with_taxes` (the hotel's own website, when Google lists it)
- `providers_count`

**Every booking site** (`providers`, one entry per site)

- `position`, `provider`, `provider_id`, `is_official_site`, `is_ad`
- `price_per_night`, `price_per_night_with_taxes`, `total_price`, `total_price_with_taxes`
- `free_cancellation` (true, false or null when Google does not say), `free_cancellation_until`
- `booking_url` (the booking site's own link, with your dates in it), `logo`

**The hotel**

- `hotel_name`, `address`, `latitude`, `longitude`, `country_code`
- `star_class`, `hotel_class` (for example `4-star tourist hotel`), `property_type` (`hotel`, `hostel` and so on)
- `rating`, `review_count`, `rating_histogram` (reviews per star)
- `phone`, `website`, `description`, `photo`

**Amenities and policies**

- `amenities` (one flat list), `popular_amenities`, `amenity_groups` (Google's groups such as Internet or Policies & payments, each with its `group` and `items`), `languages_spoken`, `check_in_time`, `check_out_time`

**Ids, links and search context**

- `hotel_id`, `place_id`, `google_hotels_url`, `google_maps_url`
- `country`, `input`, `input_type` (`location` or `hotel`), `search_query`, `search_position` (the hotel's place in Google's list for a city search), `scraped_at`

Each run also ends with one row that has `"_type": "info"` and a short message. It is never billed; filter it out by `_type`.

#### Stable fields for automations

These fields were present in every one of the 23 hotel rows of our proof runs on 1 Oct 2026, and their names will not change:

| Field | What it holds |
|---|---|
| `hotel_name` | Hotel name as Google shows it |
| `address` | Full street address |
| `latitude` | Latitude of the hotel |
| `longitude` | Longitude of the hotel |
| `rating` | Google rating, 1 to 5 |
| `review_count` | Number of Google reviews |
| `check_in` | Check-in date Google priced (YYYY-MM-DD) |
| `check_out` | Check-out date Google priced |
| `currency` | Currency of every price in the row |
| `lowest_price_per_night` | Lowest price per night across all booking sites, before taxes |
| `cheapest_provider` | Booking site with the lowest price with taxes and fees |
| `providers_count` | Number of booking sites with a price |
| `providers` | List of every booking site's offer |
| `hotel_id` | Google Hotels id, the same in every run; reuse it as input |
| `scraped_at` | When the row was read (ISO 8601) |

The price fields are in every row with prices. A row you asked for with `includeHotelsWithoutPrices` has `prices_found: false`, an empty `providers` list and no price fields. `star_class` was in 22 of the 23 rows (a hostel had no star class), `check_in_time` in 21, and `official_site_price_per_night` in 20: Google did not list the hotel's own site for the other three.

#### Output examples

Real rows from our proof runs on 1 Oct 2026, trimmed: booking sites are cut to the first few, amenities to a few, and long links are shortened with "...".

A city search row (Barcelona, 13 to 15 Nov 2026, in EUR). 30 booking sites; the cheapest with taxes was pricetravel.com, while the hotel's own site matched the lowest price before taxes:

```json
{
  "hotel_name": "W Barcelona",
  "address": "Plaça Rosa Del Vents 1, Final, Pg. de Joan de Borbó, 08039 Barcelona, Spain",
  "latitude": 41.368437,
  "longitude": 2.1901534,
  "country_code": "ES",
  "star_class": 5,
  "hotel_class": "5-star hotel",
  "property_type": "hotel",
  "rating": 4.4,
  "review_count": 19008,
  "rating_histogram": { "1": 1201, "2": 447, "3": 1140, "4": 3654, "5": 12566 },
  "check_in": "2026-11-13",
  "check_out": "2026-11-15",
  "nights": 2,
  "adults": 2,
  "currency": "EUR",
  "prices_found": true,
  "lowest_price_per_night": 389.25,
  "lowest_price_per_night_with_taxes": 423.96,
  "lowest_total_price": 778.5,
  "lowest_total_price_with_taxes": 847.93,
  "cheapest_provider": "pricetravel.com",
  "cheapest_booking_url": "https://www.pricetravel.com/es/hotel/w-barcelona?source=google-ha-usa&currency=USD&ct=US&room1.adults=2...",
  "official_site_price_per_night": 389.25,
  "official_site_price_per_night_with_taxes": 454.56,
  "providers_count": 30,
  "providers": [
    {
      "position": 1,
      "provider": "W Barcelona",
      "provider_id": 100231600,
      "is_official_site": true,
      "is_ad": false,
      "price_per_night": 389.25,
      "price_per_night_with_taxes": 454.56,
      "total_price": 778.5,
      "total_price_with_taxes": 909.13,
      "free_cancellation": false,
      "free_cancellation_until": null,
      "booking_url": "https://marriottclk.koddi.com/clk?destination=https%3A%2F%2Fad.doubleclick.net%2Fclk...",
      "logo": "https://www.gstatic.com/travel-hotels/branding/2428381527581661883.png"
    },
    {
      "position": 2,
      "provider": "pricetravel.com",
      "provider_id": 130944901,
      "is_official_site": false,
      "is_ad": false,
      "price_per_night": 396.86,
      "price_per_night_with_taxes": 423.96,
      "total_price": 793.71,
      "total_price_with_taxes": 847.93,
      "free_cancellation": null,
      "free_cancellation_until": null,
      "booking_url": "https://www.pricetravel.com/es/hotel/w-barcelona?source=google-ha-usa&currency=USD&ct=US&room1.adults=2..."
    }
  ],
  "popular_amenities": ["Wi-Fi (free)", "Air conditioning", "Breakfast (extra charge)", "Restaurant"],
  "hotel_id": "ChYIi974-4CPg_RZGgovbS8waGdyNjU2EAE",
  "place_id": "0x12a4a3b185625025:0x59e80c780f7e2f0b",
  "google_maps_url": "https://www.google.com/maps?cid=6478441773767995147",
  "country": "us",
  "input": "Barcelona",
  "input_type": "location",
  "search_query": "hotels in Barcelona",
  "search_position": 2,
  "scraped_at": "2026-10-01T13:29:38.618Z"
}
```

A hostel where the hotel's own site was the cheapest (same run):

```json
{
  "hotel_name": "Generator Barcelona",
  "address": "Carrer de Còrsega, 373, Gràcia, 08037 Barcelona, Spain",
  "star_class": 1,
  "property_type": "hostel",
  "rating": 4.5,
  "review_count": 9049,
  "currency": "EUR",
  "lowest_price_per_night": 52.8,
  "lowest_price_per_night_with_taxes": 66,
  "lowest_total_price_with_taxes": 132,
  "cheapest_provider": "Generator Barcelona",
  "official_site_price_per_night": 52.8,
  "providers_count": 16,
  "providers": [
    { "position": 1, "provider": "Generator Barcelona", "is_official_site": true, "price_per_night": 52.8, "price_per_night_with_taxes": 66, "total_price_with_taxes": 132 },
    { "position": 2, "provider": "Hostelworld", "is_official_site": false, "price_per_night": 62.38, "price_per_night_with_taxes": 75.64, "total_price_with_taxes": 151.29, "free_cancellation": false }
  ],
  "check_in_time": "3:00 PM",
  "check_out_time": "10:00 AM",
  "phone": "+34 932 20 03 77",
  "hotel_id": "ChkIw6Cs3c_U5LTCARoML2cvMWhqaDh4bmxoEAE",
  "input": "Barcelona",
  "search_position": 3
}
```

A hotel given by name, priced in GBP on Google's UK version (`country` `gb`). Google listed 4 sites and not the hotel's own, so there is no `official_site_price_per_night`:

```json
{
  "hotel_name": "The Ritz London",
  "address": "150 Piccadilly, London W1J 9BR",
  "star_class": 5,
  "rating": 4.6,
  "review_count": 7889,
  "check_in": "2026-11-13",
  "check_out": "2026-11-15",
  "currency": "GBP",
  "lowest_price_per_night": 1563.98,
  "lowest_price_per_night_with_taxes": 1876.77,
  "lowest_total_price_with_taxes": 3753.54,
  "cheapest_provider": "Tripadvisor.com",
  "providers_count": 4,
  "providers": [
    { "position": 2, "provider": "Bookhotel.direct", "price_per_night": 2041.63, "price_per_night_with_taxes": 2450, "total_price_with_taxes": 4900, "free_cancellation": true, "free_cancellation_until": "2026-11-11" },
    { "position": 3, "provider": "Tripadvisor.com", "price_per_night": 1563.98, "price_per_night_with_taxes": 1876.77, "total_price_with_taxes": 3753.54, "free_cancellation": null }
  ],
  "languages_spoken": ["English"],
  "check_in_time": "3:00 PM",
  "check_out_time": "12:00 PM",
  "phone": "020 7493 8181",
  "website": "https://www.theritzlondon.com/",
  "hotel_id": "ChUIlICR8JGwzbBZGgkvbS8wNDd6cnYQAQ",
  "country": "gb",
  "input": "The Ritz London",
  "input_type": "hotel",
  "search_query": "The Ritz London"
}
```

A hotel given as a Google Hotels link (same run). The lowest price before taxes (Evendo, 188.64) and the cheapest with taxes (Super.com) came from different sites:

```json
{
  "hotel_name": "Villa Panthéon",
  "address": "41 Rue des Écoles, 75005 Paris, France",
  "hotel_class": "4-star tourist hotel",
  "rating": 4.3,
  "review_count": 840,
  "currency": "GBP",
  "lowest_price_per_night": 188.64,
  "lowest_price_per_night_with_taxes": 213.82,
  "cheapest_provider": "Super.com",
  "official_site_price_per_night": 206.61,
  "official_site_price_per_night_with_taxes": 242.19,
  "providers_count": 21,
  "hotel_id": "ChcI1b68wq3V66lAGgsvZy8xdHRkbTljaxAB",
  "input": "https://www.google.com/travel/hotels/entity/ChcI1b68wq3V66lAGgsvZy8xdHRkbTljaxAB",
  "input_type": "hotel"
}
```

The info row that ends every run (never billed):

```json
{
  "_type": "info",
  "delivered": 20,
  "message": "20 hotels delivered. This row is informational: it is never billed.",
  "scraped_at": "2026-10-01T13:29:47.292Z"
}
```

The run's summary (status per city and hotel, pages read, attempts, robots.txt state, the dates check) is in the key-value store record `OUTPUT`, not in the dataset.

### Pricing

You pay per hotel delivered with prices, plus a flat $0.005 per run whatever memory you choose. Every booking site's price for a hotel comes inside its one row.

| Event | Free plan | Starter (Bronze) | Scale (Silver) | Business (Gold) and above |
|---|---|---|---|---|
| Hotel with prices (`hotel-scraped`), per hotel | $0.00499 | $0.00449 | $0.00399 | $0.00349 |
| Same, per 1,000 hotels | $4.99 | $4.49 | $3.99 | $3.49 |
| Run start (`run-start`), once per run | $0.005 | $0.005 | $0.005 | $0.005 |

The run start is our own flat event, charged once when the run starts. It is not Apify's per GB start fee, so it stays $0.005 at any memory size. No other pricing change is scheduled.

Never charged:

- hotels Google shows no price for on your dates (sold out, no room for your party, not bookable through Google), including the free rows `includeHotelsWithoutPrices` adds;
- places that are not a kind of lodging, and names Google cannot find;
- hotels Google answers with other dates than yours;
- the same hotel found twice in a run;
- pages Google refused;
- the info row at the end of the dataset, and the `OUTPUT` run summary.

To cap what a run can cost, set a maximum total charge in the run options. The actor stops before a hotel the budget cannot pay for. The Pricing tab always shows the rate for your own plan; if this table and the Pricing tab ever disagree, the Pricing tab is right.

### FAQ

#### What is Google Hotels, and what does this actor read?

Google Hotels is Google's hotel search: for a hotel and a stay, it lists the prices of the booking sites and the hotel's own website side by side. This actor reads the same hotel pages a visitor who is not signed in sees, for your dates, and turns each one into a row.

#### How much does it cost to price 1,000 hotels?

1,000 times your plan's price per hotel, plus $0.005 for the run: $4.99 on the Free plan, down to $3.49 on Business. All booking sites for a hotel come in its one row, and hotels without prices are not charged.

#### How many hotels can I get in one run?

Up to 300 hotels with prices for each city or area, up to 50 cities, and up to 500 named hotels. A city search returns the hotels Google Maps lists for "hotels in ...", in that order. For a very large city, search districts separately; the same hotel found twice is priced and charged once.

#### How fresh are the prices, and can I track them over time?

Every run reads Google Hotels live; nothing comes from a cache. Booking sites change prices often, so treat each row as a reading at `scraped_at`. For a price history, write the dates as days from today (`"checkIn": "30"`) and add a schedule in Apify Console: each run prices the same distance ahead, and `hotel_id` stays the same from run to run. Each run prices one stay for every hotel in it; run once per stay for several dates.

#### Do I need a Google account, an API key, cookies or a proxy?

No. The actor reads Google Hotels as a visitor who is not signed in, through Apify's datacenter proxies, which are included in the price. There is nothing to set up.

#### How does it work without a browser, and does it follow robots.txt?

In two steps. First it finds the hotels: a city is searched the way Google Maps searches it, 20 places a page, and places that are not lodging are dropped; a hotel name is searched the same way and the first hotel found is used; a link needs no search. Then it opens each hotel's Google Hotels page for your stay, which carries every booking site's offer and the hotel's details in one block of data.

Every address is checked against google.com's robots.txt, read fresh at the start of each run, before it is opened. Google Hotels' own city search (`/travel/search`) is closed to crawlers there, so the actor does not use it; the Google Maps search it uses instead is explicitly allowed (`Allow: /search?*tbm=map`), and hotel pages are not restricted. We checked the file again on 1 Oct 2026.

On 29 Sep 2026, 11 test runs from Apify datacenter IPs (Paris, New York, Mumbai, London, Lisbon and named hotels, 288 hotel rows) made 354 page requests, and all 354 were answered on the first try. Our two proof runs on 1 Oct made 28 more, all answered. No captcha, consent page or "unusual traffic" page appeared. A refused page is tried up to 4 times, each retry on a new IP, and a run stops early if Google keeps refusing.

#### Why did a hotel I asked for come back with no row?

The `OUTPUT` record says why for each city and hotel: Google had no price for your dates or party size, the name matched a place that is not a hotel, Google answered other dates, Google found nothing by that name, or the page was refused. None of these are charged. Turn on `includeHotelsWithoutPrices` to get a free row for each hotel without prices.

#### Why can the lowest price and the cheapest site differ?

Each `lowest_*` field is the lowest value of that column across all booking sites, so `lowest_price_per_night` and `lowest_price_per_night_with_taxes` can come from different sites. `cheapest_provider` is the site with the lowest price per night with taxes and fees, which is what a guest pays. In the Villa Panthéon example above, Evendo had the lowest price before taxes and Super.com the lowest with taxes.

#### Are the booking links Google's links?

No. Google's own click links are tied to a session and closed to crawlers, so the actor never opens them. `booking_url` is the booking site's own link that Google carries inside its click link, with your dates in it. A handful of offers have no link of their own (2 of 522 in our proof runs).

#### What happens with dates Google will not price?

Google answers some dates (usually more than about 11 months ahead) with tomorrow's prices instead of yours. The actor compares the stay Google priced with yours and never delivers such a row as yours. When the first 3 hotels of a run all come back with other dates, the run stops early: no hotels are charged, only the $0.005 run start.

#### What else should I know?

- Google quotes one room. Large parties (for example 6 adults) often get no price at many hotels.
- Some booking sites give no price with taxes; those fields are then null in that site's entry.
- Requests come from Apify datacenter IPs, which are mostly in the United States. `country` changes the booking sites Google lists, not where the visitor appears to be.
- If Google prices in another currency than the one you asked for, the rows carry the currency Google used and the `OUTPUT` record notes it.

#### Which formats can I export?

JSON, CSV, Excel, XML, HTML table and RSS from the dataset page in Apify Console, or through the Apify API. Add `unwind=providers` to the API link for one line per booking site.

#### Can I use it from Claude, ChatGPT or another AI agent?

- Connector URL: `https://mcp.apify.com/?tools=themineworks/google-hotels-prices-scraper`.
- Claude: Settings > Connectors > Add custom connector, paste the URL, sign in with Apify.
- ChatGPT: developer mode, add an MCP connector with the URL, sign in with Apify.
- Cursor or VS Code: add it as an HTTP MCP server with that URL.
- Claude Code: `claude mcp add -t http google-hotels-prices-scraper "https://mcp.apify.com/?tools=themineworks/google-hotels-prices-scraper"`.

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

The actor collects publicly visible business data (hotel prices and details), never signs in, and follows google.com's robots.txt. You are responsible for how you use the data, including Google's terms and data protection laws such as GDPR and CCPA. This actor is an independent tool and is not affiliated with Google, Booking.com, Expedia, Agoda or any other company named here; all names are trademarks of their owners.

### Integrations

- **Google Sheets**: send each run's hotels to a sheet with Apify's Google Sheets integration.
- **Make, Zapier and n8n**: start runs and receive the rows in your workflows.
- **Webhooks**: get a call when a run finishes, for example to post price drops to Slack.
- **API**: start runs and read datasets from any language with the Apify API or the Python and JavaScript clients.
- **MCP clients**: Claude, ChatGPT and other agents through Apify's MCP server.

### More from The Mine Works

**More tools**

- [Tennis Match & Player Data Scraper](https://apify.com/themineworks/tennis-match-data)
- [LandWatch Scraper](https://apify.com/themineworks/landwatch-land-for-sale-scraper)

**Social media and video**

- [Threads Scraper](https://apify.com/themineworks/threads-scraper)
- [Reddit Scraper](https://apify.com/themineworks/reddit-scraper)
- [Threads Search Scraper](https://apify.com/themineworks/threads-search-scraper)
- [Instagram Profile Scraper](https://apify.com/themineworks/instagram-profile-scraper)

**Leads and business directories**

- [B2B Leads Finder](https://apify.com/themineworks/b2b-leads-finder)
- [Skip Trace Lookup](https://apify.com/themineworks/skip-trace-lookup)
- [Google Maps Email Scraper](https://apify.com/themineworks/maps-leads)
- [JustDial Scraper](https://apify.com/themineworks/justdial-business)

**Marketing, SEO and reviews**

- [Facebook Ad Library Scraper](https://apify.com/themineworks/meta-ad-library-scraper)
- [Similarweb Scraper](https://apify.com/themineworks/similarweb-scraper)
- [Google Ads Transparency Scraper](https://apify.com/themineworks/google-ads-transparency)
- [Google News Scraper](https://apify.com/themineworks/google-news)

**LinkedIn**

- [LinkedIn Company Scraper](https://apify.com/themineworks/linkedin-company-details)
- [LinkedIn Post Scraper](https://apify.com/themineworks/linkedin-post-search)
- [LinkedIn Employees Scraper](https://apify.com/themineworks/linkedin-employees)
- [LinkedIn Profile Scraper](https://apify.com/themineworks/linkedin-profile-scraper)

**Real estate**

- [Zillow Rentals Scraper](https://apify.com/themineworks/zillow-rental-listings)
- [Zillow Sold Comps Scraper](https://apify.com/themineworks/zillow-recently-sold)
- [Housing.com Scraper](https://apify.com/themineworks/housing-com-scraper)
- [India Real Estate MCP](https://apify.com/themineworks/india-real-estate-mcp)

**Science, health and government data**

- [CourtListener Scraper](https://apify.com/themineworks/courtlistener-court-records)
- [data.gov.in Scraper](https://apify.com/themineworks/india-data-gov-scraper)
- [Socrata Open Data Scraper](https://apify.com/themineworks/socrata-open-data)
- [Academic Research MCP](https://apify.com/themineworks/academic-research-mcp)

**Jobs and hiring**

- [Foundit Monster India Jobs](https://apify.com/themineworks/foundit-jobs-scraper)
- [Hirist Jobs Scraper](https://apify.com/themineworks/hirist-jobs-scraper)
- [India Jobs MCP](https://apify.com/themineworks/india-jobs-mcp)
- [Naukri Jobs Scraper](https://apify.com/themineworks/naukri-jobs)

**E-commerce and marketplaces**

- [Ozon.ru Scraper](https://apify.com/themineworks/ozon-product-search)
- [⭐ Amazon Reviews Scraper](https://apify.com/themineworks/amazon-reviews)
- [Amazon Product Scraper](https://apify.com/themineworks/amazon-products)
- [Carsales.com.au Scraper](https://apify.com/themineworks/carsales-scraper)

**Company and business data**

- [Company Domain Finder](https://apify.com/themineworks/company-domain-finder)
- [GST Taxpayer Lookup](https://apify.com/themineworks/gst-taxpayer-lookup)
- [World Bank Trade Scraper](https://apify.com/themineworks/global-trade-data)
- [Company KYB Resolver](https://apify.com/themineworks/company-identity-resolver)

**Food and local services**

- [NoBroker Scraper](https://apify.com/themineworks/nobroker-scraper)
- [Swiggy Restaurant Scraper](https://apify.com/themineworks/swiggy-scraper)
- [Zomato Scraper](https://apify.com/themineworks/zomato-scraper)

**Developer and AI tools**

- [Website to Markdown Crawler](https://apify.com/themineworks/rag-crawler)
- [GitHub Skill Finder](https://apify.com/themineworks/github-skill-discovery)
- [GitHub Repo Scraper](https://apify.com/themineworks/github-repo-intelligence)
- [GitHub Trending Scraper](https://apify.com/themineworks/github-trending-scraper)

### Support

Found a problem or need a field? Open an issue on the actor's Issues tab and we will answer there. For a new source or a custom build, email dmineworks@gmail.com.

*Google Hotels Prices Scraper turns a city or a list of hotels into one row per hotel with every booking site's price for your exact dates, checked and charged only when Google has prices.*

# Actor input Schema

## `locations` (type: `array`):

One per line: a city, district or landmark (Lisbon, Shoreditch London, near Eiffel Tower). Each is searched as "hotels in ..." and priced hotel by hotel, up to "Hotels per city". Text that already names a kind of stay (hostels in Berlin, resorts near Cancun) is searched as typed. Up to 50 per run.

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

One hotel per line: a name (Park Hyatt Tokyo; add the city when the name is common), a Google Hotels link, a hotel id from an earlier run (hotel\_id), or a Google Maps link to the hotel. A name is matched to the first hotel Google Maps finds for it; the row shows which one. Up to 500 per run.

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

A date (2026-11-20) or a number of days from today (30). Use the number form in a schedule so each run prices the same distance ahead. Up to 365 days ahead; far off dates often have few prices yet. Default: 14 days from today.

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

A date (2026-11-22) or a number of days from today (32). Up to 30 nights after check-in. Default: one night after check-in.

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

Guests the room is priced for. Some hotels have no price for larger parties in one room; those come back as having no price.

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

Currency every price is quoted in. Through the API any 3 letter code Google Hotels supports works.

## `country` (type: `string`):

Two letter country code for the Google Hotels version to read (us, gb, in, de, fr, ...). It changes which booking sites Google lists: in, for example, adds Indian sites. Requests always come from Apify datacenter IPs, which are mostly in the United States.

## `maxHotels` (type: `integer`):

Most hotels with prices to return for each city or area, in the order Google Maps lists them. Hotels without a price for your stay do not count toward it.

## `includeHotelsWithoutPrices` (type: `boolean`):

Also add a row, free of charge, for hotels Google shows no price for on your dates (sold out, no rooms for your party, or not bookable through Google). Off by default.

## Actor input object example

```json
{
  "locations": [
    "Lisbon"
  ],
  "checkIn": "30",
  "checkOut": "32",
  "adults": 2,
  "currency": "USD",
  "country": "us",
  "maxHotels": 20,
  "includeHotelsWithoutPrices": false
}
```

# Actor output Schema

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

No description

## `summary` (type: `string`):

No description

# API

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

## JavaScript example

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

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

// Prepare Actor input
const input = {
    "locations": [
        "Lisbon"
    ],
    "checkIn": "30",
    "checkOut": "32"
};

// Run the Actor and wait for it to finish
const run = await client.actor("themineworks/google-hotels-prices-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 = {
    "locations": ["Lisbon"],
    "checkIn": "30",
    "checkOut": "32",
}

# Run the Actor and wait for it to finish
run = client.actor("themineworks/google-hotels-prices-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 '{
  "locations": [
    "Lisbon"
  ],
  "checkIn": "30",
  "checkOut": "32"
}' |
apify call themineworks/google-hotels-prices-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,themineworks/google-hotels-prices-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/I2AZJ7VSDiMNsNaDs/builds/sqHzg3ZKTdAxHyLve/openapi.json
