Booking.com Scraper at a glance
Booking.com Scraper is a ready-to-run Apify actor from abotapi for collecting travel data. Its documented output includes rank in search, property, link, stars and score, which you can export as JSON, CSV or Excel or read through the Apify API. It costs $1.80 per 1,000 results on the Apify Free plan and from $1.20 on paid plans, with smaller per-run or optional feature charges listed on Apify.
- Runs on
- Apify cloud: console, API, schedules and integrations
- Data type
- Travel
- Pricing
- $1.80 per 1,000 results (Free plan), from $1.20 on paid plans
- Output
- Documented below · JSON, CSV, Excel
- Inputs
- 38 options
Scrape booking.com hotels, apartments, villas and hostels. Search any destination with the site's own filters (type, stars, review score, budget, meals, cancellation, amenities) or paste links. Live prices in 36 currencies, room-level rates, facilities, house rules and guest reviews.
What Booking.com Scraper can do
- Two ways to find data. Name a destination and let the actor search, or paste links you already built (a search results page or one property) and get exactly what you saw.
- Real prices for real dates. Every price is for the stay you asked for, converted into one of 36 currencies, with the property's own currency returned alongside it so nothing is hidden behind an exchange rate.
- The site's own filters, plus three it does not enforce itself. Type, star rating, review score, budget, meals, cancellation policy, amenities, bed type and travel group are all sent as the site's own filter tokens. Minimum review count, sold out status and actual availability for your dates are checked by the actor afterward, because the site's own tokens for those do not narrow anything.
- Property depth on demand. Turn on the property's own page for facilities, house rules, the room catalogue, policies and photos, and turn on guest reviews separately. The two share one per-property surcharge, billed only for returned properties where the extra read returned data. Reviews are on by default (20 per property); set them to 0 to skip the surcharge.
- Built for monitoring. Incremental mode returns only new and changed properties on a schedule, and resume continues an interrupted run without re-collecting what it already has.
- Honest about the site's own limits. A destination bigger than the site will serve anonymously is reported as such in the log, not silently truncated with no explanation.
Choose what to collect
These inputs let you configure Booking.com Scraper - Hotels, Prices, Rooms & Reviews. Open the actor on Apify to enter your values and review the current options.
| Input | What it controls |
|---|---|
modestring · required | Search: name destinations and let the actor build the search. URL: paste booking.com search links or property links and walk exactly those. |
destinationsarray | One destination per line, exactly as you would type it into the site's own search box: a city, a region, a neighbourhood, a landmark or an airport. Example: Sydney, Lisbon, Manhattan New York. |
urlsarray | One link per line. Accepted: a search link (searchresults.html) walked with the destination, dates, guests and filters it carries; a property link (/hotel//.html, any locale suffix, www or m. host); a landing page (/city/, /region/, /district/, /landmark/, /country/) walked as a search for the place it names. Left untouched, one example of each shape is read; Max results is shared across the links (property links first, then an equal share per search or landing-page link). |
checkInstring | YYYY-MM-DD. Prices exist only for a real stay, so if you leave this empty the run prices a 2 night stay 30 days from now and says so in the log. |
checkOutstring | YYYY-MM-DD. Must be after check-in. Left empty, it becomes 2 nights after check-in. |
adultsinteger | Adults in the party. Changes which rooms and prices come back. |
childrenAgesarray | One age (0 to 17) per child, one per line. The number of children is taken from how many ages you list. |
Show 31 more inputs
| Input | What it controls |
|---|---|
roomsinteger | How many rooms the party needs. |
currencystring | Every price in the output is converted to this currency, and the budget filter above is denominated in it. The property's own currency is returned alongside it. |
languagestring | Language for property names, room names, facility labels and review text where the site has a translation. |
propertyTypesarray | Keep only these kinds of place. Several kinds widen the search (any of them matches). Leave empty for every kind. Search mode only; pasted links keep their own filters. |
starRatingsarray | Keep only properties with these star ratings. Several ratings widen the search (any of them matches). |
minReviewScorestring | Keep only properties scoring at least this, out of 10, from guest reviews. |
minPricePerNightinteger | Lower bound of the nightly budget, in the currency selected below. |
maxPricePerNightinteger | Upper bound of the nightly budget, in the currency selected below. |
mealPlansarray | Keep only properties offering ALL of the meal arrangements you pick, so each extra one narrows the search further. |
reservationPoliciesarray | Keep only properties whose booking conditions match ALL of the ones you pick, so each extra one narrows the search further. |
amenitiesarray | Keep only properties that have ALL of these, so each extra one narrows the search further. |
roomAmenitiesarray | Keep only properties whose rooms have ALL of these, so each extra one narrows the search further. |
bedPreferencesarray | Keep only properties offering these bed types for your party. Several types widen the search (any of them matches). |
travelGroupsarray | Keep only properties suited to ALL of these travellers, so each extra one narrows the search further. |
sortBystring | Which order the site returns results in. This decides WHICH properties you get when Max results stops the run early. Search mode only; a pasted link keeps its own order. |
availableOnlyboolean | The site pads a thin result set with places that are not actually bookable for your dates. Turn this on to drop them and keep only the bookable ones, reported in the isAvailableForDates column. Applied by this actor after the search, because the site ignores its own availability filter tokens. Works in search mode and for pasted search links; a pasted property link has no availability context to test. |
minReviewCountinteger | Drop properties with fewer reviews than this. A 10 out of 10 from two guests is not the same evidence as an 8.9 from four thousand. Applied by this actor after the search, because the site's own filters bound the score but never the sample size. |
excludeSoldOutboolean | Applied by this actor after the search. Useful mainly for pasted links, whose own filter string may not carry the availability option. |
fetchDetailsboolean | Adds facilities, house rules, check-in and check-out times, the child and bed policy, accepted payment methods, the fine print, the photo gallery, the room catalogue and guest questions. Costs one extra request per property and adds the per-property surcharge. |
maxReviewsPerPropertyinteger | How many guest reviews to attach to each property, newest first. 0 returns none. Reviews are read 25 at a time, so 100 costs four extra requests per property and adds the per-property surcharge. |
maxItemsinteger | Stop after this many properties. 0 means no limit, which on a big destination can be up to 1000 per search: the site stops serving new results past that point, whatever it declares as the total. |
maxPagesinteger | Stop each destination after this many result pages (25 properties per page). 0 walks until the results run out or the site stops serving new ones. |
resumeFromRunIdstring | Paste a run id or dataset id from an earlier run of this actor to continue where it stopped: everything that run already collected is skipped, so you are not charged for it twice. For recurring monitoring use Incremental mode below instead. |
incrementalModeboolean | For scheduled runs against the same search. The actor remembers the previous run itself and returns only NEW, UPDATED and REAPPEARED properties, with a changedFields list. Use Resume from a previous run above to continue one interrupted crawl instead. |
stateKeystring | Name this monitoring campaign so several schedules can track different searches independently. Leave empty and the actor derives one from the mode, destinations, links, filters and stay. |
emitUnchangedboolean | Incremental mode only. Returns properties that did not change since the last run. These are extra rows and they are billed as results. |
emitExpiredboolean | Incremental mode only. Returns a row marked EXPIRED for each tracked property no longer found, but only after a run that reached the natural end of every search. These are extra rows and they are billed as results. |
ignoreFieldsForChangesarray | Optional. Field names that must NOT count as a change in incremental mode, for example "reviewScore" or "price". A property whose only differences are in these fields is treated as UNCHANGED, so it is not returned or billed as UPDATED. Names match at any nesting depth. The fields still appear in the output of rows that are returned. |
notionParentPageUrlstring | Only used when the notion connector is selected: the page new property pages are created under. |
maxNotifyPropertiesinteger | How many properties to push into the connectors above. The dataset always keeps them all. |
maxNotifyListingsinteger | Same cap as 'Max properties to export'. When set, it takes precedence. The dataset always keeps every row. |
Fields in the output
The documented dataset includes the fields below. Availability can depend on the source page and selected mode.
orderRank in searchpropertyNamePropertypropertyUrlLink (link)starRatingStarsreviewScoreScorereviewCountReviewspricePrice (object)cityCitycountryCodeCountryaddressAddresslatitudeLatlongitudeLonShow 33 more fields
freeCancellationFree cancellationisAvailableForDatesAvailable for datescheckInCheck-incheckOutCheck-outnightsNightsadultsAdultsroomsRequestedRoomspropertyIdProperty IDscrapedAtScraped atpropertyTypeTypedescriptionDescriptionhouseRulesHouse rules (object)facilityGroupsFacilities (array)topFacilitiesTop facilities (array)roomTypesRoom types (array)childrenAndBedsChildren and beds (object)petsPolicyPets (object)damagePolicyDamage policy (object)finePrintFine print (array)photosPhotos (array)questionsAndAnswersGuest questions (array)languagesSpokenLanguages (array)brandsBrands (array)roomsroomsreviewScoreLabelScore labeltotalReviewCountTotal reviewsreviewsReturnedReviews returnedreviewCategoryScoresCategory scores (array)reviewsReviews (array)changeTypeChangechangedFieldsChanged fields (array)firstSeenAtFirst seenlastSeenAtLast seenExample output
An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.
{
"propertyId": "0000000",
"propertyName": "Example Harbour Hotel",
"propertyUrl": "https://www.booking.com/hotel/au/example-harbour-hotel.html",
"pageName": "example-harbour-hotel",
"accommodationTypeId": 999,
"destinationId": -1,
"starRating": 4,
"starRatingSymbol": "STARS",
"reviewScore": 9.2,
"reviewScoreLabel": "Wonderful",
"reviewCount": 1348,
"address": "1 Example Street",
"city": "Sydney",
"countryCode": "au",
"latitude": -33.9,
"longitude": 151.1,
"displayLocation": "Sydney, Australia",
"price": {
"currency": "USD",
"perStay": 310,
"perNight": 155,
"perStayFormatted": "$310.00",
"beforeDiscount": 360,
"chargesInfo": "Includes taxes and fees",
"propertyCurrency": "AUD",
"perStayInPropertyCurrency": 465
},
"rooms": [
{
"roomId": "0000010",
"occupancy": 2,
"price": 310,
"currency": "USD",
"mealPlan": "Breakfast included",
"freeCancellationUntil": "2026-10-30"
}
],
"matchedUnit": {
"bedrooms": 1,
"bathrooms": 1,
"beds": 1,
"area": {
"value": 30,
"unit": "m2"
}
},
"freeCancellation": true,
"noPrepayment": false,
"petsAllowedFreeOfCharge": false,
"isSoldOut": false,
"isAvailableForDates": true,
"checkIn": "2026-11-02",
"checkOut": "2026-11-04",
"nights": 2,
"adults": 2,
"children": 0,
"roomsRequested": 1,
"houseRules": {
"checkInFrom": "2:00 PM",
"checkOutUntil": "10:00 AM"
},
"reviews": [
{
"score": 8,
"title": "Great stay",
"positiveText": "Comfortable room and helpful staff",
"negativeText": "Breakfast area was busy",
"reviewerCountry": "Canada",
"travellerType": "FAMILIES",
"nights": 2,
"reviewedAt": "2026-09-01T00:00:00Z"
}
],
"searchMode": "search",
"searchQuery": "Sydney",
"scrapedAt": "2026-09-10T12:00:00Z"
}Ways to use this data
- Travel search and metasearch: build a comparison feed of live prices, availability and review scores across many destinations.
- Revenue management and competitor pricing: track a named set of properties for price and availability changes on a recurring schedule.
- Review and reputation analysis: pull guest review text, category scores and traveller types to summarize what guests actually say about a property.
- Booking assistants and AI agents: look up a destination or a specific property on demand and pipe structured results into your own tool or MCP client.
- Market research: profile the accommodation mix (property types, star ratings, amenities) of a destination.
Before you run
Start with a small input and check the resulting records against your expected fields. Source content and actor options can change; the current Apify listing is the reference for availability and pricing.
Questions about this actor
What data does Booking.com Scraper return?
The documented output for Booking.com Scraper includes rank in search, property, link, stars, score, reviews, price and city. Availability of each field depends on the source page and the selected mode.
How much does Booking.com Scraper cost?
It costs $1.80 per 1,000 results on the Apify Free plan and from $1.20 on paid plans, with smaller per-run or optional feature charges listed on Apify. The Apify listing shows the current rate for every plan.
Can I get only new or changed properties on a schedule?
Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. Each run then returns only new, updated and reappeared properties, with a changedFields list, and unchanged ones are not billed unless you turn that on too. Some fields are still returned but never count as a change on their own, because they move without the property changing: the search position (order), the long property description, the wishlist counter, the per-night price (it is the per-stay price divided by the nights) and display tags (wishlistCount, topFacilities, starRatingSymbol, searchUrl, scrapedAt), and the two wheelchair-accessibility facility tags, which the site shows on one read of a property page and drops or moves on the next. Add anything else you do not want to count to Ignore fields when detecting changes (incremental mode only).
Why did a run return fewer properties than Max results?
Three common reasons. A destination bigger than 1000 properties stops there regardless of what it declares as its total; narrow the search to reach further into it. Max results is spent on properties read from the source, not properties actually returned, so a run where many rows are dropped afterward (unchanged on an incremental run, or failing the minimum review count, sold-out or availability checks) can return well under Max results even though qualifying properties exist further down the list; raise Max results, or set it to 0. And with several overlapping destinations or search links in one run, a property one of them read past its own share can be skipped by the others; run overlapping searches separately.
Why did my run fail instead of returning an empty dataset?
If the site refuses every request, the run stops with a clear message so "no properties matched" is never confused with "nothing could be read". Run it again in a few minutes. If the site does not know a destination you typed, the run stops with a message naming it ("No destination matched ..."): check the spelling or use a nearby city, region, landmark or airport name as the site's own search box shows it. If the run reaches its time limit before any page loaded, it stops with a message saying so; with rows already collected it keeps them and the log says the results are incomplete. If only some destinations or links could be read, you still get what was found, with a warning that the results may be incomplete.
Can I use it with AI agents or MCP?
Yes. Call it from any Apify integration or MCP client, and use the connector field to push results into Notion, Linear or Airtable.
