Rate parity monitoring

Rate parity monitoring, from the booking engine to every OTA

Put the rate a hotel sells on its own website next to Booking.com, Hotels.com, Agoda, Expedia and every seller Google Hotels shows for the same night, without a browser in the loop.

Built forHotel groupsRevenue managersDistribution teamsRate-intelligence vendors

Endpoints used

See it in action

A week of parity at a glance

Every channel against the direct rate, night by night. Hover a cell or an alert to read the check.

  • data from the API
  • added by your code

Example · rate parity monitor

Which channel undercuts our direct rate this week?

  1. POST /v1/official
  2. POST /v1/ota/compare
  3. your alert rule

Checks

28

Undercuts

3

Worst

-4.0%

Total price per night on each channel, against the direct rate
Apr 2027Mon 19Tue 20Wed 21Thu 22Fri 23Sat 24Sun 25
Direct site$189$189$199$212$239$249$179
Booking.com
Expedia
Hotels.com
Agoda

Alerts from your rule · below direct by 1% or more

Nights at or above direct

Booking.com
7/7
Expedia
6/7
Hotels.com
7/7
Agoda
5/7

Agoda · Sat 24 Apr · $239 vs $249 direct

undercut -4.0%

below direct at parity above directtotals incl. taxes & fees, 1 night, King room

Fictional hotel, illustrative rates.

The problem

Is an OTA undercutting our direct rate?

Parity breaks quietly. A wholesale rate leaks to an OTA, a metasearch seller shows a member price to everyone, or a promotion ends on one channel and not another. By the time a guest mentions it, the cheaper rate has been bookable for days.

Checking by hand stops working after a handful of dates. The direct rate is the anchor, so it has to come from the hotel's own booking engine, read the same way every day, next to each OTA's own number for the identical stay.

Workflow

How teams build it

  1. Step 1

    Resolve the property once

    Turn the hotel name into its Google property token and its Booking.com, Hotels.com, Agoda and Expedia ids. Store them with the hotel record.

    POST /v1/search
  2. Step 2

    Read the direct rate

    Pass the hotel's website. The API finds the booking link, detects which of 31 booking engines it runs and returns the rooms and rate plans sold direct.

    POST /v1/official
  3. Step 3

    Read every channel for the same night

    Compare the OTAs' own inventory in one call, with sources that run in parallel and fail independently, or read every seller Google displays from the property token.

    POST /v1/ota/compare
  4. Step 4

    Flag the gap

    Compare like with like: the same room, the same stay and the same currency. Alert when a channel is below the direct rate by more than your threshold.

Output

What you get back

Direct rate
rooms and rate plans from the hotel's own booking engine, member rates where shown
OTA rates
Booking.com, Hotels.com, Agoda and Expedia prices from each site's own inventory
Google sellers
every seller on the Google Hotels page, including the official site, per room
Failure isolation
one OTA timing out does not fail the others in a comparison
curl -X POST "https://api.scrapercompany.com/v1/offers" \
  -H "x-api-key: $SCRAPERCOMPANY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "token": "ChUIoben2Mv6-CYaCi9tLzA3czVwbjQQAQ",
    "check_in": "2026-12-03",
    "nights": 1,
    "market": "US",
    "currency": "USD"
  }'
Response (trimmed)
{
  "token": "ChUIoben2Mv6-CYaCi9tLzA3czVwbjQQAQ",
  "check_in": "2029-02-07",
  "check_out": "2029-02-08",
  "nights": 1,
  "adults": 2,
  "device": "iphone",
  "coverage": 2,
  "currency": "USD",
  "currency_matches_request": true,
  "rates_include_tax": false,
  "requested_market": "US",
  "egress_market": "US",
  "egress_geo_locked_ok": true,
  "price_insights_market_verified": true,
  "lowest_price_per_night": 303.67,
  "rooms_total": 173,
  "name": "Hilton Chicago",
  "hotel_class": "4-star hotel",
  "hotel_class_stars": 4,
  "rating": 4.3,
  "reviews": 10686,
  "deal": "25% less than usual",
  "has_deal": true,
  "deal_description": "Great Deal",
  "price_insights": {
    "lowest_price": "$304",
    "price_level": "typical",
    "typical_price_range": {
      "low_price": "$304",
      "high_price": "$521"
    }
  },
  "sources": [
    "Official site",
    "Booking.com"
  ],
  "missing_sources": [],
  "refundable_offers": 2,
  "wire_bytes": 4381263,
  "elapsed_s": 1.14,
  "warnings": [],
  "offers": [
    {
      "source": "Official site",
      "raw_source": "Hilton Chicago",
      "is_official": true,
      "nights": 1,
      "currency": "USD",
      "price_per_night": 499.44,
      "price_per_night_before_taxes": 420.05,
      "tax": 79.39,
      "total": 499.44,
      "has_free_cancellation": true,
      "free_cancellation_until": "2029-02-03",
      "free_cancellation_time": "23:59",
      "room_id": "rate-plan-42",
      "provenance": {
        "schema_version": 1,
        "observation_id": "rateobs_0123456789abcdef0123456789abcdef",
        "collection_id": "ratecol_0123456789abcdef0123456789abcdef",
        "observed_at": "2026-08-07T01:23:45.678Z",
        "source": "google_hotels_property_offers",
        "source_kind": "offer",
        "collector": "scrapingme.google_property",
        "source_property_id": "ChUIoben2Mv6-CYaCi9tLzA3czVwbjQQAQ",
        "requested_market": "US",
        "requested_currency": "USD",
        "returned_currency": "USD",
        "egress_mode": "market_proxy",
        "price_basis": "room_base_before_taxes_and_fees",
        "derivation": "normalized_upstream"
      },
      "rooms": [
        {
          "name": "1 KING BED",
          "description": "1 bed",
          "beds": 1,
          "is_suite": false,
          "price_before_taxes": 420.06,
          "price_total": 499.45,
          "has_free_cancellation": true,
          "free_cancellation_until": "2029-02-03",
          "free_cancellation_time": "23:59",
          "link": "https://www.google.com/aclk?...",
          "thumbnail": "https://lh3.googleusercontent.com/..."
        }
      ]
    }
  ]
}

Worked example

A five-hotel group checks parity for the next 14 nights every morning

Illustrative scenario, not a customer

CallPer dayCredits eachCredits a day
Official-site rate, 5 hotels × 14 nights704280
Every Google seller, 5 hotels × 14 nights703210
Credits a month
14,700
Fits on
Starter
Plan price
$49 /month

30 days a month. Failed and empty requests cost nothing, so a bad day costs less. Compare plans

Which booking engines can it read?

31 official booking engines, detected automatically from the hotel website, so you never choose the vendor. GET /v1/official/engines lists them with their typical response time and is free.

Should I use the OTA comparison or Google offers?

Use the comparison when you need each OTA's own number from its own inventory. Use Google offers (3 credits) for a quick market view: it returns every seller Google displays for the night, from one property token and with no OTA ids.

What happens when an OTA does not answer?

Sources in a comparison run in parallel and fail independently, so the others still return. If none of them returns a price, the comparison is not charged.

Can it run every day without my own scheduler?

You schedule the calls. Most teams run a daily cron job and store each answer; every response says when it was collected.

Start with 1,000 free credits a month

Tell us which properties, sources and engines you need. Our team sets up your account, and you create and rotate API keys yourself. The API is free during the beta.