Appearance
Booking.com Scraper API
Turn Booking.com into structured travel data. Search a destination for a stay and get one page of properties - name, district, neighborhood, coordinates, stars, review and location scores, the total price of the stay with taxes and deals, the room and its beds, free cancellation, sustainability - or send one property and get its description, brand, facilities and highlights, house rules with the child policy, review scores by category, featured guest reviews, answered guest questions, photos, room types and every bookable rate for your dates with its prepayment terms and tax breakdown. No proxy pool, bot-check handling or parser maintenance on your side.
It ships as two synchronous Scraper APIs and a no-code scraper:
| Product | Type | Product code | What it does |
|---|---|---|---|
| Booking Search API | Scraper API (synchronous) | booking_search | Search a destination for a stay and get one page of properties. |
| Booking Hotel API | Scraper API (synchronous) | booking_hotel | Give one property URL or id, get the property and its rates. |
| Booking.com Scraper | No-code scraper | booking | Sweep several search pages into JSON, CSV and XML files. |
Every field is snake_case, the same convention as the Web Scraping API.
The stay
Both APIs take the same stay parameters. Prices and availability on Booking.com follow the visitor's location, so each request runs through a residential exit in the country you choose.
| Parameter | Type | Example | Description |
|---|---|---|---|
checkin | string | 2027-03-12 | Check-in date, YYYY-MM-DD, a real date, not in the past. |
checkout | string | 2027-03-14 | Check-out date, YYYY-MM-DD, 1 to 90 nights after checkin. |
adults | number | 2 | Adult guests, 1–30. Defaults to 2. |
children_ages | list | 7,12 | One age (0–17) per child, e.g. 7,12 or repeated children_ages=7&children_ages=12. |
rooms | number | 1 | Rooms, 1–30 and no more than adults. Defaults to 1. |
currency | string | EUR | ISO 4217 currency of the prices, e.g. EUR. Defaults to USD. |
language | string | en-gb | Booking.com language of names and descriptions: en-us, en-gb, de, fr… Defaults to en-us. |
country | string | de | Two-letter country the request runs from, e.g. de. Defaults to us. |
Booking Search API
GET https://api.scrapeit.io/api/v1/scrape/booking/search
x-api-key: YOUR_SCRAPEIT_API_KEY| Parameter | Type | Example | Description |
|---|---|---|---|
destination | string | Barcelona | Required. City, region, district, landmark or property name, as typed into the Booking.com search box. |
checkin | string | 2027-03-12 | Required. See the stay. |
checkout | string | 2027-03-14 | Required. |
page | number | 2 | Results page of 25 properties, 1–40. Defaults to 1. |
sort | string | price | popularity (default), price, price_from_high_to_low, review_score_and_price, bayesian_review_score, class, class_asc, class_and_price, distance_from_search, upsort_bh. |
Plus every stay parameter.
Example request
bash
curl -G 'https://api.scrapeit.io/api/v1/scrape/booking/search' \
-H 'x-api-key: YOUR_SCRAPEIT_API_KEY' \
--data-urlencode 'destination=Barcelona' \
--data-urlencode 'checkin=2027-03-12' \
--data-urlencode 'checkout=2027-03-14' \
--data-urlencode 'children_ages=7' \
--data-urlencode 'currency=USD' \
--data-urlencode 'sort=price'js
const response = await fetch(
'https://api.scrapeit.io/api/v1/scrape/booking/search?' +
new URLSearchParams({
destination: 'Barcelona',
checkin: '2027-03-12',
checkout: '2027-03-14',
currency: 'USD',
}),
{ headers: { 'x-api-key': 'YOUR_SCRAPEIT_API_KEY' } },
);
const { data } = await response.json();
for (const hotel of data.results) console.log(hotel.name, hotel.price, hotel.review_score);python
import requests
response = requests.get(
"https://api.scrapeit.io/api/v1/scrape/booking/search",
headers={"x-api-key": "YOUR_SCRAPEIT_API_KEY"},
params={
"destination": "Barcelona",
"checkin": "2027-03-12",
"checkout": "2027-03-14",
"currency": "USD",
},
timeout=120,
)
for hotel in response.json()["data"]["results"]:
print(hotel["name"], hotel["price"], hotel["review_score"])Search response
json
{
"data": {
"destination": "Barcelona",
"destination_name": "Barcelona",
"destination_type": "CITY",
"destination_id": -372490,
"checkin": "2027-03-12",
"checkout": "2027-03-14",
"nights": 2,
"adults": 2,
"children_ages": [7],
"rooms": 1,
"currency": "USD",
"search_url": "https://www.booking.com/searchresults.html?ss=Barcelona&checkin=2027-03-12&checkout=2027-03-14&group_adults=2&no_rooms=1&group_children=1&age=7&selected_currency=USD&lang=en-us&order=price",
"results": [
{
"position": 1,
"hotel_id": 90591,
"name": "Catalonia Mikado",
"url": "https://www.booking.com/hotel/es/cataloniamikado.html",
"accommodation_type_id": 204,
"country_code": "es",
"city": "Barcelona",
"address": "Paseo Bonanova, 58",
"district": "Sarrià-St. Gervasi, Barcelona",
"neighborhood": null,
"distance_from_center": "4 km from downtown",
"public_transport_distance": "Bonanova station is within 400 meters",
"is_centrally_located": false,
"latitude": 41.4032275747704,
"longitude": 2.12708830833435,
"stars": 3,
"star_rating_type": "stars",
"review_score": 8.2,
"review_score_word": "Very Good",
"reviews_count": 2441,
"location_score": 8.6,
"external_review_score": null,
"external_reviews_count": null,
"price": 314.27,
"price_before_discount": 349.19,
"currency": "USD",
"price_in_property_currency": 280,
"property_currency": "EUR",
"discounts": [{ "name": "Early Booker Deal", "amount": 34.92 }],
"badges": [],
"taxes_and_fees": 34.57,
"taxes_and_fees_text": "Additional charges may apply",
"meal_plan": null,
"free_cancellation": true,
"free_cancellation_until": "2027-03-09T23:00:00Z",
"no_prepayment": true,
"sold_out": false,
"rooms_left_message": "We have 2 left at this price",
"room_id": 9059105,
"room_name": "Triple Room (2 Adults + 1 Child)",
"unit_type": null,
"unit_size": null,
"beds_count": 2,
"bedrooms": null,
"bathrooms": null,
"is_preferred_partner": true,
"is_preferred_plus": false,
"genius_rate_available": false,
"is_sponsored": false,
"host_type": "professional",
"is_sustainable": false,
"sustainability_certifications": [],
"thumbnail": "https://cf.bstatic.com/xdata/images/hotel/square600/769615301.webp?k=…"
}
],
"pagination": {
"current_page": 1,
"per_page": 25,
"total_results": 951,
"total_pages": 39,
"has_next_page": true
}
}
}| Field | Description |
|---|---|
destination_name / _type | What Booking.com resolved destination to, e.g. Barcelona / CITY. |
results[].hotel_id | Booking.com property id; pass it, or url, to the Hotel API. |
results[].url | Property page URL, without stay parameters. |
results[].district | District as the card shows it; neighborhood is the popular area around it, e.g. Saint Germain des Pres. |
results[].public_transport_distance | Nearest station as the card words it; is_centrally_located is Booking.com's own flag. |
results[].stars | Star rating 1–5. star_rating_type is stars for an official classification, tiles for Booking.com's own rating of a home. |
results[].review_score | Guest score out of 10; null for a property without reviews. |
results[].location_score | Guest score of the location out of 10, when the card shows it. |
results[].external_review_score | Score out of 10 from reviews on other travel sites, with external_reviews_count, when the card shows one. |
results[].price | Price of the whole stay for the requested occupancy, in currency; price_in_property_currency is the same stay in property_currency. |
results[].discounts | Deals behind the price (Limited-time Deal, Early Booker Deal, Booking.com pays) with what each takes off the stay. |
results[].badges | Price badges of the card, e.g. Limited-time Deal. |
results[].taxes_and_fees | Taxes and fees not included in price, when Booking.com states the amount; taxes_and_fees_text is the card's own line. |
results[].free_cancellation_until | Last moment of free cancellation (ISO 8601), when the card states one. |
results[].room_name | Room the price is for; room_id matches room_types[].room_id of the Hotel API. |
results[].unit_type | For a home or suite: Entire apartment, Private suite…, with unit_size (248 ft²), beds_count, bedrooms, bathrooms. |
results[].meal_plan | Meal plan included in the price, e.g. Breakfast included. |
results[].rooms_left_message | Scarcity line of the price, e.g. We have 1 left at this price. |
results[].is_preferred_partner | Booking.com Preferred Partner (is_preferred_plus for Preferred Plus); is_sponsored marks an ad placement. |
results[].host_type | professional or a private host, as Booking.com labels it under EU consumer law. |
results[].is_sustainable | Whether the property holds a recognized sustainability certification, listed in sustainability_certifications. |
pagination.total_results | Properties Booking.com found for the search. |
Booking Hotel API
GET https://api.scrapeit.io/api/v1/scrape/booking/hotel
x-api-key: YOUR_SCRAPEIT_API_KEY| Parameter | Type | Example | Description |
|---|---|---|---|
url | string | https://www.booking.com/hotel/fr/mama-shelter.html | Property page URL, https://www.booking.com/hotel/<country>/<name>.html - e.g. the url of a search result. |
hotel_id | number | 59716 | Booking.com property id - e.g. the hotel_id of a search result. Send either url or hotel_id. |
checkin | string | 2027-03-12 | Optional, with checkout. Without dates the page has no rates: offers is empty. |
checkout | string | 2027-03-14 | Optional, with checkin. |
Plus adults, children_ages, rooms, currency, language and country from the stay. A url is never fetched as given: ScrapeIt reads the property out of it and asks Booking.com for that property. A hotel_id is first looked up on Booking.com to find its page; that lookup costs nothing extra, and a hotel_id Booking.com has no property for answers 404 NOT_FOUND, billed like a property request - Booking.com answered it.
Example request
bash
curl -G 'https://api.scrapeit.io/api/v1/scrape/booking/hotel' \
-H 'x-api-key: YOUR_SCRAPEIT_API_KEY' \
--data-urlencode 'url=https://www.booking.com/hotel/fr/mama-shelter.html' \
--data-urlencode 'checkin=2027-03-12' \
--data-urlencode 'checkout=2027-03-14' \
--data-urlencode 'currency=EUR'js
const response = await fetch(
'https://api.scrapeit.io/api/v1/scrape/booking/hotel?' +
new URLSearchParams({
hotel_id: '59716',
checkin: '2027-03-12',
checkout: '2027-03-14',
currency: 'EUR',
}),
{ headers: { 'x-api-key': 'YOUR_SCRAPEIT_API_KEY' } },
);
const { data } = await response.json();
for (const offer of data.offers) console.log(offer.room_name, offer.price, offer.cancellation_type);python
import requests
response = requests.get(
"https://api.scrapeit.io/api/v1/scrape/booking/hotel",
headers={"x-api-key": "YOUR_SCRAPEIT_API_KEY"},
params={
"url": "https://www.booking.com/hotel/fr/mama-shelter.html",
"checkin": "2027-03-12",
"checkout": "2027-03-14",
"currency": "EUR",
},
timeout=120,
)
hotel = response.json()["data"]
for offer in hotel["offers"]:
print(offer["room_name"], offer["price"], offer["cancellation_type"])Hotel response
json
{
"data": {
"hotel_id": 59716,
"name": "Mama Shelter Paris East",
"url": "https://www.booking.com/hotel/fr/mama-shelter.html",
"accommodation_type": "HOTEL",
"brand": "Mama Shelter",
"description": "Located in the 20th district in central Paris, this stylish hotel offers ultramodern guest rooms…",
"address": "109, Rue De Bagnolet, 20th arr., 75020 Paris, France",
"postal_code": "75020",
"city": "Paris",
"region": null,
"country": null,
"country_code": "fr",
"latitude": 48.85969196803369,
"longitude": 2.4029454588890076,
"stars": 2,
"review_score": 8.4,
"reviews_count": 1886,
"category_scores": [
{ "category": "hotel_staff", "score": 9, "reviews_count": 1849 },
{ "category": "hotel_clean", "score": 8.8, "reviews_count": 1844 },
{ "category": "hotel_location", "score": 8, "reviews_count": 1843 }
],
"featured_reviews": [
{
"author": "Anne",
"author_country_code": "ca",
"score": 10,
"date": "2026-09-24",
"title": "Comfortable stop over in Paris",
"positive": "It’s a well appointed hotel in a lovely residential part of Paris",
"negative": null,
"traveller_type": "young_couple",
"room_name": "Medium Mama Double"
}
],
"popular_facilities": ["Non-smoking rooms", "Facilities for disabled guests", "Restaurant"],
"facilities": ["Restaurant", "Wine/Champagne", "Kid-friendly buffet"],
"highlights": [
{ "name": "Parking", "details": ["Parking garage", "Electric charging", "Accessible"] }
],
"policies": {
"check_in_from": "3:00 PM",
"check_in_until": null,
"check_out_from": null,
"check_out_until": "12:00 PM",
"min_check_in_age": 18,
"pets_allowed": "YES",
"pets_charge": "FREE",
"children_allowed": true,
"min_child_age": 0,
"cribs_allowed": true,
"extra_beds_allowed": false,
"child_rules": [
{
"age_from": 0,
"age_to": 12,
"bed_type": "existing_bed",
"price_type": "free",
"price_mode": "per_stay",
"price_text": "€ 0"
}
],
"damage_deposit": "A damage deposit of € 350 is required on arrival. …",
"accepted_payment_methods": ["American Express", "Visa", "Mastercard", "Carte Bleue"],
"fine_print": "Children under 18 years of age must be accompanied by an adult. …"
},
"questions_and_answers": [
{
"question": "Hello, Do you have any parking ?",
"answer": "I can confirm that we do have a parking lot reserved for hotel and restaurant customers. …",
"asked_on": "November 28, 2021",
"answered_on": "December 16, 2021"
}
],
"languages_spoken": ["en", "fr"],
"is_sustainable": true,
"sustainability_certifications": ["Green Key (FEE)"],
"photos": ["https://cf.bstatic.com/xdata/images/hotel/max1280x900/871833075.jpg?k=…"],
"room_types": [
{
"room_id": 5971607,
"name": "Medium Mama Double",
"description": "This double room has air conditioning, minifridge and flat-screen TV.",
"size_m2": 17,
"max_persons": 2,
"max_children": 1,
"smoking_allowed": false,
"beds": [{ "type": "DOUBLE_BED", "count": 1 }],
"facilities": ["Safety deposit box", "Air conditioning", "Heating"],
"photos": ["https://cf.bstatic.com/xdata/images/hotel/max1024x768/875047261.jpg?k=…"]
}
],
"offers": [
{
"block_id": "5971607_430896189_2_2_0",
"room_id": 5971607,
"room_name": "Medium Mama Double",
"price": 378.95,
"price_before_discount": null,
"price_per_night": 189.48,
"currency": "EUR",
"max_persons": 2,
"cancellation_type": "free_cancellation",
"cancellation_text": "Free cancellation before March 12, 2027",
"prepayment_type": "patp_without_prepayment",
"prepayment_text": "No prepayment needed - pay at the property",
"meal_plan": null,
"taxes_and_fees": 13,
"taxes_and_fees_text": "+€ 13 taxes and fees",
"taxes_and_fees_breakdown": [{ "name": "City tax", "amount": 13 }]
}
],
"checkin": "2027-03-12",
"checkout": "2027-03-14",
"currency": "EUR"
}
}| Field | Description |
|---|---|
category_scores | Guest scores out of 10 per category, under Booking.com's own keys: hotel_staff, hotel_services (facilities), hotel_clean, hotel_comfort, hotel_value, hotel_location, hotel_wifi, breakfast… |
featured_reviews | Guest reviews the property page features: first name and country of the guest, score, date, title, what they liked and disliked, traveller type and room. |
popular_facilities | The facilities the page lists as most popular; facilities lists all of them. |
highlights | The page's highlight boxes, e.g. Parking with Parking garage, Electric charging. |
policies | House rules: check-in and check-out times as the page words them, minimum check-in age, pets, children (cribs, extra beds and what each age band costs in child_rules), the damage deposit, accepted cards and payment methods, fine print. |
questions_and_answers | Up to 20 guest questions the property answered, with the dates as the page words them. |
languages_spoken | ISO 639-1 codes of the languages the staff speak. |
room_types | Every room type of the property, bookable or not, with size, occupancy (max_persons, max_children), smoking, beds, facilities and photos. |
offers | Every bookable rate for the stay: price of the whole stay for one room (with price_per_night and, for a deal, price_before_discount), cancellation type (free_cancellation, non_refundable…) and its wording (cancellation_text, with the deadline), prepayment terms (prepayment_type, prepayment_text), included meal plan and taxes not included with their breakdown. Empty without dates or when sold out. |
region / country | Region and country name - only when the answer came from the property page itself (see Limits); null otherwise, country_code is always set. |
currency | Currency of offers, as the page priced them. |
A missing field is null or an empty list, never an error.
Booking.com Scraper (no-code)
The no-code scraper runs the Search API over several pages and writes the properties as grouped JSON, flat CSV (location_city, pricing_price…) and XML. Start it from Scrapers without code → Booking.com Scraper in the dashboard, or by API:
POST https://api.scrapeit.io/api/v1/scrapers/booking/jobs
GET https://api.scrapeit.io/api/v1/scrapers/booking/jobs/{jobId}The body takes the search parameters (without page) plus:
| Parameter | Type | Example | Description |
|---|---|---|---|
max_pages | number | 10 | Search pages to sweep, 1–20. Defaults to 5. |
limit | number | 100 | Most properties of the whole run, 1–500. All swept pages when omitted. |
output_format | array | ["json", "csv"] | One or more of json, csv, xml. Defaults to ["json"]; an empty list is rejected. |
Up to 5 pages run inline and the POST answers with the finished job; a larger run comes back queued - poll the GET until it is finished or failed. Each swept page is billed as one Booking Search API request. A job started with an API key runs under that key, queued or not: its pages count in the key's usage. The no-code scraper does not open each property page.
Errors
| Code | HTTP | Meaning |
|---|---|---|
VALIDATION_ERROR | 400 | Missing destination or dates; a date that is not YYYY-MM-DD; a check-in in the past; a stay of 0 or more than 90 nights; more rooms than adults; both or neither of url/hotel_id; a URL that is not a Booking.com property page. |
NOT_FOUND | 404 | Booking.com answered that it does not recognize the destination, has no property with this hotel_id, or no page at this URL. |
TARGET_BLOCKED | 502 | Every proxy attempt drew Booking.com's bot check (the AWS WAF challenge), or Booking.com answered in a form ScrapeIt could not read - an error instead of a search, for example - which says nothing about the property. Retry later. |
See Error codes for the shared error format.
Credits and billing
Both APIs bill per request under their own product code - 30 credits each, proxy and browser rendering included (an introductory price for a new product that may change; the dashboard Pricing page always shows the current one). Every request is scraped live - never served from the shared cache - so rates and availability are current.
Limits and behavior
region,countryandcancellation_textare not present on every property response. When the answer comes from the property page itself, the rate's prepayment terms, nightly price and tax breakdown arenullor empty, and the highlights, child policy and featured reviews are present only when the page carried them.- Booking.com's own ranking decides the order of
popularityand which properties a page shows; prices and availability followcountry,currencyand the stay. - Searches run with a fresh session, so no earlier search's dates or occupancy carry over.
Related pages
- Google Maps API - places and reviews with the same request style.
- Web Scraping API - the general single-URL scraper behind these APIs.
- Billing & credits - credit prices and plans.
- Managed Booking.com scraping - ScrapeIt builds, runs and monitors the scraper for you and delivers ready-to-use data.