Booking.com Rates Scraper
Pricing
from $1.50 / 1,000 rate rows
Booking.com Rates Scraper
The Booking.com Rates Scraper prices named hotels across a whole range of check-in dates, lengths of stay and occupancies in one run, returning total and per-night rates, taxes, cancellation terms, sold-out dates and ~100 competitor rates per stay — ideal for revenue management and rate shopping.
Pricing
from $1.50 / 1,000 rate rows
Rating
0.0
(0)
Developer
FalconScrape
Maintained by CommunityActor stats
1
Bookmarked
3
Total users
2
Monthly active users
3 days ago
Last modified
Categories
Share
📈 Booking.com Rates Scraper
Track Booking.com hotel rates across a whole calendar in a single run. Name the properties you care about, give a range of check-in dates, the lengths of stay and the occupancies you sell — and get back one clean row per combination, ready to chart. Sold-out dates come back as rows too, so your rate history never has silent gaps. Try it right now with the default input.
Most Booking.com scrapers price one stay per run, which forces you to fake a rate calendar by scheduling sixty near-identical jobs and stitching the results together. This one takes the whole matrix as input.
Running on the Apify platform means you also get a REST API, scheduled runs, webhook integrations, proxy rotation and run monitoring — without maintaining any of it yourself.
✨ Features
- 🗓️ Whole date ranges, not single stays — give a first and last check-in date and every date in between is priced. Booking.com sells roughly 450 days ahead, and the Actor covers all of it.
- 🌙 Multiple lengths of stay — price 1, 2, 3, 7, 14 or 28 nights side by side and see exactly where minimum-stay pricing kicks in.
- 👥 Multiple occupancies — 1 to 6 adults, each priced separately, so you can see where the rate jumps to a larger unit.
- 🚫 Sold-out dates are real rows —
soldOut: truewith a null price. "Sold out" and "we failed to fetch" mean opposite things commercially, and this Actor never confuses them. - 🏨 Competitor rates for the same stay — switch on Include competitor rates and every cell also returns around 100 nearby properties priced for the exact same dates, occupancy and length of stay. That is a like-for-like comp set, not a separate search.
- 🔎 Paste anything to identify a property — a hotel name, a Booking.com property URL, or a property ID. All three resolve to the same property.
- 💱 20 currencies — rates are quoted in the currency you choose, not converted after the fact.
- ⚡ Fast and cheap — no browser needed. A 180-cell rate calendar for one hotel finishes in seconds.
🛠️ How to use Booking.com Rates Scraper
- List your properties — one per line: a hotel name (
The Savoy, London), a Booking.com property URL, or a property ID. - Set the check-in date range — the first and last check-in date you want priced. Leave it empty for the next 14 days.
- Pick lengths of stay and occupancies — every combination is priced. Two lengths of stay and two occupancies over 30 dates is 120 rate rows.
- Decide on competitor rates — leave Include competitor rates off for your own properties only, or switch it on to benchmark every rate against its local market.
- Set a limit and click Start. Rows stream into the dataset as they arrive.
- Download as JSON, CSV, Excel or HTML — or pull them from the API and load them straight into your BI tool.
📥 Input
Configure everything from the Input tab. Only the property list is required.
| Field | Type | Description |
|---|---|---|
hotels | array | Required. Properties to price — hotel names, Booking.com property URLs, or property IDs. |
checkinFrom | string | First check-in date, YYYY-MM-DD. Defaults to tomorrow. |
checkinTo | string | Last check-in date, YYYY-MM-DD. Defaults to 14 days of dates. Clamped to Booking.com's ~450-day horizon. |
losNights | array | Lengths of stay in nights. Each check-in date is priced once per length. Default ["1", "2"]. |
occupancy | array | Adult counts. Each date and length of stay is priced once per occupancy. Default ["2"]. |
currency | string | Currency for all rates. Default USD. |
includeCompetitors | boolean | Also return ~100 nearby properties priced for the same stay. Default false. |
maxItems | integer | Stop after this many rate rows for your properties. Default 100. |
proxyConfiguration | object | Proxy settings. Datacenter proxies are sufficient. |
Example input — a 90-day rate calendar for two hotels at two lengths of stay:
{"hotels": ["The Savoy, London", "https://www.booking.com/hotel/gb/claridge-s.en-gb.html"],"checkinFrom": "2026-09-01","checkinTo": "2026-11-29","losNights": ["1", "2"],"occupancy": ["2"],"currency": "GBP","includeCompetitors": false,"maxItems": 400}
📊 Output
One row per property × check-in date × length of stay × occupancy. You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.
[{"hotelId": 280149,"hotelName": "The Savoy","hotelUrl": "https://www.booking.com/hotel/gb/the-savoy.en-gb.html","slug": "the-savoy","stars": 5,"reviewScore": 9.4,"reviewsCount": 1446,"checkin": "2026-08-19","checkout": "2026-08-21","nights": 2,"adults": 2,"rooms": 1,"soldOut": false,"currency": "USD","totalPrice": 2107.47,"pricePerNight": 1053.73,"priceBeforeDiscount": null,"taxesAndCharges": null,"roomName": null,"mealPlan": null,"breakfastIncluded": false,"freeCancellation": true,"freeCancellationUntil": "2026-08-17T23:00:00Z","noPrepayment": true,"geniusRateAvailable": false,"address": "Strand","district": "Westminster Borough, London","distanceFromCentre": "0.6 km from centre","city": "London","countryCode": "gb","latitude": 51.5102983,"longitude": -0.1208603,"isCompetitor": false,"comparedToHotelId": null,"comparedToHotelName": null,"scrapedAt": "2026-08-15T09:39:12.534Z"},{"hotelId": 10550,"hotelName": "Hotel Okura Amsterdam","checkin": "2026-09-10","checkout": "2026-09-12","nights": 2,"adults": 2,"soldOut": true,"currency": "EUR","totalPrice": null,"pricePerNight": null,"isCompetitor": false,"scrapedAt": "2026-08-15T09:47:03.881Z"}]
Data fields
| Field | Description |
|---|---|
hotelId, hotelName, hotelUrl, slug | Property identity and link |
checkin, checkout, nights, adults, rooms | The exact matrix cell this rate belongs to |
soldOut | true when the property has no availability for this cell — the price fields are then null |
totalPrice, pricePerNight, currency | Cheapest available rate for this cell, for the whole stay and per night |
priceBeforeDiscount, taxesAndCharges | Pre-discount rate and excluded taxes/fees, where Booking.com publishes them |
roomName, bedrooms, beds | The room type the rate was matched to |
mealPlan, breakfastIncluded | What the rate includes |
freeCancellation, freeCancellationUntil, noPrepayment, geniusRateAvailable | Booking conditions attached to the rate |
stars, reviewScore, reviewsCount | Property quality signals, for normalising comparisons |
address, district, distanceFromCentre, city, countryCode, latitude, longitude | Location |
isCompetitor, comparedToHotelId, comparedToHotelName | false for your properties; on competitor rows, which property they were pulled alongside |
scrapedAt | When the rate was captured — the timestamp your time series is keyed on |
💰 How much does it cost to scrape Booking.com rates?
This Actor uses pay per event pricing — you pay for the rates you receive, not for time spent running.
| Event | Price | Fires |
|---|---|---|
| Rate row | $0.0015 | Per priced stay for one of your properties, sold-out dates included |
| Competitor rate row | $0.0001 | Per nearby property priced for the same stay, only when competitor rates are on |
That works out at $1.50 per 1,000 rates — well below the going rate for Booking.com price data, because a rate calendar is a high-volume product by nature.
| Job | Rate rows | Cost |
|---|---|---|
| One hotel, 90 check-in dates, 2 lengths of stay | 180 | $0.27 |
| Ten hotels, 90 check-in dates, 2 lengths of stay | 1,800 | $2.70 |
| Ten hotels, 90 dates, 2 lengths of stay, daily for a month | 54,000 | $81 |
| One hotel, 90 dates, 2 lengths of stay, with competitor rates | 180 + ~18,000 | $2.09 |
Apify's free plan includes $5 of monthly usage, which covers roughly 3,300 rates at no cost.
💡 Tips
- Start small. Run one property over a few dates first to confirm it resolves to the property you meant — the log prints the name it matched.
- Property URLs and IDs are the safest input. A hotel name is resolved through Booking.com's own search, which is reliable but ambiguous for chains with many branches in one city.
- Watch the multiplication. Rate rows are properties × dates × lengths of stay × occupancies. Ten hotels over 90 dates with 3 lengths of stay and 2 occupancies is 5,400 rows.
maxItemsis your seatbelt. - Schedule it daily. Run the same input on a schedule and key on
scrapedAt— the difference between runs is your rate movement, and the difference between your rate and the comp set is your position. - Sold-out rows are data. Keep them. A property that goes sold-out 60 days out on every weekend in October is telling you something a missing row cannot.
- Competitor rows are near-free. They cost nothing extra to fetch, which is why they are priced 15× lower than your own rates. Switch them on when you want market context, off when you only need your own calendar.
- The horizon is real. Booking.com loads inventory about 450 days ahead. Dates beyond that are clamped rather than returned as a wall of false "sold out".
❓ FAQ
Is scraping Booking.com legal? This Actor collects only publicly available information — the same rates any visitor sees without logging in. It does not collect private personal data and does not bypass any login. Web scraping of public data is broadly legal, but how you use the data is your responsibility. Consult a lawyer if you are unsure.
Does it return every room type and rate plan? No. Each cell returns the cheapest available rate matching that occupancy, which is what rate shopping actually compares. A full room-type × meal-plan × cancellation-policy grid is not part of this Actor.
Why is roomName sometimes empty?
Booking.com does not always attach a room label to the cheapest matched offer, particularly for hotels. The price is still the rate for that stay.
Why did a price not change when I went from 1 adult to 2? Because the same room was matched for both. Rates move when the occupancy forces a larger unit — that is Booking.com's own pricing behaviour, not a gap in the data.
How many competitors do I get? Around 100 per cell, drawn from the same city as your property and priced for the identical stay. They vary slightly by date and availability.
Do I need residential proxies? No. Datacenter proxies — the default — are sufficient and cheaper.
Can I track a whole city instead of named properties? Not with this Actor — it is built around named properties and their comp sets. For city-wide listings with prices, use the Booking.com Listings Scraper instead.
Something is broken or missing. Open an issue on the Issues tab of this Actor and it will be looked at. Need a custom version, a different output shape, or another data source? Get in touch — custom solutions are available.