πŸ”₯ Booking Scraper avatar

πŸ”₯ Booking Scraper

Pricing

Pay per event

Go to Apify Store
πŸ”₯ Booking Scraper

πŸ”₯ Booking Scraper

⚑️ Fast, no-code Booking.com scraper with LLM- & πŸ€– agent-optimized input & output. Extract hotels, apartments, hostels, B&Bs & villas by location, URL or property ID β€” prices, availability, star ratings, review scores, photos, facilities & coordinates. Export to JSON, CSV or Excel.

Pricing

Pay per event

Rating

0.0

(0)

Developer

Bebity

Bebity

Maintained by Community

Actor stats

14

Bookmarked

566

Total users

4

Monthly active users

4 days ago

Last modified

Share

Booking.com Stays Scraper

Booking.com Stays Scraper β€” scrape hotels, apartments & stays into structured data

Scrape stays from Booking.com β€” hotels, apartments, hostels, B&Bs, villas β€” fast, with the full schema. Search by location & filters, by URL, by property ID, by geographic bounding box, or by hotel chain.

πŸ€– Built for LLMs & AI agents. Clean, typed JSON out β€” plain text, canonical URLs, stable IDs, zero HTML noise β€” ready to drop straight into RAG pipelines, vector stores, and agent tools. Typed input in, so an agent can fill it and call the actor over the API or MCP.

Fast by design. Runs start in seconds and results stream into your dataset as they're found. Everything about reaching Booking β€” proxies, anti-blocking, and retries β€” is handled for you: you bring a query, you get clean data back.


🏨 What does it do?

You give the actor a query β€” a city, a Booking search URL, a list of property URLs, a bounding box, or a hotel chain β€” and it returns one row per stay with name, prices, review score, photos, address, coordinates, facilities, and (optionally) the full hotel detail schema. Every output URL is canonicalised: tracking parameters are stripped so rows are deduplicable and shareable.

πŸ€– Built for LLMs & AI agents

Both the input and the output are designed to be consumed by language models and autonomous agents β€” not just humans.

Output β†’ LLM-ready.

  • πŸ“ Structured, typed JSON with a fully documented schema β€” every field carries a title and description, so a model knows exactly what it's reading.
  • 🧹 No HTML, no tracking noise β€” plain-text descriptions, canonical URLs (tracking params stripped), image URLs (not bytes). Feed it straight into a RAG pipeline, vector store, or context window with no post-processing.
  • πŸ”‘ Stable IDs (hotelId, cc/slug) for reliable de-duplication, joins, and incremental updates across runs.
  • βœ… Failures as data β€” failed rows are typed ({ failed: true, reason, … }), so an agent can branch on them instead of scraping logs.

Input β†’ agent-fillable.

  • πŸŽ›οΈ Typed input schema an agent can populate programmatically β€” JSON in, JSON out, no brittle form-filling.
  • πŸ”Œ Callable over the Apify API and via MCP β€” plug it into your agent framework (LangChain, LlamaIndex, custom tool-calling) as a ready-made Booking.com data tool.
  • 🧩 One call returns a whole city β€” no pagination bookkeeping on your side; the actor fans out and de-duplicates for you.

πŸ‘₯ Who is it for?

  • 🧳 Travel agencies and OTAs building hotel search/aggregation tools.
  • πŸ“Š Price-comparison and rate-parity teams monitoring nightly rates at scale.
  • 🏨 Hotel revenue managers pulling competitive intel for a city.
  • πŸ€– Content aggregators and AI/RAG pipelines indexing detailed property descriptions, photos, and facilities.
  • πŸ”¬ Researchers mapping stay supply by neighborhood, chain, or sustainability tier.

☁️ Why run it on Apify?

This is a Booking.com data pipeline, not just a script β€” the Apify platform adds the parts you'd otherwise build and maintain yourself:

  • πŸ—“οΈ Schedule runs (hourly, daily, weekly) to keep rate and availability data fresh.
  • πŸ”Œ Call it from your stack via the Apify API, or wire it into 5,000+ tools through native integrations (Make, Zapier, n8n, webhooks, Google Drive, Slack).
  • 🌐 Residential proxy rotation is built in β€” no proxy list to buy or manage.
  • πŸ“ˆ Monitor every run, get failure alerts, and re-run jobs straight from the Console.

πŸš€ How to scrape Booking.com?

  1. Open the actor on the Apify Console.
  2. In Section 1 β€” Search by location & filters, type a destination (e.g., Paris), pick check-in / check-out dates, set adults/rooms.
  3. (Optional) Pick a sort order, check scrapeDetails if you want the full schema, set currency and language.
  4. Click Run. Data lands in the run's dataset as it streams.
{
"location": "Paris",
"checkIn": "2026-06-15",
"checkOut": "2026-06-17",
"adults": 2,
"rooms": 1,
"propertyClass": ["4-stars", "5-stars"],
"reviewScoreMin": "very-good-8+",
"scrapeDetails": false,
"currency": "EUR",
"language": "en-us",
"maxItems": 100
}

πŸ“€ Example output (one row, lite mode)

{
"hotelId": 5099301,
"slug": "hotelcameliaprestige",
"cc": "fr",
"name": "Camelia Prestige - Place de la Nation",
"url": "https://www.booking.com/hotel/fr/hotelcameliaprestige.html?checkin=2026-06-15&checkout=2026-06-17&group_adults=2&no_rooms=1&selected_currency=EUR&lang=en-us",
"starRating": 2,
"reviewScore": 7.7,
"reviewLabel": "Good",
"reviewCount": 2810,
"thumbnail": "https://cf.bstatic.com/xdata/images/hotel/square600/716245082.jpg?k=...&o=",
"address": {
"neighborhood": "11th arr., Paris",
"distanceFromCenterMeters": 3300,
"latLng": null,
"full": null
},
"price": {
"amount": 125,
"total": 250,
"currency": "EUR",
"nightCount": 2
},
"badges": ["Subway Access"],
"source": {
"mode": "search-filters",
"srpvid": "f3a18f7eadd90592",
"blockId": "427808541",
"scrapedAt": "2026-04-30T04:48:00.000Z"
}
}

With scrapeDetails: true, the row also gets description, photos[], facilities[], rooms[], houseRules, reviewBreakdown, propertyType, sustainability, plus address.latLng and address.full when available.

πŸŽ›οΈ Input parameters

The input is split into 8 collapsible sections in the Console. Below are the most common ones β€” see the input schema panel for the full list with per-field descriptions.

πŸ” Section 1 β€” Search by location & filters

FieldTypeDescription
locationstringCity / area / property name.
checkIn / checkOutISO dateStay window.
adults / children / childrenAges / roomsintegersGuest mix.
propertyClassstring[]One or more star levels.
reviewScoreMinstringpleasant-6+ / good-7+ / very-good-8+ / wonderful-9+.
priceMin / priceMaxintegersBudget per night, in currency.
propertyTypesstring[]Hotels / apartments / hostels / B&Bs / villas / boats / guesthouses / vacation-homes / homestays.
mealPlans, hotelFacilities, roomFacilities, accessibleFacilities, accessibleRoomFacilities, stayType, paymentTypes, bedPreference, reservationPolicy, distanceFromCenter, ratedHigh, sustainabilityLevelvariousSee input schema for the enum values.
sortBystringResult ordering.

πŸ”— Section 2 β€” Search by URL

FieldTypeDescription
searchUrlsstring[]Paste full Booking search URLs. Useful for contextual filters not exposed above (district, chain, landmark).
FieldTypeDescription
bbox{north, south, east, west}Bounding rectangle.
center{lat, lng}Center point. Pair with radiusMeters.
radiusMetersinteger500–50,000 meters.

🏷️ Section 4 β€” Hotel chain

FieldTypeDescription
chainstringRestrict the search to a known chain. Combine with location for "Mercure in Paris"-style queries.

πŸ“„ Section 5 β€” Direct property lookup

FieldTypeDescription
propertyUrlsstring[]Direct hotel detail URLs.
propertySlugs{slug, cc}[]Slug + ISO-2 country pairs.

πŸ“¦ Section 6 β€” Output

FieldTypeDefaultDescription
scrapeDetailsbooleanfalseAdds rooms/photos/facilities/coords. +1 HTTP request per stay.
maxItemsinteger1000Hard ceiling. 0 = unlimited.

🌍 Section 7 β€” Localization

FieldTypeDefaultDescription
currencyenumEURForces selected_currency URL param.
languageenumen-usForces lang URL param.

βš™οΈ Section 8 β€” Advanced

FieldTypeDefaultDescription
maxConcurrencyinteger5Parallel requests.
proxyConfigurationproxyApify residentialCustom proxy.

πŸ“Š What data can I extract?

FieldTypeLiteFullDescription
hotelIdintegerβœ“βœ“Booking's stable numeric ID.
slug / ccstringβœ“βœ“URL slug + ISO-2 country.
namestringβœ“βœ“Property name.
urlstringβœ“βœ“Canonical detail URL.
starRatingintβœ“βœ“1–5.
reviewScorenumberβœ“βœ“0–10 aggregate.
reviewLabelstringβœ“βœ“"Good", "Superb", …
reviewCountintβœ“βœ“Total reviews.
thumbnailstringβœ“βœ“Pre-signed image URL.
addressobjectβœ“βœ“neighborhood, distanceFromCenterMeters, latLng, full.
priceobjectβœ“βœ“amount, total, currency, nightCount.
badgesstring[]βœ“βœ“Cards-level annotations.
descriptionstringβœ“Property description.
photosarrayβœ“{ thumbnail, full, caption }[] β€” URLs only.
facilitiesarrayβœ“Categorised amenities.
roomsarrayβœ“Room offers, occupancy, bed type, price, conditions.
houseRulesobjectβœ“Check-in/out, pets, parties, smoking, children.
reviewBreakdownobjectβœ“Per-category scores.
propertyTypestringβœ“Hotel / Apartment / Hostel / …
sustainabilitystringβœ“Certification when present.
sourceobjectβœ“βœ“mode, srpvid, blockId, scrapedAt.

Failed rows ship as { failed: true, reason, inputUrl, error, scrapedAt } β€” they're queryable just like data rows.

ℹ️ source.srpvid and source.blockId are Booking's search-scoped identifiers, handy for debugging a specific run. They are not stable across runs β€” always key on hotelId (or cc/slug) for de-duplication and joins.

Download any run's dataset as JSON, CSV, Excel, or HTML from the run's Storage tab, or pull it programmatically via the Apify API β€” a clean, no-code stand-in for an official Booking.com API.

πŸ’° How much does it cost?

Pay-per-event (PPE) β€” you pay per stay returned, never per page or per run. A lite stay is billed once; a full stay adds the detail add-on on top.

πŸš€ Launch promo β€” 50% off the regular price for the first 2 months.

EventLaunch (βˆ’50%)RegularCharged
Stay result$1.25 / 1,000$2.50 / 1,000Once per stay returned β€” lite and full modes.
Full hotel detail (add-on)$2.50 / 1,000$5.00 / 1,000Only with scrapeDetails: true (or direct-property modes), on top of the stay result.

Which means, end to end:

What you scrapeLaunch (βˆ’50%)Regular
Lite β€” list data (name, price, review score, stars, address, photos)$1.25 / 1,000 stays$2.50 / 1,000
Full β€” everything above + rooms, facilities, coordinates, description, full gallery$3.75 / 1,000 stays$7.50 / 1,000

Prices are the list (Free-plan) rate β€” higher Apify subscription plans pay less automatically, shown as "from $…" on the actor's Store card. That's roughly half the going rate for Booking hotel data.

Worked examples (launch pricing):

JobCost
List 1,000 hotels in Paris (lite)$1.25
List 5,000 hotels across a region (lite)$6.25
Full schema for 1,000 hotels$3.75
Full schema for 250 hotels$0.94

You're never charged for failed rows, duplicate hotels, or retried requests β€” only for unique stays actually returned to you. (A negligible Apify actor-start fee of ~$0.00005/run applies, as it does to every PPE actor.)

🧭 Scraping modes

SectionModeUse case
1. Location + filtersA"All 4-star hotels in Paris under €300"
2. Search URLsB"Pre-built Booking URL with district / chain / landmark filter"
3. Bbox / center+radiusE"All stays within this neighborhood polygon"
4. Hotel chainF"All Mercure hotels in France"
5. Direct propertyC / D"Just give me the schema for hotel camelia prestige"

You can combine multiple modes in a single run β€” they're enqueued together and de-duplicated by hotelId / slug.

⚠️ Limitations

  • ~1,000 stays per search. Booking limits how deep any single search can go. For broad cities (e.g., "Paris" β†’ 4,256 properties) the actor automatically splits the search into smaller slices to reach the long tail β€” the limit still applies to each slice.
  • No reviews list. This actor returns a review summary (score, count, label, breakdown), not individual reviews. The sister actor (coming soon) will handle full reviews.
  • No flights / cars / attractions / airport taxis. Stays only.
  • Image URLs, not files. We return image URLs; download the files yourself if you need them. (Intentional β€” it keeps runs fast and cheap.)
  • Currency. Your chosen currency is applied reliably, but a handful of properties may fall back to another currency if Booking has no quote in yours.
  • Desktop listings. Data reflects Booking's desktop results for consistency across runs.

πŸ’‘ Tips & advanced options

  • For chains not in the dropdown, copy the URL from Booking after applying their chaincode= filter, paste it in section 2.
  • For neighborhood / district filters, same trick β€” apply on Booking, copy URL, paste in section 2.
  • For huge cities, leave maxItems at the default 1000 unless you really need everything β€” Booking's pagination cap means past ~1000 results, the marginal cost grows fast.
  • For dataset deduplication, use hotelId (or cc/slug) as the key. Both are stable across runs.

❓ FAQ

Q: Why is scrapeDetails: false the default? A: Most buyers want a list, not detailed schemas. Lite mode skips the detail add-on, so it's 3Γ— cheaper ($2.50 vs$7.50 / 1,000 stays at regular pricing). Flip it on only when you actually need rooms/photos/facilities.

Q: Will the scraper get blocked? A: No β€” anti-blocking is fully handled for you. The actor manages access and proxy rotation transparently and retries automatically when needed, so you just get your data. You're only charged for stays actually returned.

Q: Can I use my own proxies? A: Yes. Section 8 β†’ proxyConfiguration accepts custom URLs. Apify residential is the safe default.

Q: What time zone are dates / timestamps in? A: scrapedAt is ISO-8601 in UTC. checkIn / checkOut are calendar dates with no time zone β€” they map to Booking's interpretation in the property's local time.

Q: Are output URLs OK to share? A: Yes β€” every URL in the dataset is cleaned of tracking parameters, so they're safe to store, de-duplicate, and share.

Q: Is it legal to scrape Booking.com? A: This actor collects only publicly available listing data β€” property names, prices, star ratings, review summaries, photos, and facilities. It does not log in, bypass any paywall, or extract private personal data. Scraping publicly available data is generally legal, but your results can still contain personal data (protected by the GDPR in the EU and similar laws elsewhere), so only collect and store what you have a legitimate reason to process β€” and consult a lawyer if you're unsure. See Apify's blog post on the legality of web scraping.

πŸ›Ÿ Support & feedback

Found a bug, need an output field we don't return yet, or want a Booking vertical we don't cover (flights, cars, attractions, reviews list)? Open a ticket on the Issues tab of this actor β€” it's monitored, and feature requests genuinely shape the roadmap. For a tailored or private build, reach out via the actor's Store page.

πŸ—“οΈ Changelog

0.6 β€” Per-result pricing

  • πŸ’³ Billing moved from per-page to per-result β€” pay for stays returned, not pages fetched (stay-result base + detail-result add-on).
  • πŸš€ Launch promo: 50% off the regular price for the first 2 months.
  • βœ… Failed rows, duplicate hotels, and retried requests are never charged.
  • ⚑ Faster by default β€” tuned for speed.

0.5 β€” Setup & reliability

  • 🧩 Works out of the box with less configuration; steadier behaviour on long runs.

0.4 β€” Data-privacy hardening

  • πŸ”’ Your run's storage stays clean β€” no internal state left behind.

0.3 β€” Cleaner run logs

  • 🧾 Friendlier, concise logs by default.
  • 🏷️ Branded run-start summary in the log.

0.2 β€” Reliability & precise limits

  • 🎯 Precise maxItems β€” the run stops exactly at your limit instead of finishing the current page.
  • πŸ›‘οΈ More reliable on large cities.

0.1 β€” Initial release

  • πŸ”€ 6 input modes: location + filters, search URL, direct property URL, slug + country, geo bounding box, and hotel chain.
  • πŸŽ›οΈ 16 typed filters for location search.
  • 🏨 Optional full-detail enrichment (rooms, photos, facilities, coordinates, description).
  • 🧭 Automatic search-splitting to reach past Booking's ~1,000-result cap on large cities.
  • ⚑ Built for speed and low cost.
  • 🌐 Apify residential proxy by default.