Booking.com Scraper: Hotel Prices by City & Date avatar

Booking.com Scraper: Hotel Prices by City & Date

Under maintenance

Pricing

from $1.00 / 1,000 hotel results

Go to Apify Store
Booking.com Scraper: Hotel Prices by City & Date

Booking.com Scraper: Hotel Prices by City & Date

Under maintenance

Search Booking.com by city, region, district, landmark or airport and get every available hotel with its price for your dates, star rating, review score, free cancellation and location. Filters, sorting, up to 10,000 hotels per search. Plain HTTP, no browser. Not affiliated with Booking.com.

Pricing

from $1.00 / 1,000 hotel results

Rating

0.0

(0)

Developer

Aleksandr Kobtsev

Aleksandr Kobtsev

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

5 days ago

Last modified

Share

Search Booking.com the way its own search box does, for any city, region, district, landmark, airport or country, and get every hotel that has rooms for your dates: the price for the stay and per night, star rating, review score and count, property type, free cancellation, meal plan, address, coordinates, distance from the centre and the hotel's page. One dataset row per hotel and check-in date, up to 10,000 hotels per place and date.

There is no login, no Booking.com account, no partner API and no browser. The Actor reads the same results list Booking.com's search page loads, over plain HTTP, which is why it runs in 512 MB, reads a hundred hotels in about a second and can be priced low. Run it once, put it on a schedule, or call it from the API, and forward the result to Google Sheets, Slack, Make, Zapier or an MCP client.

Who is this Booking.com scraper for?

You areWhat you runWhat you get
A hotel owner or revenue manageryour city, your star class, the next ten check-in datesthe market around you: who still has rooms, and at what price
A travel agency or deal sitea list of destinations, three datesa price list per destination, in your currency
An analyst or researcherone city, every hotelthe full supply of a city with ratings, types, coordinates and price spread
Building a productplaces through the APIclean rows to forward to a sheet, a database or a model

If you need to follow one named hotel on every date of the year, the companion Booking.com Hotel Price Monitor is the tool. If you need every room rate of a hotel with its cancellation and prepayment terms, use the Booking.com Hotel Price Calendar Scraper. This Actor answers a different question: which hotels are there, and what do they cost.

For what guests say about those hotels, the Booking.com Reviews Scraper takes the hotelId column of this Actor's output and returns their reviews, one row per review.

What makes this different from other Booking.com scrapers?

  • It reads a whole city. Booking.com's results list stops giving new hotels after about 1,000, however big the city. The Actor repeats the search by price band and then by property type and merges the lists. Measured on London on 11 October 2026: one query shows about 1,000 hotels, Booking.com's own count says about 2,970, and this Actor returned 3,096 in three minutes from the Apify datacenter pool (3,291 from a home address).
  • Every row is checked before it is billed. The dates Booking.com echoes back must be the dates you asked for, the price must be in your currency, and a hotel with no price is skipped. Your filters are checked again on every row, so nothing outside them is delivered or charged.
  • It says what the price contains. Booking.com quotes some prices with local taxes and some without, depending on the property and on where the request comes from. Each row carries Booking.com's own note, pricesIncludeTaxes, the amount added on top, and totalPriceWithTaxes, so rows compare with each other.
  • It names the place it searched. The matched place is in every row, and the run log lists the other places the name could have meant.
  • It is fast and cheap by construction. Fifty hotels take about five seconds and a whole country of 4,400 hotels about four minutes, in under 120 MB of memory, so the price per hotel stays low. It is on this page.

What data does it return?

One row per hotel and check-in date.

FieldWhat it is
destination, destinationTypeThe place that was searched, as Booking.com names it, and its kind: city, region, district, landmark, airport or country.
positionThe hotel's 1-based place in Booking.com's own list for your search. null for hotels found by the price-band re-search, which has no single order.
hotelId, hotelName, hotelUrlThe property. The link opens the hotel's page with your dates and guests already set. hotelId is the stable join key.
accommodationTypeId, accommodationTypeBooking.com's property type: Hotel, Apartment, Guest house, Hostel and so on. null name for an id that is not in Booking.com's list.
starRating1 to 5, or null for an unrated property.
reviewScore, reviewCount, reviewLabelThe guest review score out of 10, how many reviews, and Booking.com's word for it ("Very good"). null when there are no reviews.
address, city, countryCode, latitude, longitudeWhere it is. city is as the property wrote it, in whatever script.
locationLabel, distanceThe neighbourhood line and the distance ("0.9 km from centre", or from the landmark or airport you searched).
checkIn, checkOut, nights, adults, rooms, childrenAges, currencyThe stay this row priced.
totalPrice, pricePerNightThe lowest price for the whole stay as Booking.com printed it, and that divided by nights.
priceBeforeDiscountThe crossed-out price, when Booking.com shows one.
pricesIncludeTaxes, taxesAndChargesWhether totalPrice already contains taxes and charges (true, false, or null when the answer says neither), and Booking.com's note.
taxesAndChargesAmount, totalPriceWithTaxesThe taxes added on top for the stay, and the price with them. totalPriceWithTaxes is null only when the answer states nothing about taxes.
freeCancellation, freeCancellationUntilWhether the cheapest rate can be cancelled for free, and until when.
mealPlan, roomsLeftThe meal plan on the cheapest rate when it has one, and the number from "We have 3 left at this price".
photoUrlThe hotel's main photo.
scrapedAtWhen it was collected, ISO-8601 UTC.
{
"destination": "Batumi, Ajara, Georgia",
"destinationType": "city",
"position": 1,
"hotelId": "1054549",
"hotelName": "Hilton Batumi",
"hotelUrl": "https://www.booking.com/hotel/ge/hilton-batumi.html?checkin=2026-11-20&checkout=2026-11-22&group_adults=2&no_rooms=1&group_children=0&selected_currency=USD",
"accommodationTypeId": 204,
"accommodationType": "Hotel",
"starRating": 5,
"reviewScore": 8.1,
"reviewCount": 901,
"reviewLabel": "Very good",
"address": "Rustaveli Street #40",
"city": "Batumi",
"countryCode": "ge",
"latitude": 41.6493385306349,
"longitude": 41.6255879402161,
"locationLabel": "Old Boulevard , Batumi",
"distance": "0.9 km from centre",
"checkIn": "2026-11-20",
"checkOut": "2026-11-22",
"nights": 2,
"adults": 2,
"rooms": 1,
"childrenAges": [],
"currency": "USD",
"totalPrice": 292.03,
"pricePerNight": 146.01,
"priceBeforeDiscount": null,
"pricesIncludeTaxes": true,
"taxesAndCharges": "Includes taxes and charges",
"taxesAndChargesAmount": null,
"totalPriceWithTaxes": 292.03,
"freeCancellation": false,
"freeCancellationUntil": null,
"mealPlan": null,
"roomsLeft": 2,
"photoUrl": "https://cf.bstatic.com/xdata/images/hotel/square600/502839301.webp?k=cf269ee5ca92c953a82c477928a068e631eb6a3fdc4905dc207478685aae86b5&o=",
"scrapedAt": "2026-11-01T09:14:02.113Z"
}

What to do with it. Key rows on hotelId plus checkIn. Put the run on a daily schedule and keep every run's dataset to see a market move. Use totalPriceWithTaxes to compare hotels, pricePerNight and starRating to see the price spread of a class, and the coordinates to map it.

How do I scrape Booking.com hotels by city?

  1. Type a place into Places to search, one per line: Batumi, Manhattan, London Heathrow Airport. A pasted Booking.com search results link works too; only its destination is used.
  2. Choose the check-in date, nights and guests. Leave the date empty for tomorrow.
  3. Set Hotels per place and date. The default is 100.
  4. Add filters if you want a slice: star ratings, minimum review score, property types, free cancellation, breakfast, price per night.
  5. Run it. Download the dataset as JSON, CSV or Excel, or read it through the API.
FieldDefaultWhat it does
destinationsrequiredPlaces to search, one per line: cities, regions, districts, landmarks, airports, countries, or Booking.com search result links. Up to 50 per run.
startDatetomorrowFirst check-in date, YYYY-MM-DD (UTC). Today is allowed; a past date is moved to today.
days1Consecutive check-in dates from startDate, up to 30. Each date is its own search with its own rows.
nights1Length of stay.
adults2Adult guests. Occupancy changes the price and which hotels have rooms.
rooms1Rooms to price.
childrenAges[]Age of each child, e.g. [5, 9]. Booking.com prices children by age.
currencyUSDOne of 12 currencies. A result priced in another is skipped and not charged.
maxResults100The most hotels per place and date, 1 to 10,000. Above what one query reaches the Actor re-searches by price band and property type.
sortBypopularityBooking.com's own orders: popularity, price, best reviewed and lowest price, top reviewed, stars either way, distance from the centre.
starRatingsallKeep only these star ratings. Unrated properties cannot be asked for on their own.
minReviewScoreany6, 7, 8 or 9, as Booking.com's "Pleasant 6+" to "Superb 9+". Properties with no reviews are dropped when set.
propertyTypesallBooking.com's own groups: hotels, apartments, aparthotels, guest houses, hostels, bed and breakfasts, villas, holiday homes, homestays. They overlap by design.
freeCancellationOnlyfalseKeep only hotels whose cheapest rate can be cancelled for free.
breakfastIncludedfalseKeep only hotels whose cheapest rate includes a meal plan with breakfast.
minPricePerNight, maxPricePerNightnoneThe exact range of pricePerNight, in your currency.
concurrency2Place and date searches run at the same time. Pages of one search are read one after another.
proxyApify datacenterWhat the Actor is priced on. See the section on prices and countries.

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

One billed row is one hotel for one place and one check-in date. Nothing else is charged except the platform's own two small events.

EventPriceWhen
Hotel result$0.0015, falling to $0.001 by planPer hotel row that reaches the dataset
Actor start$0.00005Once per run; at 512 MB it is a single start event
Result$0.00001Per stored row, about one cent per thousand rows

The hotel price steps down with your Apify plan: $0.0015 on the free plan and on Bronze, $0.00125 on Silver, and $0.001 on Gold and above.

What that means for real jobs, all three charges included:

JobRowsFree planGold and above
100 hotels in one city100$0.15$0.10
1,000 hotels in one city1,000$1.51$1.01
All of London, about 3,100 hotels3,100$4.68$3.13
Five cities, 500 hotels each2,500$3.78$2.53
50 hotels in one city over 7 check-in dates350$0.53$0.35

Nothing is charged for a hotel without a price, in another currency, outside your filters, or for a page Booking.com refused to serve. Set Maximum total charge on the run to cap spending: the Actor stops cleanly at the budget and says so in the FAILED_SEARCHES record.

How this compares. On the Apify Store on 11 October 2026, Actors that return Booking.com search results charged between $0.001 and $0.005 per hotel on the free plan, some with extra events for details. Here the price above is the whole price of a row.

How deep can it go?

Booking.com's results list is capped in practice: a query stops giving new hotels after about 1,000, and its pages then repeat. For a city with more available hotels than that, asking for a large maxResults makes the Actor do the rest:

  1. read the first query as it is, in Booking.com's order, with real positions;
  2. repeat the search under Booking.com's price filter, band by band, halving any band that is still too big, and merge by hotel id;
  3. read each property type on its own, which reaches a slice the default list does not show: in London, about 200 holiday homes and 60 bed and breakfasts that no unfiltered list contained.
London, 20 November 2026, one night, two adultsHotels
One queryabout 1,000
Booking.com's own count for the searchabout 2,970
This Actor, from the Apify datacenter pool3,096 in 179 seconds
This Actor, from a home address in Georgia3,291 in 127 seconds

Rows found after the first thousand come in price-band order, not in your sortBy order, and have position: null. A smaller maxResults stops early, and nothing is re-searched while the first query already holds enough.

Prices, taxes and countries

Booking.com does not show everyone the same price. The country the request comes from decides which taxes are quoted on top and sometimes the price itself. What was measured on 11 October 2026, on 300 Batumi hotels for the same dates, asked from a Georgian home address and from the Apify datacenter pool:

  • From the datacenter pool, 273 rows quoted prices without taxes (pricesIncludeTaxes: false) and 27 stated nothing. From the home address, 254 quoted prices with taxes and 46 without.
  • 240 hotels were in both lists. For 21 the datacenter answer stated nothing about taxes. Of the other 219, after adding the taxes Booking.com listed, 152 agreed within 1 per cent, 137 of them within 0.05 per cent. 67 differed by 1 per cent or more: the median gap was zero, a quarter of the hotels were more than 8 per cent apart, and the extremes were 72 per cent dearer and 37 per cent cheaper from the datacenter. So Booking.com's price for a guest in Georgia is not always the datacenter price plus tax.

What this means for you:

  • Compare hotels with each other using totalPriceWithTaxes, all from one vantage point. That is what a market comparison needs, and it does not change between rows.
  • To see what a guest from a particular country would see, run through your own proxies in that country (Proxy, then Custom proxies). The country is a property of the exit address, and every row reports the regime it got.
  • The price is the cheapest rate Booking.com lists for the stay and occupancy you asked for. It is not a room price: for every room and its terms use the Hotel Price Calendar Scraper.

What does it not do?

  • Fully booked hotels are not in the list. Booking.com does not list a property that has no room for your dates, so it is not returned and not charged. A hotel that was there yesterday and is missing today has no rooms. To follow named hotels with an explicit sold-out flag, use the Hotel Price Monitor.
  • One price per hotel. The lowest rate, with its cancellation date and meal plan. Not every room type and rate.
  • Property types are Booking.com's. The propertyTypes groups overlap, and accommodationType carries the exact type for the rest.
  • English only. Names and labels come back in English. A property's own name and address stay in the script its owner wrote them in.
  • It does not collect guest reviews, photos beyond the main one, guest names or any personal data.

FAQ

Can I search several places and dates at once? Yes: up to 50 places and 30 check-in dates in a run. Each place and date is a separate search, and the dataset holds every row with its destination and checkIn.

Why does free cancellation leave so few hotels? The free window closes as check-in nears. Measured on Rome for a one-night stay starting the next day, 43 of 2,126 hotels still offered it; for dates six weeks out, 59 of the first 100 hotels in Batumi and 35 of the first 100 in Lisbon did. Ask for later dates, or leave the filter off and read freeCancellation and freeCancellationUntil on each row.

What if the place name is ambiguous? The Actor takes an exact match on the name, or else the first suggestion, as Booking.com's own search box would. Which place it matched is in every row, and the run log lists the other suggestions. To pick another, name it in full ("Georgia, United States") or paste its Booking.com search link.

Why does the number of hotels differ from the count Booking.com prints? The count varies by a few per cent from one request to the next and does not include every property the list can be read to: London was counted at about 2,970 and read at 3,096 to 3,291 distinct hotels. Rows here are the hotels that have a price for your stay, once each, merged by hotel id.

Does it work for countries and regions? Yes. Measured on Montenegro on 11 October 2026: 4,448 hotels in 223 seconds, 111 MB of memory. Set maxResults to what you need.

Do I need a Booking.com account or an API key? No.

Is it legal to scrape Booking.com? This is an unofficial tool, not affiliated with, endorsed by or connected to Booking.com or Booking Holdings Inc. It reads publicly visible prices and collects no personal data. Booking.com's terms of service restrict automated access, and you are responsible for making sure your use complies with those terms and with the law in your jurisdiction. See Apify's stance on web scraping legality.

Found a problem?

Open an issue on the Issues tab with the place, the dates and the run ID. Reports get read.