# Google Hotels Scraper: Prices, Ratings and Amenities (`oski/google-hotels-prices-scraper`) Actor

Scrape Google Hotels for any city and dates. Get hotel name, nightly price, star class, rating, review count, amenities and the Google Hotels link, up to 200 hotels per destination. No login, no browser, no API key. Pay only for hotels delivered, about $4 per 1,000.

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

## Pricing

from $3.88 / 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 Prices Scraper

Hotel names, nightly "from" prices, ratings, review counts, star class and amenities from Google Hotels for any destination and any dates. Pay only for hotels delivered. No login, no browser, no API key.

Tired of hotel scrapers that fail more than half the time? This one reads Google's own results page over a plain connection, so it does not break when a booking site changes its layout, and every run ends with a status line that says exactly what came back and why.

### What you get

One row per hotel:

| Field | Example |
|---|---|
| `destination` | London |
| `name` | Premier Inn London Tolworth hotel |
| `price`, `price_text`, `currency` | 44, "$44", USD |
| `rating`, `reviews` | 4.1, 1292 |
| `stars` | 3 |
| `amenities` | \["Free Wi-Fi", "Free parking"] |
| `hotel_id`, `url` | Google Hotels entity id and link |
| `check_in`, `check_out`, `nights` | 2026-11-10, 2026-11-11, 1 |
| `found_via` | the search wording that found it |
| `scraped_at` | run time |

Plus one free `SUMMARY` row per destination (hotels delivered, requested, available, searches used, and a reason when nothing came back).

### Use cases

- **Rate monitoring:** schedule a daily run for your own hotel and its competitors and chart the "from" price.
- **Market scans:** 200 hotels per city with ratings and star class for a destination study.
- **Deal finding:** run the same dates across ten cities and sort by price.
- **Lead lists for hotel suppliers:** names, star class and review counts of every hotel in a town.
- **Travel content:** "best 4 star hotels in Lisbon" tables with live prices.

### How to use it

1. Type your destinations, one per line (cities, areas, landmarks or a pasted Google Hotels link).
2. Pick check-in and check-out, or leave them empty for the coming weekend. Relative values such as "7 days" mean that far ahead. A pasted link keeps its own dates, so those rows carry no date fields.
3. Set how many hotels you want per destination (up to 200).
4. Start the run. Download the dataset as JSON, CSV or Excel, or read it through the API.

### How many hotels and what it costs

Google shows 18 hotels per search page. To get more, the scraper runs several differently worded searches for the same destination (star classes, budget, luxury, areas, airports) and merges the results. In testing, ten wordings for London returned 136 unique hotels.

| Hotels delivered | Cost |
|---|---|
| 100 | about $0.40 |
| 1,000 | about $4.00 |
| 10,000 | about $40 |

Price: a small fee per run plus a fee per hotel delivered. Hotels are counted once per destination even when several searches find them. Destinations that return nothing are free.

### Tips for bigger runs

- Keep "Hotels per destination" at 40 to 60 for a quick price check; raise it to 200 for a full market scan.
- Run many destinations in one go: they are fetched in parallel.
- For a monthly price series, schedule the actor and pass fixed dates so runs compare like with like.

### Scheduling and API

Schedule it in the Apify console (Schedules > Create) or call it:

```bash
curl -X POST "https://api.apify.com/v2/acts/oski~google-hotels-prices-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"destinations": ["London", "Paris"], "checkIn": "2026-11-10", "checkOut": "2026-11-11", "maxHotelsPerDestination": 40}'
```

### If something looks wrong

| Status line says | What it means | What to do |
|---|---|---|
| Input problem: Add at least one destination | The destinations field was empty | Add a city or paste a Google Hotels link |
| Input problem: Check-out must be after check-in | Dates were reversed | Swap them |
| Google showed a consent page instead of results | Google asked for cookie consent on that exit | Run again; if it repeats, choose the RESIDENTIAL proxy group |
| Google refused the request with a captcha | Too many requests from one exit | Run again later or choose the RESIDENTIAL proxy group |
| Fewer hotels than asked because the extra search wordings stopped finding new hotels | Our 20 search wordings found all they could for that destination | Nothing to do; the SUMMARY row shows how many were available |
| Fewer hotels than asked because Google refused the later searches | Google blocked part way through a destination | Run again later for the rest, or choose the RESIDENTIAL proxy group |
| A pasted link gave one page only | Links are fetched exactly as pasted, no fan-out | Type the destination name instead to get more than 18 |
| Prices are in USD, I wanted GBP | Google prices in the currency it picks for the request | Convert with the `currency` field; the raw text is kept in `price_text` |

### Frequently asked questions

**Does it return the total stay price or the nightly price?** The nightly "from" price Google shows on the results card, for the dates you gave.

**Can I get room types or the booking site behind each price?** Not in this version. The row carries the Google Hotels link where those are listed.

**Does it work for vacation rentals?** Google mixes some rentals into hotel results; they appear when Google shows them.

**Is it legal?** It reads publicly visible search results without logging in, and it stores no personal data.

### Related actors by the same developer

- Google Jobs Scraper
- Google Ads Transparency Center Scraper
- App Store Reviews Scraper and Google Play Reviews Scraper

# Actor input Schema

## `destinations` (type: `array`):

Cities, areas or landmarks, one per line, the way you would type them into Google Hotels. A pasted Google Hotels search link also works and is fetched exactly as pasted.

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

First night. Leave both dates empty for the coming weekend (Friday to Sunday). Typed dates such as 10/11/2026 work too.

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

Last morning. Leave empty to use Check-in plus Nights.

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

Used only when one of the two dates is empty.

## `maxHotelsPerDestination` (type: `integer`):

Google shows 18 hotels per search page, so the scraper runs several differently worded searches (star classes, budget, luxury, areas) until it has this many unique hotels or runs out of new results. 40 hotels cost about $0.16; 200 about $0.80.

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

The Google country edition to ask (the gl parameter). It shapes which hotels Google ranks first. Prices arrive in the currency Google picks for the request, reported in the currency field.

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

Apify datacenter proxy is enough (tested clean). Choose the RESIDENTIAL group only if Google starts refusing; it adds about $0.003 per search page.

## `concurrency` (type: `integer`):

How many destinations run in parallel.

## `stallAfter` (type: `integer`):

Extra searches that add fewer than 2 new hotels count as stalled; the destination stops after this many in a row.

## Actor input object example

```json
{
  "destinations": [
    "Edinburgh",
    "Barcelona",
    "Soho London",
    "https://www.google.com/travel/search?q=hotels%20in%20Lisbon"
  ],
  "nights": 1,
  "maxHotelsPerDestination": 40,
  "country": "GB",
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "concurrency": 3,
  "stallAfter": 3
}
```

# Actor output Schema

## `overview` (type: `string`):

One row per hotel: destination, name, from price, rating, reviews, stars, dates and Google Hotels link; plus one free SUMMARY row per destination.

## `allFields` (type: `string`):

Every field for each hotel, including currency, amenities, hotel id, the search wording that found it and the run time.

# 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 = {
    "destinations": [
        "London",
        "Paris",
        "New York"
    ],
    "maxHotelsPerDestination": 40
};

// Run the Actor and wait for it to finish
const run = await client.actor("oski/google-hotels-prices-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 = {
    "destinations": [
        "London",
        "Paris",
        "New York",
    ],
    "maxHotelsPerDestination": 40,
}

# Run the Actor and wait for it to finish
run = client.actor("oski/google-hotels-prices-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 '{
  "destinations": [
    "London",
    "Paris",
    "New York"
  ],
  "maxHotelsPerDestination": 40
}' |
apify call oski/google-hotels-prices-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,oski/google-hotels-prices-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/TLAKZ1o5TIUKY4Vm1/builds/qUZDs8Funl8QFqvcV/openapi.json
