Rates & promotions
Pricing in MyRentalCalendar is season-based: a shared calendar of recurring
seasons per agency, holiday rules layered on top, and length-of-stay discounts
per unit. These two endpoints let a channel manager or a pricing dashboard see
the resolved result. What a specific stay costs — fees, taxes, discounts,
promotions included — remains the job of POST /quote.
GET /partner/v1/rates
Section titled “GET /partner/v1/rates”Scope read:rates. The engine’s nightly rate for every night in [from, to),
before fees, taxes and discounts, with the season or holiday rule that set it.
| Query parameter | Required | Meaning |
|---|---|---|
unit | yes | Unit slug |
from | yes | Range start (inclusive) |
to | yes | Range end (exclusive); at most 366 days after from |
curl "https://api.myrentalcalendar.com/partner/v1/rates?unit=marina-loft-2br&from=2026-12-20&to=2027-01-05" \ -H "Authorization: Bearer $KEY"{ "unit": "marina-loft-2br", "from": "2026-12-20", "to": "2027-01-05", "currency": "AED", "nights": [ { "night": "2026-12-20", "price": 45000, "season": null, "holidayRule": null }, { "night": "2026-12-27", "price": 67500, "season": "Festive season", "holidayRule": null }, { "night": "2026-12-31", "price": 90000, "season": "Festive season", "holidayRule": "New Year's Eve" } ], "baseMinStay": 2, "seasonMinStay": 5, "lengthOfStayDiscounts": { "weeklyPct": 10, "monthlyPct": 25, "tiers": null }}| Field | Notes |
|---|---|
nights[].price | Minor units per night |
nights[].season / holidayRule | What set the price; null = the unit’s base price applies |
baseMinStay | The unit’s own minimum |
seasonMinStay | Highest seasonal minimum touched by the range; 0 when none applies. A stay must satisfy max(baseMinStay, seasonMinStay) |
lengthOfStayDiscounts.tiers | The configured ladder (“from X nights → Y % off”); null means the weekly/monthly pair applies |
Errors: 400 VALIDATION (range negative or over 366 days), 404 NOT_FOUND.
Rates are read-only: the season model is the agency’s, and a per-day price write would impose a foreign one (docs/30 §12.4).
GET /partner/v1/promotions
Section titled “GET /partner/v1/promotions”Scope read:rates. Campaigns bookable today whose stay window has not
passed, with the units they apply to. Whether a promotion actually applies to a
given stay — minimum nights, stacking with length-of-stay discounts — is decided
by the engine in POST /quote, which names the applied promotion in promos.
{ "promotions": [ { "id": "0192a…", "name": "September special", "badgeLabel": "Last minute −15%", "discountPct": 15, "stayFrom": "2026-09-01", "stayUntil": "2026-09-30", "bookFrom": null, "bookUntil": "2026-09-25", "minNights": 3, "stackWithLengthOfStay": false, "showOnWebsite": true, "units": ["marina-loft-2br", "jbr-studio-sea"] } ]}badgeLabel is the public wording; null means the campaign runs silently.
stackWithLengthOfStay: false means the better of promotion and weekly/monthly
discount wins rather than both applying.