Skip to content

Resources, room types, and rate plans

A resource is the bookable thing — a meeting room, a desk, a studio, a hotel room, a villa. Every resource belongs to one tenant (the operator you’re integrating for). vertical tells you how it is sold:

  • hourly — sold by the hour in slots. See Hourly spaces and services.
  • lodging — sold by the night.
  • equipment — a rental unit. Not available yet: rental quotes answer 503 rental_unavailable.

Lodging resources usually have a room type (max occupancy, max adults, max children) and one or more rate plans — the price policy for a stay: currency, refundable or not, minimum/maximum stay nights, whether the plan is closed to arrival or departure on certain days. An hourly space has no room type and no rate plan.

Terminal window
curl https://api.<domain>/v1/resources/<RESOURCE_ID> \
-H "Authorization: Bearer sk_test_..."
{
"id": "<RESOURCE_ID>",
"kind": "room",
"name": "Deluxe Garden View",
"capacity": 3,
"currency": "IDR",
"slug": "deluxe-garden-view",
"photoUrls": [],
"vertical": "lodging",
"timezone": null,
"slotConfig": null,
"roomType": {
"id": "...",
"code": "DLX",
"name": "Deluxe",
"maxOccupancy": 3,
"maxAdults": 2,
"maxChildren": 1,
"vertical": "lodging"
},
"ratePlans": [
{
"id": "...",
"code": "BAR",
"name": "Best Available Rate",
"currency": "IDR",
"isRefundable": true,
"minStayNights": 1,
"maxStayNights": null,
"closedToArrival": false,
"closedToDeparture": false,
"enabled": true
}
]
}

You need a rate plan’s id before you can request a quote for a resource that has a room type — see Quotes. A resource with no room type (a generic bookable resource) skips ratePlanId entirely when quoting.

An hourly space looks like this. It has vertical: "hourly", a timezone (or null to use the tenant’s zone), and a slotConfig. It has no roomType and no ratePlans:

{
"id": "0192f0c4-7d2e-7a10-9a51-3f6f2b1c9e01",
"kind": "meeting_room",
"name": "Ruang Rapat A",
"capacity": 8,
"currency": "IDR",
"slug": "ruang-rapat-a",
"photoUrls": [],
"vertical": "hourly",
"timezone": "Asia/Jakarta",
"slotConfig": {
"durationsMinutes": [60, 240],
"maxAdvanceDays": 90,
"minNoticeMinutes": 60,
"perHourMinorUnits": "150000"
},
"roomType": null,
"ratePlans": []
}
  • slotConfig.durationsMinutes lists the lengths a guest can book. Use it to build a duration picker.
  • perHourMinorUnits is null until the operator sets a price.
  • vertical cannot change after the resource is created.

GET /v1/resources lists every resource for your tenant, cursor-paginated: pass ?cursor= from the previous response’s nextCursor, never an offset.