Bookable Type
A type groups bookables that share a purpose. "Meeting Room" can cover every meeting room in the organization, "EV Charger" every charging station. Once a type exists, clients can ask "find me any free meeting room" instead of naming a specific one.
Reading time across a type
The same triple offered on a single bookable is offered on a type, rolled up across every bookable assigned to the type that the caller can see.
GET /bookable_type/{id}/booking returns the raw booking rows across the type. Recurring bookings stay as single rows.
GET /bookable_type/{id}/calendar expands recurrence and returns one entry per occurrence inside the queried window, unioned across every bookable of the type.
GET /bookable_type/{id}/available computes the free surface across every bookable of the type. This is the call a "book any meeting room" search relies on, since it shows every room that has free time inside the window.
See Calendar and Availability for how the calendar and available views compose.
Attachments
A type can carry capabilities, actions and timeslots through its sub resource endpoints. These attachments have no effect on availability calculations, booking conflict checks, or capability and action resolution. Availability, booking enforcement, and action matching all read from the bookable directly, its location chain, and its organization chain. Type attachments are stored on the type and returned through its own sub-resource endpoints only.
API
The Bookable Type tag covers type CRUD, the bookables in a type, the three time views above, and the capabilities, actions, timeslots and audit log on the type itself.