Booking.com Scraper | Live Hotel Prices & Availability avatar

Booking.com Scraper | Live Hotel Prices & Availability

Pricing

from $0.01 / 1,000 results

Go to Apify Store
Booking.com Scraper | Live Hotel Prices & Availability

Booking.com Scraper | Live Hotel Prices & Availability

Live Booking.com hotel prices and availability. Search a destination or look up a hotel by name for real-time room rates, review scores and direct booking links. Per-country pricing for rate parity checks. Ideal for price monitoring, revenue management, travel apps and AI agents.

Pricing

from $0.01 / 1,000 results

Rating

0.0

(0)

Developer

Matan Rabi

Matan Rabi

Maintained by Community

Actor stats

0

Bookmarked

9

Total users

0

Monthly active users

3 days ago

Last modified

Share

๐Ÿจ Booking.com Hotel Scraper and Live Price API

Live Booking.com room rates and availability in one call. Search a destination, look a hotel up by name, or pull every room in one property, with review scores and a direct booking link on every result.

Every query hits Booking.com at the moment you call it. Nothing comes from a cache, so the rate you get back is the rate the guest will be quoted. Every run in the last 30 days succeeded.

๐ŸŒŸ Why choose this Booking.com scraper

No property ID hunting. Most hotel scrapers make you find an internal ID before you can ask anything useful. Here you pass the hotel name a human would type and get pricing back in one call. Name resolution is built in.

Room-by-room pricing, not one headline rate. Pull every room in a property with its type, meal plan, guest capacity and price. That is what you need to answer "what does a double with breakfast actually cost", which a single nightly rate cannot.

Price by market. Booking.com quotes different rates depending on where the visitor is browsing from. Set a country and the request routes through a residential proxy there. Run the same room from us, de and il and compare. That turns this from a hotel scraper into a rate parity and geo pricing monitor, which is a different and better funded buyer.

The real filter set. All 24 filters from the Booking.com interface, including meal plans, review score thresholds, star ratings, facilities and cancellation policy, plus a maximum nightly budget.

One shape for every outcome. Sold out, not found and no availability all return the same object with available: false and nulls. Your parser never has to branch on an error format.

Flat JSON. No HTML, no nested scrape output to flatten before you can use it.

๐Ÿšฆ Four things it does

TaskWhat you give itWhat you get
Search a destinationFree text place, datesRanked properties with prices, review scores, room types, images and booking links
Look up one hotel by nameHotel name, datesThat property's availability, price, review score and booking link
List every room in a hotelBooking.com hotel ID, datesEvery available room with type, meal plan, capacity and price
Find a hotel's IDHotel nameThe Booking.com identifier, so you can call the room lookup directly from then on

๐Ÿ“– Usage examples

From the Apify Console

Pick a task, fill in the destination or hotel name and your dates, press Start. The form is prefilled with a working Paris search, so you can run it once before typing anything.

Example 1: hotels in a city, filtered

{
"endpoint": "/search",
"destination": "Lisbon",
"checkin_date": "2026-12-01",
"checkout_date": "2026-12-05",
"adults": 2,
"currency": "EUR",
"budget_per_night": 250,
"filters": ["free_cancellation", "review_score_8", "swimming_pool"]
}

Example 2: is this specific hotel available

{
"endpoint": "/hotel_by_name",
"hotel_name": "Ritz Paris",
"checkin_date": "2026-12-01",
"checkout_date": "2026-12-05",
"currency": "EUR"
}

Example 3: rate parity check across three markets

Run the same request three times, changing only proxy_country, and compare the prices that come back.

{
"endpoint": "/hotel_by_name",
"hotel_name": "Ritz Paris",
"checkin_date": "2026-12-01",
"checkout_date": "2026-12-05",
"currency": "EUR",
"proxy_country": "de"
}

Example 4: every room in one property

{
"endpoint": "/hotel",
"hotel_booking_id": "cy/four-seasons-limassol",
"checkin_date": "2026-12-01",
"checkout_date": "2026-12-05",
"adults": 2,
"free_cancellation": true
}

Python

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("mtnrabi/booking-real-time-api").call(run_input={
"endpoint": "/search",
"destination": "Lisbon",
"checkin_date": "2026-12-01",
"checkout_date": "2026-12-05",
"currency": "EUR",
"budget_per_night": 250,
"filters": ["free_cancellation", "review_score_8"],
})
for hotel in client.dataset(run["defaultDatasetId"]).list_items().items:
print(hotel["name"], hotel["price_string"], hotel["review_score"], hotel["link"])

JavaScript

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('mtnrabi/booking-real-time-api').call({
endpoint: '/search',
destination: 'Paris',
checkin_date: '2026-12-01',
checkout_date: '2026-12-05',
budget_per_night: 300,
filters: ['free_cancellation', 'breakfast_included', 'stars_4'],
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();

REST

curl -X POST "https://api.apify.com/v2/acts/mtnrabi~booking-real-time-api/run-sync-get-dataset-items" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $APIFY_TOKEN" \
-d '{
"endpoint": "/search",
"destination": "Paris",
"checkin_date": "2026-12-01",
"checkout_date": "2026-12-05",
"adults": 2,
"currency": "EUR"
}'

๐Ÿ” Input parameters

ParameterTypeRequiredDefaultDescription
endpointstringโœ…/search/search, /hotel_by_name, /hotel or /resolve
destinationstringโœ…*ParisFree text place. Used by /search
hotel_namestringโœ…*Free text hotel name. Used by /hotel_by_name and /resolve
areastringNarrows a generic hotel name to one city or region
hotel_booking_idstringโœ…*Booking.com path ID such as cy/four-seasons-limassol. Used by /hotel
checkin_datestringโœ…*YYYY-MM-DD. Not needed for /resolve
checkout_datestringโœ…*YYYY-MM-DD. Not needed for /resolve
adultsinteger2Number of adults
childreninteger0Number of children
currencystringUSDCurrency for all prices
budget_per_nightintegerMax nightly price, in the currency you set
filtersstring[][]Any of the 24 filters below. Applies to /search
free_cancellationbooleanfalseFor /hotel_by_name and /hotel
proxy_countrystringTwo letter code. Prices the request as a visitor from that country

* Required fields depend on the task you pick. /search needs a destination and dates, /hotel_by_name needs a name and dates, /hotel needs an ID and dates, /resolve needs only a name.

The 24 filters

CategoryFilters
Cancellationfree_cancellation
Mealsbreakfast_included, breakfast_and_lunch, breakfast_and_dinner, all_meals_included, all_inclusive
Facilitiesfree_wifi, swimming_pool, gym, parking, front_desk_24h
Review scorereview_score_7, review_score_8, review_score_9
Room facilitiesprivate_bathroom, air_conditioning
Property ratingstars_3, stars_4, stars_5
Travel grouppets_allowed, adults_only
Activitiessauna
Guest reviewsvery_good_breakfast
Paymentaccepts_online_payment

๐Ÿ“Š Output format

One row per property.

{
"name": "Kremlin Palace",
"price_string": "US$2,434",
"price": 2434,
"review_score": 8.4,
"review_count": 701,
"room_type": "Superior Double or Twin Room",
"location": "2.9 km from downtown",
"image_url": "https://cf.bstatic.com/xdata/images/hotel/square240/501059778.webp?k=...",
"link": "https://www.booking.com/hotel/tr/kremlin-palace.html?..."
}

One hotel by name

{
"name": "Kremlin Palace",
"available": true,
"price_string": "US$2,434",
"price": 2434,
"review_score": 8.4,
"review_count": 701,
"room_type": "Superior Double or Twin Room",
"image_url": "https://cf.bstatic.com/xdata/images/hotel/square240/501059778.webp?k=...",
"link": "https://www.booking.com/hotel/tr/kremlin-palace.html?...",
"nights": 9,
"adults": 2,
"children": 0
}

Sold out or not found returns this same shape with "available": false and nulls.

Every room in one property

{
"hotel_booking_id": "it/boffenigoboutiquegarda",
"checkin_date": "2026-05-01",
"checkout_date": "2026-05-10",
"booking_url": "https://www.booking.com/hotel/it/boffenigoboutiquegarda.html?...",
"rooms": [
{
"room_type": "Classic Double Room",
"room_economy": "Exceptional breakfast included",
"guests": 2,
"price_as_number": 2511,
"price": "โ‚ฌ 2,511"
}
]
}

Hotel ID lookup

{
"hotel_name": "Kremlin Palace Antalya",
"hotel_booking_id": "tr/kremlin-palace",
"matched_name": "Kremlin Palace"
}

Cache that ID and call the room lookup directly on every check after that.

๐ŸŽฏ Use cases

  • Rate parity monitoring. Same room, same dates, different proxy_country. Compare what each market is quoted and catch disparities.
  • Competitive set tracking for revenue managers. Put your comp set through the hotel name lookup on a schedule and watch their rates move against yours.
  • Hotel price alerts. Watch one property and fire when price drops or available flips.
  • AI travel agents. Flat JSON straight into a tool call, with a booking link on every row.
  • Metasearch and comparison sites. Every property comes with a working link, image, review score and review count.
  • Market and demand analysis. Sweep a destination across a range of dates and chart how rates move by day of week and lead time.

๐Ÿ”Œ Integrations

Schedules. Save a search as a Task and put it on a cron. 0 8 * * * checks your comp set every morning.

Webhooks. Fire ACTOR.RUN.SUCCEEDED at your own endpoint to push rates into your database as each run finishes.

Make, Zapier and n8n. Route results into a sheet, an alert or a BI tool without writing code.

Python and JavaScript clients. apify-client on PyPI and npm.

๐Ÿค– Use it from an AI agent over MCP

Available through Apify's MCP server, so Claude, Cursor, ChatGPT or any MCP capable client can check hotel prices as a tool.

https://mcp.apify.com/?tools=actors,docs,mtnrabi/booking-real-time-api

There is also an OpenClaw skill on the same backend: clawhub.ai/mtnrabi/booking-hotel-search

๐Ÿ“ Notes worth reading before your first run

Results are live, so response time tracks how much work Booking.com has to do. A single named hotel is fast. A broad destination search with several filters takes longer.

Dates are YYYY-MM-DD. proxy_country is a two letter lowercase code such as us, de or il.

budget_per_night uses whatever currency you set. 300 with EUR means 300 euro per night, not dollars.

Leaving proxy_country empty is not the same as setting one. Empty routes through the global residential pool. Setting a country pins the request to that market, which is what you want for parity checks.

โ“ Frequently asked questions

Does Booking.com have a public API?

Not for general use. Booking.com's affiliate and demand APIs require an approved partner agreement, and they are aimed at resellers rather than at anyone who just needs pricing data. This Actor reads the public site directly and gives you the rates as JSON.

How do I check hotel prices without writing a scraper?

Pick a task, fill in the form, press Start. Writing your own means maintaining a headless browser, rotating residential proxies by country, and repairing your parser every time Booking.com changes its markup. That is the work this already does.

Can I compare the same hotel's price in different countries?

Yes, and it is the feature most people miss. Set proxy_country and run the same request more than once with different codes. Booking.com genuinely quotes different rates by point of sale, so the differences you see are real.

How do I monitor hotel prices over time?

Save the search as a Task, schedule it, and send each run to your own storage with a webhook. Price and review score come back on every row, so you get a rate history and a reputation history from the same run.

Can I use this for hotel market research or competitor analysis?

Yes. The destination search returns ranked properties with price, review score, review count and room type, which is the raw material for a comp set report. Run it across a date range to separate a genuine rate change from a weekend effect.

What do I do if I only know the hotel name, not its ID?

Use the hotel name lookup, which resolves the name and returns pricing in one call. If you plan to check the same property repeatedly, use the ID lookup once, cache the ID, and call the room endpoint directly from then on.

Why did a search come back with available: false?

Either the property is sold out for those dates, or the name did not match anything. Both return the same shape deliberately, so your code does not need a separate error path. Try widening the dates or adding an area to disambiguate a generic name.

Can Claude call this as an MCP tool?

Yes. Point your MCP client at the URL in the MCP section above.


Using this Actor? A rating takes ten seconds and helps other developers find it. Found a bug or need a field that is not here? Open an issue with the input you used and the output you got, and I will answer.