# Google Hotels Scraper - Prices by Date, Ratings, Offers (`fabrikit/google-hotels-scraper`) Actor

Search Google Hotels by destination or hotel name for your check-in dates and get every listed property: name, star class, rating and reviews, nightly and total price in your currency, location, photos and links. Optional per-booking-site offers.

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

## Pricing

from $1.35 / 1,000 hotel scrapeds

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

Google Hotels Scraper extracts the properties Google Hotels lists for a destination and a stay from google.com/travel: hotel name, star class, guest rating and review count, **nightly and total price for your check-in and check-out dates** in the currency you choose, taxes and fees, coordinates, nearby landmarks, photos, website and links to Google Hotels, Google Maps and the booking page. Switch on the add-on and every property also comes with the **price of each booking site** (Booking.com, Expedia, Hotels.com, the hotel's own site...), address and phone.

Plain HTTP, no browser, no login. One request returns the 20 properties of a search, so monitoring many cities or dates is fast. Built on the same page decoder as our [Google Flights Scraper](https://apify.com/fabrikit/google-flights-scraper).

### What you get

| Field | Description |
|---|---|
| `name`, `propertyType`, `category`, `starRating`, `classText` | Property name, `hotel` or `vacation rental`, Google's category (hotel, hostel, serviced accommodation...), star class |
| `rating`, `reviewCount` | Google guest rating (1-5) and number of reviews |
| `price`, `priceText`, `totalPrice`, `totalPriceText` | Nightly price and total for the stay, as a number and as Google shows it |
| `priceBeforeTaxes`, `taxes`, `fees`, `currency` | Breakdown of the total (base + taxes + fees = total) |
| `checkIn`, `checkOut`, `nights` | The stay the prices are for |
| `latitude`, `longitude`, `countryCode`, `nearbyPlaces`, `checkInTime`, `checkOutTime` | Location, landmarks with travel time, check-in/out hours |
| `description`, `photos`, `thumbnail`, `website` | Google's one-line description, up to 5 photo URLs, official website |
| `bookingUrl`, `googleHotelsUrl`, `googleMapsUrl`, `hotelId` | Links to the cheapest booking page via Google, the Google Hotels page and Google Maps |
| `offers`, `offerCount`, `lowestOfferPrice`, `address`, `phone`, `neighborhood` | **Add-on** (`includePrices`): one entry per booking site with nightly price, total, highlights (free cancellation, breakfast...), whether it is the hotel's official site and the link |
| `query`, `position`, `searchUrl`, `scrapedAt` | Which search produced the row and its rank |

Prices are for 2 adults (Google's default occupancy) and include taxes unless Google shows them separately.

### Input examples

Hotels in Lisbon a month from now, 2 nights, in euros:

```json
{ "queries": ["hotels in Lisbon"], "checkIn": "+30", "nights": 2, "currency": "EUR" }
```

Price-check specific hotels for fixed dates, with every booking site's price:

```json
{
  "queries": ["Tivoli Avenida Liberdade Lisboa", "Pestana Palace Lisboa", "Bairro Alto Hotel"],
  "checkIn": "2026-12-05", "checkOut": "2026-12-08",
  "includePrices": true, "currency": "USD"
}
```

Cover a city in depth by combining searches (each one returns up to 20 properties):

```json
{ "queries": ["4 star hotels in Porto", "5 star hotels in Porto", "hotels in Ribeira Porto", "hotels near Porto airport"], "checkIn": "+45", "nights": 3, "maxItems": 80 }
```

Dates accept `YYYY-MM-DD` or `+N` (N days from today). A query that names one hotel returns that hotel's page as a single row.

### Output example

```json
{
  "name": "WOT New Lisbon Social", "propertyType": "hotel", "category": "serviced accommodation",
  "starRating": 2, "classText": "2-star hotel", "rating": 4.1, "reviewCount": 1773,
  "price": 29.19, "priceText": "$29", "totalPrice": 58.39, "totalPriceText": "$58",
  "priceBeforeTaxes": 55.07, "taxes": 3.32, "fees": 0, "currency": "USD",
  "checkIn": "2026-11-10", "checkOut": "2026-11-12", "nights": 2,
  "latitude": 38.7146, "longitude": -9.1475, "countryCode": "PT",
  "nearbyPlaces": [{ "name": "Praça do Comércio", "travelTime": "10 min" }],
  "website": "https://www.wotsocial.com/unidades/wot-new-lisbon/",
  "googleHotelsUrl": "https://www.google.com/travel/hotels/entity/ChkI...?ts=...",
  "googleMapsUrl": "https://maps.google.com/?cid=6368509100777602224",
  "address": "Rua de O Século 150, 1200-437 Lisboa, Portugal", "phone": "+351 21 347 1506",
  "offers": [
    { "provider": "Booking.com", "isOfficialSite": false, "price": 43, "totalPrice": 87, "highlights": ["Free Wi-Fi", "24/7 Customer service"], "url": "https://www.google.com/aclk?..." },
    { "provider": "Hostelworld", "isOfficialSite": false, "price": 45, "totalPrice": 90, "highlights": [], "url": "https://www.google.com/aclk?..." }
  ],
  "offerCount": 2, "lowestOfferPrice": 43,
  "query": "hotels in Lisbon", "position": 12
}
```

### Use cases

- **Rate monitoring and parity checks** for hotels and revenue managers: your own nightly price versus the competition, per date, and which booking site undercuts your website.
- **Travel deal sites and newsletters**: cheapest stays per city and weekend.
- **Market research**: price levels, star mix and ratings across destinations or seasons.
- **Vacation-rental pricing**: Google mixes rentals into the same results, so you can compare them with hotels for the same dates.
- **AI agents and chatbots**: structured hotel prices for a trip-planning assistant.

### Pricing

Pay per result, no subscription:

- **Property** (event `hotel-result`): each hotel saved, with its prices for the stay.
- **Booking-site offers** (event `hotel-prices`, only with `includePrices`): each property enriched with the price of every provider, address and phone.

See the Pricing tab for current prices; paid Apify plans get lower rates.

### Limits and honest notes

- Google lists **20 properties per search**; there is no "next page" in this actor. To cover a city, combine searches (neighbourhoods, star classes, "cheap", "luxury", "near <landmark>") or use hotel names. The `position` field keeps Google's ranking.
- Occupancy is Google's default (2 adults); children and room counts are not supported.
- Prices come from Google's cached quotes and can differ from the booking site at checkout.
- Each search is one request (~400 KB), each enriched property one more.

### Integrations

Run it from the Apify console, on a schedule, or through the [Apify API](https://docs.apify.com/api/v2) and client libraries (JavaScript, Python). Push results to Google Sheets, Airtable, Slack or a webhook with the Apify integrations, or wire it into n8n, Make and Zapier. AI agents can call it through the Apify MCP server.

### FAQ

**Is it legal?** The actor reads public search results and stores business data (hotel names, prices, ratings, addresses). No personal data is collected. Check the terms that apply to your use of the data.

**Do I need a proxy?** Apify datacenter proxy is used by default; if Google answers with a consent or "unusual traffic" page the actor retries and moves to a residential proxy automatically. When every search is blocked the run fails with a clear message instead of returning an empty dataset.

**Which currencies and languages work?** Any 3-letter currency code Google supports (USD, EUR, GBP, BRL, MXN, JPY...) and any Google interface language (`language`, e.g. `es`, `pt-BR`). Prices follow the currency you pass, not the proxy location.

**Can I search by coordinates or hotel ID?** Not in this version: searches are text queries, like the Google Hotels search box.

### Changelog

- **0.1** (October 2026) - first release: search cards with prices for a stay, hotel-page detection, provider offers add-on.

***

### En español

Google Hotels Scraper devuelve los alojamientos que Google Hotels lista para un destino (o un hotel concreto) y unas fechas: nombre, estrellas, puntuación y número de reseñas, precio por noche y total de la estancia en la moneda que elijas, desglose de impuestos y tasas, coordenadas, lugares cercanos, fotos, web y enlaces a Google Hotels, Google Maps y la página de reserva. Con el complemento `includePrices` añade el precio de cada web de reservas (Booking.com, Expedia, web oficial...), dirección y teléfono. Cada búsqueda devuelve hasta 20 alojamientos. Consulta la pestaña Pricing para ver los precios actuales; los planes de pago de Apify tienen tarifas más bajas.

# Actor input Schema

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

One search per line, as you would type it in Google Hotels: a destination ("hotels in Lisbon", "4 star hotels in Porto", "hotels near Times Square") or an exact hotel name ("Tivoli Avenida Liberdade Lisboa"). A hotel name returns that hotel's page.

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

YYYY-MM-DD, or +N for N days from today (+30 = a month from now). Prices are only shown for a concrete stay.

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

Length of the stay in nights (1-30). Ignored when a check-out date is given.

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

YYYY-MM-DD or +N. Overrides 'Nights'.

## `includePrices` (type: `boolean`):

For every property, also load its Google Hotels page and return the price of each booking site (Booking.com, Expedia, the hotel's own site...), address and phone. One extra request per property, charged as the hotel-prices event.

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

3-letter currency code for all prices (USD, EUR, GBP, BRL, MXN...).

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

Google interface language (en, es, de, fr, pt-BR...). Descriptions, categories and nearby places follow it.

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

2-letter country code of the Google edition to query (us, gb, de, br...). Also used for the residential proxy fallback.

## `maxItemsPerQuery` (type: `integer`):

Keep only the first N properties of every search (Google lists at most 20 per search). Leave empty for all of them.

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

Maximum number of properties to save in total.

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

Apify datacenter proxy by default. If Google answers with a consent or unusual-traffic page, the actor switches to a residential proxy automatically.

## Actor input object example

```json
{
  "queries": [
    "hotels in Lisbon"
  ],
  "checkIn": "+30",
  "nights": 2,
  "includePrices": false,
  "currency": "USD",
  "language": "en",
  "country": "us",
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

All records collected during the run

# API

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

## JavaScript example

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

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

// Prepare Actor input
const input = {
    "queries": [
        "hotels in Lisbon"
    ],
    "checkIn": "+30",
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("fabrikit/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 Lisbon"],
    "checkIn": "+30",
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("fabrikit/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 Lisbon"
  ],
  "checkIn": "+30",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call fabrikit/google-hotels-scraper --silent --output-dataset

```

## MCP server setup

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