Create Timeslot
A timeslot defines when a resource is open for booking. It wraps a Schedule with a name, is owned by an organization, and does nothing on its own until attached to a bookable. See Schedule for the full pattern reference.
Request
POST /timeslot
{
"name": "Office Hours",
"description": "Weekday opening hours",
"owner_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"schedule": {
"start_date": "2026-05-04T00:00:00Z",
"end_date": "2026-08-04T00:00:00Z",
"time_zone": "Europe/Oslo",
"available": true,
"pattern": {
"type": "weekly",
"interval": 1,
"days_of_week": [1, 2, 3, 4, 5],
"times": ["09:00/PT8H"]
}
}
}WARNING
available: true is required. If omitted, the schedule stores available: false, which the booking engine reads as a blocking window and every booking inside the time range returns 409 Conflict. See Schedule.
Response
{
"data": {
"id": "6c7639aa-60fd-4e14-8a85-734aaa71c483",
"name": "Office Hours",
"description": "Weekday opening hours",
"schedule": {
"id": "61fbaa2f-269f-449f-b39d-289cab46fd62",
"start_date": "2026-05-04T00:00:00Z",
"end_date": "2026-08-04T00:00:00Z",
"pattern": {
"type": "weekly",
"interval": 1,
"days_of_week": [1, 2, 3, 4, 5],
"times": ["09:00/PT8H"]
},
"time_zone": "Europe/Oslo",
"available": true
},
"owner_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"created_by": "e992bfc1-0336-42c5-bd0a-4f4804a9fd24",
"created_at": "2026-05-11T22:14:28.192411Z",
"updated_at": "2026-05-11T22:14:28.192411Z"
},
"request_id": "65d4468c-099e-40ec-952c-76c1bb7be30b",
"count": 1
}More patterns
Every Monday and Wednesday, 09:00 to 12:00, no end date:
{
"name": "Class Schedule",
"owner_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"schedule": {
"start_date": "2026-01-05T00:00:00Z",
"time_zone": "Europe/Oslo",
"available": true,
"pattern": {
"type": "weekly",
"interval": 1,
"days_of_week": [1, 3],
"times": ["09:00/PT3H"]
}
}
}First Monday of every month, full day:
{
"name": "Monthly Town Hall",
"owner_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"schedule": {
"start_date": "2026-01-05T00:00:00Z",
"time_zone": "Europe/Oslo",
"available": true,
"pattern": {
"type": "monthly",
"interval": 1,
"days_of_week": [1],
"weeks_of_month": [1],
"times": ["00:00/PT24H"]
}
}
}Attaching the timeslot
A timeslot has no effect until it is attached to a bookable. Use POST /timeslot/{id}/object with the target resource:
{
"object_id": "c3d4e5f6-a7b8-9012-cdef-345678901234",
"object_type": "public.bookable",
"priority": 0
}The same timeslot can be attached to multiple bookables. To attach from the resource side instead, PUT /bookable/{id}/timeslot sets the full list of timeslots on a bookable at once. The equivalent exists on location and organization as well.
See the Bookable API for full request and response shapes.