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.
| Field | Type | Required | Description |
|---|---|---|---|
mode | string | optional | Search a destination, or load specific Booking.com hotel URLs. |
destination | string | optional | City, region or landmark to search, e.g. Paris, New York or Tokyo. Required in search mode. |
startUrls | array | optional | Booking.com hotel page URLs, used in details mode. Copy links from a search result or your browser. |
checkIn | string | optional | Check-in date as YYYY-MM-DD. Leave empty to use tomorrow. |
checkOut | string | optional | Check-out date as YYYY-MM-DD. Leave empty to use a 3-night stay. |
adults | integer | optional | Number of adult guests. |
rooms | integer | optional | Number of rooms needed. |
propertyType | string | optional | Keep only one Booking.com property type, or search all types. |
minReviewScore | number | optional | Minimum 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. |
stars | string | optional | Keep only properties with this star rating, or any star rating. |
freeCancellation | boolean | optional | Return properties with at least one free-cancellation rate. |
breakfast | boolean | optional | Return properties with a breakfast-included rate. |
pool | boolean | optional | Return properties that have a swimming pool. |
minPrice | number | optional | Optional lower bound for the nightly price in the chosen currency. |
maxPrice | number | optional | Optional upper bound for the nightly price in the chosen currency. |
currency | string | optional | Three-letter currency code such as USD, EUR or GBP. |
language | string | optional | Language Booking.com should use for the pages. |
maxItems | integer | optional | Stop after this many hotels. |
includeRooms | boolean | optional | Add the room and rate table for each hotel. Turn off for a smaller, faster dataset. |
includeFullAmenities | boolean | optional | Render each hotel page in a browser to collect the complete facility list. Slower and only needed when you want every amenity. |
proxyConfiguration | object | optional | Booking.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.