directrate

Revenue managers

See every undercut on your own rate before the guest does.

Your public rate, your member rate and the night in points, read from the chain's booking system — and what Booking.com, Expedia, Hotels.com, Trip.com and Agoda charge for the same room, compared after tax, in one JSON response. Comp sets of 25 hotels in one call, a month of a competitor's nights through the chain's own calendar.

Worked example

A Choice hotel in Chicago: Expedia 18.28 % under direct, on a real night.

One POST /parity on Clarion Inn Elmhurst - Oak Brook near I-88, I-290, I-294 (IL263) for 2026-11-10, 5.25 credits live. The same call on any of 11 chains.

SidePer nightvs direct
Direct · public$118.70—
Direct · member$106.83—
Booking.com$119.76+0.89 %
Expedia$97.00-18.28 %
Hotels.com$97.00-18.28 %
Trip.comskipped: ctrip typeahead returned no hotel for the name––
Agodanative figure, no after-tax$107.00-9.86 %

Verdict ota_undercuts, deepest undercut 18.28 % on Expedia. Points for the same night: 20,000 at 0.59 ¢ per point.

Shopped 2026-10-11 09:27Z; USD, after tax where the side carries it. Clarion Inn Elmhurst - Oak Brook near I-88, I-290, I-294 is one of the hotels on the home page — this is the same snapshot.

curl -s https://api.directrate.dev/v1/parity \
  -H "x-api-key: $DIRECTRATE_API_KEY" \
  -H "content-type: application/json" \
  -d '{"chain":"choice","hotel_code":"IL263","checkin":"2026-11-10","los":1,"occupancy":{"adults":2}}'
{
  "chain": "choice",
  "hotel": {
    "code": "IL263",
    "currency": "USD",
    "name": "Clarion Inn Elmhurst - Oak Brook near I-88, I-290, I-294",
    "brand": "Clarion"
  },
  "checkin": "2026-11-10",
  "los": 1,
  "currency": "USD",
  "direct": {
    "status": "available",
    "public": {
      "per_night": 118.7,
      "total": 118.7,
      "currency": "USD",
      "basis": "after_tax",
      "rate_name": "SAPR2",
      "refundable": false
    },
    "member": {
      "per_night": 106.83,
      "total": 106.83,
      "currency": "USD",
      "basis": "after_tax",
      "rate_name": "SAPR2M",
      "refundable": false
    },
  … 106 more lines
}

shopped 2026-10-11 09:27Z, live · credits: direct 0.25 (cached) + 4 channels + 1 id lookup = 5.25

curl -s https://api.directrate.dev/v1/compset \
  -H "x-api-key: $DIRECTRATE_API_KEY" \
  -H "content-type: application/json" \
  -d '{"chain":"choice","hotel_codes":["IL263","IL264","IL265"],"checkin":"2026-11-10","los":1,"occupancy":{"adults":2}}'

up to 25 codes per call; 0.25 credit per hotel returned on Choice, minimum 1 per call

{
  "chain": "choice",
  "checkin": "2026-11-10",
  "los": 1,
  "hotels": [
    {
      "code": "IL263",
      "name": "Clarion Inn Elmhurst - Oak Brook near I-88, I-290, I-294",
      "status": "available",
      "lowest": {
        "bar": 107.91,
        "member": 97.12,
        "bar_after_tax": 118.7,
        "member_after_tax": 106.83
      },
      "lowest_points": 20000,
      "currency": "USD"
    }
  ],
  "shopped_at": "2026-10-11T09:27:53.075Z",
  "source": "live",
  "cache_age_sec": 0
}

the snapshot asked for one hotel, so the per-call minimum applied · shopped 2026-10-11 09:27Z

What you'd call

4 endpoints, one key.

POST/v1/parity
One hotel and stay: the direct public, member and points rates beside the lowest public and member price on Booking.com, Expedia, Hotels.com, Trip.com and Agoda, each channel's gap to direct, the cheapest channel and the deepest undercut. Compared per night after tax.
POST/v1/compset
Up to 25 hotels of a chain for one stay, lowest public and member rate per hotel. A native batch on Marriott, Choice, Radisson, Wyndham, Best Western and Meliá; a paced fan-out elsewhere.
POST/v1/calendar
The lowest rate per night over a window for one hotel — a month of a competitor's pricing through the chain's own calendar where it has one.
POST/v1/watch
A signed webhook when an OTA sells the same nights under the direct public rate by at least the percentage you set — the parity alert, refreshed on your schedule, charged per refresh.

Every endpoint is in the API reference; the request bodies are the Zod schemas the gateway validates with.

A month in credits

A ten-hotel portfolio, watched daily.

Weights are the ones the gateway bills with; a result served from a recent cache is a quarter of the live price, and errors cost nothing.

WhatCallsCredits eachCredits
Comp set of 20 hotels, every dayrows returned on a 1-credit chain, 0.25 each6000.25150
Parity on 10 hotels, once a week5.25 credits each, as the example above cost live405.25210
31-night calendar on 10 hotels, once a monthnights through a native calendar, 0.1 each3100.131
Hotel-code lookups515
A month396

Fits the Starter plan (3,000 credits, $29/month). All plans and weights.

Parity checks per month, by plan

Free · 250 credits
47
Starter · 3,000 credits
571
Growth · 15,000 credits
2,857
Scale · 75,000 credits
14,285

One parity check = 5.25 credits live, as costed above.

FAQ

Revenue managers: questions before the first call

What is rate parity, and why would an OTA be cheaper than the hotel?

Rate parity is the hotel's promise — to its guests and in its OTA contracts — that its own site is never undercut. It breaks all the time: wholesale rates resold through an OTA, an OTA funding a discount from its own commission, a member price the hotel forgot to match. /parity finds those cases without opening five tabs per hotel: one call per hotel per date, cheaper = channel filters the undercuts, max_undercut_pct ranks them.

Is the comparison apples to apples?

Per night, after tax, wherever both sides carry an after-tax figure; comparison_note says when a side is native (Agoda in the example above), so its gap is off by that side's taxes and fees. Public rates only: an OTA's Genius or Member Price is reported in its own field and never enters the gap.

How fresh is it, and what does an error cost?

Live at request time, or from a cache a few minutes old — every response says which in source and cache_age_sec, and a cached answer bills a quarter of the live price. Errors, a hotel code the chain does not know and an OTA with no listing for the hotel cost nothing.

Start with 250 credits a month. No card, no call.

Every response states its own price in X-Credits-Charged; the playground runs any of these calls with no code.