directrate

Getting started

Chains & coverage

The 11 chains and 5 OTAs, what each returns, and the chain ids to put in a request.

Chain ids

chain in every request is one of these ids. GET /v1/chains returns the same list with live capability flags and credit weights.

idSourceProgramMemberPointsNative calendarCredits/shop
marriottMarriottMarriott Bonvoy✓✓✓1
hiltonHiltonHilton Honors✓✓✓1
hyattHyattWorld of Hyatt✓✓✓ (availability + points only, no cash)1
ihgIHGIHG One Rewards✓✓✓1
choiceChoiceChoice Privileges✓✓✓1
radissonRadissonRadisson Rewards✓✓✓3
ipreferI PreferI Prefer (Preferred Hotels)✓✓✓1
wyndhamWyndhamWyndham Rewards✓– (login-gated at the source)✓6
meliaMeliáMeliá Rewards✓– (login-gated at the source)✓ (availability only)1
bestwesternBest WesternBest Western Rewards✓✓✓5
premierinnPremier Inn—n/an/a✓1
bookingBooking.com (OTA)Genius, reported apart✓––1
expediaExpedia (OTA)Member Price, reported apart✓––1
hotelscomHotels.com (OTA)Member Price, reported apart✓––1
ctripTrip.com (OTA)—–––1
agodaAgoda (OTA)Member deal, reported apart✓––1

Points are login-gated at the source on Meliá and Wyndham, and Premier Inn is cash-only; those fields come back empty rather than estimated. Wyndham names rooms and rate plans by code only (room_code / rate_code, names empty) — that is how its booking system answers an anonymous shop; codes are stable per property.

Hotel codes

Every rate endpoint takes the chain’s own property code — Marriott CHIRL, Hyatt CHIZP, IHG CHIMM, Hilton CHITDHX, Choice IL263. They are not guessable, so GET /v1/hotels?chain=…&q=… exists to produce them: a city, an address or a landmark in, the chain’s hotels around that point out, nearest first, with name, brand, address and coordinates where the chain’s own search publishes them (Marriott’s returns codes and distances only). An OTA’s code is its own hotel id — the number in its URL, or the id a /parity channel row returns.

Tax basis

price_per_night is in each chain’s native basis and tax_included says which: true for Hyatt, IHG, Meliá, Premier Inn and Radisson; false for Hilton, Marriott, Choice, Best Western, I Prefer and Wyndham. price_per_night_after_tax is the comparable figure, derived per chain from fields verified against live payloads and null only where the source carries no tax data — never estimated. Compare across chains, and against the OTAs, on the *_after_tax fields.

The OTAs as sources

booking, expedia, hotelscom, ctrip and agoda take the same /shop, /calendar and /compset calls as a chain, with the OTA’s hotel id as the code and the OTA’s own tax-inclusive price. They carry no points and no hotel-code search. POST /ota/{source}/shop is the same call with raw: true available for the upstream bodies.

Freshness

Live at request time, or a cache a few minutes old — source and cache_age_sec are on every response; max_age in the request bounds the staleness you accept (0 = live). The status page shows measured uptime and latency per source.