Model each asset as a resource, define turnover buffers and grid alignment in policy, and book through a single API. Native inventory with atomic holds and conflict detection - no calendar middleware.
{
"startTime": "2026-03-01T09:00:00Z",
"endTime": "2026-03-01T18:00:00Z",
"durationMs": 3600000
}→ 200
{
"slots": [
{ "startTime": "10:00", "endTime": "11:00"},
{ "startTime": "11:15", "endTime": "12:15"},
...
]
}One hold per time range at the database level. Second request gets 409.
After-buffers for resets, prep, and cleaning. Enforced in all queries.
Block resources for maintenance or setup. Respected in all queries.
Everything you need to handle real-world booking complexity out of the box.
Create resources via API - no external calendar dependency. Each resource has its own timezone, metadata (capacity, section, floor), and availability rules.
POST /availability/slots returns grid-aligned, policy-compliant time slots. 1-hour meeting rooms, 2-hour studio sessions, 30-minute court bookings.
Configure after-buffers per service for reset, sanitization, or prep time. Buffers are subtracted from availability automatically - your slot responses only return bookable times.
Snap booking start times to 15 or 30-minute boundaries via policy rules. No odd start times - clean, predictable schedules.
Block time for maintenance, events, or breaks without creating a booking. Allocations are first-class objects enforced in all availability calculations.
Group resources under a service. A booking request checks availability across all assigned resources - rooms on a floor, desks in a zone, courts in a facility.
3 API calls. Hold, confirm, done.
POST /v1/allocations
{
"resourceId": "rsc_room_a",
"startTime": "2026-03-01T08:00:00Z",
"endTime": "2026-03-01T09:00:00Z"
}→ { "id": "alc_mnt_1", "resourceId": "rsc_room_a" }Maintenance block respected in all availability queries.
POST /v1/services/{id}/availability/slots
{
"startTime": "2026-03-01T09:00:00Z",
"endTime": "2026-03-01T18:00:00Z",
"durationMs": 3600000
}→ { "slots": [{ "startTime": "10:00", "endTime": "11:00" }, ...] }9:00 blocked by maintenance. Slots start at 10:00.
POST /v1/bookings
{
"serviceId": "svc_rooms",
"resourceId": "rsc_room_a",
"startTime": "2026-03-01T10:00:00Z",
"endTime": "2026-03-01T11:00:00Z"
}→ { "id": "bkg_rm_1", "status": "hold" }Holds expire automatically after a TTL. Conflicts are handled at the database level.