Booking.com Scraper icon

Booking.com Scraper

Scrape booking.com hotels, apartments, villas and hostels. Search any destination with the site's own filters (type, stars, review score, budget,…

Start using this actor on Apify ↗Need a custom scraper?Contact us ↗

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.

Supported input fields
InputWhat it controls
modestring · requiredSearch: name destinations and let the actor build the search. URL: paste booking.com search links or property links and walk exactly those.

Choices: search, url

destinationsarrayOne 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.
urlsarrayOne 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).
checkInstringYYYY-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.
checkOutstringYYYY-MM-DD. Must be after check-in. Left empty, it becomes 2 nights after check-in.
adultsintegerAdults in the party. Changes which rooms and prices come back.
childrenAgesarrayOne 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
More input fields
InputWhat it controls
roomsintegerHow many rooms the party needs.
currencystringEvery 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.

Choices: USD, EUR, GBP, AUD, CAD, NZD, JPY, CNY, INR, BRL, MXN, CHF, SEK, NOK, DKK, PLN, CZK, HUF, TRY, ZAR, AED, SAR, SGD, HKD, KRW, THB, IDR, MYR, PHP, VND, ILS, RON, ARS, CLP, COP, TWD, AZN, BHD, XOF, EGP, FJD, GEL, JOD, KZT, KWD, MDL, NAD, OMR, QAR, RUB, UAH

languagestringLanguage for property names, room names, facility labels and review text where the site has a translation.

Choices: en-us, en-gb, de, fr, es, it, nl, pt-pt, pt-br, pl, sv, da, no, fi, cs, hu, ro, tr, ru, ar, he, ja, ko, zh-cn, zh-tw, th, id, vi, ms, es-ar, ca, el, bg, lv, uk, et, hr, lt, sk, sr, sl, tl, is

propertyTypesarrayKeep 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.
starRatingsarrayKeep only properties with these star ratings. Several ratings widen the search (any of them matches).
minReviewScorestringKeep only properties scoring at least this, out of 10, from guest reviews.

Choices: any, 6, 7, 8, 9

minPricePerNightintegerLower bound of the nightly budget, in the currency selected below.
maxPricePerNightintegerUpper bound of the nightly budget, in the currency selected below.
mealPlansarrayKeep only properties offering ALL of the meal arrangements you pick, so each extra one narrows the search further.
reservationPoliciesarrayKeep only properties whose booking conditions match ALL of the ones you pick, so each extra one narrows the search further.
amenitiesarrayKeep only properties that have ALL of these, so each extra one narrows the search further.
roomAmenitiesarrayKeep only properties whose rooms have ALL of these, so each extra one narrows the search further.
bedPreferencesarrayKeep only properties offering these bed types for your party. Several types widen the search (any of them matches).
travelGroupsarrayKeep only properties suited to ALL of these travellers, so each extra one narrows the search further.
sortBystringWhich 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.

Choices: relevance, price_low_to_high, rating_high_to_low, stars_high_to_low, stars_low_to_high, distance_from_centre, homes_and_apartments_first, review_score_and_price, class_and_price

availableOnlybooleanThe 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.
minReviewCountintegerDrop 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.
excludeSoldOutbooleanApplied by this actor after the search. Useful mainly for pasted links, whose own filter string may not carry the availability option.
fetchDetailsbooleanAdds 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.
maxReviewsPerPropertyintegerHow 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.
maxItemsintegerStop 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.
maxPagesintegerStop 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.
resumeFromRunIdstringPaste 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.
incrementalModebooleanFor 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.
stateKeystringName 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.
emitUnchangedbooleanIncremental mode only. Returns properties that did not change since the last run. These are extra rows and they are billed as results.
emitExpiredbooleanIncremental 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.
ignoreFieldsForChangesarrayOptional. 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.
notionParentPageUrlstringOnly used when the notion connector is selected: the page new property pages are created under.
maxNotifyPropertiesintegerHow many properties to push into the connectors above. The dataset always keeps them all.
maxNotifyListingsintegerSame 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 search
propertyNameProperty
propertyUrlLink (link)
starRatingStars
reviewScoreScore
reviewCountReviews
pricePrice (object)
cityCity
countryCodeCountry
addressAddress
latitudeLat
longitudeLon
Show 33 more fields
freeCancellationFree cancellation
isAvailableForDatesAvailable for dates
checkInCheck-in
checkOutCheck-out
nightsNights
adultsAdults
roomsRequestedRooms
propertyIdProperty ID
scrapedAtScraped at
propertyTypeType
descriptionDescription
houseRulesHouse 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)
roomsrooms
reviewScoreLabelScore label
totalReviewCountTotal reviews
reviewsReturnedReviews returned
reviewCategoryScoresCategory scores (array)
reviewsReviews (array)
changeTypeChange
changedFieldsChanged fields (array)
firstSeenAtFirst seen
lastSeenAtLast seen

Example 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.

Ready to collect with Booking.com Scraper?

Run it on Apify with your own input and export the results as JSON, CSV or Excel.