Booking.com Scraper — Hotels, Reviews, Calendar & Reviews API avatar

Booking.com Scraper — Hotels, Reviews, Calendar & Reviews API

Pricing

from $2.00 / 1,000 hotel search results

Go to Apify Store
Booking.com Scraper — Hotels, Reviews, Calendar & Reviews API

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Ü

SIÁN OÜ

Maintained by Community

Actor stats

1

Bookmarked

3

Total users

2

Monthly active users

2 days ago

Last modified

Share

Booking.com Scraper — Hotels, Reviews, Calendar Pricing & Forensics 🏨

SIÁN Agency Store Airbnb + STR KPIs Vrbo + STR KPIs Tripadvisor

🎉 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 feedcalendarPricing returns 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

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

ModeWhat it doesPaginationOutput rows
searchHotels in a destination✅ ~20/pageOne row per hotel
searchByCoordinatesHotels near a lat/lon✅ ~20/pageOne row per hotel
hotelDetailSingle hotel deep info1 row
reviewsReviews for one hotel✅ ~5–25/pageOne row per review
calendarPricing30-day availability feed~30 date rows
forensicsBundle5-endpoint fusion per hotel1 ultra-rich row

💰 Pricing

Pay-per-event with auto-laddered Apify tiers — you pay only for successful rows. Error rows are free.

EventFREEBRONZEGOLDDIAMOND
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. search is the cheapest per row (commodity listing data). forensicsBundle is 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 the destinationName ("Paris", "Bali", "NYC")
  • For searchByCoordinateslatitude + longitude ("48.85668", "2.3514764")
  • For hotelDetail / reviews / calendarPricing / forensicsBundle → the hotelId (find one from a previous search run)
  • 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 calendarPricing daily to extract 30-day forward availability + length-of-stay rules. Feed into a Looker / Sheets dashboard.
  • OTA-competitive analysis — run forensicsBundle on 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 reviews for 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 with hotelDetail or forensicsBundle.
  • PropTech & relocation tools — combine searchByCoordinates with 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 for
  • statussuccess or error
  • errorMessage — populated only when status === '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.


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