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

Hotel prices on Booking.com, Expedia, Agoda, Trip.com and the hotel's own site, compared by Google Hotels, for any city or hotel and dates: every offer with rooms and rates, a price calendar, reviews, amenities and ratings.

- **URL**: https://apify.com/famed_bonobo/google-hotels-scraper.md
- **Developed by:** [Axel Zúñiga](https://apify.com/famed_bonobo) (community)
- **Categories:** Travel, E-commerce, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.28 / 1,000 hotels

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

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

## What's an Apify Actor?

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

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

## How to integrate an Actor?

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

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

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

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

# README

## Google Hotels Scraper

Get hotel prices for any city and dates from [Google Hotels](https://www.google.com/travel/hotels), plus the offer from every booking site Google compares (Booking.com, Expedia, Agoda, Trip.com, the hotel's own website and more), down to each room and rate plan with free cancellation and breakfast. One run turns a search like **"hotels in Paris"** into a clean table of hotels with nightly price, total stay price, taxes, star class, guest rating, review counts, photos, coordinates and nearby places.

You can also **track specific hotels**: paste their Google Hotels links, property tokens or names, and add a **price calendar** with the price of the same stay for every check-in date up to about 300 days ahead, from one request per hotel. Add **reviews** too: up to thousands per hotel from Google, Tripadvisor and Trip.com, with text, rating, trip type, ratings by category and the hotel's reply.

### What you can use it for

- **Rate shopping and revenue management**: track what competing hotels charge for your dates, every day.
- **Price monitoring of a hotel list**: schedule a daily run on your competitors' links with a 90-day price calendar.
- **Price comparison and travel apps**: feed live prices from many booking sites into your product.
- **Market research**: compare star class, ratings and prices across neighborhoods or cities.
- **Travel content and deals**: find the cheapest well-rated hotels for a trip, a newsletter or an AI travel agent.

### What data you get

| Field | Example |
|---|---|
| Hotel name, star class | Hôtel Villa Sorel, 3-star hotel |
| Price per night, total stay, taxes and fees | $84 per night, $167.04 total, $24.61 taxes and fees |
| Guest rating, number of reviews, reviews by star | 4.3, 274 reviews, 177 five-star |
| Taxes and mandatory fees, separately | $11.69 taxes, $24.00 resort fee |
| Google's price badge | "24% less than usual", "GREAT PRICE for a 4-star hotel" |
| Hotel or vacation rental, with capacity | vacation rental: sleeps 6, 3 bedrooms, 2 bathrooms, listed by Vrbo |
| Offer from each booking site (optional) | Agoda $196 total, Booking.com $203 total, sponsored offers marked, official site marked, member prices, booking link and the site's own URL |
| Rooms and rate plans of each site (with the option above) | Double Room: $87/night; $96/night with free cancellation until Dec 8; $113/night with breakfast |
| Address, phone and neighborhood (with the option above) | 9-11 Pl. du Colonel Fabien, 75010 Paris; +33 1 70 98 84 00 |
| Ratings on other sites and review topics (with the option above) | Tripadvisor 3.7/5 from 3,328 reviews; "Service": 1,181 mentions, 900 positive |
| Location | latitude, longitude, Google Maps feature ID |
| Nearby places with travel time | Marcel Sembat: 2 min walking; CDG airport: 36 min by taxi, 1 hr 21 min by public transport |
| Check-in and check-out times, also as 24-hour time | 3:00 PM / 11:00 AM, 15:00 / 11:00 |
| Amenities by name, and location scores | Free Wi-Fi, Pool, Bar...; location 4.9, transit 5.0, airport access 3.9 |
| Full amenity list by category, languages spoken (with the booking-site option) | Food & drink: Room service (24 hour), Breakfast (extra charge); English, Spanish |
| Photos, description, website | image URLs, short description, official site |
| Reviews (optional) | 5/5, "vacation", "solo", rooms 5 · service 5 · location 5, highlights "Great value", Google's translation and the original text, the hotel's reply, "3 weeks ago" (2026-09-25) |
| Photo gallery (optional, no extra charge) | full-size photos by category (bedroom, bathroom, exterior, amenities...) from the property and the booking sites, with size and date |
| Price calendar (optional) | Hyatt Ziva Cancun, 3 nights for 3 adults: Dec 10 $3,211.50, Dec 13 $2,545.50 (cheapest), ... for 270 check-in dates |

### How to use it

1. Type one or more searches, such as `hotels in Paris`, `Shibuya, Tokyo` or `beach hotels in Cancun`, or list **specific hotels** by their Google Hotels link, property token or name with the city (for example `Hotel Arts Barcelona`).
2. Pick your check-in and check-out dates and the guests. For scheduled runs, leave the dates empty and set **Check-in in this many days** and **Nights** instead, so every run looks the same distance ahead.
3. Set how many hotels you want per search. Google shows about 20 hotels per page and the scraper pages through them for you.
4. Narrow the search with the same filters Google Hotels offers: price per night, guest rating, star class, 19 amenities (pool, spa, free breakfast, pet-friendly...), hotel type (boutique, hostel, B\&B, apartment hotel...), free cancellation, special offers, eco-certified, sort order, and children with their ages. Pick **Vacation rentals only** to search rentals with their own filters: type (apartment, villa, house...), bedrooms, bathrooms and amenities (kitchen, hot tub, crib...). Every page of results is checked against the filters Google says it applied, and asked again when Google drops one, so filtered results stay filtered on every page.
5. Turn on **Include prices from each booking site** if you need every site's offer, not just the lowest price. Sites that list their rooms also come with each room's rate plans, free cancellation date and whether breakfast is included.
6. Set **Price calendar** to a number of days to add, for each hotel, the price of the same stay for every check-in date from your check-in date on.
7. Set **Photos per hotel** for a full-size gallery by category, at no extra charge. Only the property's own photos and the booking sites' are collected: visitors' photos are left out because they can show people.
8. Set **Reviews per hotel** to add reviews, in the order you choose (most helpful, newest, highest or lowest rating), from every site or Google only, and optionally only those mentioning a word.
9. Run it and download the results as JSON, CSV, Excel or HTML, or read them through the Apify API.

#### Input example

```json
{
  "queries": ["hotels in Paris", "San José, Costa Rica"],
  "checkInDate": "2026-11-20",
  "checkOutDate": "2026-11-22",
  "adults": 2,
  "maxResultsPerQuery": 50,
  "includeBookingSources": true,
  "currency": "USD"
}
```

Tracking specific hotels, 30 days ahead, with a 90-day price calendar:

```json
{
  "hotels": [
    "https://www.google.com/travel/hotels/entity/ChkIg-b2ismUj7M1Gg0vZy8xMWg3MThreGg1EAE",
    "Hotel Arts Barcelona",
    "Hyatt Ziva Cancun"
  ],
  "checkInDaysFromToday": 30,
  "nights": 3,
  "adults": 2,
  "priceCalendarDays": 90
}
```

Each hotel comes with its full page: prices for your dates, ratings, every amenity, address and phone, plus `matchedBy`, which says how the entry was found (`link`, `token`, `place` when Google recognized the name as that property, or `name`). A name is used only when Google's first result is that hotel; otherwise the run says which entry it could not find instead of guessing.

#### Output example

```json
{
  "query": "hotels in Paris",
  "position": 1,
  "name": "Hôtel Villa Sorel",
  "hotelClass": 3,
  "overallRating": 4.3,
  "reviewsCount": 274,
  "reviewsByStars": { "5": 177, "4": 55, "3": 18, "2": 6, "1": 18 },
  "currency": "USD",
  "ratePerNight": 83.52,
  "totalRate": 167.04,
  "totalRateBeforeTaxesAndFees": 142.42,
  "taxesAndFees": 24.61,
  "checkInTime": "3:00 PM",
  "checkOutTime": "11:00 AM",
  "latitude": 48.8354461,
  "longitude": 2.2429921,
  "nearbyPlaces": [
    {
      "name": "Aéroport de Paris-Charles de Gaulle",
      "transportations": [
        { "mode": "taxi", "duration": "36 min" },
        { "mode": "public transport", "duration": "1 hr 21 min" }
      ]
    }
  ],
  "bookingSources": [
    { "source": "Hôtel Villa Sorel", "ratePerNight": 83.52, "totalRate": 167.04, "bookingUrl": "https://www.google.com/travel/lodging/clk?...", "rooms": [] },
    {
      "source": "Agoda", "ratePerNight": 98.0, "totalRate": 196.01, "bookingUrl": "https://www.google.com/travel/lodging/clk?...",
      "rooms": [
        {
          "name": "Double Room",
          "images": ["https://lh3.googleusercontent.com/..."],
          "rates": [
            { "ratePerNight": 98.0, "totalRate": 196.01, "freeCancellation": false, "freeCancellationUntil": null, "breakfastIncluded": false, "bookingUrl": "https://www.google.com/aclk?..." },
            { "ratePerNight": 109.5, "totalRate": 219.0, "freeCancellation": true, "freeCancellationUntil": "Nov 18", "breakfastIncluded": true, "bookingUrl": "https://www.google.com/aclk?..." }
          ]
        }
      ]
    }
  ],
  "googleHotelsUrl": "https://www.google.com/travel/hotels/entity/...",
  "checkInDate": "2026-11-20",
  "checkOutDate": "2026-11-22",
  "nights": 2,
  "adults": 2
}
```

All prices include taxes and fees unless the field name says otherwise, are rounded to cents, and use the currency you choose.

### City report

Turn on **City report** to get, for each search, the report Google shows next to its hotel list, stored in the run's key-value store as `CITY-REPORT-<search>`:

- **What you will pay**: the typical nightly price and range for 2- to 5-star hotels, and how many there are (Lisbon: 2★ $65, 3★ $83, 4★ $121, 5★ $259).
- **When to visit**: every month from January to December with high and low temperature in Celsius and Fahrenheit, crowd level, price level and typical price range, plus Google's note on the seasons.
- **Where to stay**: the neighbourhoods Google recommends, each with description, location score, typical nightly price, coordinates, map outline, highlights and a link to its hotels.

It costs nothing extra.

### Pricing

You pay only for what you get:

- **$0.40 per 1,000 hotels** stored.
- **$0.40 per 1,000 hotels** with booking-site offers, only when that option is on and Google lists at least one offer for the hotel. Rooms and rate plans come at no extra cost.
- **$0.05 per 1,000 dates** of price calendar, only for dates Google has a price for.
- **$0.10 per 1,000 reviews**.

Platform usage is included. You can cap the cost of any run with Apify's maximum charge setting; the scraper stops cleanly when the cap is reached.

### Reliability

- Failed requests are retried with a fresh proxy, so a temporary Google block does not end the run.
- If one search fails, the others still finish, and the run status names the search that failed.
- Hotels are saved as soon as they are ready, so a stopped run keeps everything it already collected.
- Travel modes for nearby places were checked against Google's own hotel pages: taxi, walking and public transport are labeled as Google labels them.

### FAQ

**Why did a search return no hotels?**
Write searches the way Google Hotels understands them, such as `hotels in Lisbon` or `vacation rentals in Lisbon`. Some phrasings, like `Lisbon apartments`, make Google show a regular web search instead of its hotel results.

**Why do some hotels have no price?**
Google shows no price when no booking site has availability for your dates and guests. Those hotels are still returned, with the price fields empty.

**Why are some fields empty?**
Google does not publish every detail for every property; for example, check-in times and star class are missing for many apartments and hostels.

**Are the prices right for my number of guests?**
Yes. Every price (the list, each booking site's offer and the calendar) is asked for your adults and children with their ages. Hotels that price per person, such as all-inclusive resorts, quote more for more guests, exactly as on Google Hotels.

**Do reviews include the reviewer's name?**
No. Reviews come without the reviewer's name, profile or photos, and the greeting that names the reviewer is removed from the hotel's reply. You get what the review says, not who wrote it.

**How far ahead does the price calendar go?**
Google prices check-in dates up to about 300 days ahead. Dates without availability are left out and not charged.

**How many hotels can I get per search?**
Up to 1,000. Google stops showing new hotels after a few hundred for most cities, and the scraper stops when Google does.

**Is this legal?**
The scraper collects public hotel listings and prices; it does not collect personal data. You are responsible for how you use the data and for complying with the laws and terms that apply to you.

### Also from this developer

- [Google Flights Scraper](https://apify.com/famed_bonobo/google-flights-scraper): every flight for any route and date, with prices, legs, layovers and Google's price insights.
- [Google Jobs Scraper](https://apify.com/famed_bonobo/google-jobs-scraper): job listings for any search and country, with salary, full description and direct apply links.

### Feedback

Found a problem or need a field that is missing? Open an issue on the Issues tab and it will be answered quickly.

# Actor input Schema

## `queries` (type: `array`):

What to search on Google Hotels, one search per line. Use a city, an area or landmark, or a full query such as "beach hotels in Cancun". Leave empty to look up only the hotels listed below.

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

Hotels to look up one by one, without a search: paste each hotel's Google Hotels link, its property token, or its name with the city (for example "Hotel Arts Barcelona"). Each comes with its full page: prices for your dates, ratings, every amenity, address, phone and, with booking sites on, every offer. A name is accepted only when Google's first result is that hotel; otherwise the run says so instead of guessing.

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

First night of the stay. Leave empty to use "Check-in in this many days".

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

Departure day; must be after the check-in date. Leave empty to use "Nights".

## `checkInDaysFromToday` (type: `integer`):

Used when the check-in date is empty: check in this many days after the run starts. Handy for scheduled runs that should always look the same distance ahead.

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

Used when the check-out date is empty: the stay lasts this many nights.

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

Number of adult guests. Prices change with the number of guests.

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

Age of each child, from 0 to 17, for example \[5, 12] for two children. Google prices the stay for this family.

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

Stop each search after this many hotels. Google shows about 20 hotels per page.

## `includeBookingSources` (type: `boolean`):

Also collect the offer from every booking site Google lists for each hotel (Booking.com, Expedia, Agoda, the hotel's own site and more), with price and booking link, plus each site's rooms and rate plans with free cancellation and breakfast where the site lists them. Needs one extra request per hotel, so it is charged as a separate event.

## `priceCalendarDays` (type: `integer`):

For each hotel, the price of the same stay (same nights and guests) for every check-in date from your check-in date on, as Google's date picker shows it: up to about 300 days ahead, in one extra request per hotel. Each priced date is charged as a calendar date. 0 leaves it out.

## `maxReviewsPerHotel` (type: `integer`):

Reviews to add to each hotel, from Google and the other sites Google shows (Tripadvisor, Trip.com...): text (Google's translation and the original), rating, date, trip type, ratings by category, highlights and the hotel's reply. 200 come in one request. The reviewer's name and photo are not collected. Each review is charged as a review. 0 leaves them out.

## `reviewsSort` (type: `string`):

Order of the reviews, as Google sorts them.

## `reviewsSource` (type: `string`):

Google reviews only, or also the reviews Google shows from other sites.

## `reviewsQuery` (type: `string`):

Only reviews that mention this text, as the search box of Google's reviews tab (for example "noise" or "breakfast").

## `maxPhotosPerHotel` (type: `integer`):

Photos to add to each hotel, at full size and by category (bedroom, bathroom, exterior, interior, amenities, food & drink): the property's own and the booking sites'. Visitors' photos are not collected, since they can show people. No extra charge. 0 leaves them out.

## `includeCityReport` (type: `boolean`):

For each search, Google's report on the place: typical nightly price by star class, every month's prices, temperatures and crowds, and the neighbourhoods to stay in with their typical price, map outline and highlights. Stored in the run's key-value store as CITY-REPORT-<search>. No extra charge.

## `propertyMode` (type: `string`):

Hotels and vacation rentals together (Google's default), only hotels, or only vacation rentals. Vacation rentals have their own filters below.

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

Order of the results, as Google sorts them.

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

In the chosen currency, taxes included. Leave empty for no minimum.

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

In the chosen currency, taxes included. Leave empty for no maximum.

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

Only places rated at least this much.

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

Only places with a free-cancellation rate; their price is then that rate.

## `specialOffersOnly` (type: `boolean`):

Only places priced below their usual price.

## `hotelClasses` (type: `array`):

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

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

Only hotels that have all of these.

## `hotelTypes` (type: `array`):

Only these kinds of hotel.

## `ecoCertifiedOnly` (type: `boolean`):

Only hotels with an independent sustainability certification.

## `rentalTypes` (type: `array`):

With "Vacation rentals only": only these kinds of rental.

## `rentalAmenities` (type: `array`):

With "Vacation rentals only": only rentals that have all of these.

## `minBedrooms` (type: `integer`):

With "Vacation rentals only".

## `minBathrooms` (type: `integer`):

With "Vacation rentals only".

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

Three-letter currency code for all prices, such as USD, EUR or GBP.

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

Language of hotel descriptions and texts, as a Google language code such as en, es or fr.

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

Two-letter country code Google uses to localize results, such as us, gb or de.

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

Proxies used to reach Google. The default works for most runs.

## Actor input object example

```json
{
  "queries": [
    "hotels in Paris"
  ],
  "hotels": [],
  "checkInDaysFromToday": 14,
  "nights": 1,
  "adults": 2,
  "childrenAges": [],
  "maxResultsPerQuery": 50,
  "includeBookingSources": false,
  "priceCalendarDays": 0,
  "maxReviewsPerHotel": 0,
  "reviewsSort": "mostHelpful",
  "reviewsSource": "all",
  "reviewsQuery": "",
  "maxPhotosPerHotel": 0,
  "includeCityReport": false,
  "propertyMode": "hotelsAndVacationRentals",
  "sortBy": "relevance",
  "minRating": "any",
  "freeCancellationOnly": false,
  "specialOffersOnly": false,
  "hotelClasses": [],
  "amenities": [],
  "hotelTypes": [],
  "ecoCertifiedOnly": false,
  "rentalTypes": [],
  "rentalAmenities": [],
  "currency": "USD",
  "language": "en",
  "country": "us",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (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 = {
    "queries": [
        "hotels in Paris"
    ],
    "checkInDate": "",
    "checkOutDate": "",
    "childrenAges": [],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("famed_bonobo/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 = {
    "queries": ["hotels in Paris"],
    "checkInDate": "",
    "checkOutDate": "",
    "childrenAges": [],
    "proxyConfiguration": { "useApifyProxy": True },
}

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

```

## MCP server setup

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