Search Properties
curl --request GET \
--url https://scrapebadger.com/v1/booking/searchimport requests
url = "https://scrapebadger.com/v1/booking/search"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://scrapebadger.com/v1/booking/search', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://scrapebadger.com/v1/booking/search",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://scrapebadger.com/v1/booking/search"
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://scrapebadger.com/v1/booking/search")
.asString();require 'uri'
require 'net/http'
url = URI("https://scrapebadger.com/v1/booking/search")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body{
"query": "<string>",
"destination": {
"dest_id": "<string>",
"dest_type": "<string>",
"name": "<string>",
"label": "<string>",
"country_code": "<string>"
},
"checkin": "<string>",
"checkout": "<string>",
"currency": "<string>",
"total_results": 123,
"offset": 123,
"count": 123,
"properties": [
{
"property_id": "<string>",
"name": "<string>",
"slug": "<string>",
"url": "<string>",
"accommodation_type_id": 123,
"description": "<string>",
"address": "<string>",
"city": "<string>",
"country_code": "<string>",
"latitude": 123,
"longitude": 123,
"ufi": 123,
"display_location": "<string>",
"distance_to_centre": "<string>",
"distance_to_centre_metres": 123,
"is_centrally_located": true,
"public_transport_distance": "<string>",
"beach_distance": "<string>",
"review_score": 123,
"review_count": 123,
"review_score_word": "<string>",
"star_rating": 123,
"is_preferred": true,
"is_preferred_plus": true,
"is_genius_rate_available": true,
"is_newly_opened": true,
"is_closed": true,
"is_sold_out": true,
"sold_out_messages": [
"<string>"
],
"is_sustainable": true,
"sustainability_certifications": [
"<string>"
],
"badges": [
"<string>"
],
"wishlist_count": 123,
"free_cancellation": true,
"no_prepayment": true,
"pets_allowed_free": true,
"meal_plan": "<string>",
"charges_info": "<string>",
"price": {
"display": "<string>",
"amount": 123,
"currency": "<string>",
"rounded": 123
},
"price_before_discount": {},
"price_per_night": {},
"room": {
"name": "<string>",
"unit_types": [
"<string>"
],
"beds": [
"<string>"
],
"total_beds": 123,
"bedrooms": 123,
"bathrooms": 123,
"kitchens": 123,
"living_rooms": 123,
"area": 123,
"area_unit": "<string>"
},
"blocks": [
{
"room_id": "<string>",
"occupancy": 123,
"meal_plan_id": 123,
"meal_plan": "<string>",
"price": {},
"original_price": {},
"free_cancellation_until": "<string>"
}
],
"photo": "<string>",
"thumbnail": "<string>"
}
]
}Search
Search Properties
Search Booking.com stays by destination — with dates, occupancy, sorting and Booking’s own filter ids, returning numeric prices alongside display strings.
GET
/
v1
/
booking
/
search
Search Properties
curl --request GET \
--url https://scrapebadger.com/v1/booking/searchimport requests
url = "https://scrapebadger.com/v1/booking/search"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://scrapebadger.com/v1/booking/search', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://scrapebadger.com/v1/booking/search",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://scrapebadger.com/v1/booking/search"
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://scrapebadger.com/v1/booking/search")
.asString();require 'uri'
require 'net/http'
url = URI("https://scrapebadger.com/v1/booking/search")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body{
"query": "<string>",
"destination": {
"dest_id": "<string>",
"dest_type": "<string>",
"name": "<string>",
"label": "<string>",
"country_code": "<string>"
},
"checkin": "<string>",
"checkout": "<string>",
"currency": "<string>",
"total_results": 123,
"offset": 123,
"count": 123,
"properties": [
{
"property_id": "<string>",
"name": "<string>",
"slug": "<string>",
"url": "<string>",
"accommodation_type_id": 123,
"description": "<string>",
"address": "<string>",
"city": "<string>",
"country_code": "<string>",
"latitude": 123,
"longitude": 123,
"ufi": 123,
"display_location": "<string>",
"distance_to_centre": "<string>",
"distance_to_centre_metres": 123,
"is_centrally_located": true,
"public_transport_distance": "<string>",
"beach_distance": "<string>",
"review_score": 123,
"review_count": 123,
"review_score_word": "<string>",
"star_rating": 123,
"is_preferred": true,
"is_preferred_plus": true,
"is_genius_rate_available": true,
"is_newly_opened": true,
"is_closed": true,
"is_sold_out": true,
"sold_out_messages": [
"<string>"
],
"is_sustainable": true,
"sustainability_certifications": [
"<string>"
],
"badges": [
"<string>"
],
"wishlist_count": 123,
"free_cancellation": true,
"no_prepayment": true,
"pets_allowed_free": true,
"meal_plan": "<string>",
"charges_info": "<string>",
"price": {
"display": "<string>",
"amount": 123,
"currency": "<string>",
"rounded": 123
},
"price_before_discount": {},
"price_per_night": {},
"room": {
"name": "<string>",
"unit_types": [
"<string>"
],
"beds": [
"<string>"
],
"total_beds": 123,
"bedrooms": 123,
"bathrooms": 123,
"kitchens": 123,
"living_rooms": 123,
"area": 123,
"area_unit": "<string>"
},
"blocks": [
{
"room_id": "<string>",
"occupancy": 123,
"meal_plan_id": 123,
"meal_plan": "<string>",
"price": {},
"original_price": {},
"free_cancellation_until": "<string>"
}
],
"photo": "<string>",
"thumbnail": "<string>"
}
]
}Search Booking.com for stays. Target an area either with free-text
location
(geocoded by Booking) or with an exact dest_id + dest_type pair from
/destinations. Page
through results with offset against total_results.
Query Parameters
string
Free-text destination, geocoded by Booking — e.g.
Rome, Italy, Amsterdam,
Trastevere. Provide either location or dest_id + dest_type.string
Exact Booking destination id from
/destinations.
Requires dest_type.string
Destination type that goes with
dest_id — CITY, DISTRICT, AIRPORT,
LANDMARK or REGION.string
Check-in date,
YYYY-MM-DD. Pass both checkin and checkout, or neither.string
Check-out date,
YYYY-MM-DD.integer
default:"2"
Number of adults,
1–30.string
Comma-separated children’s ages, e.g.
4,9.integer
default:"1"
Number of rooms.
integer
default:"0"
Number of properties to skip.
integer
default:"25"
Properties per page. Maximum
100.string
Sort order. One of
popularity, price, class_descending,
class_ascending, distance_from_search, bayesian_review_score,
review_score_and_price, upsort_bh. An unrecognised value is rejected with
a 400.string
default:"USD"
Currency for prices, e.g.
EUR, GBP.string
default:"en-us"
Locale for text and price formatting, e.g.
fr, de.Filters
filters takes Booking’s own filter ids, joined with ;. These are the
verified ones, with their effect on a Rome search that returns 5,982
properties unfiltered:
filters value | Meaning | Results |
|---|---|---|
class=5 | 5-star properties | 67 |
class=5;hotelfacility=107 | 5-star with a specific facility | 64 |
price=EUR-50-100-1 | €50–100 per night | 410 |
review_score=80 | Review score 8.0+ | 4,552 |
ht_id=204 | Apartments | 705 |
mealplan=1 | Breakfast included | 1,074 |
fc=2 | Free cancellation | 5,370 |
distance=1000 | Within 1 km of the centre | 629 |
An unknown filter id is ignored by Booking rather than rejected — the search
succeeds and simply returns the unfiltered count. Check
total_results to
confirm a filter actually applied.Response
string
Echo of the requested destination.
object
string
Echo of the check-in date, or
null.string
Echo of the check-out date, or
null.string
Currency the prices are quoted in.
integer
Total matching properties across all pages, after
filters.integer
Echo of the requested offset.
integer
Properties returned on this page.
Property[]
Property cards for this page.
Show Property
Show Property
string
Booking property id.
string
Property name.
string
URL slug — feed to
/properties/{country_code}/{slug}.string
Canonical property URL on booking.com.
integer
Booking accommodation type id, e.g.
204 for apartments.string
Short property blurb.
string
string
string
ISO country code — the first path segment for the detail endpoints.
number
number
integer
Booking’s internal city identifier.
string
Location line as shown on the card, e.g.
Centro Storico, Rome.string
Formatted distance, e.g.
0.6 km from centre.integer
Same distance in metres.
boolean
string
Distance to the nearest public transport, or
null.string
Distance to the nearest beach, or
null.number
Review score out of 10.
integer
Number of reviews.
string
Localized score word, e.g.
Fabulous.number
Stars, e.g.
5.boolean
boolean
boolean
boolean
boolean
boolean
string[]
Why the property is unavailable, when it is.
boolean
string[]
string[]
Booking badges, e.g.
["Genius"].integer
How many travellers saved the property.
boolean
boolean
boolean
string
Meal plan on the quoted rate, e.g.
Breakfast included.string
Taxes and charges line, e.g.
+€36 taxes and charges.object
object
Struck-through price when discounted, same shape as
price, else null.object
Per-night price, same shape as
price.object
Block[]
string
Full-size photo URL.
string
Thumbnail photo URL.
Every price is returned both as Booking’s localized display string
(
"€ 265,09") and as a numeric amount + currency. The display string is
locale-formatted — comma decimal separators, currency symbol placement — so
always do arithmetic on amount, never on display.Example
const res = await fetch(
"https://scrapebadger.com/v1/booking/search?" +
new URLSearchParams({
location: "Rome, Italy",
checkin: "2026-09-12",
checkout: "2026-09-15",
adults: "2",
children: "4,9",
sort: "bayesian_review_score",
filters: "class=5;mealplan=1",
currency: "EUR",
limit: "25",
}),
{ headers: { "X-API-Key": process.env.SCRAPEBADGER_API_KEY } },
);
const data = await res.json();
import requests
res = requests.get(
"https://scrapebadger.com/v1/booking/search",
headers={"X-API-Key": "YOUR_API_KEY"},
params={
"location": "Rome, Italy",
"checkin": "2026-09-12",
"checkout": "2026-09-15",
"adults": 2,
"children": "4,9",
"sort": "bayesian_review_score",
"filters": "class=5;mealplan=1",
"currency": "EUR",
"limit": 25,
},
)
data = res.json()
curl "https://scrapebadger.com/v1/booking/search?location=Rome%2C%20Italy&checkin=2026-09-12&checkout=2026-09-15&adults=2&children=4%2C9&sort=bayesian_review_score&filters=class%3D5%3Bmealplan%3D1¤cy=EUR&limit=25" \
-H "X-API-Key: YOUR_API_KEY"
Response
{
"query": "Rome, Italy",
"destination": {
"dest_id": "-126693",
"dest_type": "CITY",
"name": "Rome",
"label": "Rome, Lazio, Italy",
"country_code": "it"
},
"checkin": "2026-09-12",
"checkout": "2026-09-15",
"currency": "EUR",
"total_results": 1074,
"offset": 0,
"count": 25,
"properties": [
{
"property_id": "1284937",
"name": "Radisson Collection Hotel, Roma Antica",
"slug": "radisson-collection-roma-antica",
"url": "https://www.booking.com/hotel/it/radisson-collection-roma-antica.html",
"accommodation_type_id": 204,
"description": "Set 400 metres from the Colosseum, this 5-star hotel offers a rooftop restaurant and air-conditioned rooms with free WiFi.",
"address": "Via Labicana 144",
"city": "Rome",
"country_code": "it",
"latitude": 41.8902,
"longitude": 12.4964,
"ufi": -126693,
"display_location": "Centro Storico, Rome",
"distance_to_centre": "1.2 km from centre",
"distance_to_centre_metres": 1204,
"is_centrally_located": true,
"public_transport_distance": "300 m from Colosseo metro",
"beach_distance": null,
"review_score": 8.9,
"review_count": 1499,
"review_score_word": "Fabulous",
"star_rating": 5,
"is_preferred": true,
"is_preferred_plus": false,
"is_genius_rate_available": true,
"is_newly_opened": false,
"is_closed": false,
"is_sold_out": false,
"sold_out_messages": [],
"is_sustainable": true,
"sustainability_certifications": ["Green Key"],
"badges": ["Genius"],
"wishlist_count": 3812,
"free_cancellation": true,
"no_prepayment": true,
"pets_allowed_free": false,
"meal_plan": "Breakfast included",
"charges_info": "+€36 taxes and charges",
"price": {
"display": "€ 795,27",
"amount": 795.27,
"currency": "EUR",
"rounded": 795
},
"price_before_discount": {
"display": "€ 946,75",
"amount": 946.75,
"currency": "EUR",
"rounded": 947
},
"price_per_night": {
"display": "€ 265,09",
"amount": 265.09,
"currency": "EUR",
"rounded": 265
},
"room": {
"name": "Deluxe Double Room with Colosseum View",
"unit_types": ["Bedroom", "Bathroom"],
"beds": ["1 king bed"],
"total_beds": 1,
"bedrooms": 1,
"bathrooms": 1,
"kitchens": 0,
"living_rooms": 0,
"area": 32,
"area_unit": "m2"
},
"blocks": [
{
"room_id": "128493701",
"occupancy": 2,
"meal_plan_id": 1,
"meal_plan": "Breakfast included",
"price": {
"display": "€ 795,27",
"amount": 795.27,
"currency": "EUR",
"rounded": 795
},
"original_price": {
"display": "€ 946,75",
"amount": 946.75,
"currency": "EUR",
"rounded": 947
},
"free_cancellation_until": "2026-09-10T23:59:00Z"
}
],
"photo": "https://cf.bstatic.com/xdata/images/hotel/max1024x768/1284937-rooftop.jpg",
"thumbnail": "https://cf.bstatic.com/xdata/images/hotel/square200/1284937-rooftop.jpg"
}
]
}
Each search request costs 5 credits. Failed requests are not charged.
Two pagination traps.
total_results is Booking’s own estimate — the
same query returns a slightly different number between calls (we measured
5,974-5,977 for one Rome search), so never use it as a loop bound or a
completeness check. And an offset past the real end returns a full page of
tail results, not an empty page — so a naive “loop until empty” never
terminates. Page by deduplicating on property_id and stop when a page adds
nothing new. For sizing a crawl up front, use property_count from
/destinations, which
is an exact inventory count.⌘I

