hotel direct rates API
Hotel direct rates API for prices on the hotel’s own website
Send a hotel’s homepage and a stay. The API finds the booking link, works out which booking engine runs it and returns every room and rate plan the hotel sells direct, with public and member prices kept apart.
1,000 free credits a month · Failed requests are free · Free during the beta
Endpoints and prices checked against the API on
Rate parity starts with the direct price: what the hotel charges on its own website, the figure every OTA is measured against. Getting it is hard because there is no common format. A hotel’s site hands bookings to an engine such as SiteMinder, Sabre SynXis, Amadeus iHotelier, Cloudbeds or Mews, or to its chain’s own site, and each one answers differently. This API reads the engine the hotel actually uses and returns its rooms and rates in one shape, whichever engine answered.
You never name the vendor. The API follows the booking link from the homepage, through tracking redirects, identifies the engine from the URL, a redirect or the page markup, and reports how in detected_by. 31 booking engines and hotel-chain sites are supported, listed by a free endpoint with each one’s typical response time. Member and loyalty prices are labelled with access_type and kept out of cheapest_rate, so the headline stays comparable with what a signed-out guest sees on an OTA.
What you get
engine, detected_by— the booking engine found, and whether the URL, a redirect, the booking link or the page markup identified itbooking_url— the booking page the rates were read fromrooms[]— each room with its name, code, maximum occupancy, availability and cheapest raterooms[].rates[]— price, stay total, currency, rate plan name and whether tax is includedrates[].access_type— public, member, points or points and cash, from the hotel’s own labelscheapest_rate, cheapest_member_rate— the lowest public price, for parity, and the lowest member price beside itloyalty— the loyalty program, the best public, member and points rates, and the member discount against publiccomparison— on the OTA comparison: lowest price, spread and whether the sources can be compared
One call, structured JSON
POST /v1/official — 4 credits per successful call.
curl -X POST "https://api.scrapercompany.com/v1/official" \
-H "x-api-key: $SCRAPERCOMPANY_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://www.marriott.com/en-us/hotels/yyzrz-the-ritz-carlton-toronto/overview/",
"check_in": "2026-12-10",
"nights": 1,
"currency": "USD"
}'{
"search_parameters": {
"engine": "official_marriott",
"source_url": "https://www.marriott.com/en-us/hotels/yyzrz-the-ritz-carlton-toronto/overview/",
"booking_url": "https://www.marriott.com/en-us/hotels/yyzrz-the-ritz-carlton-toronto/overview/",
"check_in_date": "2029-02-18",
"check_out_date": "2029-02-19",
"adults": 2,
"currency": "CAD"
},
"engine": "marriott",
"source_url": "https://www.marriott.com/en-us/hotels/yyzrz-the-ritz-carlton-toronto/overview/",
"booking_url": "https://www.marriott.com/en-us/hotels/yyzrz-the-ritz-carlton-toronto/overview/",
"detected_by": "url",
"discovery_pages": 0,
"wrapper_resolutions": 0,
"discovery_cache_hit": false,
"discovery_elapsed_s": 0.001,
"collection_id": "ratecol_0123456789abcdef0123456789abcdef",
"observed_at": "2026-08-07T01:23:45.678Z",
"property_ref": "YYZRZ",
"check_in": "2029-02-18",
"check_out": "2029-02-19",
"nights": 1,
"currency": "CAD",
"sold_out": false,
"cheapest_rate": 690,
"cheapest_member_rate": 655.5,
"member_rates_returned": 1,
"rooms_returned": 1,
"used_browser": false,
"elapsed_s": 0.71,
"rooms": [
{
"name": "Deluxe King",
"code": "GENR",
"max_occupancy": 2,
"quantity": 3,
"available": true,
"cheapest_rate": 690,
"rates": [
{
"price": 690,
"price_total": 779.7,
"currency": "CAD",
"rate_plan": "Flexible",
"tax_inclusive": true,
"access_type": "public",
"is_discounted": false,
"provenance": {
"schema_version": 1,
"observation_id": "rateobs_0123456789abcdef0123456789abcdef",
"collection_id": "ratecol_0123456789abcdef0123456789abcdef",
"observed_at": "2026-08-07T01:23:45.678Z",
"source": "official_marriott",
"source_kind": "official",
"collector": "scrapingme.official.marriott",
"source_property_id": "YYZRZ",
"requested_market": "US",
"requested_currency": "USD",
"returned_currency": "USD",
"egress_mode": "direct",
"price_basis": "room_base_before_taxes_and_fees",
"derivation": "normalized_upstream"
}
},
{
"price": 655.5,
"price_total": 740.72,
"original_price": 690,
"currency": "CAD",
"rate_plan": "Marriott Bonvoy Member",
"tax_inclusive": false,
"access_type": "member",
"loyalty_program": "Marriott Bonvoy",
"is_discounted": true,
"member_discount_vs_public": {
"amount": 34.5,
"percent": 5,
"public_price": 690,
"currency": "CAD",
"basis": "paired_public_rate"
}
}
]
}
],
"loyalty": {
"program": "Marriott Bonvoy",
"exposed_unauthenticated": {
"program": "Marriott Bonvoy",
"member": true,
"points": true,
"points_and_cash": true,
"login_required_for": [],
"notes": "Phoenix GraphQL rate modes: cash, points, cash-and-points."
},
"rates_by_access_type": {
"public": 1,
"member": 1,
"points": 1,
"points_and_cash": 0,
"corporate": 0
},
"public_best": {
"room": "Deluxe King",
"room_code": "GENR",
"rate_plan": "Flexible",
"price": 690,
"currency": "CAD"
},
"member_best": {
"room": "Deluxe King",
"room_code": "GENR",
"rate_plan": "Marriott Bonvoy Member",
"price": 655.5,
"currency": "CAD",
"discount_vs_public": {
"amount": 34.5,
"percent": 5,
"public_price": 690,
"currency": "CAD",
"basis": "paired_public_rate"
}
},
"points_best": {
"room": "Deluxe King",
"room_code": "GENR",
"rate_plan": "Bonvoy Points",
"access_type": "points",
"points": 70000
},
"points_value_cents_per_point": {
"value": 0.986,
"unit": "cents_per_point",
"derivation": "derived",
"formula": "(public_cash - cash_component) / points * 100",
"currency": "CAD",
"room": "Deluxe King",
"public_cash": 690,
"public_rate_plan": "Flexible",
"cash_component": 0,
"points": 70000,
"points_rate_plan": "Bonvoy Points",
"points_access_type": "points",
"public_price_basis": "stay"
}
}
}Endpoints and price per call
Credits per successful call, and what one call costs on the Starter, Growth, Scale plans. Failed requests cost nothing. See all plans.
| Endpoint | What it returns | Credits | Starter · Growth · Scale |
|---|---|---|---|
| Direct rates POST /v1/official | Rooms and rate plans from the hotel’s own booking engine for one stay | 4 credits | $0.0039 · $0.0024 · $0.0016 |
| Supported engines GET /v1/official/engines | Every booking engine the API can read, with typical response time and browser use | 0 credits | $0.0000 · $0.0000 · $0.0000 |
| OTA comparison POST /v1/ota/compare | The same stay on Booking.com, Expedia, Hotels.com and Agoda, side by side | 20 credits | $0.020 · $0.012 · $0.0080 |
FAQ
Frequently asked questions
Read next
Is this an official API from hotels or booking engines?
No. It is independent of the hotels and of the booking-engine vendors. It reads the public booking page a guest would use, without signing in, so it returns the rates any visitor can book.
Which booking engines are supported?
31 booking engines and hotel-chain sites, including SiteMinder, Sabre SynXis, Amadeus iHotelier, Cloudbeds, Mews, D-EDGE, Accor and IHG. The engines endpoint lists every one with its typical response time and whether it needs a browser, and it is free. Most answer in a second or two; engines that need a browser take several seconds.
What happens if the hotel’s engine is not supported?
The call returns a 422 saying no supported booking engine was found. If the hotel’s website refuses the request, as some firewalls do, it returns a 502 instead. Neither costs anything, because failed calls are free.
How do I check rate parity with this API?
Get the direct price from POST /v1/official and the OTA prices for the same stay from POST /v1/ota/compare, then compare cheapest_rate with each OTA. Check the price basis first: each direct rate says whether tax is included, and the comparison flags OTA prices quoted on different bases and groups them by basis.
Are member and loyalty rates included?
Yes, when the hotel shows them to a signed-out guest. Each rate carries access_type, and member rates show their discount against the public rate. cheapest_rate stays public-only, so parity checks are not skewed by members-only prices.
Do failed requests cost credits?
No. A failed or blocked call (any 4xx or 5xx response) costs 0 credits, and so does a search page that comes back empty. You pay only for successful results.
How do I get an API key?
Create an account on the sign-up page. Public sign-up is invite-only during the beta, so join the waitlist there and we will email you when your account is ready. The Free plan includes 1,000 credits a month, and the API is free while it is in beta. You create and rotate keys yourself in the dashboard.
More APIs on the same key
All APIsBooking.com API
Look a hotel up by name, then read what Booking.com shows a guest: a nightly price calendar, each room type with its rate plans, and the reviews with the property’s replies. Structured JSON, priced per call.
Expedia API
Look a hotel up by name, then read what Expedia shows a guest for one stay: every room type and rate plan with its total, nightly price and cancellation terms, and the guest reviews with the property’s replies.
Hotels.com API
Find a hotel’s Hotels.com id by name, then read what a guest on the Hotels.com site for their country sees: the headline price for a stay, every room type and rate plan, and the guest reviews.
Agoda API
Look a hotel up by name, then read every room type and rate plan Agoda shows a guest for one stay, with the stay total, discounts, meal plan and cancellation terms, in any of 23 currencies.
Tripadvisor API
Send a hotel’s Tripadvisor id and a stay, and get the offers Tripadvisor lists from Booking.com, Expedia, Hotels.com and other sites, each with what its price means. Read the hotel’s guest reviews and management replies from the same id.
Airbnb API
Search Airbnb by destination or map area and get each listing with its trip price and breakdown. Then read a listing’s calendar: availability, stay rules and the price Airbnb itself quotes for the nights you choose. Structured JSON, priced per call.
Start with 1,000 free credits a month
Join the waitlist and we will email you when your account is ready: your own API keys, 1,000 free credits a month, and the API is free during the beta.