Booking.com Hotels Scraper avatar

Booking.com Hotels Scraper

Pricing

from $1.00 / 1,000 booking.com property returneds

Go to Apify Store
Booking.com Hotels Scraper

Booking.com Hotels Scraper

Give Booking.com a destination and dates and get one row per property: live price for that stay, guest review score and count, star rating, exact coordinates, room type and cancellation policy. Plain HTTP, no browser. About 1,000 per search. $1.00 per 1,000.

Pricing

from $1.00 / 1,000 booking.com property returneds

Rating

0.0

(0)

Developer

Dami's Studio

Dami's Studio

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

Give it a destination and a set of dates and you get the matching properties back as rows: the live price for that stay, the guest review score and count, star rating, coordinates, room type, cancellation policy and the Booking.com URL.

Booking.com stops serving new properties at around 1,000 per search, so a whole large city is a deep sample rather than a full inventory. The measured numbers are in Limits below.

It talks to Booking.com's own search API over plain HTTP. No headless browser and no residential bandwidth. A real 300-property run finished in a handful of requests and about 1 MB of traffic, which came to $0.0039 of Apify platform usage end to end.

What you get

One row per property. The fill rates below come from a single real 300-property run (Paris and Rome, 2-night stay, 2026-08-10) and are the numbers that run actually produced:

FieldFilledNotes
hotelId, name, url100%Booking.com's own property id and canonical page
city, countryCode100%
latitude, longitude100%exact, not geocoded
neighborhood, distanceFromCenter100%18th arr., Paris, 3.5 km from downtown
reviewScore, reviewsCount, reviewScoreWord100%9.6, 2634, Exceptional
priceTotal, pricePerNight, priceFormatted, currency100%for the exact stay you asked for
roomType100%the room the price belongs to
beds, bedrooms, bathrooms100%bedrooms and bathrooms are 0 on plain hotel rooms
freeCancellation, noPrepayment, isSoldOut100%
isSustainable, isPreferredPartner, isNewlyOpened100%
photoUrl100%
accommodationType100%Hotel, Apartment, Guesthouse, Condo Hotel and so on
address99.7%
starRating98.0%absent on some private homes. A later 250-row sample across a different destination mix came back at 90%, so expect it to move with what you search
availabilityMessage73.0%We have 1 left at this price
unitType41.0%Entire apartment, Private suite. Homes only
priceBeforeDiscount35.7%only when there's a real strike-through price
taxesAndFees33.3%only where Booking.com breaks it out
freeCancellationUntil31.7%ISO timestamp
mealPlan15.0%Breakfast included

Those optional-field percentages track how often Booking.com publishes the detail, not how often the scraper manages to read it, so they move with the destination and the dates. No column came back empty on every row.

Every row also carries the stay it was priced for: checkIn, checkOut, nights, adults, rooms, children, searchQuery, scrapedAt.

Input

{
"destinations": ["Paris", "Manhattan, New York", "Eiffel Tower"],
"checkIn": "2026-09-01",
"checkOut": "2026-09-03",
"adults": 2,
"rooms": 1,
"childrenAges": ["7"],
"maxItemsPerDestination": 200,
"sortBy": "review_score",
"currency": "EUR",
"language": "en-us",
"minStars": 4,
"minReviewScore": "80",
"maxPricePerNight": 250,
"freeCancellationOnly": true
}

destinations takes anything Booking.com's own search box takes: a city, a district, a landmark, an airport, a country, or a specific property name. Every filter and sorter in the input form is Booking.com's own, and each was checked to actually change the result set before being exposed.

Prices need dates

Booking.com won't quote a price without a stay attached. Leave checkIn and checkOut empty and the actor searches a 1-night stay 30 days out, then writes those dates onto every row, so a price is never ambiguous about what it's a price for.

Billing

$1.00 per 1,000 properties, plus a $0.001 actor start fee. It's a flat rate, the same $1.00 on the free plan as on any paid one.

You're charged once per property row and for nothing else. Diagnostics, the empty-input sample, retries and duplicate properties dropped during pagination are all free.

Limits, and what this doesn't do

  • About 1,000 properties per search, maximum. Booking.com's API stops serving new properties around that depth and starts repeating itself. The actor de-duplicates, notices the repeats and stops. A measured Tokyo run reached 1,075 unique properties and Paris reached 870. Split by neighbourhood or price band if you need a full city inventory.
  • One price per property, the one Booking.com puts on the search card for your dates and occupancy. It doesn't enumerate every room type or rate plan for a hotel.
  • No guest review text. Only the score and the count. Review text is a different scraper.
  • No hotel description, facility list or photo gallery. One main photo URL per property.
  • Availability moves. Prices and result order change through the day, so two runs minutes apart won't be byte-identical.
  • minReviewScore is Booking.com's own filter, and it lets unreviewed properties through. In a 260-row run filtered to "Very Good: 8+", 4 rows came back with reviewScore: 0 and reviewsCount: 0. Those are brand-new listings Booking.com hasn't scored yet. Drop them client-side if you only want rated properties.
  • Results follow Booking.com's own ranking, sponsored placements included, exactly as the site serves them.

FAQ

Does this need a Booking.com account or an affiliate key? No. There's nothing to log into and no key to supply.

Does it use a browser or residential proxies? No, it's a plain HTTP client against Booking.com's search API, which is why it's cheap. The free Apify datacenter proxy is used by default. Residential gets stripped from the proxy configuration even if you select it, because it costs $8/GB and buys you nothing here.

Can I get prices for one specific hotel? Yes. Put the property name in destinations, like "Hilton Paris Opera". Booking.com resolves it and the property comes back first, with the surrounding results behind it.

Can I scrape apartments and vacation rentals rather than hotels? Yes. Set propertyType to apartments, villas, vacation_homes or entire_homes_and_apartments. The accommodationType field tells you what each row is.

What currency are the prices in? Whatever you set in currency. Booking.com does the conversion server-side, and all 39 offered currencies were checked against the live API.

Why do I get fewer rows than maxItemsPerDestination? Either the destination genuinely has fewer properties available for those dates and filters, or you hit the ~1,000 pagination ceiling. The run log prints how many properties Booking.com reports for your search, so you can tell which.

What if a search returns nothing? You get one uncharged diagnostic row saying so. An empty result is never billed.

Output sample

{
"hotelId": 50908,
"name": "Bradford Elysées - Astotel",
"url": "https://www.booking.com/hotel/fr/bradfordelysees.html",
"accommodationType": "Hotel",
"address": "10 rue Saint-Philippe-du-Roule",
"city": "Paris",
"countryCode": "fr",
"latitude": 48.8729132030409,
"longitude": 2.30819128448275,
"neighborhood": "Champs Elysées, Paris",
"distanceFromCenter": "1.4 miles from downtown",
"reviewScore": 9.1,
"reviewsCount": 1113,
"reviewScoreWord": "Wonderful",
"starRating": 4,
"priceTotal": 517.08,
"pricePerNight": 258.54,
"priceFormatted": "$517.08",
"currency": "USD",
"taxesAndFees": "+$27 taxes and fees",
"roomType": "Superior Twin Room",
"beds": 2,
"freeCancellation": true,
"noPrepayment": false,
"isPreferredPartner": true,
"photoUrl": "https://cf.bstatic.com/xdata/images/hotel/square600/346706084.jpg",
"checkIn": "2026-09-01",
"checkOut": "2026-09-03",
"nights": 2,
"adults": 2,
"rooms": 1,
"children": 0,
"searchQuery": "Paris",
"scrapedAt": "2026-08-09T22:41:00.000Z"
}