Skip to content

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:

ProductTypeProduct codeWhat it does
Booking Search APIScraper API (synchronous)booking_searchSearch a destination for a stay and get one page of properties.
Booking Hotel APIScraper API (synchronous)booking_hotelGive one property URL or id, get the property and its rates.
Booking.com ScraperNo-code scraperbookingSweep 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.

ParameterTypeExampleDescription
checkinstring2027-03-12Check-in date, YYYY-MM-DD, a real date, not in the past.
checkoutstring2027-03-14Check-out date, YYYY-MM-DD, 1 to 90 nights after checkin.
adultsnumber2Adult guests, 1–30. Defaults to 2.
children_ageslist7,12One age (0–17) per child, e.g. 7,12 or repeated children_ages=7&children_ages=12.
roomsnumber1Rooms, 1–30 and no more than adults. Defaults to 1.
currencystringEURISO 4217 currency of the prices, e.g. EUR. Defaults to USD.
languagestringen-gbBooking.com language of names and descriptions: en-us, en-gb, de, fr… Defaults to en-us.
countrystringdeTwo-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
ParameterTypeExampleDescription
destinationstringBarcelonaRequired. City, region, district, landmark or property name, as typed into the Booking.com search box.
checkinstring2027-03-12Required. See the stay.
checkoutstring2027-03-14Required.
pagenumber2Results page of 25 properties, 1–40. Defaults to 1.
sortstringpricepopularity (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
    }
  }
}
FieldDescription
destination_name / _typeWhat Booking.com resolved destination to, e.g. Barcelona / CITY.
results[].hotel_idBooking.com property id; pass it, or url, to the Hotel API.
results[].urlProperty page URL, without stay parameters.
results[].districtDistrict as the card shows it; neighborhood is the popular area around it, e.g. Saint Germain des Pres.
results[].public_transport_distanceNearest station as the card words it; is_centrally_located is Booking.com's own flag.
results[].starsStar rating 1–5. star_rating_type is stars for an official classification, tiles for Booking.com's own rating of a home.
results[].review_scoreGuest score out of 10; null for a property without reviews.
results[].location_scoreGuest score of the location out of 10, when the card shows it.
results[].external_review_scoreScore out of 10 from reviews on other travel sites, with external_reviews_count, when the card shows one.
results[].pricePrice of the whole stay for the requested occupancy, in currency; price_in_property_currency is the same stay in property_currency.
results[].discountsDeals behind the price (Limited-time Deal, Early Booker Deal, Booking.com pays) with what each takes off the stay.
results[].badgesPrice badges of the card, e.g. Limited-time Deal.
results[].taxes_and_feesTaxes 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_untilLast moment of free cancellation (ISO 8601), when the card states one.
results[].room_nameRoom the price is for; room_id matches room_types[].room_id of the Hotel API.
results[].unit_typeFor a home or suite: Entire apartment, Private suite…, with unit_size (248 ft²), beds_count, bedrooms, bathrooms.
results[].meal_planMeal plan included in the price, e.g. Breakfast included.
results[].rooms_left_messageScarcity line of the price, e.g. We have 1 left at this price.
results[].is_preferred_partnerBooking.com Preferred Partner (is_preferred_plus for Preferred Plus); is_sponsored marks an ad placement.
results[].host_typeprofessional or a private host, as Booking.com labels it under EU consumer law.
results[].is_sustainableWhether the property holds a recognized sustainability certification, listed in sustainability_certifications.
pagination.total_resultsProperties 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
ParameterTypeExampleDescription
urlstringhttps://www.booking.com/hotel/fr/mama-shelter.htmlProperty page URL, https://www.booking.com/hotel/<country>/<name>.html - e.g. the url of a search result.
hotel_idnumber59716Booking.com property id - e.g. the hotel_id of a search result. Send either url or hotel_id.
checkinstring2027-03-12Optional, with checkout. Without dates the page has no rates: offers is empty.
checkoutstring2027-03-14Optional, 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"
  }
}
FieldDescription
category_scoresGuest 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_reviewsGuest 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_facilitiesThe facilities the page lists as most popular; facilities lists all of them.
highlightsThe page's highlight boxes, e.g. Parking with Parking garage, Electric charging.
policiesHouse 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_answersUp to 20 guest questions the property answered, with the dates as the page words them.
languages_spokenISO 639-1 codes of the languages the staff speak.
room_typesEvery room type of the property, bookable or not, with size, occupancy (max_persons, max_children), smoking, beds, facilities and photos.
offersEvery 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 / countryRegion and country name - only when the answer came from the property page itself (see Limits); null otherwise, country_code is always set.
currencyCurrency 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:

ParameterTypeExampleDescription
max_pagesnumber10Search pages to sweep, 1–20. Defaults to 5.
limitnumber100Most properties of the whole run, 1–500. All swept pages when omitted.
output_formatarray["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 ​

CodeHTTPMeaning
VALIDATION_ERROR400Missing 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_FOUND404Booking.com answered that it does not recognize the destination, has no property with this hotel_id, or no page at this URL.
TARGET_BLOCKED502Every 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, country and cancellation_text are 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 are null or 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 popularity and which properties a page shows; prices and availability follow country, currency and the stay.
  • Searches run with a fresh session, so no earlier search's dates or occupancy carry over.

ScrapeIt Web Scraping API documentation. Managed web scraping services: www.scrapeit.io.