Booking.com Hotels Scraper avatar

Booking.com Hotels Scraper

Under maintenance

Pricing

from $2.99 / 1,000 hotels

Go to Apify Store
Booking.com Hotels Scraper

Booking.com Hotels Scraper

Under maintenance

Scrape hotel listings from Booking.com search results. Extracts hotel name, price, rating, review count, location, and star rating.

Pricing

from $2.99 / 1,000 hotels

Rating

0.0

(0)

Developer

w3crawler

w3crawler

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Categories

Share

What does Booking.com Hotels Scraper do?

Booking.com Hotels Scraper collects hotel listings from public Booking.com search pages. It extracts public hotel-card fields with a browser and uses the page's public JSON-LD as a bounded HTTP fallback when browser extraction is unavailable. It does not sign in, use private endpoints, bypass access controls, or collect account data. See Booking.com for the source website.

Why use Booking.com Hotels Scraper?

Use the Actor for destination research, accommodation comparison, travel planning, and public rate monitoring. It returns one row per distinct source-backed hotel until maxItems records are reached. Operational issues are logged and summarized outside the dataset.

What data can Booking.com Hotels Scraper extract?

FieldTypeMeaning
rankintegerPosition assigned while results are collected.
hotelIdstringIdentifier parsed from a public hotel URL, when available.
namestringPublic hotel name.
urlstringPublic Booking.com hotel page URL.
searchUrlstringSearch URL used for the result.
price / originalPricestringLocalized displayed price text and original price when published.
priceAmount / originalPriceAmountnumberNumeric values inferred from the displayed price text.
currencystringCurrency inferred from the displayed symbol or code.
rating / reviewText / reviewCountstring / string / integerPublic score, qualitative label, and review count.
starsintegerPublic star classification when published.
location / distanceFromCenterstringPublic address/location and distance text.
thumbnail / imagestringPublic image URL when published.
badgestringPublic recommendation or promotion label.
breakfastIncluded / freeCancellation / noPrepaymentbooleanAvailability signals detected in the public card text.
roomsLeftintegerPublic low-inventory message when present.
amenitiesarray of stringsPublic facility labels found on the card or JSON-LD.
address / description / telephonestringAdditional public JSON-LD fields when the HTTP fallback exposes them.
latitude / longitudenumberPublic JSON-LD coordinates when available.
destination / checkIn / checkOut / adultsstring / string / string / integerSearch context used for the request.
sourcestringSource label, currently booking.com.
scrapedAtstringUTC timestamp for the emitted row.

Missing optional source fields are omitted; they are not filled with fabricated values or empty placeholders.

Input parameters

InputTypeRequiredDefault and limitsDescription
destinationstringyes—City, region, or hotel name used to build the public search URL.
checkInstringno30 days from run dateValid calendar date in YYYY-MM-DD format.
checkOutstringnoOne day after checkInValid calendar date in YYYY-MM-DD; it must be after check-in.
adultsintegerno2; 1–10Number of adult guests.
maxItemsintegerno25; 1–300Maximum number of successful hotel rows. Diagnostics do not consume this limit.
proxyConfigurationobjectnoDirect public requestStandard Apify Proxy configuration. It is used only when configured by the user.

The Actor accepts these fields through the Apify input form or JSON input. It does not accept startUrls; destination is authoritative and is converted into a Booking.com searchresults.html URL. Explicit checkIn, checkOut, adults, and maxItems values override their defaults. There are no separate filters, sort controls, detail-page visits, or page-count inputs: Booking.com ranking is preserved.

Minimal input

{
"destination": "Paris"
}

Dated input

{
"destination": "Paris",
"checkIn": "2026-10-12",
"checkOut": "2026-10-15",
"adults": 2,
"maxItems": 25,
"proxyConfiguration": {
"useApifyProxy": false
}
}

How to run the Actor in Apify Console

  1. Open this Actor and select Input.
  2. Enter a destination, such as Paris, and optionally set dates, adult count, result limit, or a standard proxy configuration.
  3. Select Save input if you want to reuse the configuration.
  4. Click Start and open Dataset after the run finishes.
  5. Download the dataset, open the API tab for programmatic access, or inspect OUTPUT in the default key-value store for the run summary.

How pagination, deduplication, and limits work

The browser starts at the generated search URL. If fewer than maxItems successful rows are available on the first page and at least ten cards are visible, it follows a public next-page link when one is published; otherwise it requests the next public offset in increments of 25. Collection stops at maxItems successful hotel rows or when no next page is exposed.

Rows are deduplicated during the run by the public hotel identifier, falling back to the hotel name. The rank field reflects collection order. There are no user-selectable filters or sorts, and the Actor does not visit each hotel detail page. Price and other fields are only those exposed on the public search card or public JSON-LD.

What happens when the source is blocked or empty?

The browser checks the public page for access barriers and card content. If the browser is blocked, returns no cards, or fails before producing a successful row, the Actor makes one bounded public HTTP fallback request and parses only public HTML/JSON-LD. It never solves a challenge or bypasses a login, paywall, CAPTCHA, WAF, or other access boundary.

If the public response is readable but contains no usable hotels, the run completes with status: "SUCCEEDED", runStatus: "SUCCEEDED", and dataStatus: "NO_RESULTS". A blocked or unavailable source with no saved hotel rows fails the run. When hotel rows were saved before a later request or output failure, the run remains successful and reports dataStatus: "PARTIAL". Optional bounded debug_html and crawl_error keys can provide public-response evidence; they are stored outside the dataset.

Output examples

Successful hotel row

{
"rank": 1,
"hotelId": "example-paris-hotel",
"name": "Example Paris Hotel",
"url": "https://www.booking.com/hotel/fr/example-paris-hotel.html",
"searchUrl": "https://www.booking.com/searchresults.html?ss=Paris",
"price": "€120",
"priceAmount": 120,
"currency": "EUR",
"rating": "8.4",
"reviewCount": 1250,
"destination": "Paris",
"checkIn": "2026-10-12",
"checkOut": "2026-10-15",
"adults": 2,
"source": "booking.com",
"scrapedAt": "2026-09-08T00:00:00.000Z"
}

Run summary in key-value store

{
"status": "SUCCEEDED",
"runStatus": "SUCCEEDED",
"dataStatus": "COMPLETE",
"datasetItems": 25,
"diagnosticItems": 0,
"diagnosticCount": 0,
"uniqueItems": 25
}

OUTPUT uses status and runStatus values SUCCEEDED or FAILED, with dataStatus values COMPLETE, PARTIAL, NO_RESULTS, or FAILED. It reports source-backed hotel counts and operational diagnostics; dataset rows contain only public hotel records.

How much will it cost?

There is no separate per-result fee configured by this Actor. Cost depends on Apify compute time, browser runtime, and any proxy traffic. Start with a small maxItems value and use direct public requests by default; browser extraction generally uses more compute than the HTTP fallback.

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

Advanced usage and troubleshooting

Use the API tab or an Apify client to start runs and read the default dataset. For blocked or failed runs, inspect the run log, OUTPUT, and any debug_html or crawl_error key. AWS_WAF_CHALLENGE, CAPTCHA, ACCESS_DENIED, HTTP status codes, and similar codes mean that the public source did not expose usable data; they are not hotel records. Retrying repeatedly does not guarantee access and should respect Booking.com load and terms.

The Actor has no login, private API, CAPTCHA-solving, fingerprint-evasion, or stealth mode. Proxy settings are limited to the standard Apify Proxy configuration provided by the user. A missing price, rating, address, image, or amenity is an omission caused by the public response, not a zero value.

API and Issues

For programmatic runs, use the API tab on the Actor page or the dataset URL shown in the run details. For support and feature requests, use the Issues tab and include the run ID, input, and relevant run-log details. Do not include credentials or private account information in an issue.

This Actor reads public Booking.com search responses and does not request credentials or private account data. Use it only where you have a lawful, legitimate purpose and follow Booking.com's terms, robots rules, applicable contracts, privacy laws, and rate limits. Public pages may still contain personal data; handle results under the laws that apply to you.

This is an independent, unofficial Actor and is not affiliated with, endorsed by, or sponsored by Booking.com. Booking.com is a trademark of its respective owner.