Nimbryxo Studio

Use Booking.com Hotel Price & Amenity Search Scraper with Python

Search Booking.com for a destination and dates, and collect each property's price, rating, review count, amenities, and breakfast info for the stay you specify.

1. Choose the data you need

Review the published README for supported collection modes, examples, and limits. The recipe below uses the current published input definition.

2. Prepare a source-based input

This JSON contains published prefills and required-field defaults. Review every value for your task before running it; it is not a promise of successful collection.

{
  "adults": 2,
  "breakfast": false,
  "currency": "USD",
  "destination": "Paris",
  "freeCancellation": false,
  "includeFullAmenities": false,
  "includeRooms": false,
  "language": "en-us",
  "maxItems": 1,
  "mode": "search",
  "pool": false,
  "propertyType": "all",
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "rooms": 1,
  "stars": "0",
  "startUrls": [
    {
      "url": "https://www.booking.com/hotel/fr/du-printemps-paris.html"
    }
  ]
}

Download input.example.json and save your reviewed copy as input.json.

FieldTypeRequiredDescription
modestringoptionalSearch a destination, or load specific Booking.com hotel URLs.
destinationstringoptionalCity, region or landmark to search, e.g. Paris, New York or Tokyo. Required in search mode.
startUrlsarrayoptionalBooking.com hotel page URLs, used in details mode. Copy links from a search result or your browser.
checkInstringoptionalCheck-in date as YYYY-MM-DD. Leave empty to use tomorrow.
checkOutstringoptionalCheck-out date as YYYY-MM-DD. Leave empty to use a 3-night stay.
adultsintegeroptionalNumber of adult guests.
roomsintegeroptionalNumber of rooms needed.
propertyTypestringoptionalKeep only one Booking.com property type, or search all types.
minReviewScorenumberoptionalMinimum guest score from 0 to 10. The actor applies Booking.com's score filter and then keeps only properties at or above this exact score.
starsstringoptionalKeep only properties with this star rating, or any star rating.
freeCancellationbooleanoptionalReturn properties with at least one free-cancellation rate.
breakfastbooleanoptionalReturn properties with a breakfast-included rate.
poolbooleanoptionalReturn properties that have a swimming pool.
minPricenumberoptionalOptional lower bound for the nightly price in the chosen currency.
maxPricenumberoptionalOptional upper bound for the nightly price in the chosen currency.
currencystringoptionalThree-letter currency code such as USD, EUR or GBP.
languagestringoptionalLanguage Booking.com should use for the pages.
maxItemsintegeroptionalStop after this many hotels.
includeRoomsbooleanoptionalAdd the room and rate table for each hotel. Turn off for a smaller, faster dataset.
includeFullAmenitiesbooleanoptionalRender each hotel page in a browser to collect the complete facility list. Slower and only needed when you want every amenity.
proxyConfigurationobjectoptionalBooking.com uses an AWS WAF challenge. Apify's AUTO proxy is prefilled; the actor uses this proxy for browser and HTTP requests.

3. Start an Actor run

Set APIFY_TOKEN in your environment. Python 3.10 or newer is sufficient; this recipe uses no third-party packages.

Execution may incur charges. Review current pricing on Apify. The request asks for a 120-second timeout and a charge limit; these settings are subject to Apify’s pricing and do not guarantee an all-inclusive spending cap.

import json
import os
import urllib.request

# Save the schema-derived example as input.json; review and edit it first.
with open("input.json", encoding="utf-8") as stream:
    actor_input = json.load(stream)

token = os.environ["APIFY_TOKEN"]
request = urllib.request.Request(
    "https://api.apify.com/v2/acts/sWIaAOuau5dEgTrPA/runs?timeout=120&maxTotalChargeUsd=0.50",
    data=json.dumps(actor_input).encode("utf-8"),
    headers={"Authorization": "Bearer " + token, "Content-Type": "application/json"},
    method="POST",
)
# This starts a potentially billable run. Do not automatically retry this POST.
with urllib.request.urlopen(request, timeout=40) as response:
    run = json.load(response)["data"]
print("Run ID:", run["id"])
print("Status:", run["status"])
# Inspect and download results in Apify Console once the run succeeds.

4. Inspect the actual results

Open the run in Apify Console and wait for a successful completion. Use the published output schema to locate results and the dataset schema to understand declared views. Missing or optional record fields must not be treated as guaranteed values.

One row per Booking.com property with stay prices, room types, ratings, review subscores, amenities, photos, description and policies.

Questions before you run

Which inputs are required?

No top-level fields are marked required in the published schema. Conditional requirements can still apply; check the README.

What does this guide verify?

The fields, prefills, and schema links are rendered from the published build. This is a usage recipe, not a paid live extraction test. Source availability and collection results can vary.

What if the run request times out?

Check Apify Console before retrying. The first request may already have created a run. Do not automatically repeat a run-creation POST.

Generated from source build cTXCXZCoq14RlU0gU and its README and schemas. Source changes regenerate this guide; no third-party editorial claims are inferred.