Skip to content

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.

POST /search · the captured request
{
  "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.
Lisbon, 2026-10-09 → 2026-10-12 · 2 of 6 properties, trimmed · captured 2026-08-26
{
  "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
    }
  ]
}
FieldTypeMeaningFirst property
price / price_stringnumber · stringThe 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
nightsnumberLength of the stay the price covers, echoed back so no date arithmetic is needed on your side.3
review_score / review_countnumber · numberBooking.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_typestringThe exact room the price is for. Two properties are only comparable when this is.Twin Room with Shared Bathroom
locationstring | nullNeighbourhood or district when Booking.com shows one. It really does come back null on some searches, so nothing may assume it.null
linkstringA 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.

captured run · 2026-08-26
PropertyRoomScoreReviewsTotal, 3 nights
Avenue Hostel & SuitesTwin Room with Shared Bathroom8.22,392€215link →
Oscar Concept ApartmentsStandard Studio9.21,828€452link →
HF Fénix UrbanEconomy Double or Twin Room8.82,434€509link →
WC by The Beautique HotelsSuperior Double Room8.62,457€540link →
Dorma LiberdadeDouble or Twin Room8.63,774€521link →
Vila Garden GuesthouseDouble Room9.11,868€454link →

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

destinationstring

Free text, the way a person would type it: “Paris”, “Tokyo Shibuya”, “Hilton NYC”. Not location (that name 400s).

checkin_date / checkout_datestring

YYYY-MM-DD.

Optional

adultsint

Defaults to 2.

childrenint

Defaults to 0.

currencystring

Defaults to USD.

budget_per_nightnumber

Max price per night, in the currency you set: 300 with "currency": "EUR" means 300 EUR per night.

proxy_countrystring

Two-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.

CategoryFilters
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

destinationstring

Echo of the destination searched: "Lisbon".

checkin_date / checkout_datestring

Echo 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 | null

null 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

namestring

The property name as listed: "Avenue Hostel & Suites" in the capture.

price / price_stringnumber · string

The 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 · number

Booking.com's guest score and how many reviews it rests on: 8.2 from 2,392 reviews in the capture.

room_typestring

The room the price is for: "Twin Room with Shared Bathroom" in the capture.

locationstring | null

A location string when Booking.com surfaces one on the result; null otherwise (all six captured properties returned null).

image_urlstring | null

A property thumbnail hosted by Booking.com, ready for an <img> tag.

linkstring

A 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 | null

The 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

PlanPrice / moRequests$ / 1k reqOverageRate limit
BASICFree10 / mohard capGet this plan →
PRO$102,000 / mo$5.00$0.006 / req25 / minGet this plan →
ULTRA$206,500 / mo$3.08$0.003 / req25 / minGet this plan →
MEGA$5025,000 / mo$2.00$0.002 / req50 / minGet 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.