Booking.com Hotels Scraper - Worldwide Search & Categories
Pricing
from $2.20 / 1,000 results
Booking.com Hotels Scraper - Worldwide Search & Categories
Scrape Booking.com hotel search results for any destination worldwide. Extract names, prices, ratings, locations, room types, and listing links. Filter by property category or leave empty for all types.
Pricing
from $2.20 / 1,000 results
Rating
0.0
(0)
Developer
kane liu
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
2
Monthly active users
an hour ago
Last modified
Categories
Share
Booking.com Hotels Scraper
Scrape Booking.com search results and bounded public hotel details for any destination worldwide — prices, ratings, locations, listing links, hotel identity, and public address leads in structured JSON. Filter by property category, stars, review score, and free cancellation. No Booking partner API required.
Architecture: this Apify Actor is a thin client. Scraping runs on the booking-com Cloud Run worker over HTTPS + API key. Existing output fields are preserved; lead fields are additive.
Worker URL is config, not code: the Actor reads
WORKER_BASE_URLfrom Actor environment variables (plus optional per-runworkerBaseUrl). If you migrate the worker to a new host, updateWORKER_BASE_URL(andWORKER_AUTHif the API key changes) in Apify Console — no Actor code change required. SetWORKER_PROVIDES_PROXY=1when the worker supplies its ownPROXY_URLinstead of Apify RESIDENTIAL.
Need a dedicated scraper for one website?
This Actor is the general tool for protected public pages. If you already have one specific site and a field list, a dedicated scraper is faster and more stable: listing + detail, your export format, delivered to your Apify account or as a standalone runnable client.
I confirm the tier before you pay. The clock starts after that confirmation.
Start here: Submit a custom scraper request
| Starter $50 | Dedicated $100 | Hard target $200–999 | |
|---|---|---|---|
| Site | 1 simple anti-bot public site | 1 medium anti-bot public site | Cloudflare / aggressive anti-bot / custom parser |
| Scope | Full listing + detail fields | Listing + detail + pagination, your field list | Agreed fields, repeatable runs |
| Delivery | CSV/JSON · Apify Actor or standalone runnable client (script/CLI) | Same, plus a sample run and short instructions | Feasibility first, then build |
| Time | 24 hours after we confirm the URL is in scope | 48 hours after confirmation | Quoted after feasibility |
| Fixes | 30 days for small public-layout changes | 30 days | Scoped in the quote |
Hard-target sites are not a 100% uptime promise. You get a dedicated parser that can be re-run on the agreed fields. If the URL is not feasible, you get a refund or pay an assessment fee only — you will know before the build starts.
Not in Starter/Dedicated: login-walled data, native APK / Windows installer / full web apps, or two-year maintenance. Those are a separate quote.
What does this Actor do?
- Search Booking.com stays for cities, regions, countries, or landmarks worldwide
- Resolve destinations via Booking autocomplete (
dest_id/dest_type) when possible; falls back to free-textss=search if autocomplete is unavailable - Filter by property types (empty = all), stars, min review score, and free cancellation
- Support children / child ages in the search URL
- Sort by popularity, price, reviews, stars, or distance
- Extract hotelId, name, price, total price (when shown), rating, review count, location, room type, and image
- Enrich a bounded number of public hotel Detail pages with hotel organization and postal address, while preserving honest absence reasons for unavailable contact fields
- Paginate up to your
maxResultslimit via a Cloud Run scrape worker with worker-managed acquisition and proxy/egress; never unproxied
Output fields
| Field | Description |
|---|---|
source | Always booking |
hotelId | Stable id from URL/card when available (e.g. sg/marina-bay-sands) |
name | Property name |
url | Booking.com listing URL |
price | Nightly / primary displayed price (when available) |
totalPrice | Total stay price when visible on the search card |
currency | ISO currency code |
rating | Numeric review score (typically 1–10) |
ratingText | Raw rating text from the card |
reviewCount | Number of reviews |
propertyType | Inferred type (Hotel, Apartment, Hostel, …) |
location | Neighborhood / area text |
distanceFromCenter | Distance-from-center text |
imageUrl | Primary card image |
roomType | Recommended unit / room text |
amenities | Amenity labels when present on SERP (often empty) |
destination / checkin / checkout | Echoed from the search input when set |
scrapedAt | ISO timestamp |
Lead and contact fields
Every dataset item includes the complete lead shape, even when a search row could not be enriched. A missing value is paired with a reason in leadAbsences; the Actor does not silently omit lead keys.
| Field | Type | Booking.com meaning |
|---|---|---|
phones | [{value, type, e164?}] | Public hotel phone numbers found on the measured Detail surface. The accepted Paris random-run sample returned []. |
emails | [{value, type}] | Public hotel email addresses found on Detail. The accepted Paris random-run sample returned []. |
address | {street, unit, locality, region, postalCode, country, full} | Postal address from Detail JSON-LD/visible content. unit is the street or door number. The accepted Paris sample exposed 76 Rue De Clichy, unit 76, and postal code 75009. |
geo | {lat, lng} or null | Coordinates when the public Detail exposes them. This supplements the address, it does not replace it. |
person | {name, role?} or null | Named public hotel contact. No separate person was visible on the measured hotel Detail. |
org | {name, id?} or null | Hotel organization identity, for example Hotel Pilime in the accepted Paris run. |
web | {website, socials[]} | Canonical Booking hotel URL plus public property-level social links, if any. Booking platform support/social links are excluded. |
leadSource | string enum | Surface that produced the lead: search, detail, entity, contact, or reveal-xhr. Current Booking enrichment uses search or detail. |
leadReveal | string enum | How the lead was exposed: visible, click, xhr, gated, image, or absent. Current measured hotel address and organization are visible. |
leadAbsences | object/map | Per-field reason such as 本站无 for a measured public-surface absence, 闸门锁 for a gate, or 未验证 when Detail enrichment did not complete. |
Reveal cost
enrichDetailsdefaults totrueand opens at mostdetailEnrichLimithotel Detail pages, default3, maximum10.- The measured Booking hotel addresses and organizations are already visible. No phone, email, or address reveal click/XHR was performed; the accepted fully sampled Paris row returned measured absence reasons for those contact channels.
- Detail enrichment adds one protected-page acquisition per selected hotel. It increases run time and proxy/browser use, so keep
detailEnrichLimitsmall for routine search runs. - Rows beyond the enrichment limit still include all ten lead keys, with
未验证(详情补全未成功)where appropriate.
Honest limitations
- The accepted latest-build random run exposed hotel organizations and door-number-level postal addresses for all three Paris rows, but no public property phone, email, named person, or property social account on the fully sampled Detail row.
geowas not extracted from the accepted Paris sample and is marked未验证; the populated postal address must not be treated as coordinate proof.- Search rows are not evidence that a contact field is absent across Booking.com. If Detail acquisition fails or is not attempted, the row uses
未验证, not本站无. - Partner Support and Booking platform contact/social routes are not hotel leads. The Actor does not log in, open support cases, or attribute platform contacts to a property.
More Actors like this
Looking for another travel / stays scraper, or a specialized Actor outside Booking.com hotels? Use a dedicated Actor when one exists — structured fields, better coverage, usually lower cost. Use this Actor for Booking.com hotel / accommodation search results.
Similar travel & stays Actors
- Booking.com & Airbnb Scraper
- Airbnb Listings Scraper
- Agoda Scraper
- Expedia Scraper
- Trip.com Scraper
- Traveloka Scraper
- TripAdvisor Scraper
- Despegar Scraper
- Travelstart Flights Scraper
Prefer another specialized scraper?
Jobs & Freelance
- LinkedIn Jobs Scraper
- Indeed Jobs Scraper
- Upwork Jobs Scraper
- Glassdoor Scraper
- Fiverr Gigs Scraper
- Bayt Jobs Scraper
E-commerce
- Walmart Product Scraper
- Amazon Search Scraper
- Costco Product Scraper
- Shopee Search Scraper
- Etsy Scraper
- SHEIN Product Scraper
- Temu Product Scraper
- Target Product Scraper
Real Estate
- Zillow & Zumper Scraper
- Realtor.com Scraper
- Apartments.com Rental Scraper
- Rightmove Scraper
- Idealista Scraper
- realestate.com.au Scraper
Social & Content
Ads Intelligence
Local & Maps
General Tools
→ See the full catalog in Related Actors below, or browse apify.com/lentic_clockss.
How to use
- Enter a destination (city, region, country, or landmark — e.g.
Tokyo,France,near Times Square) - Set check-in / check-out (
YYYY-MM-DD) for accurate prices - Optionally choose property types, stars, review score, sort, language, currency, and proxy country
- Click Start — results appear in the Dataset tab
Example: worldwide city search
{"destination": "Tokyo","checkin": "2026-08-01","checkout": "2026-08-03","adults": 2,"maxResults": 20,"currency": "USD","lang": "en-us","proxyCountry": "JP"}
Example: apartments only in Paris
{"destination": "Paris","checkin": "2026-08-01","checkout": "2026-08-05","adults": 2,"propertyTypes": ["apartment"],"sort": "price","maxResults": 30,"currency": "EUR","lang": "en-us","proxyCountry": "FR"}
Example: family stay with filters
{"destination": "Singapore","checkin": "2026-08-01","checkout": "2026-08-03","adults": 2,"children": 1,"childAges": [8],"stars": [4, 5],"minReviewScore": 8.0,"freeCancellation": true,"propertyTypes": ["hotel"],"maxResults": 20,"currency": "SGD","proxyCountry": "SG"}
Leaving propertyTypes empty means all accommodation categories.
Example output
Lead-focused excerpt from accepted random latest-build run bqjEZY7rgqZy2tiHE:
{"source": "booking","hotelId": "fr/hotelauroremontmartre","name": "Hotel Pilime","url": "https://www.booking.com/hotel/fr/hotelauroremontmartre.en-gb.html","phones": [],"emails": [],"address": {"street": "76 Rue De Clichy, 9th arr., 75009 Paris, France","unit": "76","locality": "76 Rue De Clichy","region": "Ile de France","postalCode": "75009","country": "France","full": "76 Rue De Clichy, 9th arr., 75009 Paris, France, 76 Rue De Clichy, Ile de France, 75009, France"},"geo": null,"person": null,"org": {"name": "Hotel Pilime","id": null},"web": {"website": "https://www.booking.com/hotel/fr/hotelauroremontmartre.en-gb.html","socials": []},"leadSource": "detail","leadReveal": "visible","leadAbsences": {"phones": "本站无(已测公开酒店详情)","emails": "本站无(已测公开酒店详情)","geo": "未验证(已测详情未提取经纬度)","person": "本站无(已测公开酒店详情)","web.socials": "本站无(已测 property 级)"}}
Input
| Field | Type | Default | Notes |
|---|---|---|---|
destination | string | Singapore | City / region / country / landmark |
checkin / checkout | string | (empty) | YYYY-MM-DD |
adults | integer | 2 | 1–10 |
children | integer | 0 | 0–10 |
childAges | integer[] | [] | Ages 0–17; padded to children |
rooms | integer | 1 | 1–10 |
maxResults | integer | 50 | 1–500 |
currency | string | USD | ISO code + cur_curr cookie |
lang | string | en-us | UI language tag |
sort | enum | popularity | popularity, price, review_score, … |
propertyTypes | string[] | [] | Empty = all categories |
stars | integer[] | [] | 1–5 → class= filters |
minReviewScore | number | (null) | 0–10 → review_score= tenths |
freeCancellation | boolean | false | → oos=1 |
destId / destType | string | (empty) | Skip autocomplete when both set |
customNfltFilters | string[] | [] | Raw nflt fragments |
detailUrls | URL[] | [] | Optional genuine Booking /hotel/... Detail URLs; skips destination search and requires enrichDetails=true |
enrichDetails | boolean | true | Fetch bounded public hotel Detail pages for lead enrichment |
detailEnrichLimit | integer | 3 | Maximum Detail pages to enrich, 1–10 |
proxyCountry | string | (empty) | RESIDENTIAL country (default US) |
proxy | object | (none) | Optional Apify proxy editor |
Supported property types
hotel, apartment, hostel, motel, resort, bed_and_breakfast, villa, guesthouse, holiday_home, aparthotel, lodge, homestay, country_house, capsule_hotel, campground, inn, ryokan, riad, chalet, holiday_park, tent, love_hotel, pension
Limits & notes
- Bounded Detail enrichment —
enrichDetails=trueenriches at mostdetailEnrichLimitrows; remaining rows keep the complete lead shape with honest absence reasons - Autocomplete — tries API + UI suggestion fallback; if both fail, search continues with free-text
ss=(destSource:query_onlyin warnings) - Proxy required — proxy/egress is supplied by the worker; the Actor does not fall back to direct/unproxied browsing
- Anti-bot — the production worker uses its configured acquisition chain (the accepted run used
geonode-extract); unresolved challenge responses fail the page/attempt
Diagnostics
Each run writes:
INPUT_ECHO— sanitized input including resolveddestId/destTypeandnfltRUN_SUMMARY— status, counters, field completeness, warnings (destSource:…, proxy mode, etc.)ERROR_SUMMARY— written only on hard failures
Statuses: ok | partial | blocked.
Pricing
This Actor uses pay-per-event pricing. Platform usage costs are included — you do not pay separate Apify compute on top of the event prices below (User pays platform usage costs: No).
| Event | Price |
|---|---|
Actor Start (apify-actor-start) | $0.005 per start |
Result (apify-default-dataset-item) | $2.00 / 1,000 listings ($0.002 each) |
Every hotel listing written to the default dataset is billed as one result.
Store discount tiers
| Tier | $/1,000 | per result |
|---|---|---|
| FREE* | $2.000 | $0.002 |
| BRONZE | $2.000 | $0.002 |
| SILVER | $2.000 | $0.002 |
| GOLD | $1.500 | $0.0015 |
| PLATINUM | $1.500 | $0.0015 |
| DIAMOND | $1.500 | $0.0015 |
*FREE is the list price before any Store volume discount. GOLD, PLATINUM, and DIAMOND pay $1.50 / 1,000.
Example cost estimates
| Listings | Approx. event cost* |
|---|---|
| 100 | ~$0.205 |
| 1,000 | ~$2.005 |
| 10,000 | ~$20.005 |
*Assumes one Actor start plus $0.002 per Dataset item (FREE/BRONZE/SILVER). Exact start billing can scale with allocated memory (one start event per GB, minimum one). This Actor defaults to 512 MB, so a typical run is one start event.
This price change is scheduled for 2026-10-03 14:24 UTC (22:24 CST). Until then, the Store pricing panel is the live bill.
Free Apify plan limits (set by this Actor's developer)
| Limit | Free Apify plan | Paid Apify plan |
|---|---|---|
| Runs of this Actor | 10 runs total | Unlimited |
Results per run (maxResults) | Up to 500 | Up to 500 |
When the run cap is hit, the run finishes with a clear status message — not an Apify platform error. Paying Apify users are not subject to the run cap.
FAQ
Can I search any country?
Yes. Enter a city, region, or country name. The Actor tries Booking autocomplete for dest_id; if that fails it still searches with the destination text. Inventory is global on www.booking.com.
What does empty propertyTypes mean?
All categories — hotels, apartments, hostels, and other accommodation types shown on the SERP.
Do I need a Booking.com account?
No.
Are amenities always filled?
No. Amenities are primarily card-level fields and are often absent on SERP cards. Detail enrichment currently focuses on the public hotel identity, address, geo, and contact lead shape rather than a full amenities catalog.
Why did my free-plan run stop after 10 runs?
Free Apify plan users get 10 runs of this Actor and up to 500 results per run. These limits are set by the Actor developer (not Apify). When you hit the run cap, the run finishes with a clear status message — it is not a platform bug. Upgrade to a paid Apify plan for unlimited runs.
Related Actors
All 77 public Actors from [lentic_clockss]. Click a name to open the Store detail page.
Jobs & Freelance
- LinkedIn Jobs Scraper
- Bayt Jobs Scraper
- Fiverr Gigs Scraper
- Freelancer.com Scraper
- Glassdoor Scraper
- Himalayas Jobs Scraper
- Indeed Jobs Scraper
- Jobicy Remote Jobs Scraper
- RemoteOK Jobs Scraper
- SEEK Jobs Scraper
- Upwork Jobs Scraper
Real Estate
- Zillow & Zumper Scraper
- Realtor.com Scraper
- 99.co Scraper
- Realtor.com Agents Scraper
- Apartments.com Rental Scraper
- Bayut Scraper
- Craigslist Housing Scraper
- Daft.ie Scraper
- Dot Property Scraper
- FINN.no Scraper
- Funda Scraper
- Hepsiemlak Scraper
- Idealista Scraper
- Immobiliare.it Scraper
- ImmoScout24 Scraper
- Naver Land Scraper
- OpenSooq Scraper
- Otodom Scraper
- Property Finder Scraper
- PropertyGuru Scraper
- realestate.com.au Scraper
- Realtor.ca Scraper
- Rightmove Scraper
- SeLoger Scraper
- SUUMO Scraper
- Zillow Group Scraper
E-commerce
- Shopee Search Scraper
- E-commerce Scraper
- 1688 Global Product Search Scraper
- Allegro Scraper
- Amazon Search Scraper
- ASOS Product Scraper
- Cdiscount Product Scraper
- Costco Product Scraper
- Coupang Product Scraper
- Etsy Scraper
- Lazada Scraper
- MercadoLibre Scraper
- Mercari Japan Scraper
- Rakuten Japan Scraper
- SHEIN Product Scraper
- Target Product Scraper
- Temu Product Scraper
- Walmart Product Scraper
Travel & Stays
- Booking.com & Airbnb Scraper
- Agoda Scraper
- Airbnb Listings Scraper
- Booking.com Hotels Scraper
- Despegar Scraper
- Expedia Scraper
- Traveloka Scraper
- Travelstart Flights Scraper
- Trip.com Scraper
- TripAdvisor Scraper
Social & Content
Ads Intelligence
Local & Maps
General Tools
→ Browse the full profile: apify.com/lentic_clockss