Request a tool
All toolsAutomationsGuidesMCP serverRequest a toolPlatformsCategories
Booking.com Hotels Scraper icon

Booking.com Hotels Scraper

Scrape Booking.com hotels by destination and dates. Live prices, guest review scores, star ratings, coordinates and room types. $1.00 per 1,000 properties.

127 runs on Apify $0.001 per booking.com property ($1 / 1,000)
Run this in the cloudRun on Apify →

Developer & Research Tools

How it works

  1. 1
    Open it on Apify

    Hit Run on Apify — it opens the tool in the cloud, no install.

  2. 2
    Set the inputs

    Adjust destinations, checkIn, checkOut (sensible defaults are pre-filled).

  3. 3
    Click Run

    The tool runs on Apify’s cloud and collects the data for you.

  4. 4
    Export the results

    Download as JSON, CSV or Excel, or pipe straight into your app, Google Sheets, or an AI agent.

Pricing

$0.001 per booking.com property = $1 per 1,000

You are charged forWhenPrice
Booking.com property returnedCharged once per real Booking.com property row. Diagnostics, the empty-input sample, retries and duplicates dropped during pagination are never charged.$0.001

Pay-per-event pricing: you are billed per result, not per subscription. Billing is handled by Apify on your own account. These are the live Apify store prices, in effect since 2026-08-10, and they are what you are actually charged.

Inputs

FieldWhat it doesType
destinationsWhat to search. Anything Booking.com's own search box accepts works: a city ("Paris"), a district ("Manhattan, New York"), a landmark ("Eiffel Tower"), an airport ("JFK Airport"), a country ("Japan") or a specific property name ("Hilton Paris Opera"). Up to 20 per run.array
checkInStart of the stay. Booking.com only quotes prices for a concrete stay, so if you leave this empty the actor uses a 1-night stay 30 days from now and writes the dates it used onto every row.string
checkOutEnd of the stay. Must be after check-in. Defaults to one night after check-in.string
adultsAdults per room. Changes which rooms are matched and therefore the quoted price.integer
roomsNumber of rooms requested.integer
childrenAgesOne entry per child, each the child's age in years (0-17). Leave empty for an adults-only search.array
maxItemsPerDestinationHow many properties to return for each destination. Booking.com stops serving new properties at roughly 1,000 per search, which is the hard cap here.integer
sortBySort order, using Booking.com's own sorters. "popularity" is the site default (Our top picks).string
currencyThree-letter currency code. Booking.com converts the quoted price into it.string
languageLanguage for the human-readable text fields (neighborhood, distance, review word, room type).string
minPricePerNightBooking.com's own budget filter, in the selected currency, per night. Leave empty for no minimum.integer
maxPricePerNightBooking.com's own budget filter, in the selected currency, per night. Leave empty for no maximum.integer
minStarsOnly return properties with at least this star rating (1-5). Leave empty for any.integer
minReviewScoreBooking.com only offers four review-score buckets. Pick one, or leave empty for any score. Note that Booking.com's own filter still lets brand-new properties with zero reviews through - those rows come back with reviewScore 0 and reviewsCount 0.string
propertyTypeRestrict to one Booking.com property type. Leave empty for all types.string
freeCancellationOnlyOnly return properties whose matched room offers free cancellation.boolean
breakfastIncludedOnly return properties whose matched room includes breakfast.boolean

What you get

A structured dataset — each result includes fields like:

namepricePerNightcurrencyreviewScorereviewsCountstarRatingcityneighborhoodroomTypefreeCancellationurl

Export every run as JSON, CSV or Excel, or send it to your app, a database, Google Sheets, or an AI agent.

Related tools in Developer & Research Tools

Other ready-to-run tools in the same category — all pay-per-use on the Apify cloud.

GitHub Scraper iconDeveloper & Research Tools

GitHub Scraper

Search GitHub repos and users: stars, forks, language, topics, licence, plus user bio, company and followers. No token needed. $0.90 per 1,000 rows.

18 use cases

Stack Overflow / Stack Exchange Scraper iconDeveloper & Research Tools

Stack Overflow / Stack Exchange Scraper

Search Stack Overflow and Stack Exchange by keyword or tag. Score, answer count, views, reputation and body text. $2 per 1,000 questions.

2 use cases

Package Registry Scraper (npm + PyPI) iconDeveloper & Research Tools

Package Registry Scraper (npm + PyPI)

Get npm and PyPI package metadata as JSON. Version, license, author, repo, keywords and npm monthly downloads. $2 per 1,000 packages.

2 use cases

arXiv Scraper iconDeveloper & Research Tools

arXiv Scraper

Search arXiv papers by title, author, abstract or category. Get full abstracts, authors, categories, DOI, dates and PDF links. $2 per 1,000 papers.

2 use cases

OpenAlex Scholarly Works Scraper iconDeveloper & Research Tools

OpenAlex Scholarly Works Scraper

Search 250M+ OpenAlex papers with no API key. Get titles, authors, venue, year, citations, DOI, OA links and full abstracts. $2.00 per 1,000 papers.

2 use cases

Crossref Scholarly Works Scraper iconDeveloper & Research Tools

Crossref Scholarly Works Scraper

Search 150M+ papers on Crossref: DOI, title, authors, journal, publisher, date, citations and abstract. No API key. $1.00 per 1,000 works.

2 use cases

See all Developer & Research Tools →

Booking.com Hotels Scraper: properties, live prices and scores for a destination and a date

Type a destination and a pair of dates and you get one row per 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 its wall, not a setting here.

InputDestinations, plus check-in and check-out dates
OutputOne row per property
CeilingAbout 1,000 properties per destination, 20 destinations per run
Account neededNone
Price$1.00 per 1,000 properties, which is $0.001 each, flat on every plan

🏨 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 you give it

{
  "destinations": ["Paris", "Lisbon"],
  "checkIn": "2026-10-06",
  "checkOut": "2026-10-07",
  "adults": 2,
  "rooms": 1,
  "maxItemsPerDestination": 100,
  "sortBy": "popularity",
  "currency": "USD"
}
FieldWhat it is
destinationsUp to 20 per run. A city, a district ("Manhattan, New York"), a landmark, an airport, a country, or one property by name. The form arrives with Paris in it.
checkIn, checkOutThe 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, childrenAgesThe party. 1 to 30 adults and rooms, and one entry per child with their age in years. The form arrives with 2 adults in 1 room.
maxItemsPerDestinationProperties per destination, 1 to 1,000. The form arrives with 100.
sortByBooking'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, language39 currencies and 29 languages. The language only changes the human-readable fields: neighborhood, distance, the review word, the room name.
minPricePerNight, maxPricePerNightBooking's budget filter, per night, in the currency you picked.
minStars1 to 5 stars, or leave it out for any.
minReviewScoreBooking offers four buckets and no more: 60, 70, 80 or 90.
propertyTypeOne of hotels, apartments, hostels, guesthouses, bed_and_breakfasts, villas, vacation_homes, homestays, entire_homes_and_apartments.
freeCancellationOnly, breakfastIncludedKeep only properties whose matched room offers that.
proxyConfigurationNot needed for a normal run. Worth switching on only if a very large run starts hitting rate limits.

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

📤 What you get back

A real row from a real run, 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"
}
FieldWhat it is
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.
latitude, longitude, neighborhood, distanceFromCenterCoordinates as numbers, the rest as text in your chosen language.
isSoldOut, availabilityMessageA sold-out stay still returns a row. Check this before treating a price as bookable.
checkIn, checkOut, nights, adults, rooms, childrenThe search that produced the row, copied onto it, so a dataset mixing several searches stays readable.
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
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.
BLOCKEDThe search did not come through.
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.

▶️ How to run it

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.

💰 How much does it cost?

$1.00 per 1,000 properties, which is $0.001 each. Flat on every Apify plan, no volume tiers.

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 people use it for

  • Watching what a set of hotels charges for the same weekend, run daily.
  • Building a map layer of every property 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.
  • Feeding a travel site or a bot with live prices for a specific stay rather than a rate card.

🚧 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.

🧭 Which travel scraper do you need?

If you wantUse
Properties, prices and scores for a destinationThis one
The guest reviews on one propertyBooking.com Reviews Scraper
Hotel prices as Google shows themGoogle Hotels Scraper
Flights instead of roomsSkyscanner Flights 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.

Is scraping Booking.com legal? 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.