Booking.com Hotel Scraper
Pricing
from $4.00 / 1,000 results
Booking.com Hotel Scraper
Scrape Booking.com hotel listings with prices, ratings, and reviews.
Pricing
from $4.00 / 1,000 results
Rating
0.0
(0)
Developer
Admo Solutions
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
19 days ago
Last modified
Categories
Share
Scrape Booking.com search results — hotel listings with prices, ratings, reviews, facilities and images — for any destination worldwide.
What does this Actor do?
For each search location the Actor opens Booking.com search results in a stealth browser (to get past the WAF), follows result pages up to your maxHotels limit, and extracts per property:
- Hotel info: name, canonical URL, address, distance from center, star rating, facility highlights
- Pricing: nightly price + currency (dates are required for Booking to display rates)
- Reviews: guest score (1–10), review count, badge (Superb, Excellent, Very Good, …)
- Images: property photo URL
- Search context: the query it came from, number of nights, provider
Every run always writes at least one dataset row: blocked pages, empty results and invalid input produce error rows instead of a silent empty dataset.
Why use this Actor?
- Travel agencies: Compare hotel prices across destinations
- Revenue managers: Monitor competitor pricing
- Researchers: Analyze hospitality market trends
- Deal seekers: Find best hotel rates
How to use
- Add search locations (e.g., "Paris, France", "Tokyo, Japan")
- Set max hotels per location (up to 200 — the Actor follows result pages automatically)
- Optional: set check-in/check-out (
YYYY-MM-DD). Leave empty to default to tomorrow + 1 night - Optional: set a min/max price filter (USD)
- Run the Actor
Input
| Field | Type | Required | Default |
|---|---|---|---|
| locations | array | Yes | - |
| maxHotels | integer | No | 20 |
| checkIn | string | No | "" (tomorrow) |
| checkOut | string | No | "" (day after check-in) |
| adults | integer | No | 2 |
| rooms | integer | No | 1 |
| minPrice | integer | No | 0 |
| maxPrice | integer | No | 0 |
| minDelay | integer | No | 2 |
| maxDelay | integer | No | 5 |
| proxyConfiguration | object | No | Apify Residential, country US |
Booking.com aggressively blocks datacenter IPs, so the default proxy is
Apify's Residential group pinned to the US market (a stable market
keeps result depth and pricing consistent). If residential proxy access is
not available on your plan, the run automatically falls back to the default
datacenter proxy. Adjust or remove proxyConfiguration to override.
Output example
{"title": "Hotel Marais Paris","url": "https://www.booking.com/hotel/fr/marais-paris.html","address": "1st arr., Paris","distance": "0.5 km from downtown","reviewScore": "8.5","reviewCount": "1234","reviewBadge": "Very Good","price": "150","currency": "USD","stars": "4","facilities": ["Free WiFi", "Subway Access"],"imageUrl": "https://cf.bstatic.com/...","query": "Paris, France","nights": 2,"provider": "booking.com"}
Error row (the run still succeeds for per-location problems and fails honestly for bad input):
{"query": "Nowhere","title": "","error": "No property cards found (page blocked or empty results)"}
Data table
| Field | Description |
|---|---|
| title | Hotel name |
| url | Direct booking link (tracking parameters stripped) |
| address | Hotel address / district |
| distance | Distance from destination center |
| reviewScore | Guest rating (1-10) as text |
| reviewCount | Number of reviews (digits only) |
| reviewBadge | Rating category (Superb, Excellent, etc.) |
| price | Nightly rate (digits only; empty when Booking shows no rates) |
| currency | USD, EUR, GBP, INR |
| stars | Star rating (1-5); empty when the page variant doesn't show star ratings (common via some network locations) or for unrated places |
| facilities | Facility highlights shown on the card |
| imageUrl | Hotel photo URL |
| query | Search location the row came from |
| nights | Nights implied by the dates used for the search |
| provider | Always "booking.com" |
| error | Present only on failure rows |
Behavior notes
- Results are fetched in server pages; pagination continues until
maxHotelsis reached (max 10 pages) or results run out - Anti-blocking self-healing: a thin first page or a page that repeats already-seen hotels triggers a retry on a fresh sticky residential session (fresh exit IP); when relevance-ranked depth is exhausted, it continues with price-sorted pages to reach
maxHotels - Prices appear only when Booking shows rates — leave the dates empty to use tomorrow +1 night defaults, or set your own
minPrice/maxPricemap to Booking's built-in price filter (USD)- A short random delay (
minDelay–maxDelayseconds) runs between locations
💰 Pricing
This Actor uses the Pay Per Event pricing model:
| Event | Price |
|---|---|
| Per hotel scraped | $4.00 / 1,000 |
For example, scraping 100 hotels costs: $0.40
Uses a Playwright browser for reliable scraping with anti-bot protection.
Tips
- Add check-in/check-out dates for accurate pricing
- Use specific locations for better results
- Higher guest counts may affect pricing
- Increase delays if rate-limited
Disclaimer
This Actor scrapes publicly available data from Booking.com. Users are responsible for compliance with Booking.com's Terms of Service.
Support
For issues or feature requests, use the Issues tab.