Booking.com Scraper (Pay-Per-Event)
Under maintenancePricing
Pay per event
Booking.com Scraper (Pay-Per-Event)
Under maintenanceScrape Booking.com hotel search results or direct hotel pages. Returns 22 fields per hotel including prices, ratings, reviews, location, address, and coordinates. Run-scoped dedupe by hotelId. Pay-per-event pricing — only pay for the hotels you actually scrape.
Pricing
Pay per event
Rating
0.0
(0)
Developer
Arnas
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
5 days ago
Last modified
Categories
Share
Booking.com Scraper
Extract hotel and accommodation data from Booking.com. Get prices, ratings, reviews, room types, photos, availability, address, and coordinates for any location worldwide. Pay-per-event pricing — only pay for the hotels you actually scrape.
What does Booking.com Scraper do?
Booking.com Scraper extracts hotel and accommodation data from Booking.com search results or directly from specific hotel pages. Enter a city or region (or paste direct hotel URLs), set your travel dates and guest count, and get structured data on prices, ratings, reviews, room types, and availability — exported as JSON, CSV, or Excel.
It uses a real browser (Playwright) and residential proxies to load search results, which means it handles Booking.com's AWS WAF anti-bot protection reliably. Pagination is automatic — the scraper walks result pages until your maxResults limit is reached.
This actor is a clean-room reimplementation in the spirit of automation-lab/booking-scraper, at identical pay-per-event pricing, with two practical improvements:
- Run-scoped dedupe by
hotelId. Overlapping searches or sponsored-then-organic placements within a single run are pushed and charged exactly once. - Two extra output fields:
address(a clean street/area string from the property tile) andcoordinates({ latitude, longitude }).
Who is it for?
Booking.com Scraper is built for data professionals, travel-industry analysts, and developers who need reliable access to Booking.com hotel data at scale — without a Booking.com API key or Affiliate Program approval.
- Revenue managers and hoteliers monitoring competitor pricing
- Travel agencies and OTAs building data feeds or price-comparison tools
- Data analysts and researchers studying hotel supply, pricing trends, and reviews
- Developers integrating accommodation data into apps, dashboards, or pipelines
Use cases
- Travel price monitoring — track hotel prices over time to find the best booking window
- Competitor analysis — compare your property's pricing and review scores against nearby competitors
- Market research — analyze hotel supply, pricing tiers, and review distributions across cities or regions
- Lead generation — build lists of hotels with contact pages, locations, and ratings
- Aggregator data feeds — power a travel comparison site or internal dashboard with fresh Booking.com data
Why use this scraper?
- Handles anti-bot protection — Playwright + residential proxies bypass Booking.com's AWS WAF where HTTP scrapers fail
- 22 data fields per hotel — prices, review scores, star ratings, room types, cancellation policy, breakfast, photos, address, coordinates, and more
- Automatic pagination — walks all search result pages
- Run-scoped dedupe — overlapping searches never double-bill
- Flexible filters — dates, guests, rooms, price range, star rating, sort order, currency, language
- Pay per result — no monthly subscription, only pay for the hotels you scrape
- Clean, flat output — every field is a primitive type or simple object, ready for spreadsheets and databases
How to scrape Booking.com hotels
Option A — search by location
- Open the actor's Input tab
- Enter a
locationQuery— any city, region, or country (e.g., "London", "Paris, France", "Tokyo") - Optionally set
checkinandcheckoutdates (default: tomorrow + 2 nights) - Adjust
adults,rooms,childrenas needed - Set
maxResultsto control how many hotels to scrape - Click Start
Example input:
{"locationQuery": "London","checkin": "2026-06-01","checkout": "2026-06-03","adults": 2,"rooms": 1,"maxResults": 50,"sortBy": "popularity","currency": "USD"}
Option B — scrape specific hotels by direct URL
If you want data for one or more specific properties, paste their Booking.com URLs into the startUrls field. The scraper visits each property page and extracts all available data.
{"startUrls": [{ "url": "https://www.booking.com/hotel/gb/the-savoy.html" },{ "url": "https://www.booking.com/hotel/gb/claridges.html" }],"checkin": "2026-06-01","checkout": "2026-06-03","adults": 2}
Input parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
startUrls | array | — | Direct Booking.com hotel page URLs to scrape. Either startUrls or locationQuery is required. |
locationQuery | string | — | City, region, country, or hotel name to search. Required if no startUrls provided. |
checkin | string | tomorrow | Check-in date in YYYY-MM-DD format. |
checkout | string | checkin + 2 days | Check-out date in YYYY-MM-DD format. |
adults | integer | 2 | Number of adult guests (1–30). |
rooms | integer | 1 | Number of rooms (1–30). |
children | integer | 0 | Number of children (0–10). |
maxResults | integer | 100 | Maximum number of hotels to return (location search). 0 = unlimited (hard-capped at 1000). |
sortBy | enum | popularity | Sort order: popularity, price, bayesian_review_score, class, distance. |
currency | string | USD | Currency code for prices (USD, EUR, GBP, etc.). |
language | string | en-us | Language code (en-us, de, fr, es, it, ja, zh-cn, etc.). |
minPrice | integer | — | Minimum price per night filter. |
maxPrice | integer | — | Maximum price per night filter. |
starsFilter | string[] | — | Filter by star rating (e.g., ["4","5"]). |
proxyConfiguration | object | Residential | Apify proxy. Residential is strongly recommended. |
Output
Each record contains up to 22 structured fields. You can download the dataset in JSON, CSV, Excel, XML, or HTML.
| Field | Type | Description |
|---|---|---|
name | string | Hotel or property name |
url | string | Canonical Booking.com URL (tracking params stripped) |
hotelId | number | Booking.com internal hotel ID (used for dedupe) |
location | string | Neighborhood and city |
address | string | Street / area address ← extra over automation-lab/booking-scraper |
starRating | number | Star rating (1–5) |
reviewScore | number | Guest review score (0–10) |
reviewCount | number | Total number of guest reviews |
reviewScoreWord | string | Rating label (e.g., "Excellent", "Very Good") |
price | number | Total price for the stay |
pricePerNight | number | Price per night |
currency | string | Currency code (USD, EUR, GBP, etc.) |
roomType | string | Recommended room/unit type |
freeCancellation | boolean | Whether free cancellation is available |
breakfastIncluded | boolean | Whether breakfast is included |
photoUrl | string | Hotel photo URL |
propertyType | string | Property type (Hotel, Apartment, etc.) |
coordinates | object | { latitude, longitude } ← extra over automation-lab/booking-scraper |
checkin | string | Check-in date (YYYY-MM-DD) |
checkout | string | Check-out date (YYYY-MM-DD) |
distanceFromCenter | string | Distance from city center |
scrapedAt | string | ISO 8601 timestamp |
Example output:
{"name": "citizenM London Shoreditch","url": "https://www.booking.com/hotel/gb/citizenm-london-shoreditch.html","hotelId": 189710206,"location": "Hackney, London","address": "Hackney, London","starRating": null,"reviewScore": 8.7,"reviewCount": 3356,"reviewScoreWord": "Excellent","price": 224,"pricePerNight": 112,"currency": "USD","roomType": "Comfort Double Room","freeCancellation": true,"breakfastIncluded": false,"photoUrl": "https://cf.bstatic.com/xdata/images/hotel/square240/772469398.webp","propertyType": null,"coordinates": null,"checkin": "2026-06-01","checkout": "2026-06-03","distanceFromCenter": "2.4 miles from downtown","scrapedAt": "2026-05-22T16:00:00.000Z"}
How much does it cost to scrape Booking.com?
This actor uses pay-per-event pricing — you pay only for what you scrape. No monthly subscription. All platform costs (compute, residential proxy, storage) are included.
| Event | Free | Business Gold |
|---|---|---|
| Actor start (per run) | $0.0575 | $0.030 |
Per hotel scraped (deduped by hotelId) | $9.76 / 1,000 | $5.09 / 1,000 |
Real-world cost examples (Free tier):
| Search | Results | Estimated cost |
|---|---|---|
| London, 10 hotels | 10 | ~$0.15 |
| Paris, 30 hotels | 30 | ~$0.35 |
| New York, 75 hotels | 75 | ~$0.79 |
| Tokyo, 100 hotels | 100 | ~$1.03 |
Tips for best results
- Target specific hotels with direct URLs — for known properties,
startUrlsis more reliable than name search. - Start small — test with
maxResults: 10before scaling up. - Set explicit dates — Booking prices vary significantly by date; always pin
checkin/checkoutfor accurate pricing. - Use price + star filters —
minPrice/maxPriceandstarsFilternarrow results without paying for irrelevant rows. - Residential proxies recommended — Booking's AWS WAF blocks datacenter IPs fast.
API usage
cURL:
curl -X POST "https://api.apify.com/v2/acts/<account>~booking-scraper/runs?token=YOUR_API_TOKEN&waitForFinish=300" \-H "Content-Type: application/json" \-d '{"locationQuery":"London","checkin":"2026-06-01","checkout":"2026-06-03","maxResults":50,"currency":"USD"}'
Node.js:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });const run = await client.actor('<account>/booking-scraper').call({locationQuery: 'London',checkin: '2026-06-01',checkout: '2026-06-03',maxResults: 50,currency: 'USD',});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(`Found ${items.length} hotels`);
Python:
from apify_client import ApifyClientclient = ApifyClient('YOUR_API_TOKEN')run = client.actor('<account>/booking-scraper').call(run_input={'locationQuery': 'London','checkin': '2026-06-01','checkout': '2026-06-03','maxResults': 50,'currency': 'USD',})items = client.dataset(run['defaultDatasetId']).list_items().itemsprint(f'Found {len(items)} hotels')
FAQ
How does this scraper handle Booking.com's anti-bot protection? Booking uses AWS WAF to block automated requests. This scraper uses a full Playwright browser with residential proxies and anti-detection flags, which bypasses the WAF reliably.
Can I scrape hotels in any country? Yes. Enter any city, region, or country in locationQuery. Booking covers 2.5M+ properties worldwide.
How many hotels can I scrape in one run? Set maxResults: 0 for unlimited (hard-capped at 1000 per run for safety). Typical city searches return 200–1,000+ properties.
How do I scrape a specific hotel? Use startUrls with the property's direct Booking.com URL (e.g., https://www.booking.com/hotel/gb/the-savoy.html).
Can I filter by price or star rating? Yes — minPrice, maxPrice, and starsFilter (e.g., ["4","5"]).
What if Booking shows a CAPTCHA? The scraper detects WAF challenge pages and automatically rotates the residential IP, retrying up to 3 times per request.
Why are some fields null? Booking doesn't show every field for every property. Non-rated properties (hostels, apartments) often lack starRating. coordinates are populated when Booking exposes lat/lng in the search tile or in the JSON-LD on the property page.
Does the dedupe affect the result count? Yes — if a property appears twice in a single run (e.g., sponsored slot + organic placement), it's pushed and charged once.
Legality
This scraper only accesses publicly available hotel listing data from Booking.com search results. It does not bypass logins, CAPTCHAs, or access controls. Web scraping of publicly available data is generally legal, but you should review Booking.com's Terms of Service and applicable laws in your jurisdiction. Use the data responsibly and in compliance with privacy regulations like GDPR.