Get Rooms & Rates
curl --request GET \
--url https://scrapebadger.com/v1/booking/properties/{country_code}/{slug}/roomsimport requests
url = "https://scrapebadger.com/v1/booking/properties/{country_code}/{slug}/rooms"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://scrapebadger.com/v1/booking/properties/{country_code}/{slug}/rooms', 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}/rooms",
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}/rooms"
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}/rooms")
.asString();require 'uri'
require 'net/http'
url = URI("https://scrapebadger.com/v1/booking/properties/{country_code}/{slug}/rooms")
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>",
"name": "<string>",
"slug": "<string>",
"url": "<string>",
"checkin": "<string>",
"checkout": "<string>",
"adults": 123,
"children": "<string>",
"rooms_requested": 123,
"currency": "<string>",
"is_sold_out": true,
"area_unit": "<string>",
"rate_count": 123,
"rooms": [
{
"room_id": "<string>",
"room_type_id": 123,
"name": "<string>",
"description": "<string>",
"size_m2": 123,
"floors": [
123
],
"bathrooms": 123,
"is_smoking": true,
"is_bigger_than_average": true,
"cribs_free": true,
"max_persons": 123,
"max_guests": 123,
"max_children": 123,
"privacy_level": "<string>",
"bed_options": [
{
"configuration_id": 123,
"beds": [
{
"count": 123,
"bed_type": "<string>"
}
]
}
],
"facilities": [
{
"category": "<string>",
"facilities": [
"<string>"
]
}
],
"highlights": [
"<string>"
],
"photos": [
"<string>"
],
"rates": [
{
"block_id": "<string>",
"room_id": "<string>",
"rate_id": 123,
"occupancy": 123,
"meal_plan_index": 123,
"price": {
"display": "<string>",
"amount": 123,
"currency": "<string>",
"rounded": 123
},
"price_before_discount": {},
"price_per_night": {},
"charges_info": "<string>",
"info_message": "<string>",
"discounts": [
{
"name": "<string>",
"description": "<string>",
"item_type": "<string>",
"amount": 123,
"currency": "<string>"
}
],
"badges": [
"<string>"
]
}
]
}
],
"meal_plans": [
{
"meal_plan_id": 123,
"name": "<string>",
"meal_type": "<string>",
"breakfast_included": true,
"breakfast_price": 123,
"lunch_included": true,
"lunch_price": 123,
"dinner_included": true,
"dinner_price": 123
}
],
"child_and_bed_policy": {
"children_allowed": true,
"min_children_age": 123,
"cribs_allowed": true,
"extra_beds_allowed": true,
"cribs_guaranteed": true,
"rules": [
{
"rule_id": 123,
"age_from": 123,
"age_to": 123,
"rule_type": "<string>",
"price_type": "<string>",
"price_mode": "<string>",
"price": 123,
"localized_price": "<string>"
}
]
}
}Properties
Get Rooms & Rates
The full Booking.com rate table for one property and one set of dates — every room type with its per-room facilities, bed layouts and every bookable rate, plus meal plans and the child and bed policy.
GET
/
v1
/
booking
/
properties
/
{country_code}
/
{slug}
/
rooms
Get Rooms & Rates
curl --request GET \
--url https://scrapebadger.com/v1/booking/properties/{country_code}/{slug}/roomsimport requests
url = "https://scrapebadger.com/v1/booking/properties/{country_code}/{slug}/rooms"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://scrapebadger.com/v1/booking/properties/{country_code}/{slug}/rooms', 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}/rooms",
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}/rooms"
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}/rooms")
.asString();require 'uri'
require 'net/http'
url = URI("https://scrapebadger.com/v1/booking/properties/{country_code}/{slug}/rooms")
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>",
"name": "<string>",
"slug": "<string>",
"url": "<string>",
"checkin": "<string>",
"checkout": "<string>",
"adults": 123,
"children": "<string>",
"rooms_requested": 123,
"currency": "<string>",
"is_sold_out": true,
"area_unit": "<string>",
"rate_count": 123,
"rooms": [
{
"room_id": "<string>",
"room_type_id": 123,
"name": "<string>",
"description": "<string>",
"size_m2": 123,
"floors": [
123
],
"bathrooms": 123,
"is_smoking": true,
"is_bigger_than_average": true,
"cribs_free": true,
"max_persons": 123,
"max_guests": 123,
"max_children": 123,
"privacy_level": "<string>",
"bed_options": [
{
"configuration_id": 123,
"beds": [
{
"count": 123,
"bed_type": "<string>"
}
]
}
],
"facilities": [
{
"category": "<string>",
"facilities": [
"<string>"
]
}
],
"highlights": [
"<string>"
],
"photos": [
"<string>"
],
"rates": [
{
"block_id": "<string>",
"room_id": "<string>",
"rate_id": 123,
"occupancy": 123,
"meal_plan_index": 123,
"price": {
"display": "<string>",
"amount": 123,
"currency": "<string>",
"rounded": 123
},
"price_before_discount": {},
"price_per_night": {},
"charges_info": "<string>",
"info_message": "<string>",
"discounts": [
{
"name": "<string>",
"description": "<string>",
"item_type": "<string>",
"amount": 123,
"currency": "<string>"
}
],
"badges": [
"<string>"
]
}
]
}
],
"meal_plans": [
{
"meal_plan_id": 123,
"name": "<string>",
"meal_type": "<string>",
"breakfast_included": true,
"breakfast_price": 123,
"lunch_included": true,
"lunch_price": 123,
"dinner_included": true,
"dinner_price": 123
}
],
"child_and_bed_policy": {
"children_allowed": true,
"min_children_age": 123,
"cribs_allowed": true,
"extra_beds_allowed": true,
"cribs_guaranteed": true,
"rules": [
{
"rule_id": 123,
"age_from": 123,
"age_to": 123,
"rule_type": "<string>",
"price_type": "<string>",
"price_mode": "<string>",
"price": 123,
"localized_price": "<string>"
}
]
}
}Fetch the entire rate table for a property on given dates.
Both also come back on every
Trimmed to 2 of 7 rooms and 3 of 30 rates:
/search returns only the single
cheapest rate per property; this endpoint returns every rate on every room
type in one call — 30 rates across 5 priced room types for a Rome five-star,
68 rates across 11 room types for a Barcelona hotel.
The two path parameters are the two segments of a Booking hotel URL:
https://www.booking.com/hotel/it/radisson-collection-roma-antica.html
^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
country_code slug
/search result as country_code
and slug.
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
string
required
Check-in date,
YYYY-MM-DD.string
required
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,
1–30.string
default:"USD"
Currency for prices, e.g.
EUR, GBP.string
default:"en-us"
Locale for text and price formatting, e.g.
fr, de. Also decides whether
room sizes come back in square metres or square feet — see area_unit.Response
string
Booking property id.
string
Property name.
string
Echo of the requested slug.
string
Canonical property URL on booking.com.
string
Echo of the check-in date.
string
Echo of the check-out date.
integer
Echo of the requested adults.
string
Echo of the requested children’s ages, or
null.integer
Echo of the requested number of rooms.
string
Currency the prices are quoted in.
boolean
No availability for these dates. The room catalogue is still returned — see
the note below.
string
Unit for
rooms[].size_m2 — SQUARE_METER or SQUARE_FEET. Locale-driven:
it follows the requested language.integer
Total rates across every room.
Room[]
Every room type at the property.
Show Room
Show Room
string
integer
string
e.g.
Deluxe Double Room.string
number
Room size in
area_unit, or null.integer[]
Floors this room type is on.
integer
boolean
boolean
Larger than the property’s typical room.
boolean
Cribs supplied free in this room.
integer
integer
integer
string
e.g.
ENTIRE_UNIT.BedOption[]
FacilityGroup[]
Facilities of this room, grouped by category — a single five-star room
returned 33 across the three categories.
/properties only carries
property-level facilities.string[]
Room highlights, e.g.
Colosseum view.string[]
Room photo URLs.
Rate[]
Every bookable rate for this room. Empty when the room has no
availability for the dates.
Show Rate
Show Rate
string
Booking’s rate identifier,
<room_id>_<rate_id>_<occupancy>_<meal_plan_index>_0 — already split into the four fields below.string
Room this rate belongs to.
integer
integer
Guests the rate is priced for.
integer
Index into
meal_plans[].object
object
Struck-through price when discounted, same shape as
price, else null.object
Per-night price, same shape as
price.string
Taxes and charges line, e.g.
+€36 taxes and charges.string
Booking’s note on the rate, e.g.
Only 2 rooms left at this price, or null.Discount[]
string[]
Rate badges, e.g.
9% off.MealPlan[]
object
Children and extra-bed rules, with priced age bands.
Show child_and_bed_policy
Show child_and_bed_policy
boolean
integer
boolean
boolean
boolean
Crib availability is guaranteed rather than on request.
Every price is returned both as Booking’s localized display string
(
"€ 1.170") and as a numeric amount + currency. Always do arithmetic on
amount, never on display.Not every room is priced. Rooms with no availability for the dates still
come back with full detail — description, facilities, bed options, photos —
but an empty
rates[]. On one Rome five-star, 5 of 7 rooms were priced; on a
Barcelona hotel, 11 of 16.Sold out is a
200, not an error. When Booking has no availability at
all for the dates you get is_sold_out: true, rate_count: 0 and an empty
rates[] on every room — the room catalogue, facilities and highlights are
still returned. The same Rome guesthouse returns is_sold_out: true with 0
rates for 2026-09-10 and is_sold_out: false with 22 rates for
2026-12-05. Branch on is_sold_out, not on a failed request.A property that does not exist returns
404. Missing checkin/checkout,
or a malformed children value, returns 400.Example
const res = await fetch(
"https://scrapebadger.com/v1/booking/properties/it/radisson-collection-roma-antica/rooms?" +
new URLSearchParams({
checkin: "2026-12-05",
checkout: "2026-12-08",
adults: "2",
children: "4,9",
currency: "EUR",
}),
{ headers: { "X-API-Key": process.env.SCRAPEBADGER_API_KEY } },
);
const data = await res.json();
console.log(data.rate_count, "rates across", data.rooms.length, "room types");
import requests
res = requests.get(
"https://scrapebadger.com/v1/booking/properties/it/radisson-collection-roma-antica/rooms",
headers={"X-API-Key": "YOUR_API_KEY"},
params={
"checkin": "2026-12-05",
"checkout": "2026-12-08",
"adults": 2,
"children": "4,9",
"currency": "EUR",
},
)
data = res.json()
print(data["rate_count"], "rates across", len(data["rooms"]), "room types")
curl "https://scrapebadger.com/v1/booking/properties/it/radisson-collection-roma-antica/rooms?checkin=2026-12-05&checkout=2026-12-08&adults=2&children=4%2C9¤cy=EUR" \
-H "X-API-Key: YOUR_API_KEY"
Response
{
"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",
"checkin": "2026-12-05",
"checkout": "2026-12-08",
"adults": 2,
"children": "4,9",
"rooms_requested": 1,
"currency": "EUR",
"is_sold_out": false,
"area_unit": "SQUARE_METER",
"rate_count": 30,
"rooms": [
{
"room_id": "128493701",
"room_type_id": 8,
"name": "Deluxe Double Room with Colosseum View",
"description": "This air-conditioned double room features a seating area, a minibar and a private bathroom with a rain shower. The room looks onto the Colosseum.",
"size_m2": 32,
"floors": [3, 4, 5],
"bathrooms": 1,
"is_smoking": false,
"is_bigger_than_average": true,
"cribs_free": true,
"max_persons": 3,
"max_guests": 3,
"max_children": 1,
"privacy_level": "ENTIRE_UNIT",
"bed_options": [
{
"configuration_id": 1,
"beds": [{ "count": 1, "bed_type": "Large double bed" }]
},
{
"configuration_id": 2,
"beds": [{ "count": 2, "bed_type": "Single bed" }]
}
],
"facilities": [
{
"category": "BATHROOM_PRIVATE",
"facilities": ["Rain shower", "Bathrobe", "Free toiletries", "Hairdryer"]
},
{
"category": "VIEW",
"facilities": ["Landmark view", "City view"]
},
{
"category": "OTHER",
"facilities": ["Air conditioning", "Minibar", "Safety deposit box", "Free WiFi"]
}
],
"highlights": ["Colosseum view", "32 m²", "Air conditioning"],
"photos": [
"https://cf.bstatic.com/xdata/images/hotel/max1024x768/1284937-deluxe-double.jpg"
],
"rates": [
{
"block_id": "128493701_412880094_2_0_0",
"room_id": "128493701",
"rate_id": 412880094,
"occupancy": 2,
"meal_plan_index": 0,
"price": {
"display": "€ 1.170",
"amount": 1170.4,
"currency": "EUR",
"rounded": 1170
},
"price_before_discount": {
"display": "€ 1.286",
"amount": 1286.15,
"currency": "EUR",
"rounded": 1286
},
"price_per_night": {
"display": "€ 390",
"amount": 390.13,
"currency": "EUR",
"rounded": 390
},
"charges_info": "+€ 63 taxes and charges",
"info_message": "Only 2 rooms left at this price",
"discounts": [
{
"name": "Genius discount",
"description": "You are getting a reduced rate because you are a Genius member.",
"item_type": "ROOM",
"amount": 115.75,
"currency": "EUR"
}
],
"badges": ["9% off"]
},
{
"block_id": "128493701_412880094_2_1_0",
"room_id": "128493701",
"rate_id": 412880094,
"occupancy": 2,
"meal_plan_index": 1,
"price": {
"display": "€ 1.320",
"amount": 1320.4,
"currency": "EUR",
"rounded": 1320
},
"price_before_discount": null,
"price_per_night": {
"display": "€ 440",
"amount": 440.13,
"currency": "EUR",
"rounded": 440
},
"charges_info": "+€ 63 taxes and charges",
"info_message": null,
"discounts": [],
"badges": []
},
{
"block_id": "128493701_412880102_3_0_0",
"room_id": "128493701",
"rate_id": 412880102,
"occupancy": 3,
"meal_plan_index": 0,
"price": {
"display": "€ 1.455",
"amount": 1455.0,
"currency": "EUR",
"rounded": 1455
},
"price_before_discount": null,
"price_per_night": {
"display": "€ 485",
"amount": 485.0,
"currency": "EUR",
"rounded": 485
},
"charges_info": "+€ 63 taxes and charges",
"info_message": null,
"discounts": [],
"badges": []
}
]
},
{
"room_id": "128493709",
"room_type_id": 12,
"name": "Classic Single Room",
"description": "A compact air-conditioned single room with a private bathroom and a courtyard outlook.",
"size_m2": 18,
"floors": [1, 2],
"bathrooms": 1,
"is_smoking": false,
"is_bigger_than_average": false,
"cribs_free": false,
"max_persons": 1,
"max_guests": 1,
"max_children": 0,
"privacy_level": "ENTIRE_UNIT",
"bed_options": [
{
"configuration_id": 1,
"beds": [{ "count": 1, "bed_type": "Single bed" }]
}
],
"facilities": [
{
"category": "BATHROOM_PRIVATE",
"facilities": ["Shower", "Free toiletries", "Hairdryer"]
},
{
"category": "OTHER",
"facilities": ["Air conditioning", "Free WiFi", "Desk"]
}
],
"highlights": ["18 m²", "Air conditioning"],
"photos": [
"https://cf.bstatic.com/xdata/images/hotel/max1024x768/1284937-classic-single.jpg"
],
"rates": []
}
],
"meal_plans": [
{
"meal_plan_id": 1,
"name": "Breakfast included",
"meal_type": "BREAKFAST",
"breakfast_included": true,
"breakfast_price": null,
"lunch_included": false,
"lunch_price": null,
"dinner_included": false,
"dinner_price": null
},
{
"meal_plan_id": 3,
"name": "Half board",
"meal_type": "HALF_BOARD",
"breakfast_included": true,
"breakfast_price": null,
"lunch_included": false,
"lunch_price": null,
"dinner_included": true,
"dinner_price": null
}
],
"child_and_bed_policy": {
"children_allowed": true,
"min_children_age": 0,
"cribs_allowed": true,
"extra_beds_allowed": true,
"cribs_guaranteed": false,
"rules": [
{
"rule_id": 1,
"age_from": 0,
"age_to": 2,
"rule_type": "CRIB",
"price_type": "FREE",
"price_mode": "PER_NIGHT",
"price": null,
"localized_price": null
},
{
"rule_id": 2,
"age_from": 3,
"age_to": 17,
"rule_type": "EXTRA_BED",
"price_type": "FIXED",
"price_mode": "PER_NIGHT",
"price": 35.0,
"localized_price": "€ 35"
}
]
}
}
The usual flow:
/search for the
shortlist, take country_code + slug off any result, then call /rooms
for that property’s full rate table.Each rooms request costs 10 credits. Failed requests are not charged.
⌘I

