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.

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: 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

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

Pricing

Every plan carries this endpoint

PlanPrice / moRequests$ / 1k reqOverageRate limit
BASICFree10 / mohard cap250 / minGet 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 →

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.