directrate

Modes

Parity — POST /parity

The direct rate of one hotel beside Booking.com, Expedia, Hotels.com, Trip.com and Agoda for the same stay — the gap per channel, the cheapest, the deepest undercut.

Request

{ "chain": "choice", "hotel_code": "IL263", "checkin": "2026-11-10", "los": 1,
  "channels": ["booking", "expedia", "hotelscom", "ctrip", "agoda"] }
Field Type Notes
chain a hotel chain id the OTAs are the channels, not the chain
hotel_code, checkin, los (1–14), occupancy, currency, max_age as /shop
channels 1–5 OTA ids default all five
ids object the hotel’s id on a channel when you know it ({"booking":"…"}); overrides the map for this call, nothing stored
min_confidence 0–1 mapped ids under this confidence are not used; default 0.6
resolve bool look up missing ids live before shopping; default true

The OTA listing is found for you: an id map from the chain’s code to each OTA’s hotel id, filled from Google Hotels’ own cross-source match the first time a hotel is seen (confidence 0.85), then the sources’ own typeaheads. GET /hotels/{chain}/{code}/ids returns the map on its own.

Response

ParityResponse: direct { status, public, member, points { lowest_points, cpp }, rates, source, credits }, channels[] each { channel, id, confidence, status, public, member, vs_direct { diff_per_night, diff_pct, cheaper }, rates, skipped, credits }, cheapest { channel, per_night, basis }, verdict (direct_lowest / ota_undercuts / equal / no_direct_rate / no_channel_rate), max_undercut_pct, comparison_note, credits { direct, channels, ids, total }.

Each figure carries basis: after_tax when the side has an after-tax number (the comparable one), native when it only has its own. The comparison is per night, after tax wherever both sides carry it, and public rates only — Genius and Member Price are reported in member, as the chain’s member rate is, and never enter the gap. A channel in another currency is shown but not compared.

Measured on this hotel (the home page’s example): direct 118.70 after tax, member 106.83, 20,000 points; Booking.com 119.76 (+0.89 %), Expedia 97.00 (−18.28 %), Hotels.com 97.00, Agoda 107 (native), Trip.com no listing matched → verdict ota_undercuts, max_undercut_pct 18.28.

Billing

Billed as the shops it made (each chain’s weight, cached 0.25×) plus 1 credit when ids were resolved live. A channel with no listing for the hotel costs nothing. Five channels on a Marriott hotel: at most 7 credits, typically less once cached.

Monitoring it

For a standing alert, POST /watches with condition: "undercut" fires a signed webhook when the named channel sells the same nights under the direct public rate by at least min_pct. See the API reference.