Booking.com Scraper — Hotels, Reviews, Calendar & Reviews API
Pricing
from $2.00 / 1,000 hotel search results
Booking.com Scraper — Hotels, Reviews, Calendar & Reviews API
Scrape Booking.com hotels, reviews, calendar pricing, photos, facilities & policies via one API. Property-forensics bundle returns 10+ enrichment fields per hotel in a single row. Lean search mode also available at commodity per-place pricing. No login or API key needed.
Pricing
from $2.00 / 1,000 hotel search results
Rating
0.0
(0)
Developer
SIÁN OÜ
Maintained by CommunityActor stats
1
Bookmarked
3
Total users
2
Monthly active users
2 days ago
Last modified
Categories
Share
Booking.com Scraper — Hotels, Reviews, Calendar Pricing & Forensics 🏨
🎉 Six scrapers in one — hotel search, reviews, calendar pricing, photos, policies & facilities, all from a Booking.com data API
Built for STR investors, revenue managers, OTA-competitive teams, travel content sites & PropTech — no login, no API key, no scraping headaches
📋 Overview
Tired of brittle DIY scrapers that break every time Booking.com tweaks their UI? This actor delivers reliable, flat structured datasets from Booking.com — one clean run per task, one tidy dataset out.
Why teams choose SIÁN for Booking.com data:
- ✅ Six operations, one actor: hotel search · hotel search by coordinates · hotel detail · reviews · 30-day calendar pricing · Property Forensics bundle
- 🌟 Property Forensics is unique to SIÁN — one row per hotel that fuses details + photos (with ML tags) + top reviews + cancellation policies + facilities. No other actor on the Apify store delivers this depth in a single row.
- 📅 30-day forward calendar feed —
calendarPricingreturns availability + minimum length-of-stay per date. Drop straight into a revenue-management dashboard. - 💬 Reviews with traveler segments — every review row carries
reviewerGroup, room name, nights stayed, language code, helpful votes, and pros/cons split. - 🎯 Production-ready data shape — curated camelCase aliases (
hotelId,reviewScore,priceTotal,hotelPageUrl,coverPhotoUrl, …) PLUS the raw upstream fields spread alongside for power users. - 💰 Pay-per-result pricing — only charged for successful rows, never for empty pages or errors.
- 💎 No login, no API key, no proxies — paste a destination, hotel ID, or lat/lon and run.
✨ Features
🔍 Hotel Search
Paginated city/destination search. Returns ~20 hotels per page with full pricing, review score, accommodation type, and a deep-link to the Booking.com hotel page.
- Auto-resolves destination name → Booking's internal
dest_id - Configurable sort (popularity, price, review score, distance, star rating)
- Configurable check-in/checkout windows (defaults to 30 days out, 2-night stay)
- Up to 50 pages per run
📍 Hotel Search by Coordinates
Same shape as Hotel Search but takes latitude + longitude instead of a destination name. Use for proximity-to-X queries (workplace, airport, school, landmark).
🏨 Hotel Detail
Single-row deep info for one hotel ID — full address, check-in window, currency, default language, timezone, coordinates, and structured policies.
💬 Hotel Reviews
Paginated reviews for one hotel. Each row carries author, authorCountryCode, reviewerGroup (solo / business / couple / family), roomName, nightsStayed, stayDate, ratingScore, reviewTitle, pros, cons, postedAt, languageCode, helpfulVoteCount. Sort by relevance / recency / score.
📅 Calendar Pricing
One call returns ~30 date rows. Each row has date, available, minLengthOfStay, and the property's currency. Perfect for ADR / occupancy proxies, length-of-stay rules, and forward-looking pricing trends.
✨ Property Forensics Bundle (premium)
Fans out 5 upstream calls in parallel for one hotel — details + photos (with ML-tagged confidence scores) + page-0 reviews + policies (cancellation, payment, deposit) + facilities (with common-room flags). Returns one ultra-rich row per hotel. If any one of the 4 enrichment calls fails, the bundle still ships with _partialFailures recording which one(s) — only a failed details anchor produces an error row.
🛠️ Operation Modes
| Mode | What it does | Pagination | Output rows |
|---|---|---|---|
search | Hotels in a destination | ✅ ~20/page | One row per hotel |
searchByCoordinates | Hotels near a lat/lon | ✅ ~20/page | One row per hotel |
hotelDetail | Single hotel deep info | ❌ | 1 row |
reviews | Reviews for one hotel | ✅ ~5–25/page | One row per review |
calendarPricing | 30-day availability feed | ❌ | ~30 date rows |
forensicsBundle | 5-endpoint fusion per hotel | ❌ | 1 ultra-rich row |
💰 Pricing
Pay-per-event with auto-laddered Apify tiers — you pay only for successful rows. Error rows are free.
| Event | FREE | BRONZE | GOLD | DIAMOND |
|---|---|---|---|---|
apify-actor-start (one-time) | $0.040 | $0.004 | $0.004 | $0.004 |
search-result (primary headline) | $0.012 | $0.004 | $0.002 | $0.001 |
review-result | $0.006 | $0.002 | $0.001 | $0.0005 |
hotel-detail-result | $0.036 | $0.012 | $0.009 | $0.003 |
calendar-row-result | $0.009 | $0.003 | $0.0015 | $0.00075 |
forensics-bundle-result | $0.075 | $0.025 | $0.01875 | $0.00625 |
Tip: Pick your operation by the question you're trying to answer.
searchis the cheapest per row (commodity listing data).forensicsBundleis the most expensive per row but bundles five upstream calls — equivalent to running 5 detail-style ops for ~1.5–2× the headline detail price.
🚀 Quick Start
1. Pick your operation
Open the actor in the Apify Console and choose one of the six operations from the dropdown.
2. Provide the required input
- For
search→ just thedestinationName("Paris", "Bali", "NYC") - For
searchByCoordinates→latitude+longitude("48.85668", "2.3514764") - For
hotelDetail/reviews/calendarPricing/forensicsBundle→ thehotelId(find one from a previoussearchrun) - Optional:
checkinDate/checkoutDate(defaults to 30 days from today, 2-night stay)
3. Run
Hit Start. Results stream into the default dataset in real time. An HTML report is saved to the key-value store on every run (success or crash).
📊 Example Inputs
Hotel search in Paris:
{"operation": "search","destinationName": "Paris","checkinDate": "2026-06-15","checkoutDate": "2026-06-17","adults": 2,"rooms": 1,"currency": "USD","maxPages": 3}
Reviews for a specific hotel:
{"operation": "reviews","hotelId": "15854834","sortType": "SORT_MOST_RELEVANT","maxPages": 5}
Property Forensics bundle:
{"operation": "forensicsBundle","hotelId": "15854834","checkinDate": "2026-06-15","checkoutDate": "2026-06-17"}
30-day calendar pricing:
{"operation": "calendarPricing","hotelId": "15854834","checkinDate": "2026-06-15","checkoutDate": "2026-06-17","currency": "USD"}
🎯 Use Cases
- STR / revenue managers tracking competitor rates — pull
calendarPricingdaily to extract 30-day forward availability + length-of-stay rules. Feed into a Looker / Sheets dashboard. - OTA-competitive analysis — run
forensicsBundleon a set of competitor hotels to capture full merchandising data (photos, policies, facilities, review snippets) in a single structured row per property. - Brand sentiment & review monitoring — paginate
reviewsfor any hotel and stream rows into a sentiment pipeline. Each review carries traveler type, room name, nights stayed, language, pros/cons split. - Travel content sites & metasearch — power city/region landing pages with
search, then enrich top results withhotelDetailorforensicsBundle. - PropTech & relocation tools — combine
searchByCoordinateswith detail bundles to surface lodging options near a workplace, school, or property listing. - Lead-gen for travel B2B — enrich your CRM with structured hotel data: address, ZIP, timezone, currency, accommodation type, star rating, review profile.
📦 Output Format
Every row carries metadata stamps:
_operation— which mode produced the row_fetchedAt— ISO timestamp_page— page number (for paginated ops)_sourceHotelId/_sourceDestination/_sourceLat/_sourceLon— what you asked forstatus—successorerrorerrorMessage— populated only whenstatus === 'error'
Search / search-by-coordinates row:
{"_operation": "search","status": "success","hotelId": "15854834","name": "Elegant Sunlit Flat with Balcony near Parc Monceau","accommodationType": "Apartment","address": "17th arr.","city": "Paris","countryCode": "fr","latitude": 48.881,"longitude": 2.315,"reviewScore": 9.4,"reviewScoreWord": "Wonderful","reviewNr": 5,"priceTotal": 765.08,"currency": "EUR","coverPhotoUrl": "https://cf.bstatic.com/...jpg","hotelPageUrl": "https://www.booking.com/hotel/fr/h15854834.html"}
Forensics bundle row:
{"_operation": "forensicsBundle","status": "success","hotelId": "15854834","name": "Elegant Sunlit Flat with Balcony near Parc Monceau","details": { /* full /v2/hotels/details response */ },"photos": [ { "photoId": "...", "urlMax": "...", "mlTags": [{"tagName":"Bed","confidence":100}, ...] }, ... ],"reviewsSample": [ { "author": "Marie", "ratingScore": 9.4, "pros": "...", "cons": "..." }, ... ],"reviewsCountTotal": 5,"policies": { /* full /v1/hotels/policies response */ },"facilities": [ { "facilityName": "Non-smoking rooms", "value": 1, "kind": "boolean" }, ... ],"_partialFailures": null}
❓ FAQ
Q: Why "Booking.com api" instead of "Booking.com scraper" in the title? A: SEO. The Google search volume for "booking.com api" is 32× higher than "booking.com scraper" (320/mo vs 10/mo). Both terms appear in the title for store-search matching.
Q: How fresh is the data? A: Live — every run hits Booking.com via our upstream provider in real time. There is no cache.
Q: Why does my forensicsBundle row have a _partialFailures field?
A: The bundle fans out 5 upstream calls in parallel. If 1–4 of them fail (rate limit, transient 5xx, etc.) the row still ships with the successful endpoints' data; _partialFailures lists which ones came back empty so you can re-run those specifically with the dedicated ops (reviews, hotelDetail, etc.). Only a failed details anchor produces an error row.
Q: Can I get more than ~5 reviews from forensicsBundle?
A: No — Forensics intentionally pulls reviews page 0 only (~5–25 reviews, varies per hotel) to keep margins predictable. For deep review extraction, use the dedicated reviews operation which paginates up to 50 pages.
Q: Does this work for properties outside hotels (apartments, villas, hostels)?
A: Yes. All accommodation types listed on Booking.com are supported — the accommodationType field will tell you what you got back.
Q: Why doesn't hotelDetail return pricing?
A: Booking's /v2/hotels/details is a property-metadata endpoint, not a rate endpoint. For pricing, use search (returns price-per-night) or calendarPricing (returns 30-day forward availability + LOS rules).
Q: How does pagination work?
A: For search, searchByCoordinates, and reviews, the actor uses page-based pagination (page_number=0, 1, 2, ...). maxPages caps the total. The actor stops early when it sees a partial page (fewer rows than the previous page returned).
⚠️ Trademark Disclaimer
This is an independent scraping tool. It is not affiliated with, endorsed by, or sponsored by Booking Holdings Inc., Booking.com B.V., or any of their subsidiaries. The Booking.com® name appears under nominative fair use to indicate compatibility.
📜 Legal
Use this actor in compliance with Booking.com's Terms of Service and applicable data-protection laws (GDPR, CCPA, etc.). Do not use it to harvest personal data for unsolicited contact or other regulated purposes without a lawful basis. SIÁN Agency provides this scraping infrastructure as a tool; responsibility for use rests with the operator. See Apify's blog on legal scraping.
📬 Support & Feedback
- Telegram:
- Email: apify@sian-agency.online
- Issues: Use the Issues tab inside the Apify Console for actor-specific feedback
- More from SIÁN: https://apify.com/sian.agency?fpr=sian