BOOKING PRICE SCRAPER - by room avatar

BOOKING PRICE SCRAPER - by room

Pricing

from $3.00 / 1,000 results

Go to Apify Store
BOOKING PRICE SCRAPER - by room

BOOKING PRICE SCRAPER - by room

Track Booking.com prices by room type, per night, up to 365 days. Get rooms_left, rate options, meal plans, discounts, and sold-out detection. Clean output for revenue management and competitive analysis. CSV, JSON, HTML, Excel. Built by NoraView Intelligence.

Pricing

from $3.00 / 1,000 results

Rating

5.0

(1)

Developer

NoraView Intelligence

NoraView Intelligence

Maintained by Community

Actor stats

0

Bookmarked

34

Total users

22

Monthly active users

4 days ago

Last modified

Share

🏨 Booking.com Room-Level Price Scraper

Extract complete room-level pricing from any Booking.com hotel β€” every room type, every rate option, every date β€” up to 365 days ahead.

Unlike listing scrapers that return one price per hotel, this actor dives into each property page and extracts granular room-by-room data: prices, rate options, availability signals, meal plans, discounts, facilities, and sold-out detection.

One run = complete pricing visibility for your competitive set.

πŸ’‘ Paste hotel URLs, set your date range, hit Start. Results ready in JSON, CSV, or Excel.


🎯 Who is this for?

  • Revenue managers monitoring competitor pricing daily
  • Hotel operators tracking market positioning at the room-type level
  • Travel tech companies feeding structured pricing data into dashboards or algorithms
  • Market analysts studying seasonal trends and demand patterns
  • Consultants building competitive intelligence reports for hospitality clients

πŸ“₯ Input

FieldTypeRequiredDefaultDescription
hotelUrlsarrayβœ…β€”Booking.com hotel URLs (up to 10 per run)
daysAheadinteger❌30Number of days to scrape (1–365)
startDatestring❌TodayStart date in YYYY-MM-DD format
currencystring❌USDAny Booking.com currency: USD, EUR, GBP, MAD, AED, JPY…
adultsinteger❌2Number of adult guests
childreninteger❌0Number of children
roomsinteger❌1Number of rooms
includeSoldOutboolean❌trueInclude sold-out dates in results
delayBetweenRequestsinteger❌4Seconds between page loads (anti-blocking)
useApifyProxyboolean❌falseUse Apify Proxy for better success rates

Example input

{
"hotelUrls": [
"https://www.booking.com/hotel/ma/savoy-le-grand.html",
"https://www.booking.com/hotel/ma/longue-vie-hotels.html"
],
"daysAhead": 30,
"currency": "USD",
"adults": 2,
"rooms": 1,
"includeSoldOut": true
}

πŸ’‘ Tip: You only need the base hotel URL β€” query parameters like ?checkin=... are automatically handled. Works with any Booking.com property worldwide.


πŸ“€ Output

Each result represents one room type for one date. A hotel with 8 room types scraped across 30 days produces ~240 results β€” a complete pricing matrix.

Output fields

FieldTypeDescription
hotel_urlstringSource URL
hotel_namestringProperty name as shown on Booking.com
scrape_timestampstringWhen this data was collected (UTC)
check_in_datestringCheck-in date (YYYY-MM-DD)
check_out_datestringCheck-out date (YYYY-MM-DD)
room_idintegerBooking.com internal room type ID
room_namestringFull room name (e.g., "Prestige Double Room with Pool View")
room_name_cleanstringRoom name with bed type suffix removed
bed_typestringBed configuration (e.g., "1 extra-large double bed")
max_guestsintegerMaximum occupancy for this room
room_size_sqmintegerRoom size in mΒ² (null if not shown)
room_viewstringView type (e.g., "Pool view", "Seating Area")
has_private_bathroombooleanWhether the room has a private bathroom
facilitiesarrayFull list of room facilities (30–40+ items per room)
room_amenitiesarrayPremium amenities only (balcony, minibar, spa bath, etc.)
currencystringPrice currency
pricenumberLowest available price for this room
price_primarynumberBest price for 2-guest standard occupancy
price_publicnumberNon-Genius public price (for competitive benchmarking)
original_pricenumberPre-discount price (null if no discount)
discount_percentintegerDiscount percentage (null if no discount)
rooms_leftintegerBooking.com availability signal (null = high availability)
availability_statusstringavailable, low_availability, low_availability_urgent, or sold_out
stock_confidencestringexact, capped, or hidden β€” see explanation below
meal_planstringMeal plan description
is_breakfast_includedbooleanWhether breakfast is included at no extra cost
is_refundablebooleanWhether free cancellation is offered
book_now_pay_laterbooleanWhether deferred payment is available
taxes_includednumberTaxes included in the displayed price
taxes_excludednumberTaxes added on top of the displayed price
rate_optionsarrayAll pricing tiers for this room (see below)
rate_options_countintegerNumber of rate options available

Rate options structure

Each entry in rate_options contains:

FieldTypeDescription
pricenumberPrice for this specific rate
public_pricenumberNon-Genius price (original price if Genius discount applied)
max_guestsintegerGuest count this rate is designed for
is_refundablebooleanFree cancellation available
is_geniusbooleanWhether this is a Genius-discounted rate
original_pricenumberPre-discount price (null if none)
free_cancellation_untilstringLast date for free cancellation (YYYY-MM-DD)
taxes_and_feesnumberTaxes shown in DOM
meal_planstringMeal plan for this rate
block_idstringBooking.com internal block ID
taxes_includednumberTaxes from Booking's JSON data (included in price)
taxes_excludednumberTaxes from Booking's JSON data (excluded from price)
stay_pricesobjectPrice per number of nights (LOS pricing data)
book_now_pay_laterbooleanDeferred payment available

πŸ’‘ Note: Rate options only include rates that match your search parameters (e.g., searching for 2 adults filters out 1-person-only rates). Partner/wholesale rates (bbasic) are automatically excluded.

Example output

{
"hotel_url": "https://www.booking.com/hotel/ma/savoy-le-grand.html",
"hotel_name": "Savoy Le Grand Hotel Marrakech",
"scrape_timestamp": "2026-03-17T22:20:20Z",
"check_in_date": "2026-03-17",
"check_out_date": "2026-03-18",
"room_id": 160633804,
"room_name": "Prestige Double Room with Pool View",
"room_name_clean": "Prestige Double Room with Pool View",
"bed_type": "1 extra-large double bed",
"max_guests": 1,
"room_size_sqm": 43,
"room_view": "Pool view",
"has_private_bathroom": true,
"facilities": [
"Room", "463 feetΒ²", "Balcony", "Pool view", "Air conditioning",
"Ensuite bathroom", "Flat-screen TV", "Soundproofing", "Terrace",
"Coffee machine", "Minibar", "Free WiFi", "..."
],
"room_amenities": ["balcony", "air conditioning", "soundproofing", "terrace", "minibar"],
"currency": "USD",
"price": 186,
"price_primary": 186,
"price_public": 186,
"original_price": 207,
"discount_percent": 10,
"rooms_left": null,
"availability_status": "available",
"stock_confidence": "hidden",
"meal_plan": "breakfast",
"is_breakfast_included": true,
"is_refundable": false,
"book_now_pay_later": true,
"taxes_included": null,
"taxes_excluded": null,
"rate_options": [
{
"price": 186,
"public_price": 186,
"max_guests": 1,
"is_refundable": false,
"is_genius": false,
"original_price": 207,
"meal_plan": "breakfast",
"block_id": "160633804_419828305_1_1_0",
"taxes_excluded": null,
"book_now_pay_later": true
}
],
"rate_options_count": 1
}

πŸ” Understanding key fields

price vs. price_primary vs. price_public

FieldWhat it isWhen to use
priceAbsolute cheapest option (may be 1-person or restricted)Quick market scan
price_primaryBest price for standard 2-guest occupancyRevenue management benchmarking
price_publicNon-Genius public rate (strips Genius discounts)Competitor comparison β€” most travelers don't have Genius

πŸ’‘ For competitive analysis, use price_public. Genius discounts (10–20%) make prices look artificially low. price_public gives you the rate that most travelers actually see.

availability_status

StatusMeaningRevenue insight
availableRooms widely availableNormal market conditions
low_availabilityInventory signal from internal dataDemand is building
low_availability_urgentBooking.com shows a visible scarcity alertHigh demand β€” act on pricing
sold_outNo rooms available for this datePeak demand β€” opportunity to optimize your rates

stock_confidence

ValueSourceReliability
exactDOM scarcity badge visible on pageHigh β€” Booking.com shows this to create urgency
cappedrooms_left = 10 from internal JSONMedium β€” actual stock is β‰₯ 10
hiddenrooms_left = null β€” no signal from either sourceLow β€” Booking.com not revealing stock level

rooms_left

Booking.com reveals availability through two channels, both captured by this scraper:

SourceHow it works
Internal JSON (b_nr_stays)Booking's internal stock data embedded in page scripts. Always captured when available.
DOM scarcity badgesVisible alerts like "Only 3 left!" shown to shoppers. Triggers stock_confidence: "exact".
ValueMeaning
1–9Real scarcity signal
10Booking.com display cap β€” actual inventory is β‰₯ 10
nullNo signal from either source β€” high availability

facilities vs. room_amenities

FieldWhat it containsExample
facilitiesComplete list β€” every feature Booking.com shows for the room (30–40+ items)"463 feetΒ²", "Pool view", "Air conditioning", "Toilet paper", ...
room_amenitiesPremium features only β€” the differentiators that affect pricing"balcony", "minibar", "soundproofing", "spa bath"

Use facilities for full room comparison. Use room_amenities for quick tier classification.


πŸ’‘ Tips for best results

  • Start with 7–30 days to validate your setup, then scale to 365
  • Schedule daily runs with Apify Scheduler β€” hotel prices change constantly
  • Use Apify Proxy (useApifyProxy: true) for better success rates on large runs
  • Monitor up to 10 hotels per run for optimal speed and reliability
  • Track sold-out patterns over time to map demand cycles in your market
  • Compare rate_options to analyze refundable vs. non-refundable pricing strategies
  • Use price_public (not price) when comparing against your own rates β€” strips Genius discounts
  • Use facilities to match comparable room types across different hotels

πŸ”— Integrations

IntegrationUse case
Apify SchedulerAutomate daily/weekly price monitoring
WebhooksGet notified when a run completes
APIPull data programmatically (see API tab)
Google SheetsDirect export for quick analysis
n8n / Make / ZapierNo-code automation pipelines
JSON / CSV / ExcelDownload in any format

πŸš€ Use cases

Daily competitor monitoring β€” Track what your competitive set charges across every room type, every day. See exactly how competitors price their rooms, when they discount, and when they sell out.

Revenue management β€” Feed room-level market data into pricing decisions. Compare your rates against competitors using matching rate options (same occupancy, same cancellation policy, same meal plan). Use price_public for fair Genius-free comparison.

Room-type matching β€” Use facilities, room_size_sqm, and room_view to match comparable rooms across different hotels. A 43mΒ² Prestige room with pool view at Hotel A maps to a similar tier at Hotel B.

Seasonal trend analysis β€” Scrape 365 days to visualize demand curves, identify shoulder seasons, and plan promotions around events and holidays.

Portfolio benchmarking β€” Manage multiple properties? Compare each one against its local market at the room-type level.

Travel platform data feeds β€” Power booking engines, metasearch tools, or dashboards with structured, validated pricing data.


❓ FAQ

Does this work with any Booking.com property? Yes β€” any hotel, resort, riad, apartment, or boutique property listed on Booking.com, in any country. Works with small riads (5 rooms) and large hotels (100+ rooms).

What currencies are supported? All currencies available on Booking.com: USD, EUR, GBP, MAD, AED, SAR, JPY, and 30+ more.

What does rooms_left: null mean? Booking.com is not displaying a scarcity alert for this room β€” it has comfortable availability. When inventory drops, Booking.com shows alerts like "Only 3 left!" and rooms_left captures that exact count.

What does rooms_left: 10 mean? This is Booking.com's display cap. The actual inventory is 10 or more β€” Booking.com doesn't show exact counts above this threshold.

Why are sold-out dates valuable? Sold-out dates reveal peak demand periods. If a competitor is fully booked, that's a high-demand window where you can optimize your own rates.

What's the difference between price, price_primary, and price_public? price is the absolute cheapest rate. price_primary is the best rate matching standard 2-guest occupancy. price_public strips Genius discounts to show the rate most travelers actually see β€” use this for competitive benchmarking.

What are Genius rates and why does price_public matter? Booking.com Genius gives 10–20% discounts to frequent bookers. price_public always shows the non-Genius price, giving you the rate that the majority of travelers see. This is critical for fair competitor comparison.

What are bbasic rates and why are they skipped? Booking.com sometimes shows "Tarif Prestataire" (partner/wholesale rates) from third-party resellers. These aren't representative of the hotel's own pricing and carry incomplete room data. The scraper automatically skips them.

How does the scraper handle large hotels with many room types? Hotels with 9+ room types use a different DOM structure. The scraper handles this automatically by grouping rate rows by room ID and matching them to room type cells.

How often should I run this? For active revenue management, daily runs are recommended. Prices and availability on Booking.com change frequently β€” sometimes multiple times per day.

Can I scrape more than 10 hotels? For optimal reliability, each run handles up to 10 hotels. For larger sets, schedule multiple runs or use the Apify API to batch them.


πŸ“ Changelog

v2.1.1 β€” March 2026

  • βœ… Fixed multi-room extraction β€” removed name-based deduplication that caused rooms to be silently skipped; roomId is now the single source of truth for deduplication
  • βœ… Robust fallback names β€” rooms with missing DOM names now use Room_{id} instead of colliding on "Unknown Room"
  • βœ… Cleaner bbasic handling β€” partner rate rows correctly skipped at both cell and row level across all hotel sizes
  • βœ… stay_prices (LOS data) β€” length-of-stay pricing matrix extracted from Booking's internal JSON (b_stay_prices)
  • βœ… taxes_included / taxes_excluded β€” tax breakdown extracted from b_included_charges / b_excluded_charges
  • βœ… book_now_pay_later β€” deferred payment flag extracted from b_book_now_pay_later
  • βœ… stock_confidence β€” distinguishes exact (DOM badge), capped (JSON β‰₯ 10), and hidden (no signal)

v2.1.0 β€” March 2026

  • βœ… Cell-based extraction β€” handles hotels with 9+ room types in a single table
  • βœ… Full facilities list β€” 30–40+ items per room (size, view, bathroom, amenities)
  • βœ… price_public β€” non-Genius public rate for fair competitor comparison
  • βœ… room_size_sqm β€” extracted from real room cell (not partner rate cell)
  • βœ… room_view β€” extracted from facilities and room name
  • βœ… has_private_bathroom β€” boolean from room facilities
  • βœ… room_amenities β€” premium features for tier classification
  • βœ… Genius detection β€” is_genius flag per rate option with public_price extraction

v2.0.3 β€” March 2026

  • βœ… Clean output schema β€” reduced from 35+ fields to 22 focused fields
  • βœ… Accurate max_guests β€” uses Booking.com's data-fltrs attribute
  • βœ… fit filtering β€” rate options only include rates matching your search parameters
  • βœ… Fixed rooms_left extraction β€” expanded JSON parsing window
  • βœ… Fixed is_breakfast_included β€” correctly detects all Booking.com breakfast formats
  • βœ… price_primary β€” new field for revenue management benchmarking

v2.0.0 β€” February 2026

  • ✨ Room-by-room extraction with multiple rate options per room
  • ✨ rooms_left + availability_status availability tracking
  • ✨ Discount detection with original price and percentage
  • ✨ Meal plan and cancellation policy extraction
  • ✨ Sold-out detection across date ranges

v1.0.0 β€” February 2026

  • Initial release

πŸ’¬ Support & feature requests

Have a question, found a bug, or want a new feature? β†’ Open an issue on the Issues tab.

Want a custom solution for your revenue management needs? β†’ Reach out via Issues.


Built by NoraView Intelligence β€” AI-powered revenue management for independent hotels.

Track Booking.com prices by room type, per night, up to 365 days ahead. Get rooms_left, rate options, meal plans, discounts, refundable pricing, sold-out detection, full facilities, room size, view, and Genius rate detection. Clean structured output for revenue management and competitive analysis. CSV, JSON, HTML, Excel.