Booking.com Rate & Availability Event Monitor avatar

Booking.com Rate & Availability Event Monitor

Pricing

from $1.31 / 1,000 rate events

Go to Apify Store
Booking.com Rate & Availability Event Monitor

Booking.com Rate & Availability Event Monitor

**Monitor hotel prices and availability on Booking.com — emit only acted-on events.** Detects price_drop, price_spike, sold_out, re_opened, rooms_left_low, new_listing, and Booking-vs-Kayak parity violations (≥5%). Stateful: remembers last-seen prices across runs via named KV store.

Pricing

from $1.31 / 1,000 rate events

Rating

0.0

(0)

Developer

Vitalii Bondarev

Vitalii Bondarev

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Categories

Share

Monitor hotel prices and availability on Booking.com and detect changes that matter — price drops, spikes, sold-out inventory, re-openings, and Booking-vs-Kayak parity violations. Emits only acted-on events, not raw snapshots. Pay per event.

What this actor does

Most Booking.com scrapers return snapshots: "here are 100 hotels right now." You have to diff them yourself to find what changed. This actor does that diffing for you across runs.

It keeps a named KV-store memory across runs and emits exactly one dataset record per meaningful change:

EventMeaning
price_dropPrice fell by ≥ your threshold (default 5%) since last run
price_spikePrice rose by ≥ your threshold since last run
sold_outProperty was available, now shows sold-out
re_openedProperty was sold out, inventory just reappeared
rooms_left_lowRooms remaining crossed below your threshold (default 3)
new_listingProperty seen for the first time in this search
parity_gapBooking.com price differs from Kayak by ≥ 5% (contractual violation signal)

Use cases

Revenue management: Track competitor repricing in real time. Get notified when a competing property drops price or sells out — react before occupancy shifts.

AI agents / price bots: Feed structured events into downstream automation. Each event has all fields needed to act on it (property, date, old price, new price, delta %).

Rate parity compliance: Hotel chains and OTAs have contractual rate parity obligations. The parity_gap event flags Booking-vs-Kayak discrepancies ≥ 5% — the standard contractual threshold.

Demand signal tracking: A cluster of sold_out events across a destination on a specific date is a demand signal. A cluster of rooms_left_low events signals scarcity before the sold-out wave.

Input

Monitor specific hotel URLs (AvailabilityCalendar path)

Provide hotel page URLs directly. The actor uses Booking.com's AvailabilityCalendar GraphQL operation — cheap (approximately 6 requests per hotel per 365-day window) and precise.

{
"propertyUrls": [
"https://www.booking.com/hotel/fr/paris-marriott-rive-gauche.html",
"https://www.booking.com/hotel/de/four-seasons-berlin.html"
],
"checkin": "2026-07-01",
"amountOfDays": 61,
"proxyConfiguration": {"useApifyProxy": true, "groups": ["RESIDENTIAL"]}
}

Monitor a destination search (FullSearch path)

Provide destination + date pairs. The actor paginate Booking.com's FullSearch results (up to 1,000 hotels per search) and tracks all of them.

{
"searches": [
{"destination": "Paris", "checkin": "2026-07-01", "checkout": "2026-07-03"},
{"destination": "Amsterdam", "checkin": "2026-08-15", "checkout": "2026-08-17"}
],
"dropPctThreshold": 5.0,
"spikePctThreshold": 5.0,
"includeParityCheck": true,
"proxyConfiguration": {"useApifyProxy": true, "groups": ["RESIDENTIAL"]}
}

Output

Each dataset record is one event. Example price_drop:

{
"event_type": "price_drop",
"property_id": "12345",
"property_name": "Hotel de Crillon",
"date": "2026-07-04",
"currency": "USD",
"prev_price": 520.0,
"curr_price": 460.0,
"change_pct": -11.54,
"detected_at": "2026-06-04T14:32:01+00:00",
"run_id": "abc123run"
}

Example parity_gap:

{
"event_type": "parity_gap",
"property_id": "99001",
"property_name": "Hotel Parisien",
"date": "2026-07-01",
"currency": "USD",
"booking_price": 185.0,
"kayak_price": 220.0,
"gap_pct": 15.91,
"direction": "booking_cheaper",
"detected_at": "2026-06-04T14:32:05+00:00",
"run_id": "abc123run"
}

Proxy requirement

Residential proxy is mandatory. Booking.com uses AWS WAF Bot Control — datacenter IPs are blocked on every endpoint including the GraphQL API. This actor handles the WAF challenge automatically, but it requires a real residential IP to get through.

Configure via proxyConfiguration input:

{"useApifyProxy": true, "groups": ["RESIDENTIAL"]}

The buyer pays proxy costs (Apify Residential) separately from PPE event charges.

Access architecture

This actor uses an HTTP/session rung where useful and escalates to its own rendering browser when the page requires it:

  1. HTTP/session rung — The actor uses direct HTTP requests and session state for the parts of the flow that can be handled reliably without rendering, including the GraphQL and CSRF bootstrap where applicable.

  2. Rendering rung — When Booking.com requires browser execution, the actor launches its own Camoufox rendering browser on the caller's Apify RESIDENTIAL proxy. Real JavaScript execution clears the mp_verify challenge. This does not depend on a managed or publisher-paid browser and carries $0 external COGS for the browser itself.

Success is determined from the real rendered page — including the expected selectors and page content — rather than from an HTTP 202 response or an awswaf substring. Those indicators may remain present even after the real page has rendered successfully, so they are not sufficient success or failure signals.

The sibling booking-scraper proved this HTTP/session-plus-own-browser pattern. This actor's page and selector flow still requires its launching live-cloud gate before that flow can be treated as validated in production.

The CSRF layer remains independently bootstrapped when needed: after the usable Booking page is available, the actor extracts b_csrf_token and X-Booking-Context-Aid, then uses those headers for subsequent GraphQL POSTs. Challenge or authentication failures during a run trigger the appropriate retry or re-bootstrap, while rendered selectors and content remain the success criteria.

Schema-drift canary: enable runCanary: true in your daily scheduled run to get early warning if Booking rotates either layer. The canary asserts gokuProps format, CSRF regex, and operationNames — logs a MAINTENANCE ALERT before the health test goes red.

Scheduling

This actor is designed for scheduled runs. Set it to run daily (or hourly for high-demand dates) on a schedule. Between runs, state is preserved in a named KV store (booking-rate-monitor-state) on your Apify account.

Pricing

Pay per event emitted — not per hotel, not per snapshot. A run that detects no changes costs only the actor-start compute fee. Runs with 50 price events are charged for 50 events.

Price: see actor listing (per-event rate, PPE model).

Limitations

  • Maximum 1,000 hotels per destination search (Booking.com FullSearch cap). Use bounding boxes or multiple searches for full-city coverage.
  • Availability calendar does not return rooms_left — only the FullSearch path surfaces that field.
  • Kayak parity check is best-effort: name-matching between Booking and Kayak properties is approximate. Exact property ID matching requires a Kayak API that is not publicly available.
  • Expedia parity is NOT supported (advanced protection, requires a separate approach).
  • This actor runs on the buyer's Apify account. Booking.com's Terms of Service require compliance with their robots.txt and fair-use policies. Do not use to violate rate parity agreements or resell raw Booking.com data.

Integrations

Built for revenue managers and travel-tech teams detecting price drops, sell-outs, and OTA parity violations — the JSON/dataset output drops into the tools you already run, no glue code:

  • n8n / Make / Zapier — trigger a run or pipe every new dataset item into 500+ apps (Google Sheets, Airtable, Slack, HubSpot, your database) with no code: n8n, Make, Zapier.
  • Webhooks — fire your own endpoint the moment a run finishes, to push results straight into your pipeline (docs).
  • MCP server — expose this actor as a tool to Claude, Cursor, or any MCP client so an AI agent can pull this data mid-conversation (guide).
  • API & SDKs — fetch the dataset as JSON, CSV, or Excel through the Apify REST API or the Python / JS SDKs.

See all Apify integrations.