Get Reviews
curl --request GET \
--url https://scrapebadger.com/v1/booking/properties/{country_code}/{slug}/reviewsimport requests
url = "https://scrapebadger.com/v1/booking/properties/{country_code}/{slug}/reviews"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://scrapebadger.com/v1/booking/properties/{country_code}/{slug}/reviews', 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/properties/{country_code}/{slug}/reviews",
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/properties/{country_code}/{slug}/reviews"
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/properties/{country_code}/{slug}/reviews")
.asString();require 'uri'
require 'net/http'
url = URI("https://scrapebadger.com/v1/booking/properties/{country_code}/{slug}/reviews")
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{
"property_id": "<string>",
"total_count": 123,
"score_breakdown": {},
"language_counts": {},
"guest_type_counts": {},
"limit": 123,
"offset": 123,
"sort": "<string>",
"reviews": [
{
"review_id": "<string>",
"title": "<string>",
"positive": "<string>",
"negative": "<string>",
"score": 123,
"date": "<string>",
"date_utc": 123,
"stay_date": "<string>",
"checkin_date": "<string>",
"checkout_date": "<string>",
"length_of_stay": 123,
"guest_name": "<string>",
"guest_country": "<string>",
"guest_country_code": "<string>",
"guest_avatar": "<string>",
"guest_type": "<string>",
"room_id": "<string>",
"room_name": "<string>",
"language": "<string>",
"review_url": "<string>",
"is_approved": true,
"is_anonymous": true,
"helpful_votes": 123,
"photos": [
"<string>"
],
"partner_reply": "<string>"
}
]
}Properties
Get Reviews
Paginated Booking.com guest reviews — positive and negative text, per-review score, stay dates, guest type, room stayed in, partner reply and photos.
GET
/
v1
/
booking
/
properties
/
{country_code}
/
{slug}
/
reviews
Get Reviews
curl --request GET \
--url https://scrapebadger.com/v1/booking/properties/{country_code}/{slug}/reviewsimport requests
url = "https://scrapebadger.com/v1/booking/properties/{country_code}/{slug}/reviews"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://scrapebadger.com/v1/booking/properties/{country_code}/{slug}/reviews', 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/properties/{country_code}/{slug}/reviews",
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/properties/{country_code}/{slug}/reviews"
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/properties/{country_code}/{slug}/reviews")
.asString();require 'uri'
require 'net/http'
url = URI("https://scrapebadger.com/v1/booking/properties/{country_code}/{slug}/reviews")
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{
"property_id": "<string>",
"total_count": 123,
"score_breakdown": {},
"language_counts": {},
"guest_type_counts": {},
"limit": 123,
"offset": 123,
"sort": "<string>",
"reviews": [
{
"review_id": "<string>",
"title": "<string>",
"positive": "<string>",
"negative": "<string>",
"score": 123,
"date": "<string>",
"date_utc": 123,
"stay_date": "<string>",
"checkin_date": "<string>",
"checkout_date": "<string>",
"length_of_stay": 123,
"guest_name": "<string>",
"guest_country": "<string>",
"guest_country_code": "<string>",
"guest_avatar": "<string>",
"guest_type": "<string>",
"room_id": "<string>",
"room_name": "<string>",
"language": "<string>",
"review_url": "<string>",
"is_approved": true,
"is_anonymous": true,
"helpful_votes": 123,
"photos": [
"<string>"
],
"partner_reply": "<string>"
}
]
}Page through a property’s guest reviews. Booking splits each review into a
positive and a negative half, either of which can be empty. Filter by
review language or guest type, sort five ways, and paginate with limit and
offset against total_count.
Path Parameters
string
required
ISO country code from the property URL, e.g.
it.string
required
Property slug from the property URL, e.g.
radisson-collection-roma-antica.Query Parameters
integer
default:"25"
Reviews per page. Maximum
100.integer
default:"0"
Number of reviews to skip.
string
default:"MOST_RELEVANT"
Sort order. One of
MOST_RELEVANT, NEWEST_FIRST, OLDEST_FIRST,
SCORE_DESC, SCORE_ASC.string
Only reviews written in this language, as an ISO code, e.g.
fr.string
Only reviews from this guest type. One of
FAMILIES, COUPLES,
GROUP_OF_FRIENDS, SOLO_TRAVELLERS, BUSINESS_TRAVELLERS.string
default:"en-us"
Locale for category names and other text, e.g.
fr, de.Response
string
Booking property id.
integer
Total reviews matching the request — reflects
review_language and
guest_type when they are set.object
Sub-scores keyed by translated category name, e.g.
Staff, Facilities,
Cleanliness, Comfort, Value for money, Location, Free Wifi.object
Map of language code to review count, e.g.
{"en": 812, "fr": 111}.object
Map of guest type to review count, e.g.
{"FAMILIES": 382}.integer
Echo of the requested page size.
integer
Echo of the requested offset.
string
Echo of the requested sort order.
Review[]
Reviews for this page.
Show Review
Show Review
string
Booking review id.
string
Review headline.
string
What the guest liked, or
null.string
What the guest disliked, or
null.number
Guest score out of 10.
string
Publication timestamp (ISO 8601, UTC).
integer
Same timestamp as Unix seconds.
string
Month of stay, e.g.
2026-07.string
YYYY-MM-DD, or null.string
YYYY-MM-DD, or null.integer
Nights stayed.
string
string
string
ISO country code, e.g.
ie.string
Avatar URL, or
null.string
e.g.
COUPLES.string
Room the guest stayed in — matches
rooms[].room_id on /properties.string
string
Language the review was written in.
string
Permalink to the review on booking.com.
boolean
boolean
integer
Guests who marked the review helpful.
string[]
Photo URLs attached to the review.
string
The property’s public reply, or
null.language_counts and guest_type_counts let you size a filtered subset
before you page it. A Rome hotel with 1,499 total reviews returns 111
with review_language=fr and 382 with guest_type=FAMILIES — read the
counts once, then decide how many pages the filtered set actually needs.Example
const res = await fetch(
"https://scrapebadger.com/v1/booking/properties/it/radisson-collection-roma-antica/reviews?" +
new URLSearchParams({
limit: "100",
offset: "0",
sort: "NEWEST_FIRST",
guest_type: "FAMILIES",
}),
{ headers: { "X-API-Key": process.env.SCRAPEBADGER_API_KEY } },
);
const data = await res.json();
console.log(data.total_count, "family reviews");
import requests
res = requests.get(
"https://scrapebadger.com/v1/booking/properties/it/radisson-collection-roma-antica/reviews",
headers={"X-API-Key": "YOUR_API_KEY"},
params={
"limit": 100,
"offset": 0,
"sort": "NEWEST_FIRST",
"guest_type": "FAMILIES",
},
)
data = res.json()
print(data["total_count"], "family reviews")
curl "https://scrapebadger.com/v1/booking/properties/it/radisson-collection-roma-antica/reviews?limit=100&offset=0&sort=NEWEST_FIRST&guest_type=FAMILIES" \
-H "X-API-Key: YOUR_API_KEY"
Response
{
"property_id": "1284937",
"total_count": 382,
"score_breakdown": {
"Staff": 9.2,
"Facilities": 8.8,
"Cleanliness": 9.1,
"Comfort": 9.0,
"Value for money": 8.1,
"Location": 9.4,
"Free Wifi": 9.3
},
"language_counts": {
"en": 812,
"it": 246,
"fr": 111,
"de": 98,
"es": 74
},
"guest_type_counts": {
"FAMILIES": 382,
"COUPLES": 611,
"GROUP_OF_FRIENDS": 152,
"SOLO_TRAVELLERS": 204,
"BUSINESS_TRAVELLERS": 150
},
"limit": 100,
"offset": 0,
"sort": "NEWEST_FIRST",
"reviews": [
{
"review_id": "1284739201",
"title": "Perfect base for a family week in Rome",
"positive": "Ten minutes on foot to the Colosseum and the staff held our bags for four hours after checkout without being asked twice. The junior suite fitted all four of us comfortably.",
"negative": "Breakfast gets very busy between 8 and 9 — go early or wait.",
"score": 9.2,
"date": "2026-08-12T09:41:22Z",
"date_utc": 1786520482,
"stay_date": "2026-07",
"checkin_date": "2026-07-28",
"checkout_date": "2026-08-02",
"length_of_stay": 5,
"guest_name": "Daniel",
"guest_country": "Ireland",
"guest_country_code": "ie",
"guest_avatar": "https://q-xx.bstatic.com/xdata/images/avatar/1284739201.jpg",
"guest_type": "FAMILIES",
"room_id": "128493705",
"room_name": "Junior Suite",
"language": "en",
"review_url": "https://www.booking.com/reviews/it/hotel/radisson-collection-roma-antica.html#1284739201",
"is_approved": true,
"is_anonymous": false,
"helpful_votes": 14,
"photos": [
"https://q-xx.bstatic.com/xdata/images/xphoto/1284739201-terrace.jpg"
],
"partner_reply": "Thank you Daniel — we are glad the junior suite worked well for the family, and we have passed your breakfast note to the restaurant team."
},
{
"review_id": "1281002934",
"title": "Emplacement idéal",
"positive": "Chambre spacieuse et très propre, vue sur le Colisée depuis la fenêtre.",
"negative": null,
"score": 8.8,
"date": "2026-07-30T18:02:10Z",
"date_utc": 1785434530,
"stay_date": "2026-07",
"checkin_date": "2026-07-21",
"checkout_date": "2026-07-24",
"length_of_stay": 3,
"guest_name": "Camille",
"guest_country": "France",
"guest_country_code": "fr",
"guest_avatar": null,
"guest_type": "FAMILIES",
"room_id": "128493701",
"room_name": "Deluxe Double Room with Colosseum View",
"language": "fr",
"review_url": "https://www.booking.com/reviews/it/hotel/radisson-collection-roma-antica.html#1281002934",
"is_approved": true,
"is_anonymous": false,
"helpful_votes": 3,
"photos": [],
"partner_reply": null
}
]
}
Each reviews request costs 10 credits. Failed requests are not charged.

