Booking.com Hotels & Prices Scraper
Pricing
from $1.50 / 1,000 hotels
Booking.com Hotels & Prices Scraper
Search Booking.com by destination, dates and guests. Each property is one row with its price for the stay, currency, taxes and fees, room offer, review score and count, stars, address and map coordinates. Optionally add every room type with its price. Pages through all results up to your limit.
Pricing
from $1.50 / 1,000 hotels
Rating
0.0
(0)
Developer
Philip Kirkbride
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
13 hours ago
Last modified
Categories
Features
Share
Search Booking.com the way a traveller does: type a destination, pick your dates and guests, and get every matching property as one clean row. Each row has the hotel's name, link, address and map coordinates, star rating, guest review score and review count, and the price for your whole stay in your currency, with the taxes and fees note, the room the price is for, meal plan, free cancellation and "rooms left" messages. Turn on room details to also get every bookable room type on the hotel's page with its own price, cancellation terms and meals.
Results come back in Booking.com's own order (or the sort order you choose) and page through automatically until your limit, so a big city search can return hundreds or thousands of properties in one run.
Built for revenue managers, travel agencies, market analysts and trip planners who need Booking.com hotel prices for real dates, not a list of names.
What sets it apart
- Real stay prices. Every price is for your dates, guests, rooms and currency, with the taxes-and-fees note, discount and cancellation terms that Booking.com shows next to it.
- $1.50 per 1,000 hotels, plus $0.005 per run. Room types, the full facilities list and guest reviews are optional add-ons you pay for only when you turn them on.
- Room-level rates. With room details, every bookable room type comes with its own price, meal plan, cancellation and rooms left.
- No duplicates across destinations, and failed destinations are not charged.
Use cases
- Hotel price tracking: re-run the same destination and dates on a schedule and watch how prices move as the stay gets closer.
- Rate comparison: compare your property's price, score and position against every competitor in the same area.
- Travel research: build a shortlist of well-reviewed places in a price range, with coordinates for mapping.
- Market analysis: count properties, star mix and average prices by city or neighbourhood.
- Room-level pricing: see every room type and rate a hotel sells for specific dates.
Quick start
Open the Actor in Console and press Start: the prefilled form searches Lisbon for 2 adults in 1 room, a 2-night stay 30 days from today, and returns 50 hotels (about $0.08). An empty input ({}) returns a small sample: up to 10 hotels in Lisbon, and the status message says it was a sample. A destinations or searchUrls list left empty on purpose stops at once with an input error.
{"destinations": ["Lisbon"],"checkIn": "2026-12-10","checkOut": "2026-12-13","adults": 2,"rooms": 1,"currency": "USD","maxItems": 50}
Leave the dates empty to search a 2-night stay 30 days from today. You can also paste a link copied from a Booking.com search results page into searchUrls; its own dates and guests are used.
Input
| Input | Type | Default | Meaning |
|---|---|---|---|
destinations | array | — | Places as you would type them on Booking.com: a city, region, district or landmark (for example Lisbon, Manhattan, Eiffel Tower). Each one is searched separately; up to 50 per run. |
searchUrls | array | — | Links copied from Booking.com search results pages. |
checkIn | string | 30 days from today | Arrival date, YYYY-MM-DD, up to 500 days ahead. |
checkOut | string | 2 nights after check-in | Departure date, YYYY-MM-DD. Stays can be up to 30 nights. |
adults | integer | 2 | Adult guests (1-30). |
childrenAges | array | [] | One age (0-17) per child, for example [5, 9]; up to 10 children. |
rooms | integer | 1 | Rooms for the group (1-30, not more than adults). |
currency | string | USD | Currency for every price, for example EUR or GBP. |
sortBy | string | popularity | popularity, price_lowest, price_highest, review_score, review_score_and_price, stars_highest, stars_lowest or distance. |
maxItems | integer | 100 | Total hotels to return, up to 5,000. With several destinations the limit is shared evenly, and a destination with fewer hotels passes its unused share on. The empty-input sample stops at 10. |
includeRoomDetails | boolean | false | Also add every bookable room type and its price from each hotel's page. Slower; charged as an add-on per hotel that returns rooms. |
includeAmenities | boolean | false | Also add the property's complete facilities list (grouped as the facilities tab shows it) and the popular-facility highlights. |
includeReviews | boolean | false | Also add review scores by category, the total review count and up to maxReviewsPerHotel guest reviews. |
maxReviewsPerHotel | integer | 100 | With includeReviews, the review cap per hotel (1-500), fetched 10 at a time. |
Example queries
{"destinations": ["Paris"], "sortBy": "price_lowest", "maxItems": 200}: the 200 cheapest places in Paris for a 2-night stay next month.{"destinations": ["New York"], "checkIn": "2026-12-31", "checkOut": "2027-01-02", "currency": "USD", "sortBy": "review_score"}: New Year's Eve, best reviewed first.{"destinations": ["Barcelona"], "adults": 2, "childrenAges": [6, 10], "rooms": 1}: a family of four.{"destinations": ["Rome"], "maxItems": 20, "includeRoomDetails": true}: 20 hotels with every room type and rate.
What it returns
The dataset contains one row per property:
| Field | Meaning |
|---|---|
kind | hotel for every dataset row. |
hotelId, name, url | Booking.com property id, name and its page for your dates and guests. |
address, city, district, countryCode | Where it is, as Booking.com lists it. |
latitude, longitude, distanceFromCenter | Map position and the distance note shown in results. |
stars | Star or quality rating (1-5) as shown in the results. |
reviewScore, reviewScoreWord, reviewCount | Guest score out of 10, its label (for example Excellent) and the number of reviews. |
price, currency, priceText | Price for the whole stay for your guests and rooms, and the price as displayed. Empty when sold out. |
priceBeforeDiscount | The struck-through price when a discount is shown. |
taxesAndFees | Whether taxes and fees are included, or the extra amount. |
roomOffer, beds, mealPlan | The room the price is for, its bed count and any included meals. |
freeCancellation, noPrepayment, roomsLeftMessage | Booking terms and scarcity notes shown with the price. |
available | True when the property has a price for your dates. |
photoUrl | Main photo. |
checkIn, checkOut, nights, adults, children, rooms | The stay the price is for. |
destination, searchRank | The destination as Booking.com matched it, and the position in the results. |
roomTypes | With includeRoomDetails: every room offer with roomName, roomId, offerId, maxGuests, price (one room, whole stay), priceText, cancellation, mealPlan, includedTaxesAndFees, excludedTaxesAndFees and roomsAvailable. Otherwise null. |
scrapedAt | Collection time (UTC). |
error | Always null in the dataset. Failures are reported in the run summary instead. |
The run summary (OUTPUT) lists each destination with the place Booking.com matched, its total number of available properties, how many hotels were returned and any error, plus hotels, hotelsWithRoomDetails and errors.
Output example
{"kind": "hotel","hotelId": "10990731","name": "Easy Host Porto","url": "https://www.booking.com/hotel/pt/easy-host-porto.html?checkin=2026-11-19&checkout=2026-11-21&group_adults=2&no_rooms=1&group_children=0&selected_currency=EUR","address": "352 Avenida de Camilo","city": "Porto","district": "Bonfim, Porto","countryCode": "pt","latitude": 41.148359797018,"longitude": -8.597949513527,"distanceFromCenter": "1.1 km from downtown","stars": null,"reviewScore": 7.9,"reviewScoreWord": "Good","reviewCount": 2568,"price": 46.02,"priceBeforeDiscount": 49.8,"currency": "EUR","priceText": "€ 46.02","taxesAndFees": "Includes taxes and fees","roomOffer": "Single Bed in Dormitory Room","beds": 2,"mealPlan": null,"freeCancellation": false,"noPrepayment": false,"roomsLeftMessage": null,"available": true,"photoUrl": "https://cf.bstatic.com/xdata/images/hotel/square600/503127088.jpg?k=26c54a43bb5ce75638e275bddf4be2cb458c34414a7a18716d9503577c791db9&o=","checkIn": "2026-11-19","checkOut": "2026-11-21","nights": 2,"adults": 2,"children": 0,"rooms": 1,"destination": "Porto, Norte Region, Portugal","searchRank": 1,"roomTypes": [{"roomName": "Single Bed in Dormitory Room","roomId": "1099073105","offerId": "1099073105_382770871_1_10_0_139926","maxGuests": 1,"price": 24.9,"priceText": "€ 25","cancellation": "free_cancellation","mealPlan": null,"includedTaxesAndFees": 7.07,"excludedTaxesAndFees": 0.0,"roomsAvailable": 7}],"scrapedAt": "2026-10-20T01:59:15Z","error": null}
Good to know
- Prices are what a signed-out visitor sees for your dates, guests and currency. Member-only and app-only rates are not included, and Booking.com may show slightly different prices to visitors in other countries.
- A place name is matched to Booking.com's own destination list; the matched destination is shown in
destinationand in the run summary. For an exact area, paste a search results link instead. - Sold-out properties that Booking.com still lists come back with
available: falseand no price. - Each destination returns at most the number of properties Booking.com lists for it. Hotels found under two destinations are returned once.
- Room details take a few extra seconds per hotel. If a hotel's page cannot be read, the hotel is still returned with
roomTypes: nulland no room-details charge. - If no destination returns any hotel, the run fails with a clear message instead of finishing with an empty dataset.
- Review text is only included with
includeReviews. It is returned as the guest wrote it, so it can occasionally contain personal details the author typed in. - Automated access is subject to Booking.com's terms; use this actor only where you have the necessary permissions and a lawful basis.
Price
$0.0015 per hotel delivered, plus $0.00055 per hotel that comes back with room details when includeRoomDetails is on ($0.00205 in total for such a hotel), plus $0.00125 per run start. The run-start event is charged per GB of memory; the default 4096 MB run is four start events ($0.005). The start is charged even if the run saves no results. Failed destinations are not charged. A hotel whose page could not be read is still charged the $0.0015 hotel price, but not the room-details add-on. Platform usage is included in these prices.
Worked costs: the 50-hotel prefill run is about $0.08; 1,000 hotels about $1.505; 1,000 hotels with room details about $2.055.
Optional property data, only when you turn it on:
- Amenities (
includeAmenities): $0.0015 per hotel with the complete facilities list (facilitiesScope: "full"); a hotel that falls back to the page's highlights is not charged for amenities. - Reviews (
includeReviews): $0.0015 per hotel plus $0.00006 per returned review. At 100 reviews that is about $0.0075 per hotel, at 500 about $0.0315.
maxReviewsPerHotel bounds the reviews cost: a hotel never returns, or is charged for, more reviews than that cap. The reviews price is charged only when the hotel's reviews were fetched successfully (a hotel with no reviews at all still counts as a successful fetch and is charged $0.0015 with no per-review charge). A duplicate review is returned and charged once. If the reviews fetch fails after one or more pages, the hotel keeps the reviews already paged, the run summary records PARTIAL with the error, and only the per-review price is charged for them (no $0.0015 per-hotel price). If it fails before any page, the hotel keeps its featured reviews (scope: "featured") and no reviews price is charged. Your maximum charge per run covers the review charges too: when the remaining budget cannot cover all of a hotel's reviews, the review list is cut to what it covers (or left out), the run summary records CHARGE_LIMIT, and the run stops there. You are never charged for reviews you did not receive.
Scheduling and monitoring
Schedule the same destination and dates daily to watch prices move as the stay gets closer, or use a rolling date (leave the dates empty) to always price a stay 30 days out. Each run is a full snapshot; match rows across runs by hotelId. There is no built-in "changes only" mode.
FAQ
How fresh are the prices? Every run reads Booking.com at run time for the stay you asked for; nothing is cached between runs.
How many hotels can one run return? Up to 5,000 (maxItems), shared across destinations. Each destination returns at most the number of properties Booking.com lists for it.
Can I filter by stars, price or facilities? Not in the input yet. Sort with sortBy, or filter the dataset afterwards on stars, price or reviewScore.
Are member or app prices included? No. Prices are what a signed-out visitor sees.
Which export formats are available? JSON, CSV, Excel, XML or RSS from the dataset, or read the rows with the Apify API.
Optional property data
Set includeAmenities: true for facilityGroups — the complete facilities
list grouped and named the way the property's own facilities tab groups it
(including policy notes such as pets and parking where the page has them) —
plus popularFacilities, the page's "relevant for your trip" highlights.
That highlight list is often empty (Booking.com fills it only for a dated
search), so treat facilityGroups as the complete facilities list.
facilitiesScope: "full" marks this complete coverage; if the complete
facilities list cannot be read for a hotel, that hotel falls back to the page's
own highlights (facilitiesScope: "highlights-and-subsets", which also
carries the selected propertyFacilities subset list) and the run
summary records the failure. Room-specific facilities are not included.
Set includeReviews: true for reviews, containing scoresByCategory,
totalReviewCount, fetchedCount, and up to maxReviewsPerHotel items
(1-500, default 100) with UTC review date, title, positive/negative text,
score, trip type, reviewer country, room type and the property's reply
(propertyReply, null when the property did not reply), paged exactly the
way the property's reviews tab pages them (10 at a time).
scope: "paginated" marks the paged feed; if paging fails for a hotel after
some pages, the reviews already paged are kept and the run summary records
PARTIAL; if it fails before any page, its featured reviews are kept instead
(scope: "featured", not charged as reviews) and the run summary records the
failure.
Review text and property replies are returned as Booking.com shows them.
Featured reviews carry no property reply.
Both flags default to false and their fields are omitted when off. Amenities,
reviews and room details take additional time; larger maxReviewsPerHotel
values take longer. An unavailable feature is omitted or falls back as
described above, and is recorded in the OUTPUT errors. If a property's
optional data cannot be read at all, the run summary records DEEP_BLOCKED.
The summary counts hotels with amenities and reviews when those options are
enabled. Add-on billing events: hotel-amenities and hotel-reviews per
hotel, hotel-review per returned review (prices above). Availability
calendars are not yet supported.
If collection reaches the run's time limit, collected hotels remain available
and the run finishes successfully with OUTPUT status time_budget.
Slow or unavailable sources can leave partial results.