Booking.com Hotel Scraper
Pricing
from $2.87 / 1,000 hotel scrapeds
Booking.com Hotel Scraper
Scrape hotel listings from Booking.com including prices, ratings, availability, and cancellation policies. Uses the unprotected GraphQL API — HTTP-only, low memory, fast.
Pricing
from $2.87 / 1,000 hotel scrapeds
Rating
0.0
(0)
Developer
NanoScrape
Maintained by CommunityActor stats
6
Bookmarked
1.2K
Total users
214
Monthly active users
4 days ago
Last modified
Categories
Share
Scrape hotel listings from Booking.com with 34+ structured fields including GPS coordinates, guest review scores, street addresses, discount badges, sold-out signals, high-res photos, and cancellation policies. Search any city, region, or country worldwide.
Export results as JSON, CSV, Excel, or HTML directly from the Apify platform.
How it works
- Enter a destination (e.g., "Berlin", "Rome", "Tokyo")
- Set check-in and check-out dates
- Choose number of guests and rooms
- Run the actor — results appear in seconds
The actor calls Booking.com's internal GraphQL API directly. No browser, no cookies, no manual session handling required.
Use cases
- Travel price comparison and monitoring — track nightly rates across hundreds of hotels for any destination and date range
- Revenue management and competitive pricing intelligence — monitor competitor pricing, discount patterns, and availability signals
- Market research for hotel operators and consultants — benchmark star ratings, pricing tiers, and cancellation policies by location
- Mapping hotel inventories with GPS data — build geo-analytics dashboards, coverage maps, or proximity-based filters using latitude/longitude
- Lead generation for travel agencies and OTAs — extract hotel contact details and inventory at scale
- Tracking promotional discount patterns — capture "Getaway Deal", "Limited-time Deal", and "Early Bird" badges as they appear
- Monitoring availability and sold-out signals — identify high-demand periods by tracking
is_sold_outacross date windows - Building hotel comparison tools and travel apps — structured data with photos, GPS, pricing, and policies ready for direct integration
- Academic research on travel pricing patterns — large-scale structured dataset for econometric or machine-learning studies
- Yield analysis and demand forecasting — correlate occupancy signals with price fluctuations over time
Architecture note
HTTP-only (no browser) — uses Booking.com's internal GraphQL API with TLS fingerprinting. Significantly faster and cheaper than browser-based alternatives, with lower memory requirements and no risk of JavaScript rendering failures.
Output
| Field | Type | Description |
|---|---|---|
id | number | Booking.com hotel ID |
name | string | Hotel name |
url | string | Direct link to hotel on Booking.com |
star_rating | number|null | Star rating (1–5) |
review_score | number|null | Guest review score (0–10, e.g. 8.7) |
review_count | number|null | Total number of guest reviews |
review_score_word | string|null | Score label (Exceptional / Fabulous / Wonderful / Superb / Very Good / Good / Pleasant / Okay) |
secondary_score | number|null | Secondary review sub-score (0–10) |
room_type | string|null | Matching room/unit type name |
meal_plan_text | string|null | e.g. "Breakfast included" when a meal is included |
breakfast_included | boolean | Whether the offered rate includes breakfast |
is_closed | boolean | Whether the hotel is temporarily closed |
photo_url | string|null | Main photo (240px square) |
photo_url_high_res | string|null | Main photo (600px square, high-res) |
photos | string[]|null | All photo URLs (when includeAllPhotos=true) |
location | string|null | District + city from search results |
district | string|null | District or neighborhood |
city | string|null | City from destination resolution |
property_city | string|null | City from hotel's own data |
property_country | string|null | Country from hotel's own data |
country_code | string|null | ISO country code |
address | string|null | Street address (e.g. "Kurfürstendamm 12") |
latitude | number|null | GPS latitude |
longitude | number|null | GPS longitude |
distance_from_center | string|null | Distance from city center |
price | number|null | Price for the whole booking: all nights and all searched rooms (for rooms > 1 the per-room prices are summed), not per night, in the selected currency |
price_total | number|null | Same whole-booking price, rounded to 2 decimals |
price_per_night | number|null | price_total ÷ nights, rounded to 2 decimals |
nights | integer | Number of nights the price covers (check-out minus check-in) |
rooms | integer | Number of rooms the price covers (the rooms input) |
price_scope | string | booking when price covers all searched rooms; per_room if Booking returned fewer priced rooms than requested (price is then for one room) |
original_price | number|null | Original price before discount, in the hotel's own currency (can differ from currency) |
original_price_stay | string|null | Pre-discount formatted stay total (e.g. "CHF 259") |
currency | string|null | Price currency code |
is_sold_out | boolean | Whether sold out for selected dates |
discount_badge | string|null | Promotion label ("Getaway Deal", "Limited-time Deal") |
discount_badge_id | string|null | Internal badge identifier from Booking.com |
free_cancellation | boolean | Free cancellation available |
free_cancellation_until | string|null | Cancellation deadline date |
no_prepayment | boolean | No prepayment required |
room_id | string|null | Room type identifier |
meal_plan | string|null | Included meal plan |
scraped_at | string | ISO timestamp of when data was scraped |
Pricing
| Event | Cost |
|---|---|
| Start | $0.050 per run |
| Hotel | $0.005 per result |
100 hotels = $0.55 | 1,000 hotels = $5.05
Input options
| Field | Default | Description |
|---|---|---|
destination | (required) | City, region, or country name |
checkin | Tomorrow | Check-in date (YYYY-MM-DD) |
checkout | Day after checkin | Check-out date (YYYY-MM-DD) |
adults | 2 | Number of adult guests |
children | 0 | Number of child guests |
childrenAges | [] | Age (0-17) of each child. Missing ages default to 10 |
rooms | 1 | Number of rooms |
currency | EUR | Price currency (ISO 4217) |
sortBy | POPULARITY | Sort order (POPULARITY, PRICE, REVIEW_SCORE, DISTANCE) |
maxResults | 100 | Max hotels to scrape (0 = unlimited) |
includeAllPhotos | false | Include photos[] array with all photo URLs |
Use with AI Agents (MCP)
Connect this actor to any MCP-compatible AI client — Claude Desktop, Claude.ai, Cursor, VS Code, LangChain, LlamaIndex, or custom agents.
Apify MCP server URL:
https://mcp.apify.com?tools=santamaria-automations/booking-com-scraper
Example prompts once connected:
"Use
booking-com-scraperto find the 20 cheapest hotels in Rome for next weekend. Sort by price and return as a table with name, price per night, GPS coordinates, and cancellation policy."
"Scrape 50 hotels in Amsterdam for July 15–17 and show which ones have a discount badge active."
Clients that support dynamic tool discovery (Claude.ai, VS Code) will receive the full input schema automatically via add-actor.
Examples
Hotels in Berlin
{"destination": "Berlin","checkin": "2026-08-01","checkout": "2026-08-03","adults": 2,"currency": "EUR","maxResults": 50}
Cheapest hotels in Rome
{"destination": "Rome","checkin": "2026-09-01","checkout": "2026-09-03","sortBy": "PRICE","maxResults": 100}
Family trip to Zurich with photos
{"destination": "Zurich","checkin": "2026-10-01","checkout": "2026-10-05","adults": 2,"children": 2,"rooms": 1,"currency": "CHF","maxResults": 50,"includeAllPhotos": true}
Hotels sorted by review score in Tokyo
{"destination": "Tokyo","checkin": "2026-11-01","checkout": "2026-11-04","sortBy": "REVIEW_SCORE","currency": "JPY","maxResults": 200}
Related Actors
E-Commerce & Price Comparison
- AutoScout24 Scraper — European car listings
- AliExpress Scraper — Global marketplace
- Galaxus.ch Scraper — Swiss electronics retailer
- Groupon Scraper — Deals in 12 countries
Classifieds
- Kleinanzeigen.de Scraper — Germany
- Willhaben.at Scraper — Austria
- Marktplaats.nl Scraper — Netherlands
Enrich your data
Changelog
1.2
- The
currencyandsortByinputs are now applied to the results. - Default currency is EUR. Previously prices came back in the proxy location's currency.
- Duplicate hotels across result pages are no longer returned or charged.
1.2.3
- Clarified that
priceis the total for the whole booking, not per night. Addedprice_total,nightsandrooms; forrooms> 1,priceandoriginal_pricenow sum all rooms (before, only the first room was returned). For one room all values are unchanged. Searches withchildrennow send child ages (newchildrenAgesinput, default age 10) and no longer fail.
Issues & Feedback
Missing a field or not working as expected? Open an issue and we'll fix it.