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.
Short answer
What a hotel destination search returns
POST /v1/hotels/search on api.flightpowers.com (the same endpoint is /search on booking-live-api.p.rapidapi.com with a RapidAPI key) takes a free-text destination plus checkin_date and checkout_date, and returns live Booking.com properties: name, the total price for the stay, review score and count, room type, an image and a booking link. Nothing is cached; every search runs against Booking.com at request time.{
"destination": "Lisbon",
"checkin_date": "2026-10-09",
"checkout_date": "2026-10-12",
"applied_filters": [
"review_score_8",
"free_cancellation"
],
"properties": [
{
"name": "Avenue Hostel & Suites",
"price_string": "€215",
"price": 215,
"review_score": 8.2,
"review_count": 2392,
"room_type": "Twin Room with Shared Bathroom",
"location": null,
"nights": 3
},
{
"name": "Oscar Concept Apartments",
"price_string": "€452",
"price": 452,
"review_score": 9.2,
"review_count": 1828,
"room_type": "Standard Studio",
"location": null,
"nights": 3
}
]
}| Field | Type | Meaning | First property |
|---|---|---|---|
price / price_string | number · string | The total for the whole stay, not per night, as a number and as a display string in the currency you asked for. Divide by nights for a nightly rate. | 215 · €215 |
nights | number | Length of the stay the price covers, echoed back so no date arithmetic is needed on your side. | 3 |
review_score / review_count | number · number | Booking.com's own score out of 10 and how many reviews it rests on. A high score on 12 reviews is not the same product as a high score on thousands. | 8.2 · 2392 |
room_type | string | The exact room the price is for. Two properties are only comparable when this is. | Twin Room with Shared Bathroom |
location | string | null | Neighbourhood or district when Booking.com shows one. It really does come back null on some searches, so nothing may assume it. | null |
link | string | A working Booking.com deep link to that property with your dates and party already applied. | booking.com/hotel/… |
The request field is destination. Sending location is a 400 with a message saying so. It takes free text, so "Paris", "Tokyo Shibuya" or a hotel name all work.
filters takes any of the 24 documented values and comes back as applied_filters; budget_per_night is per night, unlike the price. proxy_country works here too, which is what makes rate-parity monitoring possible from the same endpoint.
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. Every field of that object, with the values this exact capture returned, is documented below.
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 |
Response
Every response field
Values in brackets are from the captured Lisbon run above. Real output, not invented examples. The top level echoes the search; properties carries one flat object per result.
Top level
destinationstringEcho of the destination searched: "Lisbon".
checkin_date / checkout_datestringEcho of the stay, YYYY-MM-DD: 2026-10-09 to 2026-10-12 in the capture.
applied_filtersstring[]The filters the search ran with: ["review_score_8","free_cancellation"] in the capture, matching the request. Confirm here that the facets you asked for were used.
budget_per_nightnumber | nullnull when the request set no per-night cap, as in the capture.
propertiesobject[]The results, ranked as Booking.com ranks them. One flat object per property; its fields are below.
Per property
namestringThe property name as listed: "Avenue Hostel & Suites" in the capture.
price / price_stringnumber · stringThe stay total, twice: a number (215) to sort and compare on, and the formatted version (€215), both in the currency you set. It is the total for all 3 nights, not a nightly rate: divide by nights for that.
review_score / review_countnumber · numberBooking.com's guest score and how many reviews it rests on: 8.2 from 2,392 reviews in the capture.
room_typestringThe room the price is for: "Twin Room with Shared Bathroom" in the capture.
locationstring | nullA location string when Booking.com surfaces one on the result; null otherwise (all six captured properties returned null).
image_urlstring | nullA property thumbnail hosted by Booking.com, ready for an <img> tag.
linkstringA working Booking.com URL for exactly this room, these dates, and this party: hand it to a user and the page shows what the API priced.
nights / adults / childrennumber · number · number | nullThe stay as priced: nights computed from the dates (3 in the capture), adults as applied (2), and children, null when the request did not send any.
Pricing
Every plan carries this endpoint
| Plan | Price / mo | Requests | $ / 1k req | Overage | Rate limit | |
|---|---|---|---|---|---|---|
| BASIC | Free | 10 / mo | — | hard cap | — | 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 → |
Swipe the table sideways for overage and rate limits.
Every plan on this API includes all of its endpoints; flights and hotels are separate subscriptions. Read from the live listing on 2026-09-11; 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 repeat-sampled run and how to tell a real gap from ordinary movement.
- 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.