Booking.com API & Scraper · Live Hotel Rates · $3.70/1k
Pricing
from $3.70 / 1,000 hotel lookups
Booking.com API & Scraper · Live Hotel Rates · $3.70/1k
Live Booking.com hotel rates as an API: search a destination or look a hotel up by name and get prices as JSON with a booking link. proxy_country prices the stay as seen from another country. By FlightPowers. $3.70 per 1,000 lookups. A hotel data API, not a booking engine.
Pricing
from $3.70 / 1,000 hotel lookups
Rating
0.0
(0)
Developer
Matan Rabi
Maintained by CommunityActor stats
0
Bookmarked
13
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Share
Booking.com API: live hotel rates as JSON
Live Booking.com hotel rates as an API: search a destination, or look a hotel up by the name a person would type, and get the live prices as flat JSON with the review score, the room type and a booking link. proxy_country prices the same stay as seen from another country, for rate-parity checks. $3.70 per 1,000 hotel lookups, and Apify's free plan comes with $5 of usage every month.
Built by FlightPowers. Run it from the Apify Console, the Apify API or a schedule, or give it to Claude, Cursor or ChatGPT as a tool through Apify's MCP server. It is a hotel data API, not a booking engine.
People use it three ways. Scan for rate gaps: a scheduled run samples one property from several countries. Put live hotel search in your app: call it from the Apify API and get room-level rates as JSON. Run an AI travel agent: add it as a tool through Apify's MCP server.
Booking.com rates API: why this one
Booking.com does not ship a public hotel-rates API for general use. The official Partner / Demand APIs require an approved OTA contract. What you need instead is the guest-facing rate, as JSON, without hunting for a property ID.
- hotel_by_name. Pass the name a person would type. Name resolution is built in. No property-ID scavenger hunt for a one-off check.
- proxy_country. Booking.com quotes different rates by point of sale. Set
de,us, oriland the request is priced as a visitor from that market. Run the same stay twice and compare. - Room-level, not one headline.
/hotelreturns every available room with type, meal plan, capacity, and price. - One shape for sold-out / not-found.
available: falseplus nulls. Your parser does not branch on an error format. - 24 real Booking.com filters on destination search (meals, facilities, review thresholds, stars, cancellation, payment).
Features
Search
- Destination search (
/search): free-text place, dates, adults/children, currency, nightly budget, filters - Hotel by name (
/hotel_by_name): free-text name plus dates; optionalareawhen the name is generic - Every room in one property (
/hotel): Booking.com path ID such ascy/four-seasons-limassol - ID resolve (
/resolve): name in,hotel_booking_idout, so later checks skip name matching
Result quality
- Flat JSON for search and by-name rows (name, numeric price, review score, image, booking link)
- Direct Booking.com
linkon every property proxy_countryas a two-letter ISO code; empty is the global pool, not a market pin- Live rates: nothing is served from a cache
Usage examples
Dates below are in late 2026 so a Console try-run still has inventory. Swap them for your own.
Example 1: Paris destination search
{"endpoint": "/search","destination": "Paris","checkin_date": "2026-12-01","checkout_date": "2026-12-05","adults": 2,"currency": "EUR","budget_per_night": 300,"filters": ["free_cancellation", "review_score_8"]}
Example 2: hotel by name
{"endpoint": "/hotel_by_name","hotel_name": "Ritz Paris","checkin_date": "2026-12-01","checkout_date": "2026-12-05","currency": "EUR"}
Example 3: rate parity via proxy_country
Run the same body more than once, changing only proxy_country (us, de, il).
{"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 ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("mtnrabi/booking-real-time-api").call(run_input={"endpoint": "/search","destination": "Paris","checkin_date": "2026-12-01","checkout_date": "2026-12-05","adults": 2,"currency": "EUR",})for hotel in client.dataset(run["defaultDatasetId"]).list_items().items:print(hotel.get("name"), hotel.get("price_string"), hotel.get("review_score"), hotel.get("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: '/hotel_by_name',hotel_name: 'Ritz Paris',checkin_date: '2026-12-01',checkout_date: '2026-12-05',currency: 'EUR',});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items[0]);
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
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
endpoint | string | yes | /search | /search, /hotel_by_name, /hotel, or /resolve |
destination | string | /search | Paris | Free-text place |
hotel_name | string | /hotel_by_name, /resolve | Free-text hotel name | |
area | string | Narrows a generic hotel name to one city or region | ||
hotel_booking_id | string | /hotel | Booking.com path ID, e.g. cy/four-seasons-limassol | |
checkin_date | string | priced endpoints | YYYY-MM-DD | |
checkout_date | string | priced endpoints | YYYY-MM-DD | |
adults | integer | 2 | Number of adults | |
children | integer | 0 | Number of children | |
currency | string | USD | Currency for all prices | |
budget_per_night | integer | Max nightly price for /search | ||
filters | string[] | [] | Any of the 24 Booking.com filters (destination search) | |
free_cancellation | boolean | false | For /hotel_by_name and /hotel | |
proxy_country | string | ISO-2. Empty is not a market pin |
/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
| Category | Filters |
|---|---|
| Cancellation | free_cancellation |
| Meals | breakfast_included, breakfast_and_lunch, breakfast_and_dinner, all_meals_included, all_inclusive |
| Facilities | free_wifi, swimming_pool, gym, parking, front_desk_24h |
| Review score | review_score_7, review_score_8, review_score_9 |
| Room facilities | private_bathroom, air_conditioning |
| Property rating | stars_3, stars_4, stars_5 |
| Travel group | pets_allowed, adults_only |
| Activities | sauna |
| Guest reviews | very_good_breakfast |
| Payment | accepts_online_payment |
Output format
Destination search
One dataset 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?..."}
Every row also carries latitude and longitude: the property's coordinates from Booking.com, as decimal numbers, null when Booking.com publishes none.
One hotel by name
Same fields plus available, nights, adults, children. Sold out or not found returns this 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 /hotel on every later check.
Use cases
- Rate-parity monitoring: same room, same dates, different
proxy_country - Competitive-set tracking for revenue managers
- Hotel price alerts when
pricedrops oravailableflips - AI travel agents that need a rate and a booking link in one hop
- Metasearch pages that cannot reconstruct a Booking.com URL
- Destination sweeps across a date range for demand charts
Integrations
Schedules. Save the input as a Task and run it on a cron. Each run appends a dataset.
Webhooks. On ACTOR.RUN.SUCCEEDED, fetch the dataset.
Automation. Use Apify connectors in n8n, Make, or Zapier.
Clients. Use apify-client for Python or JavaScript.
MCP and AI agents
Run this Actor as a tool in Claude, Cursor, ChatGPT or any MCP client through Apify's MCP server:
https://mcp.apify.com/?tools=actors,docs,mtnrabi/booking-real-time-api
Notes
- Results are live. A named hotel is fast; a broad destination search with several filters takes longer.
- Dates are
YYYY-MM-DD.proxy_countryis a two-letter lowercase code (us,de,il). budget_per_nightuses the currency you set.300withEURmeans 300 euro per night.- Leaving
proxy_countryempty is not the same as setting one. Empty uses the global residential pool. Setting a country pins the request to that market.
Frequently asked questions
Is there a Booking.com API? (Booking.com API alternative)
There is no public Booking.com API you can get a key for as a general developer. The official Partner / Demand APIs require an approved OTA (online travel agency) contract and are aimed at resellers, not at anyone who just needs the guest-facing rate. This Actor reads the public site and returns live public rates as JSON: destination search, hotel_by_name, room lists, and proxy_country geo-pricing. It is not Booking.com's Partner API and it does not book, hold, or ticket.
Does Booking.com have a public API I can get a key for?
No. Use this Actor on Apify (pay per event, one hotel_search per run).
Hotel rates by hotel name: how do I check one property?
Set endpoint to /hotel_by_name and pass hotel_name plus dates. Add area when the name is generic. For repeated checks, /resolve once, cache hotel_booking_id, then call /hotel.
Booking.com rates by country: how do I compare them?
Set proxy_country and run the same body more than once (us, de, il, …). Differences are real point-of-sale quotes.
Why available: false?
Sold out for those dates, or the name did not match. Same shape on purpose. Widen dates or add area.
How much does one search cost?
Pay per event: $3.70 per 1,000 hotel lookups (one hotel_search per run), plus a small per-result fee ($0.01 per 1,000 rows) and an Actor-start fee. Apify's free plan comes with $5 of usage every month. The Store pricing tab is authoritative.
Can Claude or Cursor call this as MCP?
Yes. Point an MCP client at the Apify MCP URL above and the Actor shows up as a tool.
Featured tasks
One-click clones on this Actor (created 2026-09-01):
- Paris hotels (Dec 2026 dates)
- Ritz Paris by hotel_by_name
- Ritz Paris rates from Germany (
proxy_country)
After you clone a task, save it and put it on a schedule if you want a rate history.
Related
- Google Flights API, live fares with Google's verdict, a round trip in one request: https://apify.com/mtnrabi/google-flights-real-time-api
Using this Actor? A rating helps other developers find it. Found a bug or need a field? Open an issue with the input you used and the output you got.
Last Updated: 2026.10.07