Skip to content
Docs

Booking.com destination search

The properties Booking.com lists for a place and a stay.

POST/v1/ota/booking/hotels
4 creditsTry it4 per started 25 properties returned (an empty answer, a place Booking.com cannot find and failed requests are free)

Each 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

POSThttps://api.scrapercompany.com/v1/ota/booking/hotels

Authenticate 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.destination says what it chose. For an exact place use dest_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_type that came with dest_id.

    One ofairportcitycountrydistricthotellandmarkregion

  • urlstring | null

    A booking.com/searchresults.html link. 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 from url when it has one.

  • check_outstring (date) | null

    Departure date. An alternative to nights — if both are given, this wins.

  • nightsintegerdefault 1min 1, max 90

    Length of stay. Ignored when check_out is supplied.

  • adultsintegerdefault 2min 1, max 30

    Adults across all rooms.

  • children_agesarray of integermax items 10

    One age (0-17) per child. Booking prices children by age.

  • roomsintegerdefault 1min 1, max 30

    Rooms requested.

  • currencystringdefault USD

    ISO 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-us

    Booking's site language for names and labels (en-us, en-gb, fr, de, es, it, pt-pt, ja...).

  • sortstringdefault popularity

    Booking'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 reviewed

    One ofbayesian_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-5 and unrated.

  • min_review_scoreinteger | null

    Booking's review filter: 6, 7, 8 or 9 and up. Booking also keeps properties with no reviews yet (review_score null).

    One of6789

  • property_typesarray of string

    Booking's property types by name (Hotels, Apartments, Hostels, Resorts, Villas...) or numeric ht_id. Booking groups some types with others, so a row's own property_type can differ.

  • price_mininteger | nullmin 0

    Lowest price per night, in currency.

  • price_maxinteger | nullmin 1

    Highest price per night, in currency.

  • free_cancellationbooleandefault false

    Only properties with a free-cancellation rate.

  • no_prepaymentbooleandefault false

    Only properties that take no prepayment.

  • meal_planstring | null

    Keep properties with this meal plan.

    One ofall_inclusiveall_mealsbreakfastbreakfast_and_dinnerbreakfast_and_lunchkitchen

  • filtersstringdefault

    Advanced: Booking's own filter string (the nflt parameter of a search link, e.g. hotelfacility=107;di=929), added to the fields above.

  • limitintegerdefault 25min 1, max 1000

    Properties to return, in Booking's order. Billed per started 25 returned.

  • offsetintegerdefault 0min 0, max 1000

    Properties 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's point_of_sale block 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).

200 response
{
  "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.

StatusMeaningRetry?
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 enforce (mode in GET /v1/billing) and the request costs more than the available credits. Nothing is run or charged.

{"detail":"insufficient credits: this request costs 5, 0 available. Credits renew 2026-11-01."}
No, fix the request
422Unprocessable Content

Request validation failed. detail is a list of problems for schema errors, or a string for semantic checks performed by the endpoint.

{"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 enforce credits mode) the plan's concurrent-request limit. No rate-limit or Retry-After headers are sent; back off and retry.

{"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.

  1. Export your key: export SCRAPERCOMPANY_API_KEY=sk_... (no key yet? start a free trial).
  2. Copy the cURL example above and run it in a terminal.

Credits

4 credits per successful call (4 per started 25 properties returned (an empty answer, a place Booking.com cannot find and failed requests are free)). Failed, blocked and empty results are free.

Questions about this page?

Send the page link and your question, and the team will answer.

Email support