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
23
Total users
7
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
🔎 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 ofsearch -> needs `destinationName` (a city, region or neighbourhood), ~20 hotels per page, paginated with `maxPages`searchByCoordinates -> needs `latitude` + `longitude`, same row shape as searchhotelDetail -> needs `hotelId`, returns one rowreviews -> needs `hotelId`, paginated, sorted by `sortType`calendarPricing -> needs `hotelId`, returns about 30 date rowsforensicsBundle -> 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 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