Booking.com Search API
The Booking.com Search API returns accommodation search results as structured JSON. Search by destination or property name, specify stay dates and guests, and filter by price, property class, guest review score, property type and cancellation options. Results include available property details, ratings, displayed stay prices, matching rooms and filters. Core property fields can be null when unavailable; rooms starts as an empty array, while optional enrichment fields may be omitted. Use a returned property link with the Booking.com Place API for individual property details.
Endpoint: https://api.scrapingdog.com/booking/search
Each successful request costs 5 credits, including a valid empty search. Requests use a fixed page size of up to 30 properties. The supplied response below shows one property and a shortened selection of filters; totals and pagination reflect the full response. API keys use
APIKEY. Example dates match the supplied response; choose today or future dates when executing requests.API Parameters
🔑
Scrapingdog Parameters
api_keyRequiredYour Scrapingdog API key, available on your dashboard. ReplaceAPIKEYwhen executing requests. Send each key once in the GET query string; repeated, bracketed or nested query keys are not supported.
Type: String
🔍
Search
queryRequiredDestination or property search text, for examplejaipur. Must be nonblank and at most 1,000 submitted characters before trimming. Leading and trailing whitespace is removed.
Type: String
📅
Stay Dates
check_in_dateOptionalA real calendar date inYYYY-MM-DDformat, today or in the future. Invalid calendar dates are rejected. Today is determined inAsia/Kolkata.
Default: Today in Asia/Kolkata
Type: Date stringcheck_out_dateOptionalA real calendar date inYYYY-MM-DDformat, strictly after the effective check-in date. The stay must not exceed 90 nights.
Default: The day after effective check-in
Type: Date stringflex_windowOptionalDate flexibility of ± the selected number of days. Accepted values are exactly1,2,3or7;0is invalid.
Default: Unset, for exact dates
Type: Integer enum
👥
Guests & Rooms
adultsOptionalNumber of adults, from1to30. Guest counts accept one or two decimal digits in query text.
Default:2
Type: IntegerchildrenOptionalNumber of children, from0to10. Must equal the number of suppliedchildren_ages; a positive child count without ages is invalid.
Default: Number of supplied ages, otherwise 0
Type: Integerchildren_agesOptionalRequired for children. A comma-separated string with exactly one age per child, each from0to17, for example5,9. Up to 10 ages and 100 submitted characters. Ages describe children at checkout. Supplying ages alone infers the child count. Omit for zero children; an empty string is invalid. Do not send an array or repeated keys.
Type: Comma-separated stringroomsOptionalNumber of rooms, from1to30. Cannot exceedadults.
Default:1
Type: Integer
🌐
Localization
languageOptionalA supported language code, for exampleen-us. Trimmed and lowercased; maximum 30 submitted characters. Omission leaves the Booking language selector unset, while transport uses an English fallback header.
Default: No explicit language selection
Type: String enumcurrencyOptionalA supported currency code, such asINR, orhotel_currencyfor each property’s currency. Codes are trimmed and uppercased; the special value is normalized tohotel_currency. Maximum 30 submitted characters. Price bounds without a currency selectUSD.hotel_currencycannot be combined with price bounds.
Default: Unset, or USD when price bounds require it
Type: String enum
↕
️ Sorting & Price
sort_byOptionalA supported sorter, for examplepricefor lowest price first. Values are trimmed and case-sensitive; maximum 30 submitted characters.
Default:popularity
Type: String enummin_priceOptionalMinimum nightly filter amount in the selected currency. Must be a non-negative decimal no greater than9007199254740991, with at most 64 characters. Use digits with an optional decimal fraction; no spaces, signs, exponents or grouping commas. Supplying a bound without currency selects USD. Responseprice,old_priceand tax amounts describe the stay, rather than nightly rates or a guaranteed final checkout total.
Default: No explicit minimum
Type: Non-negative decimalmax_priceOptionalMaximum nightly filter amount in the selected currency. Same numeric rules asmin_price, including the 64-character maximum. Must be at leastmin_pricewhen both are supplied. Bounds cannot be used withhotel_currency.
Default: No explicit maximum
Type: Non-negative decimal
🏨
Property Filters
hotel_classOptionalOne or more property class values from1to5, as a comma-separated string such as4,5. Item whitespace is trimmed and duplicates are removed; maximum 100 submitted characters. This classification differs from guest review score.
Default: Unset
Type: Comma-separated stringratingOptionalMinimum guest review score. Accepted values are exactly6,7,8or9, meaning 6+, 7+, 8+ or 9+ on Booking’s review scale.
Default: Unset
Type: Integer enumproperty_typesOptionalA comma-separated string of supported property type IDs, for example204for Hotel or201,220for Apartment and Vacation Home. Values are trimmed and deduplicated; maximum 512 submitted characters. Do not send an array or repeated keys.
Default: Unset
Type: Comma-separated stringfree_cancellationOptionalSet to exactlytrueorfalsein query text. Values are case-sensitive and whitespace is not trimmed. In Python and PHP, use lowercase strings rather than native booleans whose query encoding can differ. A returned property’s policy flag depends on its available matching offer data.
Default:false
Type: Boolean stringnfltOptionalAdditional Booking filter tokens separated by semicolons, for examplehotelfacility=107;mealplan=1. Discover tokens infilters[].options[].valueand start at offset 0 after changing filters. These raw tokens are appended to typed selections without resolving conflicts or validating against a fixed token list; use consistent combinations. An empty string adds no filter. Normal HTTP/server URL limits apply. An option’sbooking_linkis a website URL, rather than a Scrapingdog request URL.
Default: Unset
Type: String
📄
Pagination
offsetOptionalDigits-only non-negative safe integer, up to9007199254740961. Start at 0 and follow the returnednext_offsetorscrapingdog_pagination.next, keeping all effective dates, guests, currency and filters. Offsets need not be multiples of 30. Stop when continuation is null; an empty page ends pagination even if the reported total is positive. The requested page size is fixed at 30.total_resultscounts returned properties;total_availableandsearch_information.total_resultsdescribe the upstream total. Keep numericproperty_idvalues as numbers.
Default:0
Type: Integer
API Examples

curl "https://api.scrapingdog.com/booking/search?api_key=APIKEY&query=jaipur&check_in_date=2026-10-30&check_out_date=2026-10-31&adults=2&children=0&rooms=1&free_cancellation=false&sort_by=popularity&offset=0"
import requests params = { "api_key": "APIKEY", "query": "jaipur", "check_in_date": "2026-10-30", "check_out_date": "2026-10-31", "adults": 2, "children": 0, "rooms": 1, "free_cancellation": "false", "sort_by": "popularity", "offset": 0 } response = requests.get("https://api.scrapingdog.com/booking/search", params=params, timeout=70) response.raise_for_status() data = response.json() print(data["properties"]) print(data["next_offset"])
const axios = require('axios'); axios.get('https://api.scrapingdog.com/booking/search', { params: { "api_key": "APIKEY", "query": "jaipur", "check_in_date": "2026-10-30", "check_out_date": "2026-10-31", "adults": 2, "children": 0, "rooms": 1, "free_cancellation": "false", "sort_by": "popularity", "offset": 0 }, timeout: 70000, }).then(({ data }) => { console.log(data.properties); console.log(data.next_offset); }).catch(error => console.error(error.response?.data ?? error.message));
<?php $params = [ 'api_key' => "APIKEY", 'query' => "jaipur", 'check_in_date' => "2026-10-30", 'check_out_date' => "2026-10-31", 'adults' => 2, 'children' => 0, 'rooms' => 1, 'free_cancellation' => "false", 'sort_by' => "popularity", 'offset' => 0, ]; $url = 'https://api.scrapingdog.com/booking/search?' . http_build_query($params); $ch = curl_init($url); curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 70]); $body = curl_exec($ch); if ($body === false) { throw new RuntimeException(curl_error($ch)); } $status = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); if ($status !== 200) { throw new RuntimeException("HTTP $status: $body"); } $data = json_decode($body, true, 512, JSON_THROW_ON_ERROR); print_r($data['properties']);
require 'net/http' require 'uri' require 'json' url = URI('https://api.scrapingdog.com/booking/search') url.query = URI.encode_www_form( api_key: "APIKEY", query: "jaipur", check_in_date: "2026-10-30", check_out_date: "2026-10-31", adults: 2, children: 0, rooms: 1, free_cancellation: "false", sort_by: "popularity", offset: 0 ) http = Net::HTTP.new(url.host, url.port) http.use_ssl = true http.read_timeout = 70 response = http.get(url.request_uri) raise "HTTP #{response.code}: #{response.body}" unless response.is_a?(Net::HTTPSuccess) data = JSON.parse(response.body) puts JSON.pretty_generate(data.fetch('properties'))
import java.net.URI; import java.net.URLEncoder; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.nio.charset.StandardCharsets; import java.time.Duration; public class Main { public static void main(String[] args) throws Exception { String apiKey = URLEncoder.encode("APIKEY", StandardCharsets.UTF_8); String query = URLEncoder.encode("jaipur", StandardCharsets.UTF_8); String url = "https://api.scrapingdog.com/booking/search?api_key=" + apiKey + "&query=" + query + "&check_in_date=2026-10-30&check_out_date=2026-10-31&adults=2&children=0&rooms=1&free_cancellation=false&sort_by=popularity&offset=0"; HttpRequest request = HttpRequest.newBuilder(URI.create(url)) .timeout(Duration.ofSeconds(70)).GET().build(); HttpResponse<String> response = HttpClient.newHttpClient() .send(request, HttpResponse.BodyHandlers.ofString()); if (response.statusCode() != 200) { throw new RuntimeException("HTTP " + response.statusCode() + ": " + response.body()); } System.out.println(response.body()); } }
{
"search_metadata": {
"status": "Success",
"booking_url": "https://www.booking.com/searchresults.html?ss=jaipur&group_adults=2&no_rooms=1&group_children=0&checkin=2026-10-30&checkout=2026-10-31&order=popularity&offset=0",
"total_time_taken": 1.37
},
"search_parameters": {
"engine": "booking",
"query": "jaipur",
"offset": 0,
"limit": 30,
"adults": 2,
"children": 0,
"rooms": 1,
"free_cancellation": false,
"sort_by": "popularity",
"check_in_date": "2026-10-30",
"check_out_date": "2026-10-31"
},
"search_information": {
"destination": "Jaipur",
"total_results": 1098,
"destination_id": -2098033,
"destination_type": "CITY"
},
"total_time_taken": 1.37,
"total_results": 30,
"total_available": 1098,
"next_offset": 30,
"scrapingdog_pagination": {
"current": "https://api.scrapingdog.com/booking/search?api_key=APIKEY&query=jaipur&offset=0&adults=2&children=0&rooms=1&free_cancellation=false&sort_by=popularity&check_in_date=2026-10-30&check_out_date=2026-10-31",
"next": "https://api.scrapingdog.com/booking/search?api_key=APIKEY&query=jaipur&offset=30&adults=2&children=0&rooms=1&free_cancellation=false&sort_by=popularity&check_in_date=2026-10-30&check_out_date=2026-10-31"
},
"properties": [
{
"position": 1,
"property_id": 7967119,
"name": "The Knights' Inn",
"link": "https://www.booking.com/hotel/in/the-knights-39-inn.html?group_adults=2&no_rooms=1&group_children=0&checkin=2026-10-30&checkout=2026-10-31&order=popularity",
"type": "Hotel",
"hotel_class": 3,
"preferred_partner": false,
"location": "Jaipur",
"address": "Rana Sanga Marg Near Akashya Patra Mandir Jagatoura",
"distance": "8.2 miles from downtown",
"public_transport": null,
"gps_coordinates": {
"latitude": 26.8033,
"longitude": 75.857862
},
"rating": 10,
"rating_text": "Exceptional",
"reviews": 1,
"location_rating": null,
"price": "$21.68",
"extracted_price": 21.6836143034377,
"currency": "USD",
"old_price": null,
"extracted_old_price": null,
"taxes_and_fees": "$1.08",
"extracted_taxes_and_fees": 1.08418071517197,
"rooms": [
{
"name": "Junior Suite",
"type": "Private suite",
"beds": 1,
"bathrooms": 1,
"bedrooms": 1,
"living_rooms": 1,
"units": 1,
"room_id": 796711902,
"size": "194 ft²",
"bed_options": [
{
"king_bed": 1
}
],
"bed_configurations": [
{
"beds": [
{
"bed_type_id": 3,
"count": 1
}
]
}
]
}
],
"eco_certified": false,
"thumbnail": "https://cf.bstatic.com/xdata/images/hotel/square600/412367712.jpg?k=fd87877088d6d49ab57aa4138e7204405eb14d8a8a61c574f37100b05c8294ed&o=",
"property_type_id": 204,
"city": "Jaipur",
"country_code": "in",
"value_for_money_rating": 10,
"free_cancellation": false,
"no_prepayment": true,
"availability": "We have 7 left at this price",
"sponsored": false,
"featured": false,
"newly_opened": false
}
],
"filters": [
{
"title": "Your budget (per night)",
"options": [],
"slider": {
"min": 3,
"max": 90,
"currency": "USD"
}
},
{
"title": "Popular filters",
"options": [
{
"name": "5 stars",
"value": "class=5",
"count": 53,
"selected": false,
"booking_link": "https://www.booking.com/searchresults.html?ss=jaipur&group_adults=2&no_rooms=1&group_children=0&checkin=2026-10-30&checkout=2026-10-31&order=popularity&offset=0&nflt=class%3D5"
},
{
"name": "Free Wifi",
"value": "hotelfacility=107",
"count": 1033,
"selected": false,
"booking_link": "https://www.booking.com/searchresults.html?ss=jaipur&group_adults=2&no_rooms=1&group_children=0&checkin=2026-10-30&checkout=2026-10-31&order=popularity&offset=0&nflt=hotelfacility%3D107"
}
]
}
]
}