Booking.com Price Scraper - Hotel Rates & Calendar avatar

Booking.com Price Scraper - Hotel Rates & Calendar

Pricing

from $12.00 / 1,000 rates requests

Go to Apify Store
Booking.com Price Scraper - Hotel Rates & Calendar

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

ScraperCompany

Maintained by Community

Actor stats

0

Bookmarked

5

Total users

4

Monthly active users

11 hours ago

Last modified

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

ModeWhat it returnsPrice per request
ratesNightly price, availability and minimum stay for up to 365 dates per property$0.018
roomsEvery room type and rate plan (meals, cancellation, price) for one stay$0.018
searchBooking.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?

FieldDescription
calendar[].stay_dateNight being priced (Price calendar mode)
calendar[].priceLowest nightly price on Booking.com for that night
calendar[].availableWhether the night can be booked
calendar[].min_length_of_stayMinimum nights required when arriving that day
unavailable_datesDates that are sold out or closed
property.hotel_idBooking.com numeric hotel id
rooms[].name / rooms[].room_size / rooms[].bedsRoom type details (Rooms mode)
rooms[].rate_plansEach rate plan with price, meal plan and cancellation terms
cheapest_rate / sold_outCheapest rate for the stay and sold-out flag
matches[] / recommended_matchHotel candidates with slug, URL and confidence (Find hotel slug mode)
provenanceWhere 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

  1. Open Booking.com Price Scraper in Apify Console and go to the Input tab.
  2. 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.
  3. Adjust the options if needed. Dates accept an exact date (2026-12-01) or a relative one (30 days from today), so saved tasks and schedules never go stale.
  4. Click Start and wait for the run to finish.
  5. 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.

EventCharged whenPricePer 1,000
rates-requestOne property priced: a price calendar (up to 365 nights) or the room and rate-plan list for one stay.$0.018$18.00
search-requestOne 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.

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 os
from apify_client import ApifyClient
client = 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.

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.