# Google Hotels Scraper - Prices & Booking Offers (`barefoot_grade/google-hotels-scraper`) Actor

Search Google Hotels for any place and dates. Each hotel becomes one row with its lowest price per night and per stay, rating, reviews, star class, coordinates and every booking site's offer (Booking.com, Agoda, Trip.com, the hotel's own site...). Failures are reported, not charged.

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

## Pricing

from $0.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.

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 & Booking Offers

Get Google Hotels prices for any place and any dates. Type a city, neighborhood or search such as "hotels near Times Square", pick check-in and check-out dates and the number of guests, and every hotel Google lists becomes one row: the lowest price per night and for the whole stay (taxes and fees included), star class, guest rating and review count, coordinates, check-in and check-out times and the hotel's website.

Leave **Add every booking site's offer** on to add, for each hotel, the price from every booking site Google compares (Booking.com, Agoda, Trip.com, Hotels.com, Hostelworld, Super.com, the hotel's own site and more), cheapest first with a link to each offer, plus the street address, phone number and the range the hotel typically costs for your dates. Prices come in the currency you choose. No Google account is needed.

### Use cases

- **Rate shopping:** compare your hotel's price with the competition for the same dates, every day.
- **Booking-site parity:** see which site sells each hotel cheapest and how far the others are from it.
- **Travel deals:** find hotels priced below what they typically cost for your dates.
- **Market research:** collect star class, ratings and prices for every hotel in a city.
- **Trip planning:** shortlist hotels by price, rating and location for a group's exact dates.

### Quick Start

```json
{
  "queries": [
    "Lisbon"
  ],
  "checkInDate": "2026-12-10",
  "checkOutDate": "2026-12-13",
  "adults": 2,
  "maxItems": 20,
  "includeOffers": true
}
```

More examples:

- A family weekend in GBP: `{"queries": ["Edinburgh"], "checkInDate": "2026-11-27", "checkOutDate": "2026-11-29", "adults": 2, "childrenAges": [6, 10], "currency": "GBP", "country": "GB"}`
- Several cities, prices only (faster): `{"queries": ["Paris", "Rome", "Barcelona"], "checkInDate": "+30 days", "checkOutDate": "+32 days", "includeOffers": false, "maxItems": 100}`
- Hotels only, no apartments: `{"queries": ["hotels near Times Square"], "hotelsOnly": true}`

### Input

| Input | Type | Default | Meaning |
| --- | --- | --- | --- |
| `queries` | array | — | Places or searches as you would type them on Google Hotels: `Lisbon`, `Austin, TX`, `hotels near Times Square`, `resorts in Cancun`. A bare place is searched as "hotels in <place>". |
| `checkInDate` | string | 7 days from today | Arrival date (`YYYY-MM-DD`) or days from today (`+14 days`, `+2 weeks`). Up to 330 days ahead. |
| `checkOutDate` | string | one night after check-in | Departure date, same formats. At most 30 nights. |
| `adults` | integer | `2` | Adults staying (1 to 6). |
| `childrenAges` | array | — | One age (0 to 17) per child. Adults and children together: at most 6. |
| `includeOffers` | boolean | `true` | Add every booking site's offer, the cheapest site, address, phone and the typical price range. Turn off for faster, cheaper price lists. |
| `hotelsOnly` | boolean | `false` | Leave out the vacation rentals (apartments and homes) Google mixes into results. |
| `maxItems` | integer | `20` | Cap on rows for each place or search (up to 1,000). |
| `currency` | string | `USD` | Currency for every price: `USD`, `EUR`, `GBP`, `JPY`, … |
| `country` | string | `US` | Country whose Google Hotels results you want (`US`, `GB`, `DE`, …). |
| `language` | string | `en` | Language of names and labels (`en`, `es`, `de`, `pt-BR`, …). |

Places run in the order given. A hotel that appears in more than one search is returned once.

### What it returns

The dataset contains one row per hotel or vacation rental:

| Field | Meaning |
| --- | --- |
| `searchQuery`, `searchedQuery`, `matchedPlace`, `position` | Your query, what was searched for it (a "near" search that finds nothing is retried with "in"), the place Google matched it to and the hotel's position in Google's results (1 = first). |
| `name`, `entityId`, `url` | Hotel name, Google Hotels property id and its Google Hotels page. |
| `propertyType` | `hotel` or `vacationRental`. |
| `hotelClass`, `hotelClassText` | Star class (1 to 5) and Google's label, for example `4-star hotel`. |
| `rating`, `reviewCount`, `ratingBreakdown` | Average guest rating out of 5, number of reviews, and the share and count of reviews per star. |
| `description` | Google's short description of the property. |
| `address`, `phone` | Street address and phone number (with offers). |
| `latitude`, `longitude`, `countryCode` | Map coordinates and the property's country. |
| `website`, `googleMapsId` | The hotel's own website and its Google Maps id. |
| `checkInTime`, `checkOutTime` | The hotel's check-in and check-out times. |
| `checkInDate`, `checkOutDate`, `nights`, `adults`, `childrenAges` | The stay that was priced. |
| `currency` | Currency of every price in the row. |
| `pricePerNight`, `pricePerNightText` | Lowest nightly price with taxes and fees, as a number and as shown. |
| `totalPrice`, `totalPriceText`, `taxesAndFees` | Lowest price for the whole stay with taxes and fees, and the taxes and fees inside it. |
| `lowestPriceSite`, `lowestPriceUrl` | Site selling the stay cheapest and the link to that offer (with offers). |
| `dealText` | Google's deal label, for example `23% less than usual`. |
| `typicalPriceLow`, `typicalPriceHigh` | The range the hotel typically costs per night for these dates (with offers, when Google shows it). |
| `offerCount`, `offers` | Every booking site's offer, cheapest first: `site`, `isOfficialSite`, `pricePerNight`, `totalPrice` (number and as shown) and `url` (with offers). |
| `imageUrls` | Up to 10 photo links. |
| `detailLevel` | `offers` when the hotel's booking-site prices were read (`offerCount` 0 when it is sold out), `search` otherwise. |
| `scrapedAt` | Collection time (UTC, ISO 8601). |

Fields Google does not show are `null`, never guessed. Hotels that are sold out for your dates come back with `null` prices.

The run summary (`OUTPUT`) reports the stay searched, `results`, `resultsWithOffers`, one entry per search in `searches` (the place Google matched, its total count, pages read and rows delivered), `errors` with the list at `searchErrors`, and `offerErrors` for hotels whose booking-site offers could not be read.

### Example queries

- **Weekend rates in a city:** `{"queries": ["Chicago"], "checkInDate": "2026-12-04", "checkOutDate": "2026-12-06"}`, then sort by `pricePerNight`.
- **Cheapest site per hotel:** keep `includeOffers` on and compare `lowestPriceSite` with the `offers` list.
- **Deals:** keep rows whose `pricePerNight` is below `typicalPriceLow`, or with a `dealText`.
- **Daily rate tracking:** schedule the same search every morning and watch `pricePerNight` move.
- **Group trips:** set `adults` and `childrenAges` to see prices for the whole party.

### Output example

```json
{
  "searchQuery": "Lisbon",
  "searchedQuery": "hotels in Lisbon",
  "matchedPlace": "Lisbon",
  "position": 2,
  "name": "The Central House Lisbon Baixa",
  "entityId": "ChkIg-b2ismUj7M1Gg0vZy8xMWg3MThreGg1EAE",
  "url": "https://www.google.com/travel/hotels/entity/ChkIg-b2ismUj7M1Gg0vZy8xMWg3MThreGg1EAE",
  "propertyType": "hotel",
  "hotelClass": 2,
  "hotelClassText": "2-star hotel",
  "rating": 4.3,
  "reviewCount": 754,
  "ratingBreakdown": [
    {"stars": 5, "percent": 68, "count": 499},
    {"stars": 4, "percent": 16, "count": 126},
    {"stars": 3, "percent": 6, "count": 51},
    {"stars": 2, "percent": 3, "count": 25},
    {"stars": 1, "percent": 7, "count": 53}
  ],
  "description": "Straightforward dorms & private rooms in a casual hostel featuring a colorful cafe/bar.",
  "address": "R. dos Fanqueiros 300, 1100-233 Lisboa, Portugal",
  "phone": "+351 21 887 3552",
  "latitude": 38.7131037,
  "longitude": -9.1368004,
  "countryCode": "PT",
  "website": "https://www.thecentralhousegroup.com/",
  "googleMapsId": "0xd1934787bad6065:0x35663ca4915db303",
  "checkInTime": "2:00 PM",
  "checkOutTime": "11:00 AM",
  "checkInDate": "2026-11-12",
  "checkOutDate": "2026-11-14",
  "nights": 2,
  "adults": 2,
  "childrenAges": [],
  "currency": "USD",
  "pricePerNight": 59.7,
  "pricePerNightText": "$60",
  "totalPrice": 119.39,
  "totalPriceText": "$119",
  "taxesAndFees": 23.72,
  "lowestPriceSite": "The Central House Lisbon Baixa Hostel",
  "lowestPriceUrl": "https://reservation.mirai.com/Forwarder/googleFrontDispatcher.htm",
  "dealText": "23% less than usual",
  "typicalPriceLow": "$69",
  "typicalPriceHigh": "$86",
  "offerCount": 16,
  "offers": [
    {
      "site": "The Central House Lisbon Baixa Hostel",
      "isOfficialSite": true,
      "pricePerNight": 59.7,
      "pricePerNightText": "$60",
      "totalPrice": 119.39,
      "totalPriceText": "$119",
      "url": "https://reservation.mirai.com/Forwarder/googleFrontDispatcher.htm"
    },
    {
      "site": "Hostelworld",
      "isOfficialSite": false,
      "pricePerNight": 65.23,
      "pricePerNightText": "$65",
      "totalPrice": 130.45,
      "totalPriceText": "$130",
      "url": "https://www.hostelworld.com/pwa/hosteldetails.php/296255"
    },
    {
      "site": "Booking.com",
      "isOfficialSite": false,
      "pricePerNight": 65.99,
      "pricePerNightText": "$66",
      "totalPrice": 131.98,
      "totalPriceText": "$132",
      "url": "https://www.booking.com/"
    }
  ],
  "imageUrls": [
    "https://lh3.googleusercontent.com/grass-cs/AABkmLc9Crdaf45yQ7xb5_N2s15-NsaXQLzcetxCBIBXbn9cwGOQT5W714kRplSjMio8JBh4CvgwT892rSAEvxt3iVdgxSmQceIpydTx_z-LT9ZZ_GdnDCQhmazoZKyzcAlbwsrKNJvz=s287-w287-h192-n-k-no-v1"
  ],
  "detailLevel": "offers",
  "scrapedAt": "2026-10-20T18:43:10Z"
}
```

(Offer links are shortened here; the dataset carries the full link for your dates and guests.)

### Failed searches and offers

A search that could not be read is reported in the run summary at `OUTPUT.searchErrors` with its query, `code` and `message`. When a hotel's booking-site offers cannot be read, the hotel is still delivered with its lowest price and `detailLevel` `search`, and it is listed in `OUTPUT.offerErrors`. Failures are never dataset rows and are not charged.

Every price is checked against your dates: a hotel Google priced for other dates, or without saying for which dates, is left out and not charged, and the run summary counts it at `OUTPUT.stayChecks`. A search whose prices are all for other dates is reported with the code `DATES_IGNORED`, and one whose prices carry no dates with `DATES_UNVERIFIED`. If no hotel at all could be collected, the run ends with an error instead of finishing green with an empty dataset.

### Limits and caveats

- Prices are what Google Hotels shows at the moment of the run for your dates, guests and currency; they change often, and booking sites may show a different final price.
- Google mixes vacation rentals into hotel results; use `hotelsOnly` to leave them out. Rentals have no star class or address.
- Google lists up to a few hundred properties for most places. For more, split a large city into neighborhoods; duplicates across searches are removed.
- At most 6 guests, 30 nights and 330 days ahead per search, as on Google Hotels.
- With offers on, each hotel takes about a second; without offers, results come back about 18 at a time.
- Automated access is subject to Google's terms; use this actor only where you have the necessary permissions and a lawful basis.

### FAQ

**Do I need a Google account?** No. Only public hotel and price information is collected.

**Which booking sites are covered?** Every site Google Hotels compares for that hotel and stay, typically 5 to 20: Booking.com, Agoda, Trip.com, Hotels.com, Hostelworld, Super.com, trivago, the hotel's own website and many more.

**Are prices per night or per stay?** Both: `pricePerNight` and `totalPrice`, each with taxes and fees included.

**Can I use relative dates for a scheduled run?** Yes. `"checkInDate": "+14 days"` always searches two weeks ahead of the run date.

### Price

**$0.0005 per hotel**, **$0.00125 per hotel with booking-site offers** ($0.0005 hotel + $0.00075 offers add-on), plus **$0.005 per run start**. The offers add-on is charged only when at least one booking-site offer comes back: a hotel that is sold out for your dates, or whose offers could not be read, is charged as a hotel. The run-start event is charged per GB of memory; the default 512 MB run is one start event. The start is charged even if the run saves no results. Failed searches are not charged. When your maximum charge for the run is reached, the run stops and keeps the rows already saved. Platform usage is included in these prices.

# Actor input Schema

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

Cities, neighborhoods or searches as you would type them on Google Hotels, for example "Lisbon", "Austin, TX" or "hotels near Times Square". A bare place is searched as "hotels in <place>".

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

Arrival date (YYYY-MM-DD), or a number of days from today such as "+14 days". Empty: 7 days from today.

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

Departure date (YYYY-MM-DD), or days from today. Empty: one night after check-in. At most 30 nights.

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

Adults staying (1-6, children included in the 6).

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

One age (0-17) per child, for example \[4, 9].

## `includeOffers` (type: `boolean`):

Open each hotel's prices to add the offer from every booking site (cheapest first, with links), the cheapest site, address, phone and the price range the hotel typically costs for these dates.

## `hotelsOnly` (type: `boolean`):

Leave out vacation rentals (apartments and homes) that Google mixes into the results.

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

Cap on rows for each place or search. Google Hotels lists up to a few hundred properties for most places.

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

Currency for every price (ISO code such as USD, EUR, GBP, JPY).

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

Country whose Google Hotels results you want to see (ISO code such as US, GB, DE).

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

Language of names and labels (code such as en, es, de, pt-BR).

## Actor input object example

```json
{
  "queries": [
    "Lisbon"
  ],
  "adults": 2,
  "includeOffers": true,
  "hotelsOnly": false,
  "maxItems": 20,
  "currency": "USD",
  "country": "US",
  "language": "en"
}
```

# 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 = {
    "queries": [
        "Lisbon"
    ],
    "adults": 2,
    "includeOffers": true,
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("barefoot_grade/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": ["Lisbon"],
    "adults": 2,
    "includeOffers": True,
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("barefoot_grade/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": [
    "Lisbon"
  ],
  "adults": 2,
  "includeOffers": true,
  "maxItems": 20
}' |
apify call barefoot_grade/google-hotels-scraper --silent --output-dataset

```

## MCP server setup

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