Booking Calendars
Retrieve booking-focused calendar data and occupancy counts for display in calendar UIs. This endpoint belongs to the Bookings surface, even though the aggregate route itself lives in the misc path file.
For general conventions, see JSON-API Conventions. For availability search, see Availability & Booking Search.
Prerequisites
- At least one resource with a configured schedule
- Public endpoint — no authentication required for basic usage
Unified Calendar View
Request path documentation:
paths/public/misc.yamlforGET /api/v1/calendar-events
The main endpoint aggregates multiple data sources into a single response:
GET /api/v1/calendar-events?resource_id={resource_uuid}&start_date=2026-04-01T00:00:00Z&end_date=2026-04-30T23:59:59Z
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
resource_id |
string/array | Yes | Single UUID or array of resource UUIDs |
start_date |
string | No | Range start (ISO 8601). Defaults to current time. |
end_date |
string | No | Range end (ISO 8601) |
timezone |
string | No | Timezone for local date calculations (e.g. Europe/Berlin) |
filter[exclude_child_resources] |
boolean | No | Only show parent resource data |
Multiple Resources
Query multiple resources in a single request:
GET /api/v1/calendar-events?resource_id[]={uuid_1}&resource_id[]={uuid_2}&start_date=2026-04-01T00:00:00Z
Event Types
The response contains events of different types, combined from booking and availability data sources:
| Type | Description |
|---|---|
period |
A raw availability slot from the resource's schedule |
period_fragment |
Remaining availability after bookings are subtracted |
booking |
An accepted booking (includes customer data for small-capacity resources) |
reserved_booking |
A temporary hold — no customer details exposed |
blocker |
A manually blocked time slot included in the aggregated calendar response |
booking_count |
Aggregated booking count for high-capacity resources (>25 slots) |
Response Structure
{
"data": {
"events": [
{
"id": "event-uuid",
"type": "booking",
"start_date": "2026-04-15T10:00:00Z",
"end_date": "2026-04-15T11:00:00Z",
"resource_id": "res-uuid",
"resource_name": "Meeting Room A",
"quota": 1,
"occupancy": 1.0,
"is_available": false,
"is_blocker": false,
"display_label": "Jane Doe - Workshop",
"customers": [
{ "id": "cust-1", "first_name": "Jane", "last_name": "Doe" }
],
"bookings": [
{ "id": "book-uuid", "status": "accepted" }
],
"color_map": { "bg": "#3b82f6", "text": "#ffffff" }
},
{
"id": "period-uuid",
"type": "period_fragment",
"start_date": "2026-04-15T11:00:00Z",
"end_date": "2026-04-15T18:00:00Z",
"resource_id": "res-uuid",
"is_available": true,
"quota": 1,
"occupancy": 0.0
}
],
"resources_with_schedule": ["res-uuid"]
}
}
Capacity-Based Rendering
The API adapts its response based on resource capacity:
- Small resources (capacity ≤ 25): Returns individual
bookingevents with customer details. Use these to render detailed calendar entries. - Large resources (capacity > 25): Returns
booking_countevents with aggregated occupancy numbers. Use these for heatmap or occupancy bar display.
Booking Detail Preview
For calendar detail views, use the booking preview endpoint to get a summary of a specific booking without fetching the full resource:
GET /api/v1/customer-accounts/{account_id}/booking-preview/{booking_id}
Common Patterns
Daily Calendar View
GET /api/v1/calendar-events?resource_id={uuid}&start_date=2026-04-15T00:00:00Z&end_date=2026-04-15T23:59:59Z&timezone=Europe/Berlin
Weekly Multi-Resource View
GET /api/v1/calendar-events?resource_id[]={uuid_1}&resource_id[]={uuid_2}&start_date=2026-04-14T00:00:00Z&end_date=2026-04-20T23:59:59Z
Common Errors
| Error | Cause | Solution |
|---|---|---|
Empty events array |
Resource has no schedule configured | Verify the resource has an active schedule |
| Missing customer data | High-capacity resource | Use booking_count events instead of individual bookings |
422 — resource_id required |
Missing parameter | Always include at least one resource_id |