Units & occupancy
All four endpoints need landlord:read:units.
GET /units
Section titled “GET /units”Every apartment you hold or held, with the tenure that ties it to you. A
unit you sold stays listed with tenure.current: false, so your history keeps
reading — but nothing after the sale date is yours.
{ "units": [ { "id": "0190c…", "slug": "marina-loft-2br", "name": "Marina Loft · 2BR", "status": "published", "city": "Dubai", "area": "Dubai Marina", "building": "Marina Heights", "address": "Marina Heights, Tower B", "bedrooms": 2, "beds": 3, "bathrooms": 2, "maxGuests": 5, "sizeSqm": 118, "checkinTime": "15:00", "checkoutTime": "11:00", "petsAllowed": false, "tourUrl": "https://my.matterport.com/show/?m=…", "coverPhoto": "/static/photos/marina-stays/marina-loft-2br/cover.webp", "tenure": { "sharePct": 100, "commissionPct": 18, "validFrom": "2024-03-01", "validTo": null, "current": true } } ]}tenure.commissionPct is the agency fee that actually applies to your stays —
resolved from the unit override, your landlord override and the agency default,
in that order. coverPhoto is relative to https://api.myrentalcalendar.com.
GET /units/:slug
Section titled “GET /units/:slug”One of your apartments, same shape. 404 NOT_FOUND for anything that is not
inside one of your tenures — including apartments that exist but belong to
someone else.
GET /availability
Section titled “GET /availability”| Query parameter | Required | Meaning |
|---|---|---|
unit | yes | Unit slug |
from / to | yes | [from, to), at most 366 days |
{ "unit": "marina-loft-2br", "from": "2026-10-01", "to": "2026-11-01", "blockedNights": ["2026-10-03", "2026-10-04", "2026-10-05"] }Blocked nights are stays of any kind, your own blocks, and the cleaning block after a checkout. A night not listed is free — which is what you check before blocking dates for yourself.
GET /bookings
Section titled “GET /bookings”Anonymised occupancy inside your tenure. Stays are attributed by arrival date: a stay that arrived before you bought the unit belongs to the seller and does not appear.
| Query parameter | Meaning |
|---|---|
from / to | Stays with departure ≥ from and arrival ≤ to |
unit | Unit slug |
page / pageSize | 1-based page, 1–200 rows (default 100); newest arrival first |
{ "bookings": [ { "id": "0191a…", "unitSlug": "marina-loft-2br", "unitName": "Marina Loft · 2BR", "type": "guest", "status": "confirmed", "source": "airbnb", "arrival": "2026-10-03", "departure": "2026-10-06", "nights": 3, "adults": 2, "children": 0, "totalAmount": 168000, "currency": "AED", "earlyCheckin": null, "lateCheckout": null, "cleanedAt": null, "createdAt": "2026-09-12T10:22:00.000Z" }, { "id": "0191e…", "type": "owner_stay", "status": "confirmed", "source": "direct", "arrival": "2026-10-20", "departure": "2026-10-27", "nights": 7, "adults": 2, "children": 0, "totalAmount": 0, "…": "…" } ], "page": 1, "pageSize": 100, "totalItems": 41, "pageCount": 1}| Field | Notes |
|---|---|
type | guest (revenue), owner_stay (your own use), block, maintenance |
totalAmount | Gross amount of a guest stay — what the statement’s gross column shows; 0 for everything else |
cleanedAt | When housekeeping reported the turnover done |
There is no guest name, e-mail or phone here, and there will not be.
GET /bookings/:id
Section titled “GET /bookings/:id”One stay inside your tenure, same fields. 404 NOT_FOUND otherwise.