# 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.

Canonical page: https://scrapercompany.com/hotel-direct-rates-api. Endpoints and prices checked against the API on 2026-10-11.

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

## Endpoints and price per call

| Endpoint | Method and path | What it returns | Credits per successful call | Price per call |
| --- | --- | --- | --- | --- |
| [Direct rates](https://scrapercompany.com/docs/reference/official) | `POST /v1/official` | Rooms and rate plans from the hotel’s own booking engine for one stay | 4 credits | $0.0039 on Starter, $0.0024 on Growth, $0.0016 on Scale |
| [Supported engines](https://scrapercompany.com/docs/reference/official-engines) | `GET /v1/official/engines` | Every booking engine the API can read, with typical response time and browser use | free | free |
| [OTA comparison](https://scrapercompany.com/docs/reference/ota-compare) | `POST /v1/ota/compare` | The same stay on Booking.com, Expedia, Hotels.com and Agoda, side by side | 20 credits | $0.020 on Starter, $0.012 on Growth, $0.0080 on Scale |

Pricing: Free $0/month for 1,000 credits; Starter $49/month for 50,000 credits; Growth $149/month for 250,000 credits; Scale $399/month for 1,000,000 credits. Failed requests (4xx or 5xx) and empty results cost 0 credits. Free during the beta. https://scrapercompany.com/pricing

## Example

`POST /v1/official`, 4 credits per successful call.

```bash
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):

```json
{
  "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"
    }
  }
}
```

## FAQ

### 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.

## Read next

- [Official site rates guide](https://scrapercompany.com/docs/guides/official-site-rates)
- [Rate parity monitoring](https://scrapercompany.com/use-cases/rate-parity-monitoring)
- [Compare OTA rates guide](https://scrapercompany.com/docs/guides/compare-ota-rates)
- [All APIs](https://scrapercompany.com/apis.md)
