Skip to content

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.

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 parameterRequiredMeaning
unityesUnit slug
fromyesRange start (inclusive)
toyesRange end (exclusive); at most 366 days after from
Terminal window
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
}
}
FieldNotes
nights[].priceMinor units per night
nights[].season / holidayRuleWhat set the price; null = the unit’s base price applies
baseMinStayThe unit’s own minimum
seasonMinStayHighest seasonal minimum touched by the range; 0 when none applies. A stay must satisfy max(baseMinStay, seasonMinStay)
lengthOfStayDiscounts.tiersThe 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).

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.