# Google Hotels Scraper (`ralfij/google-hotels-scraper`) Actor

Hotel prices from Google Hotels for any city and dates: nightly and total price with taxes, deals, rating, reviews, star class, amenities and coordinates. Fast HTTP-only scraper, pay per hotel.

- **URL**: https://apify.com/ralfij/google-hotels-scraper.md
- **Developed by:** [Ralf IJsbrandij](https://apify.com/ralfij) (community)
- **Categories:** Travel, Automation, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.50 / 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

Scrape **hotel prices from Google Hotels** for any city and dates. For every hotel you get the lowest nightly price, the price for the whole stay with taxes and fees, Google's deal note, the guest rating and review count, star class, amenities, check-in times, coordinates and links. Use it for hotel price monitoring, rate shopping, travel apps, market research or AI agents that need live hotel prices.

- **Fast and light:** plain HTTP, no browser. One request returns about 20 hotels with prices.
- **Your dates, guests and currency:** check-in and check-out dates (fixed or relative, such as "14 days" from the run), adults, children's ages, and any currency.
- **Built for reliability:** fresh IPs and retries on every block, a run summary that explains every search, and a run that never fails because of one bad search.
- **Pay per hotel:** you only pay for hotels you get.

### What data do you get?

| Field                                                         | Example                                      | Notes                                                      |
| ------------------------------------------------------------- | -------------------------------------------- | ---------------------------------------------------------- |
| `name`                                                        | Radisson Hotel & Suites Amsterdam South      |                                                            |
| `hotelId`                                                     | ChoIgfeI9cmwttG7ARoNL2cvMTFmMmdzenZrbBAB     | Google's id for the property, stable across runs           |
| `position`                                                    | 1                                            | Rank in Google's results for your search                   |
| `pricePerNight` / `pricePerNightText`                         | 97.91 / "$98"                                | Lowest nightly price as Google shows it (see note below)   |
| `totalPrice`                                                  | 195.82                                       | Whole stay, including taxes and fees                       |
| `totalPriceBeforeTaxes`, `taxesAndFees`                       | 143.6, 52.23                                 | When Google shows the split                                |
| `currency`                                                    | USD                                          |                                                            |
| `dealText`                                                    | 23% less than usual                          | Google's deal note                                         |
| `rating`, `reviewCount`                                       | 4.1, 1779                                    | Guest rating out of 5                                      |
| `hotelClass`, `hotelClassText`                                | 4, "4-star hotel"                            | Official star class when Google has it                     |
| `propertyType`                                                | hotel                                        | hotel, hostel, resort hotel, vacation rental, ...          |
| `amenities`                                                   | Free Wi-Fi, Breakfast ($), Parking ($), Pool | English pages                                              |
| `checkInTime`, `checkOutTime`                                 | 3:00 PM, 12:00 PM                            |                                                            |
| `latitude`, `longitude`, `countryCode`                        | 52.3215, 4.8815, NL                          |                                                            |
| `description`                                                 | Polished hotel with a restaurant & a bar...  | Google's one-line summary                                  |
| `website`                                                     | https://www.radissonhotels.com/...           | `utm_*` and click-tracking parameters removed              |
| `thumbnailUrl`                                                | https://lh3.googleusercontent.com/...        | Main photo                                                 |
| `googleHotelsUrl`, `googleMapsUrl`                            | links                                        | The hotel on Google Hotels (same dates) and on Google Maps |
| `checkInDate`, `checkOutDate`, `nights`, `adults`, `children` | 2026-11-12, 2026-11-14, 2, 2, 0              | What the price is for                                      |
| `query`, `searchLocation`, `searchUrl`, `scrapedAt`           |                                              | Where the row came from                                    |

Every result has the same fields in the same order. A value Google does not show is `null`, never missing. Guest reviews are not included because they contain personal data. You get the rating and review count instead.

**Taxes:** `pricePerNight` is the nightly price exactly as Google shows it. Google shows US visitors prices before taxes and fees, and most other markets prices that include them. For an all-in price you can compare across markets, use `totalPrice`.

### How to use it

1. Enter one or more **searches**, such as `hotels in Amsterdam`, `Paris` or `hotels near Times Square`.
2. Pick **check-in** and **check-out** dates. Relative dates such as `14 days` and `16 days` keep a scheduled run pointing at the future.
3. Set **adults**, **children's ages** and **currency** if needed, and click **Start**.
4. Download the results as JSON, CSV or Excel, or use the API. The **Hotels and prices** tab shows them as a table with photos.

#### Input example

```json
{
    "queries": ["hotels in Amsterdam", "hotels in Paris"],
    "checkInDate": "14 days",
    "checkOutDate": "16 days",
    "adults": 2,
    "childrenAges": ["8"],
    "currency": "EUR",
    "maxHotelsPerSearch": 20
}
```

| Input                | Default                | What it does                                                                                                |
| -------------------- | ---------------------- | ----------------------------------------------------------------------------------------------------------- |
| `queries` (required) |                        | One search per line. Search for a place; a hotel name on its own opens that hotel's page, which is skipped. |
| `checkInDate`        | 14 days from today     | `YYYY-MM-DD` or relative: `3 days`, `2 weeks`, `1 month`                                                    |
| `checkOutDate`       | 1 night after check-in | Up to 30 nights                                                                                             |
| `adults`             | 2                      | 1 to 10                                                                                                     |
| `childrenAges`       | none                   | One age (0-17) per child                                                                                    |
| `currency`           | USD                    | Any three-letter code: EUR, GBP, AUD, JPY, ...                                                              |
| `maxHotelsPerSearch` | 20                     | Google shows about 20 hotels per search; lower it to spend less                                             |
| `country`            | us                     | Google market (`gl`). Decides which booking sites Google compares                                           |
| `language`           | en                     | Language of Google's texts. Keep `en` for amenities                                                         |
| `proxyConfiguration` | Residential            | Residential IPs from your Google country work best                                                          |

#### Output example

```json
{
    "query": "hotels in Amsterdam",
    "searchLocation": "Amsterdam",
    "position": 1,
    "name": "Radisson Hotel & Suites Amsterdam South",
    "hotelId": "ChoIgfeI9cmwttG7ARoNL2cvMTFmMmdzenZrbBAB",
    "propertyType": "hotel",
    "hotelClass": null,
    "hotelClassText": null,
    "rating": 4.1,
    "reviewCount": 1779,
    "pricePerNight": 97.91,
    "pricePerNightText": "$98",
    "totalPrice": 195.82,
    "totalPriceBeforeTaxes": 143.6,
    "taxesAndFees": 52.23,
    "currency": "USD",
    "dealText": "23% less than usual",
    "checkInDate": "2026-11-12",
    "checkOutDate": "2026-11-14",
    "nights": 2,
    "adults": 2,
    "children": 0,
    "latitude": 52.3214936,
    "longitude": 4.881534,
    "checkInTime": "3:00 PM",
    "checkOutTime": "12:00 PM",
    "amenities": "Breakfast ($), Free Wi-Fi, Parking ($), Air conditioning, Pet-friendly, Fitness center, Bar, Restaurant, Room service",
    "description": "Polished hotel with a restaurant & a bar, plus breakfast, parking & Wi-Fi access.",
    "website": "https://www.radissonhotels.com/en-us/hotels/radisson-hotel-and-suites-amsterdam-south?cid=...",
    "countryCode": "NL",
    "thumbnailUrl": "https://lh3.googleusercontent.com/...",
    "googleHotelsUrl": "https://www.google.com/travel/hotels/entity/ChoIgfeI9cmwttG7ARoNL2cvMTFmMmdzenZrbBAB?hl=en&gl=us&curr=USD&ts=...",
    "googleMapsUrl": "https://maps.google.com/?cid=13520608194939992961",
    "searchUrl": "https://www.google.com/travel/search?q=hotels+in+Amsterdam&...",
    "scrapedAt": "2026-10-10T16:01:40.120Z"
}
```

Each run also saves a **run summary** (`RUN_SUMMARY` in the key-value store, linked from the Output tab). It lists every search with its status (`ok`, `no-results`, `skipped`, `failed` or `not-run`), the number of hotels, how Google read the search ("Amsterdam", 58 results) and a note on anything that went wrong.

### Pricing

This Actor uses **pay per event**. You pay a fixed price for each hotel in your results, plus a tiny fee when a run starts:

| Event        | Price                                                                      |
| ------------ | -------------------------------------------------------------------------- |
| Hotel result | $0.0035 ($3.50 per 1,000 hotels), less on paid Apify plans (down to $2.50) |
| Run start    | $0.00005                                                                   |

**Example:** checking 10 cities for one date range returns about 200 hotels and costs about 200 x $0.0035 = **$0.70**. A daily price check of the same 10 cities costs about $21 a month.

Searches that return no hotels cost nothing beyond the run start. You can set a maximum charge per run; the Actor stops cleanly when it is reached and keeps everything found so far.

### Tips

- **More hotels for a city:** Google shows about 20 hotels per search. Add more specific searches, such as `hotels in Amsterdam Jordaan` or `hotels near Amsterdam Centraal`. Each search is priced separately.
- **Track prices over time:** schedule the Actor with relative dates (`30 days` to `31 days`) and match rows across runs by `hotelId`.
- **Compare markets:** run the same search with `country` set to `us`, `gb` or `de`. Google compares different booking sites per market, and prices can differ.
- **Currencies:** prices come in the currency you choose. `pricePerNightText` shows them exactly as Google displays them.

### Use it as an API, from Python or from AI tools

Every run is also an API call. From Python, with the official [Apify client](https://docs.apify.com/api/client/python):

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("ralfij/google-hotels-scraper").call(
    run_input={"queries": ["hotels in Lisbon"], "checkInDate": "30 days", "checkOutDate": "32 days", "currency": "EUR"}
)
for hotel in client.dataset(run.default_dataset_id).iterate_items():
    print(hotel["name"], "|", hotel["pricePerNightText"], "|", hotel["rating"])
```

More Python examples, including comparing cities, finding the cheapest weekend and a daily price tracker, are on GitHub: [RalfIJ/google-hotels-api](https://github.com/RalfIJ/google-hotels-api).

To let an AI assistant such as Claude, Cursor or VS Code look up hotel prices for you, add this MCP server URL in its settings: `https://mcp.apify.com?tools=ralfij/google-hotels-scraper`

### FAQ

**Is there an official Google Hotels API?**
Not for reading prices. Google's hotel APIs are for travel partners that send their prices to Google. This actor gives you the hotels and prices Google shows as structured data (JSON, CSV or Excel) through the Apify API.

**Is it free to try?**
Yes. Apify's free plan includes $5 of credit every month, with no credit card needed. That covers more than 1,000 hotel prices at the standard price.

**How many hotels does one search return?**
About 20, the first page of Google Hotels results. The run summary shows how many hotels Google has in total for the search.

**Why did a search return no hotels?**
For some large cities Google sometimes answers a search with an empty list. The Actor then asks again from other IPs. If the list stays empty, the search is marked `no-results` in the run summary and costs nothing. Different wording or dates can help.

**Do I need a Google account or an API key?**
No. The Actor reads the public Google Hotels pages, the same ones you see in a browser without logging in.

**Are prices live?**
Yes. They are the prices Google shows at the time of the run for your dates, guests and currency. Hotel prices change often, so schedule runs if you need a history.

**Why does a price differ from what I see in my browser?**
Google adapts prices to the visitor's country, currency and sometimes membership deals. Use the same `country` and `currency` as your browser to compare.

**Does it collect personal data?**
No. It returns hotel (business) data only. Guest reviews and reviewer names are left out on purpose.

**Is scraping Google Hotels legal?**
The Actor reads publicly visible, non-personal business data. You are responsible for how you use the data, including Google's terms of service and the laws that apply to you. If unsure, ask a lawyer.

**Can I use it with AI agents?**
Yes. The flat output with fixed field names works well with LLM tools, the Apify API and the Apify MCP server.

### Feedback

Found a search that fails or a field that looks wrong? Open an issue on the Actor page with the search and dates. Fixes ship quickly. Did it save you time? A short review on the **Reviews** tab helps other people find it.

*This actor is not affiliated with, endorsed by or sponsored by Google. Google Hotels is a trademark of Google LLC.*

# Actor input Schema

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

What to search on Google Hotels, one search per line, for example "hotels in Amsterdam", "Paris" or "hotels near Times Square". Each search returns up to 20 hotels. Search for a place: a hotel name on its own opens that hotel's page, which this Actor skips.

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

A date (YYYY-MM-DD) or a date relative to the run, such as "14 days" or "2 weeks". Relative dates keep scheduled runs pointing at the future. Empty means 14 days from today.

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

A date (YYYY-MM-DD) or a relative date such as "16 days". Empty means one night after check-in. Stays can be up to 30 nights.

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

Number of adult guests. Google prices the stay for this many people.

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

One age (0 to 17) per child, for example 8. Leave empty when no children travel.

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

Three-letter currency code for all prices, for example USD, EUR, GBP, AUD or JPY.

## `maxHotelsPerSearch` (type: `integer`):

Google shows about 20 hotels per search. Set a lower number to get (and pay for) fewer results.

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

Two-letter country code of the Google market (Google's "gl" setting), for example us, gb, de or au. It decides which booking sites Google compares and can change prices.

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

Language of Google's texts such as descriptions and deals, for example en, de or fr. Amenities are only read from English pages, so keep "en" if you need them.

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

Google blocks repeated requests from data center IPs, so residential proxies are the default and the most reliable choice.

## Actor input object example

```json
{
  "queries": [
    "hotels in Amsterdam",
    "hotels in New York"
  ],
  "checkInDate": "14 days",
  "adults": 2,
  "childrenAges": [],
  "currency": "USD",
  "maxHotelsPerSearch": 20,
  "country": "us",
  "language": "en",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

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

One item per hotel found, with prices for your dates.

## `runSummary` (type: `string`):

Per-search status: hotels saved, Google's reading of the search, and why a search was skipped or failed.

# 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 Amsterdam",
        "hotels in New York"
    ],
    "checkInDate": "14 days",
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("ralfij/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 Amsterdam",
        "hotels in New York",
    ],
    "checkInDate": "14 days",
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("ralfij/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 Amsterdam",
    "hotels in New York"
  ],
  "checkInDate": "14 days",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call ralfij/google-hotels-scraper --silent --output-dataset

```

## MCP server setup

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