Google Hotels Scraper avatar

Google Hotels Scraper

Pricing

from $1.99 / 1,000 search results

Go to Apify Store
Google Hotels Scraper

Google Hotels Scraper

Scrapes structured Google Travel hotel results with entity IDs, ratings, review counts, prices, property types, amenities, images, cancellation flags, dates, guest counts, and search metadata.

Pricing

from $1.99 / 1,000 search results

Rating

0.0

(0)

Developer

Search API

Search API

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

5 hours ago

Last modified

Share

Collect public hotel cards from Google Travel for one location or a batch of locations. The Actor uses Playwright with consistent browser fingerprints, bounded sessions and retries, and produces a normalized dataset without placeholder or empty fields.

Input modes

  • single: search one location (or the backward-compatible query alias).
  • batch: search locations concurrently. maxItems is allocated fairly and the final dataset is interleaved across locations.

Dates are optional, but checkIn and checkOut must be supplied together, use YYYY-MM-DD, and describe a future stay. Inputs also support guest/room counts, child ages, locale, requested currency, price/rating filters, property types, amenities, free-cancellation filtering, sorting, limits, timeouts, and concurrency.

Example:

{
"mode": "single",
"location": "Paris",
"checkIn": "2026-10-15",
"checkOut": "2026-10-18",
"adults": 2,
"rooms": 1,
"currency": "USD",
"gl": "us",
"hl": "en",
"maxItems": 10,
"proxyConfiguration": { "useApifyProxy": false }
}

Dataset

Every record has a stable SHA-256 id, canonical Google /entity/ URL, hotel name, positions, search context, source, engine, and ISO timestamp. When displayed by Google, records also include typed nightly price and currency, rating and review count, property/star type, amenities, deal, cancellation flag, image, and distance.

Optional values are omitted when Google does not expose them on the card. The Actor never invents address, coordinates, contact details, booking-provider details, or other fields that are not source-backed.

requestedCurrency records the input and currency records what Google actually displayed. currencyMatched makes localization overrides visible. For example, a direct run from an Indian IP can display INR even when USD was requested; use a compatible country-local Residential or custom proxy when matching market localization is important.

Proxy guidance

  • Direct mode is the default and fastest option.
  • Apify Residential or custom proxies are supported through proxyConfiguration.
  • GOOGLE_SERP is deliberately rejected. It supports Google Search-style HTTP requests, not the interactive Google Travel page used by this Actor.
  • CAPTCHA or challenge pages are never stored and are not bypassed. The affected request fails with TARGET_BLOCKED so an authorized proxy configuration can be selected.

Performance and reliability

The Actor blocks fonts and media (not images, scripts, or API calls), scrolls only as needed, caps concurrency at five, deduplicates by stable hotel ID, and stops at maxItems. Representative local direct runs produced 10 records in about five seconds and a two-location batch in about five seconds; cloud time includes container startup.

Local validation

npm test
npm run lint
npm run validate:dataset
apify validate-schema
apify run --purge --input-file INPUT.json
node scripts/audit-dataset.mjs

Additional inputs are in qa-inputs/, including minimal, batch, filtered-empty, invalid-date, Residential-proxy, and incompatible-GOOGLE_SERP cases.

Limitations

Google changes card markup and localized availability over time. Only fields visible on public result cards are emitted. Results, prices, currencies, amenities, and deals can vary by IP market, language, dates, cookies, and availability. The Actor does not solve CAPTCHAs or access private/authenticated content.