Hotel Direct Booking Rates Scraper - Official Websites avatar

Hotel Direct Booking Rates Scraper - Official Websites

Pricing

from $6.00 / 1,000 rates requests

Go to Apify Store
Hotel Direct Booking Rates Scraper - Official Websites

Hotel Direct Booking Rates Scraper - Official Websites

Get room rates straight from a hotel's own website: paste the hotel URL and the Actor finds its booking engine automatically (over 50 supported, with more added regularly) and returns rooms, rate plans and member rates for your stay. Made by ScraperCompany.

Pricing

from $6.00 / 1,000 rates requests

Rating

0.0

(0)

Developer

ScraperCompany

ScraperCompany

Maintained by Community

Actor stats

0

Bookmarked

6

Total users

2

Monthly active users

11 hours ago

Last modified

Categories

Share

Hotel Direct Booking Rates Scraper by ScraperCompany prices a stay on the hotel's own website, the direct channel OTAs are measured against. Paste the hotel's homepage; the Actor discovers its reservation flow, recognises the booking engine and returns every room and rate plan it sells for your dates, including member rates when the engine shows them. It covers over 50 booking engines used by hotel chains and independent hotels, with more added regularly. Use it to check direct-vs-OTA rate parity. Pricing is pay-per-event: $0.006 per rates request; 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 hotel direct booking scraper do?

  • Just paste the hotel URL: booking-engine discovery and selection happen automatically.
  • Supports over 50 booking engines, from major hotel chains to independent-hotel engines, with more added regularly.
  • Every room and rate plan with price, occupancy and availability.
  • Member / loyalty rates reported separately when the engine shows them, never mixed with public rates.
  • Any stay length, adults and rooms; request a currency.

Use cases for hotel direct booking data

  • Revenue managers: Check what your own booking engine sells and compare it with what the OTAs show.
  • Rate parity teams: Measure the direct rate every OTA price is benchmarked against, including member rates.
  • Hotel tech and metasearch: Collect room and rate-plan data straight from hotel websites across booking engines.

What hotel direct booking data can you extract?

FieldDescription
engineIdentifier of the booking engine that answered
cheapest_rate / cheapest_member_rateLowest public rate and lowest member rate
rooms[].name / code / max_occupancyRoom type
rooms[].ratesRate plans with price, cancellation and meal terms
currency / sold_outReturned currency and sold-out flag
booking_url / source_urlBooking-engine link that was priced and the page you gave
detected_by / discovery_pagesHow the engine was found

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 hotel direct booking rates

  1. Open Hotel Direct Booking Rates Scraper in Apify Console and go to the Input tab.
  2. Paste one or more hotel website URLs (homepage or property page, e.g. https://www.marriott.com/en-us/hotels/yyzrz-the-ritz-carlton-toronto/overview/) or direct booking-engine links, and pick your dates.
  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.

{
"hotelUrls": [
"https://app-apac.thebookingbutton.com/properties/ParksideHotelandApartmentsdirect"
],
"check_in": "30 days",
"currency": "USD",
"includeErrors": true,
"maxConcurrency": 3,
"maxRetries": 2
}

Output example

One dataset item per request (trimmed here; real items contain every field the API returns):

{
"endpoint": "/v1/official",
"input": {
"url": "https://www.marriott.com/en-us/hotels/yyzrz-the-ritz-carlton-toronto/overview/",
"check_in": "2026-10-31",
"currency": "CAD"
},
"booking_url": "https://www.ihg.com/intercontinental/hotels/us/en/new-york/nychc/hoteldetail",
"cheapest_member_rate": 612.07,
"cheapest_rate": 631,
"check_in": "2026-11-10",
"check_out": "2026-11-11",
"collection_id": "ratecol_0123456789abcdef0123456789abcdef",
"currency": "USD",
"elapsed_s": 1,
"engine": "brand_ihg",
"loyalty": {
"exposed_unauthenticated": {
"login_required_for": [],
"member": true,
"points": true,
"points_and_cash": true,
"program": "IHG One Rewards"
},
"member_best": {
"currency": "USD",
"discount_vs_public": {
"amount": 18.93,
"basis": "room_cheapest_public",
"currency": "USD",
"percent": 3,
"public_price": 631,
"public_rate_plan": "Early Saver Rate"
},
"price": 612.07,
"rate_plan": "Early Saver Member Exclusive",
"room": "Premium Room",
"room_code": "CDXG"
},
"points_best": {
"access_type": "points",
"cash_component": null,
"currency": null,
"points": 123000,
"points_basis": "stay",
"rate_plan": "Reward Nights",
"room": "Premium Room",
"room_code": "CDXG"
},
"points_plus_cash_best": {
"access_type": "points_and_cash",
"cash_component": 149,
"currency": "USD",
"points": 103000,
"points_basis": "stay",
"rate_plan": "Reward Nights (points + cash)",
"room": "Premium Room",
"room_code": "CDXG"
},
"points_value_cents_per_point": {
"cash_component": 0,
"currency": "USD",
"derivation": "derived",
"formula": "(public_cash - cash_component) / points * 100",
"points": 123000,
"points_access_type": "points",
"points_rate_plan": "Reward Nights",
"public_cash": 631,
"public_price_basis": "stay",
"public_rate_plan": "Early Saver Rate",
"room": "Premium Room",
"unit": "cents_per_point",
"value": 0.513
},
"program": "IHG One Rewards",
"public_best": {
"currency": "USD",
"price": 631,
"rate_plan": "Early Saver Rate",
"room": "Premium Room",
"room_code": "CDXG"
},
"rates_by_access_type": {
"corporate": 0,
"member": 2,
"points": 1,
"points_and_cash": 2,
"public": 2,
"qualified": 0
}
},
"member_rates_returned": 2,
"nights": 1,
"observed_at": "2026-08-07T01:23:45.678Z",
"property_id": null,
"property_ref": "NYCHC",
"rooms": [
{
"available": true,
"cheapest_rate": 631,
"code": "CDXG",
"max_occupancy": 2,
"name": "Premium Room",
"quantity": 9,
"rates": [
{
"access_type": "points",
"cash_component": null,
"currency": "USD",
"fees": null,
"is_discounted": false,
"loyalty_cash": null,
"loyalty_points": 123000,
"loyalty_program": "IHG One Rewards",
"meal_plan": null,
"member_discount_vs_public": null,
"original_price": null,
"points": 123000,
"points_basis": "stay",
"price": null,
"price_total": null,
"rate_category": "points",
"rate_category_source": "brand_flag",
"rate_code": "IVANI",
"rate_code_scope": null,
"rate_plan": "Reward Nights",
"reference_price": null,
"refundable": true,
"tax": null,
"tax_inclusive": null
},
{
"access_type": "points_and_cash",
"cash_component": 79,
"currency": "USD",
"fees": null,
"is_discounted": false,
"loyalty_cash": 79,
"loyalty_points": 113000,
"loyalty_program": "IHG One Rewards",
"meal_plan": null,
"member_discount_vs_public": null,
"original_price": null,
"points": 113000,
"points_basis": "stay",
"price": 79,
"price_total": null,
"rate_category": "points",
"rate_category_source": "brand_flag",
"rate_code": "IVANI",
"rate_code_scope": null,
"rate_plan": "Reward Nights (points + cash)",
"reference_price": null,
"refundable": true,
"tax": null,
"tax_inclusive": null
}
]
}
],
"rooms_returned": 1,
"search_parameters": {
"adults": 2,
"booking_url": "https://www.ihg.com/intercontinental/hotels/us/en/new-york/nychc/hoteldetail",
"check_in_date": "2026-11-10",
"check_out_date": "2026-11-11",
"currency": "USD",
"engine": "official_brand_ihg",
"source_url": "https://www.ihg.com/intercontinental/hotels/us/en/new-york/nychc/hoteldetail"
},
"sold_out": false,
"source_url": "https://www.ihg.com/intercontinental/hotels/us/en/new-york/nychc/hoteldetail",
"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 hotel direct booking rates?

This Actor uses pay-per-event pricing: you pay for successful API requests, not for compute time.

EventCharged whenPricePer 1,000
rates-requestOne hotel website priced for one stay through the hotel's own booking engine.$0.006$6.00
qualified-rate-typeOne extra eligibility-restricted rate search (AAA/CAA, senior or government) on a hotel request, per type you ask for.$0.002$2.00

Paid Apify plans pay less: qualified-rate-type up to 20% off (Bronze 5%, more on higher plans). The Pricing tab shows the price on your plan.

For example, 1,000 requests in the default mode cost $6.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 if the hotel uses an engine you do not support?

The request fails with a clear message naming what was found, and it is not charged.

Do qualified rates (AAA, senior, government) cost extra?

Each type you ask for is one more search on the hotel's engine and is charged one qualified-rate-type event per hotel request, from the date shown on the Pricing tab. Until that date they are included in the rates-request price.

Do I need to know the booking engine?

No. Give the hotel's normal website; the Actor finds the booking link and picks the right extractor.

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/official-hotel-rates-scraper').call({
"hotelUrls": [
"https://app-apac.thebookingbutton.com/properties/ParksideHotelandApartmentsdirect"
],
"check_in": "30 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/official-hotel-rates-scraper").call(run_input={
"hotelUrls": ["https://app-apac.thebookingbutton.com/properties/ParksideHotelandApartmentsdirect"],
"check_in": "30 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.