Booking.com Hotels Scraper: Prices, Ratings & Review Scores
Pricing
from $1.49 / 1,000 hotels
Booking.com Hotels Scraper: Prices, Ratings & Review Scores
Scrape Booking.com hotels for any city, region or landmark and your dates: price for the stay, review score and count, stars, address, coordinates, room offered, free cancellation, meal plan and distance. Optional facilities and nearby places. No login.
Pricing
from $1.49 / 1,000 hotels
Rating
0.0
(0)
Developer
The Mine Works
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
15 days ago
Last modified
Categories
Share
From The Mine Works, makers of Threads Scraper and B2B Leads Finder, with over 140,000 runs across 170+ public actors.
Why choose this actor?
- The real price for your stay, on every row. Give a place and your dates, and each property comes back with the total price for those nights and guests, the average per night, the crossed out price when there is a deal, taxes and fees not included, free cancellation and its deadline, and the meal plan. Our proof run returned 400 properties from Lisbon, Paris, New York and Tokyo in 7 seconds, with the stay price, review score, address and coordinates on every row. No Booking.com account, no API key.
- Up to 1,000 properties per destination, fast. The actor asks Booking for 100 properties at a time, the same data Booking's own search page loads, so a whole city is a few calls. In our depth test London gave 980 unique properties in 31 seconds, cheapest first, from 15 calls with none refused.
- You pay only for properties you receive. One charge per property saved to your dataset, plus a flat start fee per run. Places Booking does not know, refused calls and a property already delivered earlier in the run cost nothing, and the hotel page details are included at the same price.
Part of The Mine Works Food and local services family: NoBroker Scraper, Swiggy Restaurant Scraper, Zomato Scraper.
Try it in one minute
Paste this input and press Start. It returns 20 Lisbon properties for a two night stay starting 30 days from today, each with the price for the stay, score, stars, address and coordinates, in about 5 seconds:
{"destinations": ["Lisbon"],"maxHotelsPerDestination": 20}
You can name a destination in two plain forms, and mix them in one run:
- A place name, the way you would type it in Booking's search box: a city (
Lisbon,New York), a region (Bali,Tuscany), a district (Manhattan,Shibuya), a landmark (Eiffel Tower) or an airport (Heathrow Airport). Booking's own first suggestion is used, and the run summary tells you which one. - A booking.com search results link copied from your browser after you set dates, guests, sort and filters there. The link keeps all of them; anything it does not carry comes from the inputs.
Apify's free plan includes $5 of credit every month, which covers about 1,900 results at this actor's price.
Copy to your AI assistant
themineworks/booking-hotels-scraper on Apify. Returns Booking.com properties (hotels, apartments, hostels and other stays) for a destination and dates, one row per property with the total price for the stay and per night, price before a deal, taxes and fees, currency, review score, score word and review count, stars, property type, room offered, free cancellation and its deadline, meal plan, address, city, country, latitude and longitude, distance from the center and a link with the dates filled in; with includeDetails also the full address with postcode, review sub scores, facilities, languages spoken and nearby landmarks, airports, transport and beaches with distances. Call ApifyClient("TOKEN").actor("themineworks/booking-hotels-scraper").call(run_input={"destinations": ["Lisbon"], "checkIn": "2026-11-13", "checkOut": "2026-11-15", "maxHotelsPerDestination": 100}), then client.dataset(run["defaultDatasetId"]).list_items().items. Required: destinations (place names or booking.com searchresults links). Optional: checkIn and checkOut (YYYY-MM-DD; default 30 days from today for "nights" nights, default 2), adults (default 2), childrenAges (list of ages 0 to 17), rooms (default 1), currency (default USD), sortBy ("popularity", "price_lowest", "review_score", "stars_highest", "stars_lowest", "distance"), starRatings (["4","5"]), minReviewScore ("6" to "9"), propertyTypes (keys such as "hotels", "apartments"), freeCancellationOnly, breakfastIncluded, minPricePerNight, maxPricePerNight, maxHotelsPerDestination (10 to 1,000, default 100), includeDetails (default false). Skip rows that have "_type": "info". Full spec: GET https://api.apify.com/v2/acts/themineworks~booking-hotels-scraper/builds/default (Bearer TOKEN), which returns inputSchema and readme. Token: https://console.apify.com/account/integrations?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral
Key features
- About 45 fields per property, about 55 with details: id, name, link with your dates, total price for the stay, formatted price, currency, average per night, price before a deal, taxes and fees not included, deal labels, review score, score word, review count, stars, property type, room or unit offered, unit type and size, free cancellation and its deadline, meal plan, scarcity note, street address, city, country, latitude, longitude, district line, distance from the center, nearest station note, main photo, and the dates, guests and destination searched.
- Every search option that changes the price: check-in and check-out dates (or a number of nights), adults, children with their ages, rooms and currency. Booking prices family rooms by child age, so the ages matter.
- Booking's own sort and filters: top picks, lowest price, top reviewed, stars high or low, distance; star ratings, minimum review score (6+ to 9+), 10 property types (hotels, apartments, hostels, resorts, bed and breakfasts, villas, guest houses, aparthotels, holiday homes, homestays), free cancellation, breakfast included, and a price range per night.
- Hotel page details at no extra charge: full address with postcode, review sub scores (staff, facilities, cleanliness, comfort, value for money, location, wifi, breakfast), every facility Booking lists, grouped as on the page, languages the staff speak, and the nearest landmarks, airports, metro, train and bus stops and beaches with distances in kilometres. In our details run 97 of 97 detail calls answered.
- Up to 50 destinations and 1,000 properties each in one run, 100 per call. A property found by two of your searches with the same dates is delivered once.
- No browser, no login: plain requests to the same data Booking's search page loads, over Apify's datacenter proxy, which the run includes. Runs at 256 MB.
How to use it
Basic: one city, your dates
{"destinations": ["Barcelona"],"checkIn": "2026-12-10","checkOut": "2026-12-13","adults": 2,"currency": "EUR","maxHotelsPerDestination": 200}
Several destinations at once
Each line is its own search with the same dates and guests. Mix cities, regions, districts and landmarks.
{"destinations": ["Lisbon", "Porto", "Algarve", "Madeira"],"checkIn": "2026-11-20","nights": 3,"maxHotelsPerDestination": 300}
Rate shopping: your hotel against the competition, every day
Hotels and revenue managers watch what nearby properties charge for the same night. Search the district around your property (here Baixa / Chiado in Lisbon), sorted by distance, with the guests you sell most.
{"destinations": ["Chiado"],"checkIn": "2026-11-14","nights": 1,"adults": 2,"sortBy": "distance","propertyTypes": ["hotels"],"starRatings": ["4", "5"],"maxHotelsPerDestination": 50}
Tip: put this on an Apify schedule once a day and send the dataset to Google Sheets; one row per competitor per day gives you a price history.
Family trip: price with children and free cancellation
{"destinations": ["Orlando"],"checkIn": "2026-12-20","checkOut": "2026-12-27","adults": 2,"childrenAges": ["6", "10"],"rooms": 1,"freeCancellationOnly": true,"minReviewScore": "8","sortBy": "price_lowest","maxHotelsPerDestination": 100}
Market research: every 4 and 5 star hotel in a city, with facilities
{"destinations": ["Dubai"],"checkIn": "2026-11-18","nights": 2,"starRatings": ["4", "5"],"propertyTypes": ["hotels", "resorts"],"includeDetails": true,"maxHotelsPerDestination": 500}
From a Booking.com link with your filters
Set up the search on booking.com, copy the link from the address bar and paste it. Its dates, guests, sort and filters are kept.
{"destinations": ["https://www.booking.com/searchresults.html?ss=Rome&checkin=2026-12-04&checkout=2026-12-06&group_adults=2&no_rooms=1&group_children=1&age=7&nflt=class%3D4%3Bclass%3D5&order=price&selected_currency=EUR"],"maxHotelsPerDestination": 100}
Input parameters
| Parameter | Type | Default | What it does |
|---|---|---|---|
destinations | array of strings | ["Lisbon"] | Place names (city, region, district, landmark, airport) or booking.com search results links, one per line. Up to 50. |
checkIn | string | empty | Check-in date, YYYY-MM-DD. Empty means 30 days from today. |
checkOut | string | empty | Check-out date, YYYY-MM-DD. Empty means check-in plus nights. |
nights | integer | 2 | Length of the stay when there is no check-out date, 1 to 90. |
adults | integer | 2 | Adult guests, 1 to 30. |
childrenAges | array of strings | empty | One age per child, 0 to 17. |
rooms | integer | 1 | Rooms needed, 1 to 30. |
currency | string | USD | Three letter currency code for all prices. |
sortBy | string | popularity | popularity (Booking's top picks), price_lowest, review_score, stars_highest, stars_lowest or distance. |
starRatings | array | empty | Only these star ratings, from "1" to "5". |
minReviewScore | string | empty | "6", "7", "8" or "9": only properties scored at least that. |
propertyTypes | array | empty | hotels, apartments, hostels, resorts, bed_and_breakfasts, villas, guest_houses, aparthotels, holiday_homes, homestays. |
freeCancellationOnly | boolean | false | Only offers with free cancellation. |
breakfastIncluded | boolean | false | Only offers that include breakfast. |
minPricePerNight | integer | empty | Lowest price per night, in currency. |
maxPricePerNight | integer | empty | Highest price per night, in currency. |
maxHotelsPerDestination | integer | 100 | Most properties per destination, 10 to 1,000. |
includeDetails | boolean | false | Adds full address, review sub scores, facilities, languages and nearby places. Same price per property. |
The sort, the filters and the shared dates and guests apply to place names. A search link keeps its own and only borrows what it does not carry.
What data do you get?
One row per property, grouped here by what it describes:
- The property:
hotel_id,name,url,property_type,property_type_id,stars,photo_url,is_closed. - Price for your stay:
price_total,price_total_text,currency,price_per_night,price_before_discount,taxes_and_fees,deal_badges. - The offer:
room_type,rooms_offered,unit_type,unit_size,free_cancellation,free_cancellation_until,meal_plan,only_few_left. - Guest reviews:
review_score,review_score_word,review_count. - Location:
address,city,country_code,latitude,longitude,area_name,distance_from_center,public_transport. - What was searched:
check_in,check_out,nights,adults,children,rooms,destination,destination_id,destination_type,rank,scraped_at. - With details on:
full_address,review_subscores,facilities,facilities_by_group,languages_spoken,nearby_landmarks,nearby_airports,nearby_transport,nearby_beaches,details_status.
A field Booking does not show for a property is left out of that row rather than filled with an empty value; for example stars is absent for apartments without a star rating, and meal_plan when no meals are included.
Stable fields for automations
These fields were present in every row of our proof runs and are safe to build on:
| Field | Meaning |
|---|---|
hotel_id | Booking's property id, the same across runs |
name | Property name |
url | Property page with your dates and guests |
price_total | Price for the whole stay |
currency | Currency of the prices |
price_per_night | Average price per night |
review_count | Number of guest reviews |
property_type_id | Booking's property type id |
room_type | Room or unit offered |
free_cancellation | True or false |
address | Street address |
latitude | Latitude |
longitude | Longitude |
check_in | Check-in date searched |
rank | Position in Booking's results |
These names will not change. New fields may be added next to them.
Output examples
A hotel in Lisbon from the one minute test (search fields only; the photo link is shortened):
{"hotel_id": 4045490,"name": "Maxime Boutique Hotel Avenida da Liberdade","url": "https://www.booking.com/hotel/pt/maxime.html?checkin=2026-11-04&checkout=2026-11-06&group_adults=2&no_rooms=1&group_children=0&selected_currency=USD","price_total": 297.94,"price_total_text": "$297.94","currency": "USD","price_per_night": 148.97,"price_before_discount": 372.42,"taxes_and_fees": 35.92,"review_score": 8.9,"review_score_word": "Excellent","review_count": 3595,"stars": 3,"property_type": "Hotel","property_type_id": 204,"room_type": "Deluxe Double Room","free_cancellation": true,"free_cancellation_until": "2026-11-03T00:00:00Z","meal_plan": "Breakfast included","address": "58 Praça da Alegria","city": "Lisboa","country_code": "PT","latitude": 38.7183344745959,"longitude": -9.14531938657763,"area_name": "Santo Antonio, Lisbon","distance_from_center": "0.4 miles from downtown","public_transport": "Avenida station is within 100 yards","photo_url": "https://cf.bstatic.com/xdata/images/hotel/square600/646162366.webp?k=...","check_in": "2026-11-04","check_out": "2026-11-06","nights": 2,"adults": 2,"children": 0,"rooms": 1,"destination": "Lisbon","destination_id": "-2167973","destination_type": "CITY","rank": 2,"scraped_at": "2026-10-05T21:51:05.757Z"}
A Barcelona property with details on, searched for two adults and a six year old (lists trimmed to three entries):
{"hotel_id": 7934475,"name": "HOSTAL BEDMATES","price_total": 344.59,"currency": "EUR","price_per_night": 114.86,"taxes_and_fees": 105.86,"review_score": 8.3,"review_count": 5084,"stars": 2,"room_type": "Studio Apartment","unit_type": "Entire apartment","unit_size": "431 ft²","free_cancellation": true,"free_cancellation_until": "2026-11-09T23:00:00Z","check_in": "2026-12-10","check_out": "2026-12-13","children": 1,"full_address": "79 Carrer de Vila i Vilà, Sants-Montjuïc, 08004 Barcelona, Spain","review_subscores": { "staff": 9.1, "facilities": 8.3, "cleanliness": 8.7, "comfort": 8.6, "value_for_money": 8.2, "location": 8.7, "breakfast": 7.9, "free_wifi": 8.9 },"facilities": ["Air conditioning", "Smoke-free property", "Heating"],"facilities_by_group": { "General": ["Air conditioning", "Smoke-free property", "Heating"], "Services": ["Daily housekeeping", "Concierge", "Baggage storage"] },"languages_spoken": ["ca", "en", "es", "it"],"nearby_landmarks": [{ "name": "Plaça Reial", "distance_km": 0.91 }, { "name": "Magic Fountain of Montjuic", "distance_km": 1.44 }],"nearby_airports": [{ "name": "Barcelona El Prat Airport", "distance_km": 8.58 }],"nearby_transport": [{ "name": "Paral·lel Metro Station", "distance_km": 0.12, "kind": "metro" }],"nearby_beaches": [{ "name": "Barceloneta Beach", "distance_km": 1.97 }],"details_status": "ok"}
The last row of every run that delivered something is an information row. It is never charged; skip rows that have "_type": "info":
{"_type": "info","delivered": 20,"message": "20 hotels delivered. This row is informational: it is never billed.","scraped_at": "2026-10-05T21:51:05.814Z"}
Pricing
Pay per event: you pay for each property delivered to your dataset, plus a flat $0.005 per run, whatever memory you choose. Prices by Apify plan:
| Event | Free plan | Bronze (Starter) | Silver (Scale) | Gold and above (Business) |
|---|---|---|---|---|
Property delivered (hotel-scraped), per 1,000 | $2.49 | $2.09 | $1.79 | $1.49 |
Run start (run-start), once per run | $0.005 | $0.005 | $0.005 | $0.005 |
Hotel page details come at the same price per property; there is no separate details fee. Details make a run a little slower (one more call per property), not dearer.
What is never charged:
- Destinations Booking does not know, and searches with no properties.
- Calls Booking refused, even after retries.
- A property already delivered earlier in the same run for the same dates and guests.
- The information row at the end of the dataset (it has
"_type": "info").
Proxy traffic goes through Apify's datacenter proxy, which is included in the price; there is no separate proxy fee. To cap a run's cost, set a maximum total charge in the run options; the actor stops cleanly when it is reached.
FAQ
What is Booking.com, and what does this actor read? Booking.com is one of the largest travel sites, listing hotels, apartments, hostels, resorts and homes worldwide with live prices for chosen dates. The actor reads Booking's public search results for your destination, dates and guests, the same results any visitor sees, and optionally the public facts on each hotel page.
How many properties can I get? Up to 1,000 per destination and up to 50 destinations per run. Booking itself stops showing new properties at roughly 1,000 for one search, so for a big city split it into districts, or into star ratings and property types, and run them as separate lines.
Are the prices real for my dates?
Yes. Prices are what Booking showed our run for your exact dates, guests, rooms and currency, as a visitor who is not signed in. Member only prices (Genius) and prices for a specific country of residence can differ. price_total is the whole stay; taxes_and_fees lists charges Booking shows as not included.
How fresh is the data?
Live. Every run asks Booking at that moment. Prices move during the day, so for monitoring run on a schedule and compare price_total by hotel_id and check_in.
Do I need a Booking.com account, cookies or an API key? No. Nothing to sign in to and nothing to supply. The actor reads what an anonymous visitor sees.
Do I need to set up a proxy? No. The run uses Apify's datacenter proxy, included in the price.
What does "Add hotel page details" add, and does it cost more? Full address with postcode, review sub scores, all facilities (grouped), languages spoken, and the nearest landmarks, airports, metro, train and bus stops and beaches with distances in kilometres. It costs the same per property; it only adds one call per property, about 1 second each with four in parallel.
Can I search with children?
Yes. Put one age per child in childrenAges. Booking prices family stays by age, so a 3 year old and a 15 year old can change the price and the rooms offered.
Why is a field missing on some rows?
Booking does not show it for that property: apartments often have no star rating, meal_plan appears only when meals are included, price_before_discount only when there is a deal. Missing fields are left out of the row instead of being set to empty.
What happens when a place is not found?
That destination is reported in the run summary (OUTPUT in the key-value store) as destination_not_found, the rest of the run continues, and nothing is charged for it. Booking's first suggestion is used for every name; the summary shows which place it was, so check it for ambiguous names like Paris (France or Texas).
Can I monitor prices on a schedule?
Yes. Save your input as a task and add an Apify schedule (daily, hourly). Each run delivers the current prices; join runs on hotel_id, check_in and check_out.
Which export formats are there? JSON, CSV, Excel, XML, HTML table and RSS from the dataset, or the API.
Can I use it from Claude, ChatGPT or Cursor (MCP)? Yes, through Apify's MCP server.
- Connector URL: https://mcp.apify.com/?tools=themineworks/booking-hotels-scraper
- Claude: Settings > Connectors > Add custom connector, paste the URL, sign in with Apify.
- ChatGPT: developer mode, add an MCP connector with the URL, sign in with Apify.
- Cursor or VS Code: add it as an HTTP MCP server with that URL.
- Claude Code:
claude mcp add -t http booking-hotels-scraper "https://mcp.apify.com/?tools=themineworks/booking-hotels-scraper"
Is it legal to scrape Booking.com? The actor reads only public search results and public hotel facts that any visitor can see, and no personal data about guests. You are responsible for how you use the data, including Booking.com's terms and data protection law such as GDPR and CCPA.
Integrations
- Google Sheets: add the Google Sheets integration to the actor or a schedule, and each run's prices land in a sheet.
- Make, Zapier and n8n: use the Apify app to start a run and read the dataset, for example to post a daily competitor price table to Slack.
- Webhooks: call your own endpoint when a run finishes.
- API: start runs and read results from any language; the Python and JavaScript clients are a few lines each.
- MCP clients: Claude, ChatGPT, Cursor, VS Code and Claude Code, as in the FAQ above.
More from The Mine Works
Food and local services
Social media and video
Leads and business directories
Marketing, SEO and reviews
Real estate
Science, health and government data
Jobs and hiring
Company and business data
E-commerce and marketplaces
Developer and AI tools
More tools
Support
Found a destination, link or field that does not come through? Open an issue on the Issues tab and include the input you used; we answer there. For a new site or source, email dmineworks@gmail.com.
Booking.com Hotels Scraper turns a place and your dates into a clean table of properties with the price for your stay, scores, stars and locations, with a charge only for the properties you get.

