Hotel Search API
One destination in, ranked live rates out
POST /search takes a free-text destination and dates; returns properties with live prices, review scores, room types and booking links.
- Free-text
destination: “Paris”, “Tokyo Shibuya”, even a hotel name - 24 filters plus
budget_per_night, matching the Booking.com UI - Every property ships with a working booking link, image, review score and review count
Free tier on RapidAPI. No card to try.
{
"destination": "Lisbon",
"checkin_date": "2026-10-09",
"checkout_date": "2026-10-12",
"adults": 2,
"currency": "EUR",
"filters": [
"review_score_8",
"free_cancellation"
]
}The response this exact request produced is rendered below, labelled as a captured run.
The response, rendered
What came back for Lisbon
Six of the properties returned by the request above, filtered to review score 8+ with free cancellation, priced in EUR for a 3-night stay.
| Property | Room | Score | Reviews | Total, 3 nights | |
|---|---|---|---|---|---|
| Avenue Hostel & Suites | Twin Room with Shared Bathroom | 8.2 | 2,392 | €215 | link → |
| Oscar Concept Apartments | Standard Studio | 9.2 | 1,828 | €452 | link → |
| HF Fénix Urban | Economy Double or Twin Room | 8.8 | 2,434 | €509 | link → |
| WC by The Beautique Hotels | Superior Double Room | 8.6 | 2,457 | €540 | link → |
| Dorma Liberdade | Double or Twin Room | 8.6 | 3,774 | €521 | link → |
| Vila Garden Guesthouse | Double Room | 9.1 | 1,868 | €454 | link → |
Each row is one object in the properties array: price is the stay total as a number, price_string the formatted version, and link a working Booking.com URL for exactly that room and dates.
Request fields
The field is destination, not location
The one trap on this endpoint, stated up front: the required search field is named destination. Send location instead and the API returns a 400 with a clear message naming the fields it needs.
Required
destinationstringFree text, the way a person would type it: “Paris”, “Tokyo Shibuya”, “Hilton NYC”. Not location (that name 400s).
checkin_date / checkout_datestringYYYY-MM-DD.
Optional
adultsintDefaults to 2.
childrenintDefaults to 0.
currencystringDefaults to USD.
budget_per_nightnumberMax price per night, in the currency you set: 300 with "currency": "EUR" means 300 EUR per night.
proxy_countrystringTwo-letter code: price the search from that market. See geo-pricing.
filtersstring[]Any of the 24 values below.
Call it from your stack
curl -X POST "https://booking-live-api.p.rapidapi.com/search" \
-H "Content-Type: application/json" \
-H "x-rapidapi-host: booking-live-api.p.rapidapi.com" \
-H "x-rapidapi-key: $RAPIDAPI_KEY" \
-d '{
"destination": "Lisbon",
"checkin_date": "2026-10-09",
"checkout_date": "2026-10-12",
"adults": 2,
"currency": "USD"
}'filters
All 24 filters, by category
The same facets Booking.com shows its own users. Pass any combination as a filters array.
| Category | Filters |
|---|---|
| Cancellation | free_cancellation |
| Meals | breakfast_includedbreakfast_and_lunchbreakfast_and_dinnerall_meals_includedall_inclusive |
| Facilities | free_wifiswimming_poolgymparkingfront_desk_24h |
| Review score | review_score_7review_score_8review_score_9 |
| Room facilities | private_bathroomair_conditioning |
| Property rating | stars_3stars_4stars_5 |
| Travel group | pets_allowedadults_only |
| Activities | sauna |
| Guest reviews | very_good_breakfast |
| Payment | accepts_online_payment |
Pricing
Every plan carries this endpoint
| Plan | Price / mo | Requests | $ / 1k req | Overage | Rate limit | |
|---|---|---|---|---|---|---|
| BASIC | Free | 10 / mo | — | hard cap | 250 / min | Get this plan → |
| PRO | $10 | 2,000 / mo | $5.00 | $0.006 / req | 25 / min | Get this plan → |
| ULTRA | $20 | 6,500 / mo | $3.08 | $0.003 / req | 25 / min | Get this plan → |
| MEGA | $50 | 25,000 / mo | $2.00 | $0.002 / req | 50 / min | Get this plan → |
Every plan includes every endpoint. You only choose volume and rate limit. Read from the live listing on 2026-08-26; the listing is authoritative.
Questions, answered plainly
- Why did I get a 400 about missing fields?
- The usual cause: the request sent location instead of destination. The three required fields are destination, checkin_date and checkout_date. The 400 body names them plainly. destination appears in the request; a location string can appear per property in the response. They are different fields.
- What can destination be?
- Free text, the way a person would type it: a city ("Paris"), a neighbourhood ("Tokyo Shibuya"), even a hotel name ("Hilton NYC"). No destination IDs to look up first.
- Is price per night or for the stay?
- The price on each property is the total for the stay: the response carries nights, so a nightly rate is one division away. budget_per_night, by contrast, is per night, in whatever currency you set: 300 with "currency": "EUR" means 300 EUR per night.
- How do the filters work?
- Pass a filters array with any of the 24 documented values. They match the facets Booking.com shows its own users, from free_cancellation to all_inclusive to stars_5. The full list is on this page.
- Can I price a destination from another country?
- Yes. /search accepts proxy_country like every other endpoint. A two-letter code routes the request through a residential proxy in that market; leave it out and the request uses the global pool. The geo-pricing page shows a real captured spread.
- How fresh are the prices?
- Every search runs against Booking.com at request time: nothing is cached. That is also why response time tracks how much work Booking.com has to do for the query.
Start with one destination
Live Booking.com rates with review scores, room types and booking links, as flat JSON your code or your agent can use directly.
Free tier: 10 requests/month. No card to try.