Booking.com Hotel Prices
Pricing
from $1.40 / 1,000 hotel scrapeds
Booking.com Hotel Prices
One search, one flat table: hotel name, id, address, lowest all-in price for the stay, star rating, review score and count, and the booking URL.
Pricing
from $1.40 / 1,000 hotel scrapeds
Rating
0.0
(0)
Developer
Superslow Sloth
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
2
Monthly active users
a day ago
Last modified
Categories
Share
One search in, one flat table out. Give it a destination and a date; it returns the hotels Booking.com would show you, each with its lowest all-in price for the whole stay in the currency you asked for, its star rating, its guest review score and review count, and the URL of the property page.
Built to be called by an agent or a script: small input, small output, one row per hotel, no nested objects, no HTML.
Input
| field | default | meaning |
|---|---|---|
destination | required | City, region, district or landmark: Bangkok, Osaka, Bali, Times Square |
checkIn | 30 days out | Check-in date, YYYY-MM-DD |
nights | 1 | Length of stay; check-out is derived from it |
adults | 2 | Adult guests the prices are quoted for |
rooms | 1 | Rooms requested |
children, childAges | 0, [] | Children, and one age per child |
currency | USD | Three-letter code the prices are quoted in |
maxResults | 50 | Stop after this many hotels have been delivered |
includeUnpriced | false | Also emit properties with nothing bookable, at a null price |
Output
One item per hotel:
| field | meaning |
|---|---|
hotel_id | Booking's numeric property id, stable across searches |
name | Property name as Booking displays it |
url | Property page on booking.com |
area | Street address as Booking prints it on the card |
city | City as Booking classifies the property — see the note below |
country_code | Two-letter country code, e.g. th |
star_rating | Official star rating, 1-5 |
review_score | Booking guest score out of 10 |
review_count | Number of guest reviews behind that score |
total_price | Lowest all-in price for the whole stay, not per night |
currency | Currency total_price is quoted in |
check_in, check_out, nights, adults, rooms | The search the prices belong to |
requested_destination | The destination string you sent, echoed back |
resolved_destination, resolved_country_code, resolved_ufi | The place Booking actually searched |
destination_matched | false when Booking searched somewhere other than what you asked for |
total_price is the whole stay
Booking's search cards quote a total for the dates, so that is what this
returns. It is not divided by nights to make a nightly rate, because a
stay whose rate changes from night to night has no single nightly price and
inventing one would be wrong for exactly the bookings people care about. Divide
it yourself if an approximate nightly figure is what you need.
Always check destination_matched
Booking resolves free text on its own side and answers nearly any string with
some place, so a typo or a bad input can produce a complete, successful,
charged run about somewhere else. This actor cannot refuse that outright
without also refusing legitimate variants — Booking files "Koh Samui" as "Ko
Samui" and answers a city name with the surrounding region — so instead every
row says what you asked for and what it got. When destination_matched is
false, read resolved_destination before trusting the prices.
A destination Booking cannot place at all is not silently swapped for another: the run ends with no items and says so.
city is not reliably in English
Measured 2026-08-25: the same Bangkok search answered Bangkok on one request
and กรุงเทพมหานคร minutes later, with an English language setting on both.
Booking localises this field to the property's own language some of the time,
and no request-side setting changes it. It is passed through exactly as sent
rather than transliterated, because a guessed translation would put an invented
value in a column you might join on. resolved_destination is consistently
in the requested language — group by that.
Nulls are never zeros
A property with nothing bookable for those dates has total_price: null and
currency: null, and by default is not emitted at all. A property nobody has
reviewed yet has review_score: null and review_count: null. None of these
ever come back as 0, because a 0 would read as a measurement — "free", or
"rated nought" — which is the one thing it never means.
Use a residential proxy
Booking.com sits behind an AWS WAF. A challenged request comes back as
HTTP 202 carrying a JavaScript proof-of-work instead of data, and no HTTP
client can solve it — only a different exit address clears it. The input's
default proxy configuration is RESIDENTIAL, and it should be left that way.
The actor rotates its exit address before every retry, which is the thing that
actually clears a block; re-asking from the blocked address never does.
What it costs
Pay per event: a small charge when the run starts, and one charge per hotel row delivered. Properties skipped for having no price are not charged for, and a hotel that appears on two pages is charged once. A run rejected for a malformed date is not charged the start event at all.