Get Reviews
curl --request GET \
--url https://scrapebadger.com/v1/airbnb/listings/{room_id}/reviewsimport requests
url = "https://scrapebadger.com/v1/airbnb/listings/{room_id}/reviews"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://scrapebadger.com/v1/airbnb/listings/{room_id}/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/airbnb/listings/{room_id}/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/airbnb/listings/{room_id}/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/airbnb/listings/{room_id}/reviews")
.asString();require 'uri'
require 'net/http'
url = URI("https://scrapebadger.com/v1/airbnb/listings/{room_id}/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{
"room_id": "<string>",
"total_count": 123,
"limit": 123,
"offset": 123,
"reviews": [
{
"id": "<string>",
"comments": "<string>",
"rating": 123,
"language": "<string>",
"created_at": "<string>",
"localized_date": "<string>",
"reviewer_name": "<string>",
"reviewer_id": "<string>",
"reviewer_location": "<string>",
"reviewer_image": "<string>",
"response": "<string>",
"photos": [
"<string>"
]
}
]
}Endpoints
Get Reviews
Paginated Airbnb guest reviews — full text, per-review rating, language, reviewer profile, host response and photos.
GET
/
v1
/
airbnb
/
listings
/
{room_id}
/
reviews
Get Reviews
curl --request GET \
--url https://scrapebadger.com/v1/airbnb/listings/{room_id}/reviewsimport requests
url = "https://scrapebadger.com/v1/airbnb/listings/{room_id}/reviews"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://scrapebadger.com/v1/airbnb/listings/{room_id}/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/airbnb/listings/{room_id}/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/airbnb/listings/{room_id}/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/airbnb/listings/{room_id}/reviews")
.asString();require 'uri'
require 'net/http'
url = URI("https://scrapebadger.com/v1/airbnb/listings/{room_id}/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{
"room_id": "<string>",
"total_count": 123,
"limit": 123,
"offset": 123,
"reviews": [
{
"id": "<string>",
"comments": "<string>",
"rating": 123,
"language": "<string>",
"created_at": "<string>",
"localized_date": "<string>",
"reviewer_name": "<string>",
"reviewer_id": "<string>",
"reviewer_location": "<string>",
"reviewer_image": "<string>",
"response": "<string>",
"photos": [
"<string>"
]
}
]
}Page through a listing’s guest reviews by
room_id. Each review carries the
full comment text, the guest’s rating, the review language, the reviewer’s
profile, the host’s response when there is one, and any photos the guest
attached. Paginate with limit and offset against total_count.
Path Parameters
string
required
Airbnb room id, e.g.
48291736.Query Parameters
integer
default:"24"
Reviews per page. Maximum
50.integer
default:"0"
Number of reviews to skip.
string
default:"MOST_RECENT"
Sort order. One of
MOST_RECENT, RATING_DESC, RATING_ASC.string
default:"USD"
Currency for prices, e.g.
EUR, GBP.string
default:"en"
Locale for text, e.g.
fr, es.Response
string
Airbnb room id.
integer
Total reviews on the listing.
integer
Echo of the requested page size.
integer
Echo of the requested offset.
Review[]
Reviews for this page.
Show Review
Show Review
string
Airbnb review id.
string
Full review text.
integer
Guest rating,
1–5.string
Language code the review was written in, e.g.
en.string
Publication timestamp (ISO 8601).
string
Airbnb’s relative date, e.g.
2 days ago.string
string
string
Guest’s stated location.
string
Guest avatar URL.
string
Host’s public reply, or
null.string[]
Photo URLs attached to the review.
Example
const res = await fetch(
"https://scrapebadger.com/v1/airbnb/listings/48291736/reviews?" +
new URLSearchParams({ limit: "50", offset: "0", sort: "MOST_RECENT" }),
{ headers: { "X-API-Key": process.env.SCRAPEBADGER_API_KEY } },
);
const data = await res.json();
import requests
res = requests.get(
"https://scrapebadger.com/v1/airbnb/listings/48291736/reviews",
headers={"X-API-Key": "YOUR_API_KEY"},
params={"limit": 50, "offset": 0, "sort": "MOST_RECENT"},
)
data = res.json()
curl "https://scrapebadger.com/v1/airbnb/listings/48291736/reviews?limit=50&offset=0&sort=MOST_RECENT" \
-H "X-API-Key: YOUR_API_KEY"
Response
{
"room_id": "48291736",
"total_count": 214,
"limit": 50,
"offset": 0,
"reviews": [
{
"id": "1284739201",
"comments": "Inês's place is exactly as pictured — the balcony view over the Tagus is worth the four flights of stairs. Spotless, quiet at night despite being right by tram 28, and she left us a map of her favourite tascas. Would stay again.",
"rating": 5,
"language": "en",
"created_at": "2026-08-12T09:41:22Z",
"localized_date": "2 days ago",
"reviewer_name": "Daniel",
"reviewer_id": "38472910",
"reviewer_location": "Dublin, Ireland",
"reviewer_image": "https://a0.muscache.com/im/pictures/user/38472910-profile.jpg",
"response": "Thank you Daniel! You were wonderful guests — come back any time.",
"photos": [
"https://a0.muscache.com/im/pictures/review/1284739201-balcony.jpeg"
]
},
{
"id": "1281002934",
"comments": "Très bien situé, appartement propre et bien équipé. Un peu bruyant le matin à cause du tram, mais rien de grave.",
"rating": 4,
"language": "fr",
"created_at": "2026-07-30T18:02:10Z",
"localized_date": "2 weeks ago",
"reviewer_name": "Camille",
"reviewer_id": "19283746",
"reviewer_location": "Lyon, France",
"reviewer_image": "https://a0.muscache.com/im/pictures/user/19283746-profile.jpg",
"response": null,
"photos": []
}
]
}
Each reviews request costs 5 credits. Failed requests are not charged.
⌘I

