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 it
  • booking_url — the booking page the rates were read from
  • rooms[] — each room with its name, code, maximum occupancy, availability and cheapest rate
  • rooms[].rates[] — price, stay total, currency, rate plan name and whether tax is included
  • rates[].access_type — public, member, points or points and cash, from the hotel’s own labels
  • cheapest_rate, cheapest_member_rate — the lowest public price, for parity, and the lowest member price beside it
  • loyalty — the loyalty program, the best public, member and points rates, and the member discount against public
  • comparison — 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"
  }'
Response (trimmed)
{
  "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.

EndpointWhat it returnsCreditsStarter · Growth · Scale
Direct rates
POST /v1/official
Rooms and rate plans from the hotel’s own booking engine for one stay4 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 use0 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 side20 credits$0.020 · $0.012 · $0.0080
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.

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.

Sign-up is invite-only during the beta. Privacy

Or read the quickstart →