Booking.com Price Scraper
Pricing
from $0.37 / 1,000 results
Booking.com Price Scraper
Extract live public Booking.com hotel prices with explicit currency, occupancy/dates context, and taxes/fees breakdown when Booking shows them. Supports destination search, filters, and fast single-hotel lookups. No login required.
What does Booking.com Price Scraper do?
Booking.com Price Scraper extracts live public hotel prices from Booking.com with explicit currency, requested dates/occupancy context, and taxes/fees breakdown when Booking exposes them on the property page. Use a destination search, a Booking search URL (filters preserved), or a single hotel URL for a low-latency lookup — no login or user cookies required.
What can this Actor do?
- Scrape destination search results and optional hotel detail enrichment
- Capture explicit currency and displayed stay prices (no invented / guessed amounts)
- Extract room-level offers with public VAT / city tax / charges lines when present
- Capture minimum nights / min stay (and maximum nights when Booking shows them) for the stay’s check-in
- Apply common search filters (stars, minimum review score, sort, currency, language)
- Flag priceComplete and taxesFeesComplete so incomplete public data is never silently filled
- Run on the Apify platform with scheduling, monitoring, dataset export, and API access
Why scrape Booking.com prices?
- Price monitoring — Track live public rates for competitors or portfolio hotels
- Travel intelligence — Compare destinations with consistent occupancy and currency
- Tax transparency — Keep excluded/included fee lines when Booking shows them
- Apify platform — Schedule runs and export JSON, CSV, Excel, or webhooks
What data can you extract?
| Field | Description |
|---|---|
| name | Hotel name |
| url | Canonical public hotel URL with stay params |
| imageUrl / image | Primary hotel image (image aliases imageUrl for drop-in pipelines) |
| imageUrls / images | Image gallery when available |
| currency | Parsed display currency (for example EUR, USD) |
| priceAmount / price | Stay price amount (price aliases priceAmount for drop-in pipelines) |
| pricePerNightAmount | Per-night amount when Booking shows it |
| totalWithTaxesFeesAmount | Total including publicly shown taxes/fees when available |
| taxesAndFees | Line items (VAT, city tax, etc.) with included/excluded flags |
| roomOffers | Room/block-level public offers for the stay |
| minimumNights | Min stay / minimum nights for the check-in when Booking exposes it |
| maximumNights | Maximum nights when Booking exposes it (often null) |
| reviewScore / rating | Public review score (rating alias) |
| reviewCount / reviews | Public review count (reviews alias) |
| reviewScoreWord / ratingLabel | Score label such as "Excellent" |
| stars / type / description / location | Stars, property type, description, { lat, lng } when public |
| address / addressDetails / city / countryCode | Address string plus structured details |
| checkIn / checkOut / checkInDate / checkOutDate | Requested stay dates (ISO). Policy times are in checkInTime / checkOutTime |
| adults / children / childrenAges / rooms | Requested stay context (rooms = occupancy count) |
| breakfast | Meal plan / breakfast hint when Booking exposes it |
| priceComplete | True only when amount + currency were explicitly present |
| taxesFeesComplete | True only when a public taxes/fees breakdown (or total with fees) was present |
| completenessNotes | Human-readable gaps — never silent empty success |
| guessedPrice | Always false — this Actor does not invent prices |
How to scrape Booking.com hotel prices
- Open the Actor in Apify Console.
- Enter a destination (for example
Amsterdam) and/or Start URLs (search or hotel pages). - Set check-in / check-out (or leave blank for dynamic ~30/32-day defaults), guests, childrenAges when traveling with children, rooms, and preferred currency.
- Keep Enrich hotel details enabled for taxes/fees fidelity (disable for faster search-card-only runs).
- Set Max hotels per start URL (default 5) and run.
- Download results from the dataset tab.
Supported URL patterns
- Search results:
https://www.booking.com/searchresults*.html?... - Hotel detail:
https://www.booking.com/hotel/{country}/{hotel-slug}.html
Dates and occupancy on the URL are overwritten by the Actor input stay context so runs stay reproducible.
Input
This Actor keeps a price-fidelity wedge: dynamic default dates, required child ages, honest completeness flags, and no guessed prices.
| Field | Notes |
|---|---|
| search | Destination text |
| startUrls | Optional Booking search/hotel URLs (public pages only; no account shared lists) |
| checkIn / checkOut | YYYY-MM-DD; leave empty for dynamic ~30/32 days ahead |
| flexWindow | Optional stay flexibility (0/1/2/3/7) for search/destination |
| adults / rooms | Occupancy context |
| childrenAges | Ages 0–17 per child (required for accurate child pricing; sets age= on Booking URLs) |
| children | Optional; must match childrenAges.length when both are set |
| currency / language | Display preferences (expanded enums) |
| propertyType | Booking property-type filter (Hotels, Apartments, …) |
| minMaxPrice | Per-night range such as 100-150 or 100+ |
| starsCountFilter / minScore / sortBy | Search filters (includes unrated stars) |
| enrichHotelDetails | Room + taxes/fees enrichment (default true) |
| extractAdditionalHotelData | Alias of enrichHotelDetails; used only when that field is omitted |
| maxItems | Per start URL / destination |
| proxyConfiguration | Default off; enable residential if your IP is blocked |
Output example
{"name": "citizenM Amsterdam South","url": "https://www.booking.com/hotel/nl/citizenm-amsterdam-city.en-gb.html?checkin=2026-09-07&checkout=2026-09-09&group_adults=2&no_rooms=1&selected_currency=EUR","imageUrl": "https://cf.bstatic.com/xdata/images/hotel/max500/772469520.jpg","image": "https://cf.bstatic.com/xdata/images/hotel/max500/772469520.jpg","currency": "EUR","priceAmount": 296,"price": 296,"pricePerNightAmount": 148,"totalWithTaxesFeesAmount": 395,"taxesAndFees": [{"label": "21 % VAT","amount": 62.16,"included": false,"type": "percentage__excluded"},{"label": "12.50 % City tax","amount": 37.0,"included": false,"type": "percentage__excluded"}],"rating": 8.6,"reviews": 2450,"ratingLabel": "Excellent","stars": 4,"type": "hotel","location": { "lat": "52.3676", "lng": "4.9041" },"checkIn": "2026-09-07","checkOut": "2026-09-09","checkInDate": "2026-09-07","checkOutDate": "2026-09-09","adults": 2,"children": 0,"childrenAges": [],"rooms": 1,"minimumNights": 1,"maximumNights": null,"priceComplete": true,"taxesFeesComplete": true,"guessedPrice": false,"priceSource": "hotel_rooms","completenessNotes": ["Price taken from public hotel room offers for the requested stay context."]}
Pricing
This Actor can be monetized on Apify with pay-per-event pricing after publication. Platform compute and proxy usage are billed separately by Apify.
FAQ
Why is maximumNights often null?
Booking commonly publishes a minimum stay for a check-in date, but does not always publish a matching maximum nights limit on the public hotel page. When it is missing, the field is null — this Actor does not invent limits.
Does this Actor log in to Booking.com?
No. It only reads public search and hotel pages. It does not accept Booking usernames, passwords, or user session cookies.
Why are taxes/fees sometimes missing?
Booking often shows a clean search-card price and only exposes the full charges breakdown on the hotel page. Enable Enrich hotel details. If enrichment fails after retries, the Actor keeps an honest search-card fallback with taxesFeesComplete=false instead of silently dropping the row. If Booking still does not publish a breakdown for that stay, completeness flags and notes explain the gap — prices are never guessed.
Do I need child ages?
Yes whenever children > 0. Booking prices depend on each child's age. Provide childrenAges (for example [5, 8]); the Actor sends Booking age= / req_age= parameters. Runs with children but no ages fail validation instead of returning inaccurate prices.
What happens if the run finds nothing?
If every requested search/hotel fails or is blocked and no rows are pushed, the Actor exits with code 1. Empty successful runs are not allowed.
Can I scrape a single hotel quickly?
Yes. Pass a hotel URL in Start URLs. The Actor skips destination search and loads that property with your dates/occupancy.
Do I need a proxy?
Many environments clear Booking’s AWS WAF browser challenge without a proxy. If runs are blocked in your region or on datacenter IPs, enable Apify residential proxies in the input.
Related scrapers
Looking for other travel sources? See rainminer hotel Actors such as eDreams Hotels Scraper, Despegar Hotels Scraper, and hotel.de Scraper on Apify Store.
Image Credit
Image credit: Booking.com