openapi: 3.0.0
info:
title: Cal.diy API v2 Api Keys Slots API
description: ''
version: 1.0.0
contact: {}
servers: []
tags:
- name: Slots
paths:
/v2/slots:
get:
operationId: SlotsController_2024_09_04_getAvailableSlots
summary: Get available time slots for an event type
description: "\n There are 4 ways to get available slots for event type of an individual user:\n\n 1. By event type id. Example '/v2/slots?eventTypeId=10&start=2050-09-05&end=2050-09-06&timeZone=Europe/Rome'\n\n 2. By event type slug + username. Example '/v2/slots?eventTypeSlug=intro&username=bob&start=2050-09-05&end=2050-09-06'\n\n 3. By event type slug + username + organization slug when searching within an organization. Example '/v2/slots?organizationSlug=org-slug&eventTypeSlug=intro&username=bob&start=2050-09-05&end=2050-09-06'\n\n 4. By usernames only (used for dynamic event type - there is no specific event but you want to know when 2 or more people are available). Example '/v2/slots?usernames=alice,bob&username=bob&organizationSlug=org-slug&start=2050-09-05&end=2050-09-06'. As you see you also need to provide the slug of the organization to which each user in the 'usernames' array belongs.\n\n And 3 ways to get available slots for team event type:\n\n 1. By team event type id. Example '/v2/slots?eventTypeId=10&start=2050-09-05&end=2050-09-06&timeZone=Europe/Rome'.\n **Note for managed event types**: Managed event types are templates that create individual child event types for each team member. You cannot fetch slots for the parent managed event type directly. Instead, you must:\n - Find the child event type IDs (the ones assigned to specific users)\n - Use those child event type IDs to fetch slots as individual user event types using as described in the individual user section above.\n\n 2. By team event type slug + team slug. Example '/v2/slots?eventTypeSlug=intro&teamSlug=team-slug&start=2050-09-05&end=2050-09-06'\n\n 3. By team event type slug + team slug + organization slug when searching within an organization. Example '/v2/slots?organizationSlug=org-slug&eventTypeSlug=intro&teamSlug=team-slug&start=2050-09-05&end=2050-09-06'\n\n All of them require \"start\" and \"end\" query parameters which define the time range for which available slots should be checked.\n Optional parameters are:\n - timeZone: Time zone in which the available slots should be returned. Defaults to UTC.\n - duration: Only use for event types that allow multiple durations or for dynamic event types. If not passed for multiple duration event types defaults to default duration. For dynamic event types defaults to 30 aka each returned slot is 30 minutes long. So duration=60 means that returned slots will be each 60 minutes long.\n - format: Format of the slots. By default return is an object where each key is date and value is array of slots as string. If you want to get start and end of each slot use \"range\" as value.\n - bookingUidToReschedule: When rescheduling an existing booking, provide the booking's unique identifier to exclude its time slot from busy time calculations. This ensures the original booking time appears as available for rescheduling.\n\n Please make sure to pass in the cal-api-version header value as mentioned in the Headers section. Not passing the correct value will default to an older version of this endpoint.\n "
parameters:
- name: cal-api-version
in: header
description: Must be set to 2024-09-04. If not set to this value, the endpoint will default to an older version.
required: true
schema:
type: string
default: '2024-09-04'
- name: bookingUidToReschedule
required: false
in: query
description: The unique identifier of the booking being rescheduled. When provided will ensure that the original booking time appears within the returned available slots when rescheduling.
schema:
example: abc123def456
type: string
- name: start
required: true
in: query
description: "\n Time starting from which available slots should be checked.\n\n Must be in UTC timezone as ISO 8601 datestring.\n\n You can pass date without hours which defaults to start of day or specify hours:\n 2024-08-13 (will have hours 00:00:00 aka at very beginning of the date) or you can specify hours manually like 2024-08-13T09:00:00Z."
schema:
example: '2050-09-05'
type: string
- name: end
required: true
in: query
description: "\n Time until which available slots should be checked.\n\n Must be in UTC timezone as ISO 8601 datestring.\n\n You can pass date without hours which defaults to end of day or specify hours:\n 2024-08-20 (will have hours 23:59:59 aka at the very end of the date) or you can specify hours manually like 2024-08-20T18:00:00Z."
schema:
example: '2050-09-06'
type: string
- name: organizationSlug
required: false
in: query
description: The slug of the organization to which user with username belongs or team with teamSlug belongs.
schema:
example: org-slug
type: string
- name: teamSlug
required: false
in: query
description: The slug of the team who owns event type with eventTypeSlug - used when slots are checked for team event type.
schema:
example: team-slug
type: string
- name: username
required: false
in: query
description: The username of the user who owns event type with eventTypeSlug - used when slots are checked for individual user event type.
schema:
example: bob
type: string
- name: eventTypeSlug
required: false
in: query
description: The slug of the event type for which available slots should be checked. If slug is provided then username or teamSlug must be provided too and if relevant organizationSlug too.
schema:
example: event-type-slug
type: string
- name: eventTypeId
required: false
in: query
description: The ID of the event type for which available slots should be checked.
schema:
example: '100'
type: number
- name: usernames
required: false
in: query
description: "The usernames for which available slots should be checked separated by a comma.\n\n Checking slots by usernames is used mainly for dynamic events where there is no specific event but we just want to know when 2 or more people are available.\n\n Must contain at least 2 usernames."
schema:
example: alice,bob
type: string
- name: format
required: false
in: query
description: Format of slot times in response. Use 'range' to get start and end times. Use 'time' or omit this query parameter to get only start time.
schema:
example: range
type: string
- name: duration
required: false
in: query
description: If event type has multiple possible durations then you can specify the desired duration here. Also, if you are fetching slots for a dynamic event then you can specify the duration her which defaults to 30, meaning that returned slots will be each 30 minutes long.
schema:
example: '60'
type: number
- name: timeZone
required: false
in: query
description: Time zone in which the available slots should be returned. Defaults to UTC.
schema:
example: Europe/Rome
type: string
responses:
'200':
description: "A map of available slots indexed by date, where each date is associated with an array of time slots. If format=range is specified, each slot will be an object with start and end properties denoting start and end of the slot.\n For seated slots each object will have attendeesCount and bookingUid properties.\n If no slots are available, the data field will be an empty object {}."
content:
application/json:
schema:
oneOf:
- type: object
title: Default format (or with format=time)
additionalProperties:
type: array
items:
type: string
example:
status: success
data:
'2050-09-05':
- start: '2050-09-05T09:00:00.000+02:00'
- start: '2050-09-05T10:00:00.000+02:00'
'2050-09-06':
- start: '2050-09-06T09:00:00.000+02:00'
- start: '2050-09-06T10:00:00.000+02:00'
- type: object
title: Range format (when format=range)
additionalProperties:
type: array
items:
type: object
properties:
start:
type: string
end:
type: string
example:
status: success
data:
'2050-09-05':
- start: '2050-09-05T09:00:00.000+02:00'
end: '2050-09-05T10:00:00.000+02:00'
- start: '2050-09-05T10:00:00.000+02:00'
end: '2050-09-05T11:00:00.000+02:00'
'2050-09-06':
- start: '2050-09-06T09:00:00.000+02:00'
end: '2050-09-06T10:00:00.000+02:00'
- start: '2050-09-06T10:00:00.000+02:00'
end: '2050-09-06T11:00:00.000+02:00'
tags:
- Slots
/v2/slots/reservations:
post:
operationId: SlotsController_2024_09_04_reserveSlot
summary: Reserve a slot
description: "Make a slot not available for others to book for a certain period of time. If you authenticate using oAuth credentials, api key or access token\n then you can also specify custom duration for how long the slot should be reserved for (defaults to 5 minutes).\n \n Please make sure to pass in the cal-api-version header value as mentioned in the Headers section. Not passing the correct value will default to an older version of this endpoint. \n "
parameters:
- name: cal-api-version
in: header
description: Must be set to 2024-09-04. If not set to this value, the endpoint will default to an older version.
required: true
schema:
type: string
default: '2024-09-04'
- name: Authorization
in: header
description: value must be `Bearer ` where `` is api key prefixed with cal_ or managed user access token
required: false
schema:
type: string
- name: x-cal-client-id
in: header
description: For platform customers - OAuth client ID
required: false
schema:
type: string
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/ReserveSlotInput_2024_09_04'
responses:
'201':
description: ''
content:
application/json:
schema:
$ref: '#/components/schemas/ReserveSlotOutputResponse_2024_09_04'
tags:
- Slots
/v2/slots/reservations/{uid}:
get:
operationId: SlotsController_2024_09_04_getReservedSlot
summary: Get reserved slot
description: Please make sure to pass in the cal-api-version header value as mentioned in the Headers section. Not passing the correct value will default to an older version of this endpoint.
parameters:
- name: cal-api-version
in: header
description: Must be set to 2024-09-04. If not set to this value, the endpoint will default to an older version.
required: true
schema:
type: string
default: '2024-09-04'
- name: uid
required: true
in: path
schema:
type: string
responses:
'200':
description: ''
content:
application/json:
schema:
$ref: '#/components/schemas/GetReservedSlotOutput_2024_09_04'
tags:
- Slots
patch:
operationId: SlotsController_2024_09_04_updateReservedSlot
summary: Update a reserved slot
description: Please make sure to pass in the cal-api-version header value as mentioned in the Headers section. Not passing the correct value will default to an older version of this endpoint.
parameters:
- name: cal-api-version
in: header
description: Must be set to 2024-09-04. If not set to this value, the endpoint will default to an older version.
required: true
schema:
type: string
default: '2024-09-04'
- name: uid
required: true
in: path
schema:
type: string
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/ReserveSlotInput_2024_09_04'
responses:
'200':
description: ''
content:
application/json:
schema:
$ref: '#/components/schemas/ReserveSlotOutputResponse_2024_09_04'
tags:
- Slots
delete:
operationId: SlotsController_2024_09_04_deleteReservedSlot
summary: Delete a reserved slot
description: Please make sure to pass in the cal-api-version header value as mentioned in the Headers section. Not passing the correct value will default to an older version of this endpoint.
parameters:
- name: cal-api-version
in: header
description: Must be set to 2024-09-04. If not set to this value, the endpoint will default to an older version.
required: true
schema:
type: string
default: '2024-09-04'
- name: uid
required: true
in: path
schema:
type: string
responses:
'200':
description: ''
content:
application/json:
schema:
type: object
example:
status: success
tags:
- Slots
components:
schemas:
ReserveSlotInput_2024_09_04:
type: object
properties:
eventTypeId:
type: number
example: 1
description: The ID of the event type for which slot should be reserved.
slotStart:
type: string
example: '2024-09-04T09:00:00Z'
description: ISO 8601 datestring in UTC timezone representing available slot.
slotDuration:
type: number
example: '30'
description: By default slot duration is equal to event type length, but if you want to reserve a slot for an event type that has a variable length you can specify it here as a number in minutes. If you don't have this set explicitly that event type can have one of many lengths you can omit this.
reservationDuration:
type: number
example: 5
description: "ONLY for authenticated requests with api key, access token or OAuth credentials (ID + secret).\n \n For how many minutes the slot should be reserved - for this long time noone else can book this event type at `start` time. If not provided, defaults to 5 minutes."
required:
- eventTypeId
- slotStart
GetReservedSlotOutput_2024_09_04:
type: object
properties:
status:
type: string
example: success
enum:
- success
- error
data:
nullable: true
allOf:
- $ref: '#/components/schemas/GetReservedSlotOutput_2024_09_04'
required:
- status
- data
ReserveSlotOutput_2024_09_04:
type: object
properties:
eventTypeId:
type: number
example: 1
description: The ID of the event type for which slot was reserved.
slotStart:
type: string
example: '2024-09-04T09:00:00Z'
description: ISO 8601 datestring in UTC timezone representing available slot.
slotEnd:
type: string
example: '2024-09-04T10:00:00Z'
description: ISO 8601 datestring in UTC timezone representing slot end.
slotDuration:
type: number
example: '30'
description: By default slot duration is equal to event type length, but if you want to reserve a slot for an event type that has a variable length you can specify it here. If you don't have this set explicitly that event type can have one of many lengths you can omit this.
reservationUid:
type: string
example: e84be5a3-4696-49e3-acc7-b2f3999c3b94
description: The unique identifier of the reservation. Use it to update, get or delete the reservation.
reservationDuration:
type: number
example: 5
description: For how many minutes the slot is reserved - for this long time noone else can book this event type at `start` time.
reservationUntil:
type: string
example: '2023-09-04T10:00:00Z'
description: ISO 8601 datestring in UTC timezone representing time until which the slot is reserved.
required:
- eventTypeId
- slotStart
- slotEnd
- slotDuration
- reservationUid
- reservationDuration
- reservationUntil
ReserveSlotOutputResponse_2024_09_04:
type: object
properties:
status:
type: string
example: success
enum:
- success
- error
data:
$ref: '#/components/schemas/ReserveSlotOutput_2024_09_04'
required:
- status
- data