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 answer503 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.
curl https://api.<domain>/v1/resources/<RESOURCE_ID> \ -H "Authorization: Bearer sk_test_..."const { data: resource, error } = await client.GET("/v1/resources/{id}", { params: { path: { id: "<RESOURCE_ID>" } },});if (error) throw error;{ "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.durationsMinuteslists the lengths a guest can book. Use it to build a duration picker.perHourMinorUnitsisnulluntil the operator sets a price.verticalcannot 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.