Booking.com Scraper - Hotel Prices, Ratings & Details avatar

Booking.com Scraper - Hotel Prices, Ratings & Details

Pricing

from $1.50 / 1,000 hotels

Go to Apify Store
Booking.com Scraper - Hotel Prices, Ratings & Details

Booking.com Scraper - Hotel Prices, Ratings & Details

Collect Booking.com accommodations worldwide by destination or hotel URL. Extract stay prices, ratings, addresses and available hotel details. Pay per delivered property row, plus a start fee.

Pricing

from $1.50 / 1,000 hotels

Rating

0.0

(0)

Developer

kane liu

kane liu

Maintained by Community

Actor stats

1

Bookmarked

1

Total users

1

Monthly active users

2 days ago

Last modified

Security

Limited permissions

Share

Booking.com Scraper

Extract Booking.com accommodation listings worldwide, with stay prices, ratings and optional hotel details in rows you can export.

  • Search a city, region, country or landmark.
  • Collect specific properties from their Booking.com hotel URLs.
  • Filter by accommodation type, stars, review score and free cancellation.
  • Add public addresses, descriptions and house rules when available.
  • Pay $2 per 1,000 delivered rows on the Free plan, plus a small start fee.

What does Booking.com Scraper do?

Booking.com Scraper collects accommodation data from Booking.com for travel research, price comparisons and property inventories. Each row represents one property, not one room or guest review. Prices describe the dates and guests you request; they are not booking guarantees.

  • Destination search: enter destination to find matching properties.
  • Hotel URLs: enter detailUrls to collect named properties without a destination search. These URLs take priority when both target fields are filled.
  • Detail enrichment: enrichDetails defaults to true, with detailEnrichLimit set to 3. It adds fields to existing property rows rather than creating separately billed add-on rows.
  • Search controls: choose dates, adults, children, rooms, currency, language, filters and sorting.

What data can you extract from Booking.com?

Both search and hotel-URL collection produce property rows. A field can be empty or absent if the source does not supply it or the property was not enriched.

FieldDescriptionExample
hotelIdProperty identifier derived from its Booking.com URL.fr/hotelauroremontmartre
nameProperty name.Hotel Pilime
urlBooking.com property link.https://www.booking.com/hotel/fr/hotelauroremontmartre.html
priceNightly price: stay total divided by nights.150
totalPriceWhole-stay price for the requested guests.300
originalTotalPricePrevious stay price when a discount is shown.340
currencyCurrency actually used by the row's price.EUR
nightsNumber of nights priced.2
ratingGuest review score, separate from hotel stars.8.5
reviewCountNumber of guest reviews when shown.1200
propertyTypeAccommodation category; empty when none is stated.Hotel
locationArea or city displayed for the property.Paris
roomTypeRoom selection behind the price, when supplied.Double Room
amenitiesDetail amenity labels; empty on search rows without enrichment.["Free WiFi"]
descriptionProperty description from successful enrichment.null
starRatingOfficial hotel star rating when available.4
addressStructured postal address; street keeps the house number.{"street":"76 Rue De Clichy","unit":null}
geoLatitude and longitude, when available.null
phonesPublic property phone entries, not Booking.com support numbers.[]
emailsPublic property email entries.[]
orgProperty organization identity.{"name":"Hotel Pilime","id":null}
webHotel's own website and property social links, not its Booking.com page.{"website":null,"socials":[]}
leadAbsencesReasons some contact fields are empty (short reason codes).{}
destinationRequested search location.Paris
checkinDate used for arrival.2027-03-12
checkoutDate used for departure.2027-03-14
adultsAdult guest count.2
imageUrlMain property image URL, when shown.""
scrapedAtCollection timestamp.2026-10-24T08:00:00+00:00

Enriched rows can also include spokenLanguages, roomTypes, paymentMethods, allowChildren and check-in/out windows such as checkinFrom and checkoutUntil. address.unit holds an apartment, suite, floor or room designation, not the house number. addressCorrected identifies address parts filled from postal references. Coordinates are independent of whether a street address is present.

How to scrape Booking.com

  1. Open Booking.com Scraper in Apify Console.
  2. Enter destination or paste hotel links into detailUrls.
  3. Set maxResults to 3 for a small first run. Check the dates and maximum cost.
  4. Click Start and wait for the run to finish.
  5. Download the dataset or read its rows through the API.

An empty input starts the form's example: Singapore, at most three rows. This is a normal billed run, not a free preview. Filling either target field selects the appropriate collection path automatically; there is no mode field to set.

Enter one place in destination. Leave propertyTypes empty for all accommodation categories, or select categories such as hotel, apartment, hostel or resort. Use the form's remaining categories for other accommodation types. A search can return fewer properties than requested.

Hotel URLs

Use Booking.com /hotel/<country>/<name>.html links in detailUrls. Keep enrichDetails enabled. This path processes up to the smaller of maxResults and detailEnrichLimit, so increase both if you want more than three URLs processed. Duplicate links are removed. Invalid links are dropped when valid links remain; an entirely invalid list is rejected.

What to fill in

FieldWhat to enterDefault
destinationOne city, region, country, area or landmark.Empty; example Singapore
detailUrlsList of Booking.com hotel links.Empty
maxResultsProperty-row limit, from 1 to 500.70; form example 3
checkinArrival date in YYYY-MM-DD.21 days from today
checkoutDeparture date after arrival.Two nights after arrival
adultsAdult guests, 1–10.2
childrenChildren, 0–10.0
childAgesAges from 0–17; missing ages are filled with 8.[]
roomsRequested rooms, 1–10.1
currencyThree-letter currency code.USD
langDisplay language, for example en-us or fr.en-us
sortResult order, using the values below.popularity
propertyTypesAccommodation categories from the form.[], all types
starsAccepted hotel star classes, 1–5.[], no filter
minReviewScoreMinimum guest score, 0–10.No filter
freeCancellationRestrict search to free-cancellation offers.false
enrichDetailsAdd public hotel details to selected rows.true
detailEnrichLimitMaximum properties to enrich, 1–30.3
destIdKnown Booking.com destination ID; pair with destType.Empty
destTypeDestination kind, such as city or region.Empty
customNfltFiltersAdditional Booking.com filter fragments, such as class=5.[]
countryCountry hint for an ambiguous address or postal code.Empty

sort accepts popularity, price, review_score, review_and_price, stars_desc, stars_asc, distance and homes_first.

Destination search:

{
"destination": "Paris",
"propertyTypes": ["apartment"],
"sort": "price",
"currency": "EUR",
"maxResults": 3
}

Hotel URLs:

{
"detailUrls": ["https://www.booking.com/hotel/sg/marina-bay-sands.html"],
"enrichDetails": true,
"detailEnrichLimit": 1,
"maxResults": 1
}
  • maxItems and limit are aliases for maxResults. city, location and query work as destination; urls and startUrls work as detailUrls.
  • Close field-name misspellings can be corrected. Other unknown fields are ignored with a note. An unsupported sort value is ignored rather than failing the run.
  • Invalid targets or dates stop collection with INVALID_INPUT: and an explanation, before any row is charged. For example: INVALID_INPUT: enrichDetails must be true when detailUrls is set. The start fee is separate.
  • INPUT_REPORT in the default key-value store records fields recognized, corrected, filled or ignored.
  • With neither date filled, arrival is 21 days ahead and departure two nights later. With one date filled, the other completes a two-night stay. Use future dates; arrival cannot be more than 500 days ahead.

Output example

Illustrative excerpt of a property row. The address belongs to the hotel; missing contact fields are not replaced with Booking.com's own contact details.

{
"source": "booking",
"hotelId": "fr/hotelauroremontmartre",
"name": "Hotel Pilime",
"url": "https://www.booking.com/hotel/fr/hotelauroremontmartre.en-gb.html",
"phones": [],
"emails": [],
"address": {
"street": "76 Rue De Clichy",
"unit": null,
"locality": "Paris",
"region": "Ile de France",
"postalCode": "75009",
"country": "France",
"full": "76 Rue De Clichy, 9th arr., 75009 Paris, France"
},
"geo": null,
"person": null,
"org": {"name": "Hotel Pilime", "id": null},
"web": {"website": null, "socials": []},
"leadSource": "detail",
"leadReveal": "visible"
}

Export the dataset as JSON, CSV, Excel, XML, RSS or an HTML table.

Why use this Booking.com scraper?

  • Pay for delivered rows: the row charge applies to properties written to the dataset, not unsuccessful attempts. A start fee also applies.
  • Keep delivered results: rows already in the dataset remain available if the run stops. Do not assume unfinished collection has been delivered.
  • Understand short results: RUN_SUMMARY explains unavailable properties, skipped URLs and limits; ERROR_SUMMARY records collection errors.
  • Compare like-for-like stays: specify the same dates, guests, rooms and currency across runs.
  • Collect several known properties: provide a list of hotel URLs within the detail limits.
  • No proxy setup: you do not need to set up proxies or supply a Booking.com account.

How much does it cost to scrape Booking.com?

The Actor uses pay-per-event pricing. A start event costs $0.005 per GB of selected memory, with at least one event charged. At the default 512 MB, the start charge is $0.005. Platform usage is included in these prices.

Apify planStart at 512 MBPrice per rowPrice per 1,000 rows
Free$0.005$0.002$2.00
Starter$0.005$0.002$2.00
Scale$0.005$0.002$2.00
Business$0.005$0.0015$1.50
  • For destination search, maxResults applies to that destination. It defaults to 70; larger requests are collected in parts of 70, up to the input maximum of 500.
  • For detailUrls, the list shares the row limit and the separate enrichment limit; it is not 70 rows per hotel URL.
  • Free Apify plan users are limited to 200 rows per run and 10 runs of this Actor. These limits are set by the publisher; paid plans remove the 10-run cap.
  • Maximum cost per run (maxTotalChargeUsd in the API) caps the whole run. A smaller budget can reduce the number of rows delivered.

Example: one destination returning 50 rows at 512 MB costs 50 × $0.002 + $0.005 = $0.105 on the Free plan. Asking for 50 does not charge for 50 if fewer rows are delivered.

What happens when the run timeout is too short

If collection needs more time, the run can pause instead of failing. Its status message says “Queued on the collection backend; this run will resume automatically when results are ready (about N s).” It temporarily appears as ABORTED.

When results are ready, the same run resumes automatically, writes to the same dataset and finishes as SUCCEEDED if collection succeeds. Delivery continues after rows already written, avoiding duplicate delivery and row charges. A resumed delivery can show “Resumed: delivering N rows.” You do not need to start a replacement run.

  • Automatic pauses are limited to three per run. Keep the default timeout of 900 seconds to reduce pauses.
  • Synchronous API endpoints (run-sync, run-sync-get-dataset-items) wait at most 300 seconds and may return an empty dataset during a pause. For longer requests, start asynchronously and read the dataset after SUCCEEDED, or use a succeeded-event webhook.

Use with AI agents and the API

Apify MCP server

Add this remote server in an MCP client such as Claude, ChatGPT, Cursor or VS Code:

https://mcp.apify.com?tools=lentic_clockss/booking-hotels-scraper

Sign in with Apify through OAuth when prompted, or send Authorization: Bearer <YOUR_APIFY_TOKEN>. The tool starts a run and returns run and dataset IDs; the agent reads rows with get-dataset-items.

Clients without remote support can use npx @apify/actors-mcp-server --tools lentic_clockss/booking-hotels-scraper with APIFY_TOKEN set locally.

Example prompt: “Find three apartments in Paris, priced in EUR for two adults, and return their names, prices and Booking.com links.”

Apify API

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("lentic_clockss/booking-hotels-scraper").call(
run_input={"destination": "Paris", "maxResults": 3}
)
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
print(row)
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('lentic_clockss/booking-hotels-scraper')
.call({ destination: 'Paris', maxResults: 3 });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

For asynchronous HTTP calls, send the input JSON to POST https://api.apify.com/v2/acts/lentic_clockss~booking-hotels-scraper/runs with an Authorization: Bearer <YOUR_APIFY_TOKEN> header. After completion, read GET https://api.apify.com/v2/datasets/<datasetId>/items?format=json.

Integrations

Use the Actor's Integrations tab with Google Sheets, Make, Zapier, n8n, Slack, Airtable or a webhook. Apify Schedules can run recurring searches.

FAQ

This Actor collects publicly accessible property data. You are responsible for checking applicable terms and data-protection law. Processing personal data requires a lawful basis; public availability alone does not establish one.

Why did my run end as ABORTED?

An automatic pause can temporarily use this status. Check for the resume message described above. A manually aborted run is different and should not be assumed to restart automatically.

How many results can I get?

Destination searches accept maxResults up to 500, subject to availability and cost limits. Free-plan runs stop at 200 rows. Hotel-URL runs also have the 1–30 detailEnrichLimit, defaulting to three.

Why are some fields empty?

Search results do not contain every hotel detail. Enrichment is limited, and even enriched properties may lack phones, emails or other fields. Check leadAbsences; an unverified field is not proof of absence.

Can I search any country?

You can enter destinations worldwide. Results depend on Booking.com's available inventory and whether the place can be resolved. An empty propertyTypes list includes all categories rather than just hotels.

Why do hotel-URL prices differ from search prices?

Hotel-URL rows use recommended rooms for the requested party. Rates and availability can differ from search offers. No total is supplied if the recommendation cannot cover the requested rooms. Always read the row's currency; without a conversion rate, the property's currency remains.

Why did the free trial stop after ten runs?

The publisher limits Free-plan accounts to ten runs of this Actor. The run explains that limit in its status. A paid Apify plan removes that run-count restriction, but row charges still apply.

Limitations

  • One destination per run; a list of destinations is not supported.
  • This Actor collects accommodations, not flights, restaurant listings or individual guest reviews.
  • Detail enrichment is bounded and can fail without removing an otherwise usable search row.
  • Some hotel URLs cannot be collected. A fallback limit can restrict a hotel-URL run to ten properties even when detailEnrichLimit is higher.
  • Public contact information, complete amenities and exact price agreement across Booking.com offers are not guaranteed.

More travel, hotel and flight scrapers from the same publisher:

Browse all of our scrapers at apify.com/lentic_clockss.

Support

Report a problem or request a field through the Issues tab of this Actor's page. Include the run ID and the input you used.