# Google Hotels Scraper: Prices for Your Dates (`agnes.developer.queen/google-hotels-scraper`) Actor

Get Google Hotels prices for the dates and guests you choose: nightly and total price, rating, reviews, star class, coordinates and website for every hotel on the results page.

- **URL**: https://apify.com/agnes.developer.queen/google-hotels-scraper.md
- **Developed by:** [Agnes Maina](https://apify.com/agnes.developer.queen) (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 $2.00 / 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.

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: prices for your dates

Get Google Hotels prices for the dates and guests you choose. Each location returns its first results page, about 20 hotels, with the nightly price, the total for the stay, rating, review count, star class, coordinates, check-in time and the hotel's website.

$2 per 1,000 hotels with a price. Booking site prices for a hotel you link cost $0.008 per hotel. Hotels without a price for your dates are free.

Limits per run: up to 50 locations and 100 hotel links, about 20 hotels per location, stays of up to 30 nights starting within 330 days.

### What you get

| Field | What it is |
|---|---|
| `name` | Hotel name as Google shows it |
| `pricePerNight` | Nightly price for your dates and guests, as a number |
| `totalPrice` | Price for the whole stay, which Google labels "with taxes + fees" |
| `pricePerNightText`, `totalPriceText` | The same prices as Google formats them |
| `currency` | The currency you picked |
| `rating`, `reviewsCount` | Google rating out of 5 and the number of reviews |
| `hotelClass`, `stars` | Star class when Google lists one, for example "4-star hotel" |
| `latitude`, `longitude` | Hotel position |
| `checkInTime`, `checkOutTime` | The hotel's check-in and check-out times |
| `website` | The hotel's own site |
| `countryCode` | Two letter country code |
| `googleHotelsUrl` | The hotel's Google Hotels page |
| `location`, `checkIn`, `checkOut`, `nights`, `adults` | The search this row belongs to |
| `searchArea` | The place Google matched your location to, for example "Manhattan" |
| `charged`, `reason` | Whether the row was billed, and why not when it was free |

### Booking site prices for one hotel

Put Google Hotels links in `hotelUrls`, for example the `googleHotelsUrl` of a search row. Each link returns one row with the price at every booking site Google lists for your dates and guests, cheapest first:

| Field | What it is |
|---|---|
| `offers` | One entry per booking site: `provider`, `pricePerNight`, `totalPrice`, and `isOfficialSite` when it is the hotel's own website |
| `lowestPricePerNight`, `lowestTotalPrice`, `lowestPriceProvider` | The cheapest offer |
| `offersCount` | How many booking sites have a price |
| `name`, `googleHotelsUrl`, `checkIn`, `checkOut`, `nights`, `adults`, `currency` | The hotel and the stay |

### Input

- `locations`: cities, neighborhoods or areas, for example "Paris" or "Manhattan, New York". Up to 50 per run.
- `hotelUrls`: Google Hotels links for booking site prices. Up to 100 per run. A run needs at least one location or one link. Links that are not Google Hotels links are skipped and named in the run's status message.
- `checkIn` and `checkOut`: dates like 2026-12-01. Leave them empty to search a stay starting 30 days from today, so a scheduled task never goes stale. Without `checkOut`, `nights` sets the length of the stay.
- `adults`: 1 to 10, default 2.
- `currency`: USD by default; 19 currencies are supported.
- `proxyConfiguration`: residential US by default. Datacenter proxies cost less, but Google often stalls them.

### Example output

```json
{
  "name": "The People Belleville",
  "location": "Paris",
  "checkIn": "2026-11-12",
  "checkOut": "2026-11-15",
  "nights": 3,
  "adults": 2,
  "currency": "USD",
  "pricePerNight": 80.75,
  "pricePerNightText": "$81",
  "totalPrice": 242,
  "totalPriceText": "$242",
  "rating": 4.3,
  "reviewsCount": 2336,
  "hotelClass": null,
  "stars": null,
  "latitude": 48.8700202,
  "longitude": 2.3789075,
  "checkInTime": "3:00 PM",
  "checkOutTime": "12:00 PM",
  "website": "https://www.thepeoplehostel.com/en/destinations/paris-belleville/",
  "countryCode": "FR",
  "googleHotelsUrl": "https://www.google.com/travel/hotels/entity/ChoIh--v1tzql_y2ARoNL2cvMTFjbHdtaGZ5bBAB",
  "charged": true,
  "reason": null,
  "scrapedAt": "2026-10-21T07:05:12.000Z"
}
```

### Pricing

Each hotel delivered with a price for your dates costs $0.002, so 1,000 priced hotels cost $2. Each run also has Apify's standard start charge of $0.00005. A run for one location usually returns 20 priced hotels and costs about $0.04.

Hotels Google lists without a price for your dates are delivered free with a reason. If Google does not recognize a location, it shows hotels near some other place instead. When the place Google matched (`searchArea`) does not fit what you typed, those hotels are delivered free and the run's status message names the location. A hotel that shows up for two locations in one run is charged once. If Google prices other dates or another currency than you asked for, that row is free. A hotel link with at least one booking site price costs $0.008. The run checks your spending limit before each location and each link and stops when the limit is reached. If the limit runs out partway through a location, only the hotels you can pay for are delivered.

The default key value store holds `RUN_SUMMARY` with locations and hotel links searched, hotels found, charged and free rows, and any location or link that returned no page.

### Limits

- One results page per location, about 20 hotels. For more hotels, search smaller areas, for example "Le Marais, Paris" and "Montmartre, Paris".
- Google changes which hotels it shows from one search to the next. To track a fixed list of hotels, put their links in `hotelUrls`, or search each one by name, for example "The Hoxton, Paris"; that hotel comes first.
- Stays of up to 30 nights, starting within 330 days.
- Prices are the ones Google shows for that search. They can differ from a booking site's own page, and they change during the day.

### FAQ

#### Do I need a Google account or cookies?

No. The actor reads the public Google Hotels results page.

#### How do I track prices over time?

Save a task with your locations, dates and guests, then schedule it. Each run adds dated rows you can compare.

#### Why does a hotel have no price?

Google lists some hotels with no partner price for your dates, usually because they are sold out. Those rows are free.

#### Can I search one specific hotel?

Put its Google Hotels link in `hotelUrls` to get its price at every booking site. To see it among nearby hotels instead, use its name and city as the location, for example "The Hoxton, Paris"; in tests the named hotel came first on the page.

#### Is it legal?

The actor reads public pages without logging in. You are responsible for how you use the data, so check the rules that apply to your use and your country.

# Actor input Schema

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

Cities, neighborhoods or areas, for example "Paris" or "Manhattan, New York". Each location returns its first results page, about 20 hotels. Up to 50. Optional when you give hotel links.

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

Google Hotels links, for example googleHotelsUrl from a search row. Each one returns that hotel's price at every booking site Google lists for your dates, cheapest first. Up to 100.

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

YYYY-MM-DD. Leave empty to search a stay starting 30 days from today, which keeps a saved task from going stale. With only a check-out date, the stay ends on it and lasts the number of nights below.

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

YYYY-MM-DD. Leave empty to use the number of nights below. Stays can be up to 30 nights.

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

Length of the stay when check-in or check-out is empty.

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

Guests the price is for.

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

Prices come back in this currency.

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

Residential US works best. Datacenter proxies are cheaper but Google often stalls them.

## Actor input object example

```json
{
  "locations": [
    "Paris"
  ],
  "nights": 1,
  "adults": 2,
  "currency": "USD",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}
```

# Actor output Schema

## `hotels` (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": [
        "Paris"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "US"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("agnes.developer.queen/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 = {
    "locations": ["Paris"],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "US",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("agnes.developer.queen/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 '{
  "locations": [
    "Paris"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}' |
apify call agnes.developer.queen/google-hotels-scraper --silent --output-dataset

```

## MCP server setup

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