GoHighLevel Calendars API
Create Calendar
/calendars/POST /calendars/ Create calendar in a location It takes 59 body fields, requires the calendars.write scope and authenticates with a sub-account (location) token.
Request and authentication
- Method
POST- Full URL
https://services.leadconnectorhq.com/calendars/- Scopes
calendars.write- Token type
- Sub-account (location) token
- Accepted auth
- OAuth Access Token, Private Integration Token
- API version header
Version: 2021-07-28- Schema verified
- 22 June 2026
Notes from the field
- For a personal calendar (`calendarType: 'personal'`), `teamMembers` must contain EXACTLY ONE member.
- `slug` must be unique for the location; check availability if the user cares about the booking URL.
Request body
JSON body fields. Nested objects are shown indented under their parent.
| Name | Type | Description |
|---|---|---|
isActive | boolean | Should the created calendar be active or draft |
notifications | array | 🚨 Deprecated! Please use 'Calendar Notifications APIs' instead. |
locationIdrequired | string | Example: |
groupId | string | Group Id Example: |
teamMembers | array | Team members are required for calendars of type: Round Robin, Collective, Class, Service. Personal calendar must have exactly one team member. |
eventType | string | One of: |
namerequired | string | Example: |
description | string | Example: |
slug | string | Example: |
widgetSlug | string | Example: |
calendarType | string | One of: |
widgetType | string | Calendar widget type. Choose "default" for "neo" and "classic" for "classic" layout. One of: Example: |
eventTitle | string | — |
eventColor | string | — |
meetingLocation | string | 🚨 Deprecated! Use locationConfigurations.location or teamMembers[].locationConfigurations.location instead. |
locationConfigurations | array | Meeting location configuration for event calendar |
slotDuration | number | This controls the duration of the meeting |
slotDurationUnit | string | Unit for slot duration. One of: |
slotInterval | number | Slot interval reflects the amount of time the between booking slots that will be shown in the calendar. |
slotIntervalUnit | string | Unit for slot interval. One of: |
slotBuffer | number | Slot-Buffer is additional time that can be added after an appointment, allowing for extra time to wrap up |
slotBufferUnit | string | Unit for slot buffer. One of: |
preBuffer | number | Pre-Buffer is additional time that can be added before an appointment, allowing for extra time to get ready |
preBufferUnit | string | Unit for pre-buffer. One of: |
appoinmentPerSlot | number | Maximum bookings per slot (per user). Maximum seats per slot in case of Class Booking Calendar. |
appoinmentPerDay | number | Number of appointments that can be booked for a given day |
allowBookingAfter | number | Minimum scheduling notice for events |
allowBookingAfterUnit | string | Unit for minimum scheduling notice One of: Example: |
allowBookingFor | number | Minimum number of days/weeks/months for which to allow booking events |
allowBookingForUnit | string | Unit for controlling the duration for which booking would be allowed for One of: Example: |
openHours | array | This is only to set the standard availability. For custom availability, use the availabilities property |
enableRecurring | boolean | Enable recurring appointments for the calendars. Please note that only one member should be added in the calendar to enable this |
recurring | object | — |
freq | string | One of: |
count | number | Number of recurrences |
bookingOption | string | This setting contols what to do incase a recurring slot is unavailable One of: |
bookingOverlapDefaultStatus | string | This setting contols what to do incase a recurring slot is unavailable One of: |
formId | string | — |
stickyContact | boolean | — |
isLivePaymentMode | boolean | — |
autoConfirm | boolean | — |
shouldSendAlertEmailsToAssignedMember | boolean | — |
alertEmail | string | — |
googleInvitationEmails | boolean | — |
allowReschedule | boolean | — |
allowCancellation | boolean | — |
shouldAssignContactToTeamMember | boolean | — |
shouldSkipAssigningContactForExisting | boolean | — |
notes | string | — |
pixelId | string | — |
formSubmitType | string | One of: |
formSubmitRedirectURL | string | — |
formSubmitThanksMessage | string | — |
availabilityType | number | Determines which availability type to consider: - 1: Only custom availabilities will be used. - 0: Only open hours will be used. - null: Both custom availabilities and open hours will be considered. One of: |
availabilities | array | This is only to set the custom availability. For standard availability, use the openHours property |
guestType | string | One of: |
consentLabel | string | — |
calendarCoverImage | string | Example: |
lookBusyConfig | unknown | Look Busy Configuration |
Response fields
Top-level fields returned on a successful call.
| Name | Type | Description |
|---|---|---|
calendarrequired | object | — |
isActive | boolean | Should the created calendar be active or draft |
notifications | array | 🚨 Deprecated! Please use 'Calendar Notifications APIs' instead. |
locationIdrequired | string | Example: |
groupId | string | Group Id Example: |
teamMembers | array | Team members are for calendars of type: Round Robin, Collective, Class, Service. Personal calendar must have exactly one team member. |
eventType | string | One of: |
namerequired | string | Example: |
description | string | Example: |
slug | string | Example: |
widgetSlug | string | Example: |
calendarType | string | One of: |
widgetType | string | Calendar widget type. Choose "default" for "neo" and "classic" for "classic" layout. One of: Example: |
eventTitle | string | — |
eventColor | string | — |
meetingLocation | string | 🚨 Deprecated! Use locationConfigurations.location or teamMembers[].locationConfigurations.location instead. |
locationConfigurations | array | Meeting location configuration for event calendar |
slotDuration | number | This controls the duration of the meeting |
slotDurationUnit | string | Unit for slot duration. One of: |
slotInterval | number | Slot interval reflects the amount of time the between booking slots that will be shown in the calendar. |
slotIntervalUnit | string | Unit for slot interval. One of: |
slotBuffer | number | Slot-Buffer is additional time that can be added after an appointment, allowing for extra time to wrap up |
slotBufferUnit | string | Unit for slot buffer. One of: |
preBuffer | number | Pre-Buffer is additional time that can be added before an appointment, allowing for extra time to get ready |
preBufferUnit | string | Unit for pre-buffer. One of: |
appoinmentPerSlot | number | Maximum bookings per slot (per user). Maximum seats per slot in case of Class Booking Calendar. |
Example request
Copy-paste ready. Swap YOUR_TOKEN for your access token or Private Integration Token.
curl -X POST 'https://services.leadconnectorhq.com/calendars/' \
-H 'Authorization: Bearer YOUR_TOKEN' \
-H 'Version: 2021-07-28' \
-H 'Content-Type: application/json' \
-d '{
"locationId": "ocQHyuzHvysMo5N5VsXc",
"name": "test calendar"
}'Skip the schema lookup
Hylo gives your AI agent this schema — and the other 52 documented here — without you looking anything up. Ask in plain English; it picks the endpoint, fills the body, and can run the call against your own sub-account.
More calendars endpoints
- Create Calendar ResourcePOST /calendars/resources/:resourceType
- Create Event NotificationPOST /calendars/:calendarId/notifications
- Create SchedulePOST /calendars/schedules
- Edit Block SlotPUT /calendars/events/block-slots/:eventId
- Fetch Calendar ResourcesGET /calendars/resources/:resourceType
- Find Event NotificationGET /calendars/:calendarId/notifications/:notificationId
- All GoHighLevel Calendars endpointsCategory index
- GoHighLevel API referenceEvery category, webhooks, and OAuth scopes