Booking.com Price Scraper - Hotel Rates & Calendar
Pricing
from $12.00 / 1,000 rates requests
Booking.com Price Scraper - Hotel Rates & Calendar
Scrape Booking.com hotel prices: a nightly price calendar for up to 365 dates in one request, every room type and rate plan for a stay (meals, cancellation, price), or a hotel's Booking.com slug by name. Batch many hotels, export JSON or CSV. No proxies needed. Made by ScraperCompany.
Pricing
from $12.00 / 1,000 rates requests
Rating
0.0
(0)
Developer
ScraperCompany
Maintained by CommunityActor stats
0
Bookmarked
5
Total users
4
Monthly active users
11 hours ago
Last modified
Categories
Share
Booking.com Price Scraper by ScraperCompany collects hotel prices from Booking.com in two ways. Price calendar returns a day-by-day price, availability and minimum length of stay for up to 365 dates in one request. Rooms lists every room type and rate plan for a specific stay, with room size, beds, meal plan, cancellation terms and price. A search mode turns a hotel name into its Booking.com slug. Revenue managers use it for rate shopping and parity checks, analysts for pricing research. Pricing is pay-per-event: $0.018 per rates request and $0.006 per hotel search; failed requests are not charged.
Proxies, retries and anti-bot handling are built in, so you don't need your own proxies or an API key. Start a run, get structured JSON.
What can this Booking.com scraper do?
- Price up to 365 consecutive dates for a hotel in a single request (nightly price, availability, minimum stay).
- List every room type and rate plan for one stay: bed types, room size, max occupancy, meal plan, cancellation policy and price.
- Find a hotel's Booking.com URL slug from its name and city, with match confidence.
- Choose the currency (40+ supported), number of adults and rooms.
- Batch as many hotels as you like; each hotel is one request and one dataset item.
- Relative dates (
7 days,1 month) keep scheduled runs pointing at the future.
Modes
| Mode | What it returns | Price per request |
|---|---|---|
rates | Nightly price, availability and minimum stay for up to 365 dates per property | $0.018 |
rooms | Every room type and rate plan (meals, cancellation, price) for one stay | $0.018 |
search | Booking.com URL slug and country for a hotel name | $0.006 |
Use cases for Booking.com data
- Revenue managers: Pull a year of daily prices and minimum stays for your compset in one request per hotel.
- Rate parity teams: Compare Booking.com room rates with your direct channel and other OTAs.
- Pricing analysts: Study seasonality, length-of-stay rules and meal-plan or cancellation premiums.
What Booking.com data can you extract?
| Field | Description |
|---|---|
calendar[].stay_date | Night being priced (Price calendar mode) |
calendar[].price | Lowest nightly price on Booking.com for that night |
calendar[].available | Whether the night can be booked |
calendar[].min_length_of_stay | Minimum nights required when arriving that day |
unavailable_dates | Dates that are sold out or closed |
property.hotel_id | Booking.com numeric hotel id |
rooms[].name / rooms[].room_size / rooms[].beds | Room type details (Rooms mode) |
rooms[].rate_plans | Each rate plan with price, meal plan and cancellation terms |
cheapest_rate / sold_out | Cheapest rate for the stay and sold-out flag |
matches[] / recommended_match | Hotel candidates with slug, URL and confidence (Find hotel slug mode) |
provenance | Where and when each price was observed, requested vs returned currency |
Every dataset item also carries input (the exact request that was sent), request_id (quote it to support), billed and scraped_at.
How to scrape Booking.com hotel prices
- Open Booking.com Price Scraper in Apify Console and go to the Input tab.
- Pick a Mode, then enter Booking.com hotel slugs (the part of the URL after
/hotel/us/). Don't know the slug? Run Find hotel slug mode with the hotel name first. - Adjust the options if needed. Dates accept an exact date (
2026-12-01) or a relative one (30 daysfrom today), so saved tasks and schedules never go stale. - Click Start and wait for the run to finish.
- Download the results from the Output tab as JSON, CSV, Excel or HTML, or fetch them with the Apify API.
Input example
This is the default input; running the Actor without changes uses it.
{"mode": "rates","pagenames": ["moxy-boston-downtown"],"country": "us","currency": "USD","adults": 2,"start": "7 days","days": 30,"check_in": "30 days","hotelNames": ["Moxy Boston Downtown"],"includeErrors": true,"maxConcurrency": 3,"maxRetries": 2}
Output example
One dataset item per request (trimmed here; real items contain every field the API returns):
{"mode": "rates","endpoint": "/v1/ota/booking","input": {"pagename": "moxy-boston-downtown","country": "us","start": "2026-10-08","days": 30,"currency": "USD","adults": 2},"calendar": [{"availability": "available","available": true,"currency": "USD","is_soldout": false,"min_length_of_stay": 1,"price": 453,"provenance": {"collection_id": "ratecol_0123456789abcdef0123456789abcdef","derivation": "normalized_upstream","observation_id": "rateobs_0123456789abcdef0123456789abcdef","observed_at": "2026-08-07T01:23:45.678Z","price_basis": "room_base_before_taxes_and_fees","requested_currency": "USD","requested_market": "US","returned_currency": "USD","schema_version": 1,"source": "booking_com","source_kind": "ota_calendar","source_property_id": "ChUIoben2Mv6-CYaCi9tLzA3czVwbjQQAQ","upstream_rate_id": null},"stay_date": "2026-09-14"},{"availability": "sold_out","available": false,"currency": "USD","is_soldout": true,"min_length_of_stay": 1,"price": null,"stay_date": "2026-09-15"}],"meta": {"calls": 1,"collection_id": "ratecol_0123456789abcdef0123456789abcdef","dates": 3,"elapsed_s": 2.147,"observed_at": "2026-08-07T01:23:45.678Z","priced": 1,"source": "booking"},"point_of_sale": {"country_market": "GB"},"property": {"hotel_id": 5375786,"pagename": "moxy-boston-downtown"},"search_parameters": {"adults": 2,"country": "us","country_market": "GB","currency": "USD","days": 3,"engine": "booking_calendar","pagename": "moxy-boston-downtown","rooms": 1,"start_date": "2026-09-14"},"unavailable_dates": ["2026-09-15","2026-09-16"],"request_id": "req_3f9c0d6e2b8a4c1f9e7d5b3a1c0e8f6d","billed": true,"scraped_at": "2026-10-01T14:03:27.512Z"}
A request that fails is saved with an error message instead (turn off Include failed requests to skip those). Failed requests are never charged.
How much does it cost to scrape Booking.com hotel prices?
This Actor uses pay-per-event pricing: you pay for successful API requests, not for compute time.
| Event | Charged when | Price | Per 1,000 |
|---|---|---|---|
rates-request | One property priced: a price calendar (up to 365 nights) or the room and rate-plan list for one stay. | $0.018 | $18.00 |
search-request | One hotel name looked up on Booking.com (returns its URL slug). | $0.006 | $6.00 |
These prices apply from November 5, 2026, after Apify's 14-day notice of a price change; until then runs are charged the previous prices shown on the Pricing tab.
For example, 1,000 requests in the default mode cost $18.00.
- Failed requests (errors, invalid input, blocked upstream after retries) are free.
- Requests where the source returns nothing at all (no results, nothing priced) are saved but not charged.
- Set Maximum cost per run when you start a run and the Actor stops cleanly before going over it.
FAQ
Do I need proxies or an API key?
No. Proxy rotation, retries and anti-bot handling are built in, and the Actor is ready to run as is. You only pay the per-event prices above.
What is a Booking.com slug?
It is the hotel's name in the Booking.com URL. For https://www.booking.com/hotel/us/moxy-boston-downtown.html the slug is moxy-boston-downtown and the country code is us.
Why are there 365 dates in one request but only one stay in Rooms mode?
The price calendar reads Booking.com's own availability calendar, which covers many dates at once. Rooms mode loads the hotel page for one specific stay to list every room and rate plan.
Is it legal to scrape Booking.com hotel prices?
The Actor collects publicly available information that anyone can see without logging in. You are responsible for how you use the results: respect the source site's terms, copyright and privacy law (such as GDPR) and do not collect personal data without a lawful basis. If in doubt, ask a lawyer.
What happens when a request is blocked or rate-limited?
Rate limits (HTTP 429) and temporary errors (5xx) are retried automatically with exponential backoff, respecting Retry-After. If a request still fails it is saved with the error message and not charged, and the rest of the batch keeps going. A run only fails when every request failed.
Why did a request return an error?
Read the error field: validation problems (for example a malformed date or an unknown id) are reported exactly as the API sees them. Fix the input and run again; failed requests cost nothing.
How many requests can I run at once?
Any number per run. The Actor sends up to 3 requests in parallel by default (change it under Run options); larger batches simply take longer.
Use it from your code
Call the Actor from any language through the Apify API. With the JavaScript client (npm install apify-client):
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('scrapercompany/booking-hotel-rates-scraper').call({"mode": "rates","pagenames": ["moxy-boston-downtown"],"start": "7 days"});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
With Python (pip install apify-client):
import osfrom apify_client import ApifyClientclient = ApifyClient(os.environ["APIFY_TOKEN"])run = client.actor("scrapercompany/booking-hotel-rates-scraper").call(run_input={"mode": "rates","pagenames": ["moxy-boston-downtown"],"start": "7 days",})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item)
You can also schedule runs, chain them with webhooks, or connect them to Make, Zapier, n8n, Google Sheets and other integrations from the Integrations tab.
Related scrapers
- Hotels.com Scraper: Hotels.com headline prices and rooms
- Expedia Scraper: Expedia rooms and rate plans
- Hotel Price Comparison: Booking.com against three other OTAs in one request
Support
Questions, a field you need, or a site that stopped working? Open an issue on the Issues tab. Include the request_id from the dataset item so we can trace the request.