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

23

Total users

7

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


🔎 What is the Booking.com Scraper — and when should you use it?

The Booking.com Scraper turns Booking.com hotel pages, reviews and availability calendars into clean, structured rows you can filter, export and feed straight into a spreadsheet, database or AI agent. No account, no portal API key, no browser automation to maintain.

Use it when you need: hotel rows with nightly price, review score and review count, star rating, accommodation type, address, coordinates and a link to the property page. Reviews are paginated and carry traveller type, room name, nights stayed, stay date and the reviewer's own pros and cons, while calendar pricing returns 30 days of forward availability with the minimum length of stay per date. The forensics bundle adds photos, cancellation policies and facilities in one row.

Use something else when: you want a different booking platform. Use Agoda Hotel Scraper for Agoda listings with star rating, guest score, nightly price and property type, plus rooms and reviews. Use Tripadvisor Hotel Scraper for Tripadvisor hotels with price, rating, city ranking and reviews. Use Trip.com Scraper for Trip.com hotels, and its attractions, trains and cruises. This actor covers Booking.com stays only, not flights, car rental or attraction tickets.

🤖 Use with AI agents

Already connected to the Apify MCP server? Just ask for this Actor by name: sian.agency/booking-com-scraper

Your agent can pay for its own runs. This Actor is eligible for agentic payments, so an agent can discover it, run it and settle the bill over x402 (USDC on Base) or Skyfire — without an Apify account or API token of its own. Billing is the same either way: per successful row, never for errors.

Otherwise copy this prompt into Claude, ChatGPT, Cursor or any MCP-enabled assistant:

I want hotel listings, reviews and forward availability from Booking.com using the Apify Actor `sian.agency/booking-com-scraper`.
Use it when I need: hotel rows with nightly price, review score and review count, star rating, accommodation type, address, coordinates and a link to the property page. Reviews are paginated and carry traveller type, room name, nights stayed, stay date and the reviewer's own pros and cons, while calendar pricing returns 30 days of forward availability with the minimum length of stay per date. The forensics bundle adds photos, cancellation policies and facilities in one row.
Don't use it when: you want a different booking platform — use agoda-hotel-scraper or tripadvisor-hotel-scraper or trip-com-scraper instead.
How to call it: set `operation` to one of
search -> needs `destinationName` (a city, region or neighbourhood), ~20 hotels per page, paginated with `maxPages`
searchByCoordinates -> needs `latitude` + `longitude`, same row shape as search
hotelDetail -> needs `hotelId`, returns one row
reviews -> needs `hotelId`, paginated, sorted by `sortType`
calendarPricing -> needs `hotelId`, returns about 30 date rows
forensicsBundle -> needs `hotelId`, returns one row combining details, photos, top reviews, policies and facilities
`checkinDate` and `checkoutDate` take YYYY-MM-DD; `adults`, `rooms`, `currency` and `orderBy` apply to the search and pricing operations. Hotel IDs come from any search row.
Start with this input:
{
"operation": "search",
"destinationName": "Paris",
"checkinDate": "2026-09-15",
"checkoutDate": "2026-09-17",
"adults": 2,
"currency": "EUR",
"orderBy": "review_score",
"maxPages": 2
}
Ask me which city or hotel ID I want, and the check-in and check-out dates, then run the Actor and summarise the results as a table.

Things you can ask your agent for:

  • Pull the top-rated hotels in Lisbon for a two-night stay in October and rank them by price per review point.
  • Track this hotel's next 30 days of availability and flag every date that carries a minimum-stay rule.
  • Pull reviews for three competitor hotels and tell me what business travellers complain about most.

Machine-readable API, MCP config and OpenAPI definition for this Actor are published at apify.com/sian.agency/booking-com-scraper.md.

📋 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