Skip to content

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

json
{
  "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

json
{
  "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:

json
{
  "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:

json
{
  "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:

json
{
  "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.