Booking.com destination search
The properties Booking.com lists for a place and a stay.
/v1/ota/booking/hotelsEach property carries its hotel_id, the pagename and country that POST /v1/ota/booking and /v1/ota/booking/rooms price, the stay price (total, per night, before-discount, and taxes where Booking states them), review score and count, stars, property type, address, coordinates, distance, photo, the matched room and Booking's policy flags. Filters and sort orders are Booking's own. Page on with pagination.next_offset, resending the same body.
Billed per started 25 properties returned; an empty answer is free.
Request
https://api.scrapercompany.com/v1/ota/booking/hotelsAuthenticate with your API key in the x-api-key header (see Authentication).
Run this request on your own API key from this page, with the values you type. Signed out? Sign in or get an API key.
Body
JSON object. Unknown fields are rejected with 422.
- querystring | nullmin length 2
Destination as a guest would type it: a city, region, district, landmark or airport. Booking resolves free text itself;
search_information.destinationsays what it chose. For an exact place usedest_id. - dest_idinteger | null
Booking's destination id from
POST /v1/ota/booking/destinations(negative for most cities, e.g. Lisbon is-2167973). - dest_typestring | null
The
dest_typethat came withdest_id.One of
airportcitycountrydistricthotellandmarkregion - urlstring | null
A
booking.com/searchresults.htmllink. Its destination, dates, guests, filters (nflt), sort (order), currency and language are used unless this request sets them. - check_instring (date)required
First night of the stay,
YYYY-MM-DD. Taken fromurlwhen it has one. - check_outstring (date) | null
Departure date. An alternative to
nights— if both are given, this wins. - nightsintegerdefault
1min 1, max 90Length of stay. Ignored when
check_outis supplied. - adultsintegerdefault
2min 1, max 30Adults across all rooms.
- children_agesarray of integermax items 10
One age (0-17) per child. Booking prices children by age.
- roomsintegerdefault
1min 1, max 30Rooms requested.
- currencystringdefault
USDISO 4217 code for the returned prices. Major currencies include AED, AUD, BRL, CAD, CHF, CNY, EUR, GBP, HKD, INR, JPY, KRW, MXN, NZD, SGD, USD; all 39 supported codes are listed in the enum.
39 allowed values
AED, ARS, AUD, BRL, CAD, CHF, CLP, CNY, COP, CZK, DKK, EGP, EUR, GBP, HKD, HUF, IDR, ILS, INR, JPY, KRW, MXN, MYR, NOK, NZD, PEN, PHP, PLN, QAR, RON, SAR, SEK, SGD, THB, TRY, TWD, USD, VND, ZAR
- languagestringdefault
en-usBooking's site language for names and labels (
en-us,en-gb,fr,de,es,it,pt-pt,ja...). - sortstringdefault
popularityBooking's own sort orders: -
popularity: Our top picks (Booking's default) -upsort_bh: Homes and apartments first -price: Price, lowest first -price_from_high_to_low: Price, highest first -review_score_and_price: Best reviewed and lowest price -class: Stars, highest first -class_asc: Stars, lowest first -class_and_price: Stars and price -distance_from_search: Distance from the searched place -bayesian_review_score: Top reviewedOne of
bayesian_review_scoreclassclass_and_priceclass_ascdistance_from_searchpopularitypriceprice_from_high_to_lowreview_score_and_priceupsort_bh - starsarray of string
Star classes to keep: any of
1-5andunrated. - min_review_scoreinteger | null
Booking's review filter: 6, 7, 8 or 9 and up. Booking also keeps properties with no reviews yet (
review_scorenull).One of
6789 - property_typesarray of string
Booking's property types by name (
Hotels,Apartments,Hostels,Resorts,Villas...) or numericht_id. Booking groups some types with others, so a row's ownproperty_typecan differ. - price_mininteger | nullmin 0
Lowest price per night, in
currency. - price_maxinteger | nullmin 1
Highest price per night, in
currency. - free_cancellationbooleandefault
falseOnly properties with a free-cancellation rate.
- no_prepaymentbooleandefault
falseOnly properties that take no prepayment.
- meal_planstring | null
Keep properties with this meal plan.
One of
all_inclusiveall_mealsbreakfastbreakfast_and_dinnerbreakfast_and_lunchkitchen - filtersstringdefault
Advanced: Booking's own filter string (the
nfltparameter of a search link, e.g.hotelfacility=107;di=929), added to the fields above. - limitintegerdefault
25min 1, max 1000Properties to return, in Booking's order. Billed per started 25 returned.
- offsetintegerdefault
0min 0, max 1000Properties to skip: page on with
pagination.next_offset. Booking lists about 1,000 properties per search at most. - country_marketstring | null
Visitor country (point of sale), two letters, e.g.
GB. Booking and Agoda price by the visitor's country - measured 2026-10-03, Booking showed a GB visitor 321 USD where US and CA visitors saw 276 for the same night - so this asks for the price a visitor from that country sees. The answer'spoint_of_saleblock says whether that country was actually served; when it was not, the price is the default market's. Omit for the previous behaviour.251 allowed values
AD, AE, AF, AG, AI, AL, AM, AO, AQ, AR, AS, AT, AU, AW, AX, AZ, BA, BB, BD, BE, BF, BG, BH, BI, BJ, BL, BM, BN, BO, BQ, BR, BS, BT, BV, BW, BY, BZ, CA, CC, CD, CF, CG, CH, CI, CK, CL, CM, CN, CO, CR, CU, CV, CW, CX, CY, CZ, DE, DJ, DK, DM, DO, DZ, EC, EE, EG, EH, ER, ES, ET, FI, FJ, FK, FM, FO, FR, GA, GB, GD, GE, GF, GG, GH, GI, GL, GM, GN, GP, GQ, GR, GS, GT, GU, GW, GY, HK, HM, HN, HR, HT, HU, ID, IE, IL, IM, IN, IO, IQ, IR, IS, IT, JE, JM, JO, JP, KE, KG, KH, KI, KM, KN, KP, KR, KW, KY, KZ, LA, LB, LC, LI, LK, LR, LS, LT, LU, LV, LY, MA, MC, MD, ME, MF, MG, MH, MK, ML, MM, MN, MO, MP, MQ, MR, MS, MT, MU, MV, MW, MX, MY, MZ, NA, NC, NE, NF, NG, NI, NL, NO, NP, NR, NU, NZ, OM, PA, PE, PF, PG, PH, PK, PL, PM, PN, PR, PS, PT, PW, PY, QA, RE, RO, RS, RU, RW, SA, SB, SC, SD, SE, SG, SH, SI, SJ, SK, SL, SM, SN, SO, SR, SS, ST, SV, SX, SY, SZ, TC, TD, TF, TG, TH, TJ, TK, TL, TM, TN, TO, TR, TT, TV, TW, TZ, UA, UG, UK, UM, US, UY, UZ, VA, VC, VE, VG, VI, VN, VU, WF, WS, XK, YE, YT, ZA, ZM, ZW
Example request
curl -X POST "https://api.scrapercompany.com/v1/ota/booking/hotels" \
-H "x-api-key: $SCRAPERCOMPANY_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"query": "Lisbon",
"check_in": "2027-01-02",
"nights": 2,
"adults": 2,
"currency": "EUR"
}'Response
200 — Properties Booking.com lists for a destination and stay (parsed from a live New York search on 2026-11-02, trimmed to one property). `taxes_and_fees` and `total_with_taxes` are set only when Booking states them. Metered responses carry x-credits-charged and x-credits-remaining headers (see credit headers).
{
"source": "booking",
"search_parameters": {
"query": "New York",
"check_in": "2027-03-23",
"check_out": "2027-03-25",
"nights": 2,
"adults": 2,
"children_ages": [],
"rooms": 1,
"currency": "USD",
"language": "en-us",
"sort": "popularity",
"limit": 25,
"offset": 0
},
"search_information": {
"total_results": 446,
"destination": {
"name": "New York",
"dest_id": 20088325,
"dest_type": "CITY",
"country": "US"
}
},
"properties": [
{
"position": 1,
"hotel_id": 2769928,
"pagename": "freehand-new-york",
"country": "us",
"name": "Freehand New York",
"url": "https://www.booking.com/hotel/us/freehand-new-york.html",
"property_type": "Hotels",
"property_type_id": 204,
"stars": 4,
"stars_kind": "stars",
"review_score": 8,
"review_label": "Very Good",
"review_count": 2708,
"secondary_score": {
"label": "Location",
"score": 9.3
},
"address": "23 Lexington Avenue",
"city": "New York (New York)",
"district": "Gramercy, New York",
"distance": "3.1 km from downtown",
"transit": "23rd Street station is within 200 meters",
"coordinates": {
"latitude": 40.7398336,
"longitude": -73.9842543
},
"dest_id": 20088325,
"photo": "https://cf.bstatic.com/xdata/images/hotel/square600/616499567.jpg?k=3986043bd47a869827d184f17a74202ce5c5c867593ace03a5a2d019efd2023e&o=",
"price": {
"total": 1203.83,
"per_night": 601.91,
"currency": "USD",
"before_discount": 1302.42,
"taxes_and_fees": 199,
"tax_inclusive": false,
"total_with_taxes": 1402.83,
"charges_text": "+US$199 taxes",
"deal_badges": [],
"nights": 2,
"provenance": {
"schema_version": 1,
"observation_id": "rateobs_0123456789abcdef0123456789abcdef",
"collection_id": "ratecol_0123456789abcdef0123456789abcdef",
"observed_at": "2026-08-07T01:23:45.678Z",
"source": "booking",
"source_kind": "ota",
"source_property_id": "us/freehand-new-york",
"requested_currency": "USD",
"returned_currency": "USD",
"price_basis": "stay_total",
"derivation": "upstream"
}
},
"room": {
"name": "Three's Company",
"room_id": "276992806",
"beds": [
{
"count": 1,
"type_id": 4
},
{
"count": 1,
"type_id": 6
}
],
"units": 1
},
"free_cancellation": false,
"no_prepayment": false,
"sold_out": false,
"preferred_partner": true,
"sponsored": false,
"sustainability": [],
"is_closed": false
}
],
"pagination": {
"offset": 0,
"returned": 1,
"next_offset": 1
},
"meta": {
"source": "booking",
"calls": 2,
"elapsed_s": 2.41,
"observed_at": "2026-08-07T01:23:45.678Z"
}
}Errors
Errors return a JSON body with a detail field. Failed requests are not charged. See Errors for the full list and retry advice.
| Status | Meaning | Retry? |
|---|---|---|
401Unauthorized | Missing or invalid API key. {"detail":"missing or invalid API key"} | No, fix the request |
402Payment Required | Not enough credits for this request: the account's credits mode is {"detail":"insufficient credits: this request costs 5, 0 available. Credits renew 2026-11-01."} | No, fix the request |
422Unprocessable Content | Request validation failed. {"detail":[{"loc":["body","name"],"msg":"Field required","type":"missing"}]} | No, fix the request |
429Too Many Requests | Too many requests: the key's requests-per-minute limit was exceeded, or (in {"detail":"rate limit 60/min exceeded"} | Yes, with backoff |
503Service Unavailable | Temporarily unavailable: a dependency of this endpoint is down, or the upstream source changed its contract. Retry later. {"detail":"database unavailable: OperationalError"} | Yes, with backoff |
Try it
Press Try it above to run this request on your own key, with the values you type (sign in first). For a no-code walkthrough, use the workspace’s guided Try it.
- Export your key:
export SCRAPERCOMPANY_API_KEY=sk_...(no key yet? start a free trial). - Copy the cURL example above and run it in a terminal.
Questions about this page?
Send the page link and your question, and the team will answer.