Booking.com Hotels Scraper avatar

Booking.com Hotels Scraper

Pricing

from $0.97 / 1,000 booking.com properties

Go to Apify Store
Booking.com Hotels Scraper

Booking.com Hotels Scraper

Booking.com hotels scraper: give destinations and dates, get one row per property with the live price for that stay, guest score, stars, coordinates, the matched room and its cancellation terms. Up to about 1,000 properties per search. $1.00 per 1,000 properties.

Pricing

from $0.97 / 1,000 booking.com properties

Rating

0.0

(0)

Developer

Dami's Studio

Dami's Studio

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

0

Monthly active users

8 days ago

Last modified

Share

Type a destination and a pair of dates and get one row per Booking.com property: the price Booking.com quotes for that stay, the guest review score, the star rating, map coordinates, the room that was matched, and whether it cancels free.

Booking only quotes a price for a concrete stay, so the dates are doing real work here. Leave them empty, or type something Booking cannot read, and the run prices a one-night stay 30 days from today and writes those dates onto every row. Nothing warns you, so read checkIn on the first row before you trust the prices.

The other thing to know early: Booking stops serving new properties at roughly 1,000 per search. That is Booking's own limit, not a setting here.

InputDestinations, plus check-in and check-out dates
OutputOne row per property: price for your stay, review score, stars, coordinates, matched room, cancellation and breakfast terms
CeilingAbout 1,000 properties per destination, 20 destinations per run
Account neededNone
Price$1.00 per 1,000 properties on the Free plan, a little less on paid plans. The free plan's $5 a month covers about 5,000

🔍 What Booking.com Hotels Scraper does

It runs the search Booking.com runs when you type into its own box, and writes down every property on the results, page after page, until it has the number you asked for or Booking stops producing new ones.

Anything that search box accepts works as a destination: a city, a district, a landmark, an airport, a country, or the name of one specific property.

The price on a row is the price for the stay you asked about, in the currency you chose, for the room Booking matched to your party size. Change adults, rooms or the dates and the matched room changes with them.

The filters are Booking's own: budget per night, star rating, review score, property type, free cancellation, breakfast. They are applied by the site during the search, not by throwing rows away afterwards.

📋 What data you get from each Booking.com property

What you getField
Booking's property id, name and linkhotelId, name, url
Type, address, city and countryaccommodationType, address, city, countryCode
Coordinates, neighbourhood and distance from the centrelatitude, longitude, neighborhood, distanceFromCenter
Guest score, review count, the score's word and the star ratingreviewScore, reviewsCount, reviewScoreWord, starRating
Price for the stay, per night, as printed, and the currencypriceTotal, pricePerNight, priceFormatted, currency
The struck-through price and taxes, where Booking shows thempriceBeforeDiscount, taxesAndFees
The room matched to your party: type, beds, bedrooms, bathrooms, unit and mealsroomType, beds, bedrooms, bathrooms, unitType, mealPlan
Cancellation and prepayment termsfreeCancellation, freeCancellationUntil, noPrepayment
Availability and Booking's badgesavailabilityMessage, isSoldOut, isSustainable, isPreferredPartner, isNewlyOpened
One photophotoUrl
The search that produced the rowcheckIn, checkOut, nights, adults, rooms, children, searchQuery, scrapedAt

▶️ How to scrape Booking.com hotels

  1. Open Booking.com Hotels Scraper and click Try for free.
  2. Put your destinations into Destinations, one per line.
  3. Set Check-in date and Check-out date. Do this even for a quick test, or the prices you get back are for a stay a month from now.
  4. Set Max properties per destination. A hundred is a sensible first run.
  5. Click Start, then download the dataset as JSON, CSV or Excel, or read it from the API.

Leave destinations empty and you get one sample row showing the shape of the output, with nothing searched.

💰 How much does it cost to scrape Booking.com?

$1.00 per 1,000 properties, which is $0.001 each on the Free plan. Paid plans pay a little less: $0.99 on Starter, $0.98 on Scale and $0.97 on Business. On the free plan, the $5 Apify gives you each month covers about 5,000 properties.

You pay per property row. The sample row and diagnostics are not property rows and carry no result charge, so a destination Booking cannot place leaves you a row explaining it rather than a bill for results you did not get.

One destination at 100 properties is ten cents. Note that a property listed under two of your destinations is returned, and charged, once for each of them.

📥 What you give it

{
"destinations": ["Paris", "Lisbon"],
"checkIn": "2026-11-06",
"checkOut": "2026-11-07",
"adults": 2,
"rooms": 1,
"maxItemsPerDestination": 100,
"sortBy": "popularity",
"currency": "USD"
}
FieldDefaultWhat it is
destinationsnone, the form starts with ParisUp to 20 per run. A city, a district ("Manhattan, New York"), a landmark, an airport, a country, or one property by name.
checkIn, checkOut30 days from today, one nightThe stay, as YYYY-MM-DD. Check-out must be after check-in, and one night after it is what you get if you only set the first.
adults, rooms, childrenAges2 adults, 1 room, no childrenThe party. 1 to 30 adults and rooms, and one entry per child with their age in years.
maxItemsPerDestination100Properties per destination, 1 to 1,000.
sortBypopularityBooking's own sorters: popularity (its "Our top picks"), price, price_high_to_low, rating_high_to_low, rating_low_to_high, review_score, distance_from_center, homes_first.
currency, languageUSD, en-us39 currencies and 29 languages. The language only changes the human-readable fields: neighborhood, distance, the review word, the room name.
minPricePerNight, maxPricePerNightnoneBooking's budget filter, per night, in the currency you picked.
minStarsany1 to 5 stars.
minReviewScoreanyBooking offers four buckets and no more: 60, 70, 80 or 90.
propertyTypeanyOne of hotels, apartments, hostels, guesthouses, bed_and_breakfasts, villas, vacation_homes, homestays, entire_homes_and_apartments.
freeCancellationOnly, breakfastIncludedoffKeep only properties whose matched room offers that.
proxyConfigurationleave it as it isOptional, and not needed for a normal run. Servers of your own listed here are used too.

📤 What you get back

A real row, with the photo URL cut short so the block stays readable:

{
"hotelId": 11556136,
"name": "Warm 2 bedrooms apartement - c38",
"url": "https://www.booking.com/hotel/fr/warm-2-bedrooms-appartement-c38.html",
"accommodationType": "Apartment",
"address": "38 Rue de Campo-Formio",
"city": "Paris",
"countryCode": "fr",
"latitude": 48.835111441834,
"longitude": 2.359235481545,
"neighborhood": "13th arr., Paris",
"distanceFromCenter": "1.5 miles from downtown",
"reviewScore": 8.1,
"reviewsCount": 110,
"reviewScoreWord": "Very Good",
"starRating": 4,
"priceTotal": 482.137879271985,
"pricePerNight": 482.14,
"priceFormatted": "$482.14",
"currency": "USD",
"priceBeforeDiscount": 651.42528204287,
"taxesAndFees": null,
"roomType": "One-Bedroom Apartment",
"beds": 3,
"bedrooms": 1,
"bathrooms": 1,
"unitType": "Entire apartment",
"mealPlan": null,
"freeCancellation": false,
"freeCancellationUntil": null,
"noPrepayment": false,
"availabilityMessage": null,
"isSoldOut": false,
"isSustainable": false,
"isPreferredPartner": true,
"isNewlyOpened": false,
"photoUrl": "https://cf.bstatic.com/xdata/images/hotel/square600/547855615.jpg?k=417ee...",
"checkIn": "2026-10-06",
"checkOut": "2026-10-07",
"nights": 1,
"adults": 2,
"rooms": 1,
"children": 0,
"searchQuery": "Paris",
"scrapedAt": "2026-09-06T17:08:50.241Z"
}
FieldHow to read it
hotelIdBooking's own id. Stable between runs, so use it as your key.
priceTotal, pricePerNightThe whole stay and the stay divided by nights, both as numbers. priceFormatted is the same figure as Booking prints it.
priceBeforeDiscountWhat the room was struck through at, when there was a discount. Null when there wasn't.
taxesAndFeesOften null. Booking shows it on some properties and not others, and this reports what the search returned.
roomType, beds, bedrooms, bathrooms, unitType, mealPlanThe room that was matched to your party, not the cheapest room in the building.
reviewScore, reviewsCount, reviewScoreWordA brand-new property comes back with 0 and 0, even under a review-score filter. Booking lets those through its own filter.
isSoldOut, availabilityMessageA sold-out stay still returns a row. Check this before treating a price as bookable.
searchQueryWhat you typed, not what Booking decided you meant.

🧾 Reading the output

A property row carries no ok field. Anything with ok: false on it is a note, not a property.

RowHow to spot itCharged
A propertyhotelId is set, no ok fieldyes
The sample row_sample is trueno
A diagnosticok is false, _diagnostic is true, and status names the reasonno

The Console's default table has no column for status, so a diagnostic shows as a blank line there. Download the JSON to read it.

statusWhat it means
NO_RESULTSThe search ran and Booking had nothing for it. Often a destination it could not place.
UPSTREAMBooking's own search answered with an error. Usually worth one re-run.
NOT_SERVEDThis property was not served this run. Re-run it later. Until 12 October 2026 this code was called BLOCKED.
RATE_LIMITEDToo many searches too quickly. Space them out or shorten the run.
NETWORKBooking.com was unreachable or answered badly.
TIMEOUTThe search took longer than the run allowed.
PROXY_GROUP_IGNOREDA network option you set was not one this actor uses, so it carried on without it.

💡 What people use it for

  • Watching what a set of hotels charges for the same weekend, run daily.
  • Building a map layer of the properties in a district, with coordinates already on the row.
  • Checking your own property's price and score against the others on page one of its search.
  • Pulling a city's supply by type: how many apartments, how many hostels, at what prices.

🚧 What it does not do

  • About 1,000 properties per search. Booking stops serving new ones past that. Split a big city by district if you need more.
  • One price per property, for the room matched to your party. Not the full room list.
  • No review text. Scores and counts only. The reviews scraper linked below has the text.
  • No description, facilities list or photo gallery. One photo URL per row.
  • A past date is accepted without complaint, and so is a stay Booking has to guess at. Read checkIn on the row.
  • Nothing checks that Booking understood your destination. "Springfield" gets you whichever Springfield it picked. Use a district or a country for anything ambiguous.
  • Prices move. A row is what Booking quoted at scrapedAt, for that party, that day.
  • It is not an official Booking.com tool. Dami's Studio is independent and is not affiliated with or endorsed by Booking.com, or by any other company named on this page.

🧭 Which travel scraper do you need?

If you wantUse
Airbnb listings with prices, ratings and coordinates for a placeAirbnb Listings Scraper
Hotels on Booking.com with live prices and scores for your datesThis one
Live hotel prices for your dates, as Google Hotels shows themGoogle Hotels Scraper

❓ Questions people ask

Do I need a Booking.com account?

No. Nothing to paste, nothing that expires.

Why is the price different from what I see on the site?

Check the party and the dates on the row. Two adults in one room for one night in October is a different price from your browser's last search, and Booking's own currency conversion moves too.

Can I get more than 1,000 properties for a city?

Not in one search. Break the city into districts, or add a filter, and run those as separate destinations.

Does a sold-out property still come back?

Yes, with isSoldOut set. Filter it out if you only want bookable rooms.

Can I schedule it?

Yes. Run it each morning for the same stay and you have a price history keyed on hotelId.

Can I call it from code or connect it to an AI assistant?

Yes. The API tab has ready-made code for Python, JavaScript and the command line. For Claude, ChatGPT or another MCP client, connect https://mcp.apify.com/?tools=fetch-actor-details,dami_studio/booking-hotels-scraper. Either way the run happens on your Apify account at the same price.

These are public search results. Apify's write-up on the legality of web scraping is a good starting point, and we are not lawyers.

🆘 If something breaks

Open the Issues tab on the actor page. Send the destination, the dates and the run ID. If a diagnostic row landed, its status and details usually name the reason already.