Booking.com Hotel Rates Scraper avatar

Booking.com Hotel Rates Scraper

Pricing

from $12.00 / 1,000 rates requests

Go to Apify Store
Booking.com Hotel Rates Scraper

Booking.com Hotel Rates Scraper

Scrape Booking.com hotel prices: a nightly price calendar for up to 365 dates, every room type and rate plan for a stay, or a hotel's Booking.com slug by name. Batch many hotels, export JSON/CSV. No proxies or API key needed.

Pricing

from $12.00 / 1,000 rates requests

Rating

0.0

(0)

Developer

ScraperCompany

ScraperCompany

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

Share

Booking.com Hotel Rates Scraper collects hotel prices straight from Booking.com. Give it one or more hotel slugs and get a day-by-day price calendar (price, availability and minimum length of stay for up to 365 dates in one request), or the full list of room types and rate plans for a specific stay, with meal plans, cancellation terms and prices. Revenue managers use it for rate shopping and parity checks, analysts for pricing research, and travel startups to feed their own apps.

Powered by the ScraperCompany API: requests, proxies, retries and anti-bot handling run on ScraperCompany's servers, so you don't need your own proxies or API key. Start a run, get structured JSON.

What can this 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.012
roomsEvery room type and rate plan (meals, cancellation, price) for one stay$0.012
searchBooking.com URL slug and country for a hotel name$0.002

What 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 use Booking.com Hotel Rates Scraper

  1. Open Booking.com Hotel Rates 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": [
{
"available": true,
"currency": "USD",
"min_length_of_stay": 1,
"price": 453,
"provenance": {
"collection_id": "ratecol_0123456789abcdef0123456789abcdef",
"collector": "scrapingme.ota.booking",
"derivation": "normalized_upstream",
"egress_mode": "direct",
"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"
},
{
"available": false,
"currency": "USD",
"min_length_of_stay": 1,
"price": "…",
"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",
"wire_bytes": 454
},
"property": {
"hotel_id": 5375786,
"pagename": "moxy-boston-downtown"
},
"search_parameters": {
"adults": 2,
"country": "us",
"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?

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.012$12.00
search-requestOne hotel name looked up on Booking.com (returns its URL slug).$0.002$2.00

For example, 1,000 requests in the default mode cost $12.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 a ScraperCompany API key?

No. Proxy rotation, retries and anti-bot handling run on the ScraperCompany side, and the Actor is already connected to the API. 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 or contact us at scrapercompany.com. Include the request_id from the dataset item so we can trace the request.