Skip to main content
CAL
Step-by-Step Setup 10-15 minutes

Calendar CRUD Setup

Calendars & Scheduling Intermediate
Need more detail? Read the full guide for config deep-dives and best practices.

Calendar CRUD Setup

Manage GoHighLevel calendars programmatically with full create, read, update, and delete operations. Configure availability windows, buffer times, and booking settings through the API.

Prerequisites

Before you begin, confirm the following:

  • A GoHighLevel sub-account with calendar access enabled
  • A Private Integration Token (PIT) with the calendars scope enabled
  • Your locationId from Settings > Business Info
  • At least one team member whose calendar you want to manage
  • A REST client like Postman, Insomnia, or curl installed

Set Up Authentication

Calendar endpoints require a Bearer token with the calendars scope.

  1. Go to Settings > Integrations > Private Integrations
  2. Click Create Private Integration (or use an existing one)
  3. Name it “Calendar Manager” or similar
  4. Under Scopes, enable calendars (read and write)
  5. Click Save and copy the token
export GHL_TOKEN="your-private-integration-token"
export LOCATION_ID="your-location-id"

Required headers:

Authorization: Bearer $GHL_TOKEN
Content-Type: application/json
Version: 2021-07-28

Make Your First Call

List all calendars in your sub-account:

curl -X GET "https://services.leadconnectorhq.com/calendars/?locationId=$LOCATION_ID" \
  -H "Authorization: Bearer $GHL_TOKEN" \
  -H "Version: 2021-07-28"

Create a new calendar:

curl -X POST "https://services.leadconnectorhq.com/calendars/" \
  -H "Authorization: Bearer $GHL_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Version: 2021-07-28" \
  -d '{
    "locationId": "'"$LOCATION_ID"'",
    "name": "Discovery Calls",
    "description": "30-minute discovery call calendar",
    "slug": "discovery-calls",
    "widgetSlug": "discovery-calls",
    "calendarType": "round_robin",
    "widgetType": "default",
    "eventTitle": "Discovery Call with {{contact.name}}",
    "eventColor": "#4287f5",
    "meetingLocation": "Zoom",
    "slotDuration": 30,
    "slotBuffer": 15,
    "slotInterval": 30,
    "preBuffer": 5,
    "appoinmentPerSlot": 1,
    "appoinmentPerDay": 8
  }'

Key fields: slotDuration is meeting length in minutes, slotBuffer is time between meetings, preBuffer is prep time before each slot, and appoinmentPerSlot controls concurrent bookings.

Update a calendar:

curl -X PUT "https://services.leadconnectorhq.com/calendars/{calendarId}" \
  -H "Authorization: Bearer $GHL_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Version: 2021-07-28" \
  -d '{"name": "Strategy Calls", "slotDuration": 45}'

Delete a calendar:

curl -X DELETE "https://services.leadconnectorhq.com/calendars/{calendarId}" \
  -H "Authorization: Bearer $GHL_TOKEN" \
  -H "Version: 2021-07-28"

Handle the Response

A successful POST returns 200 with the full calendar object including the generated id, all settings, and availability configuration.

The GET (list) endpoint returns a calendars array with every calendar in the location. Each object includes id, name, slug, calendarType, teamMembers, and all scheduling settings.

A PUT returns the updated calendar object. A DELETE returns a success confirmation.

Common errors:

  • 401 — Invalid token. Verify your PIT has calendars scope.
  • 404 — Calendar ID not found. Use the list endpoint to get valid IDs.
  • 422 — Missing required fields. The create call requires at minimum locationId, name, and calendarType.
  • 409 — Slug conflict. The slug must be unique within the location.

Test Your Setup

Verify your calendar management works end to end:

  1. List all calendars and note the count
  2. Create a test calendar with a unique slug like “test-calendar-api”
  3. Read the calendar back by ID and verify all settings match
  4. Update the name or duration and confirm the change persists
  5. Check the GHL dashboard under Calendars to see your test calendar
  6. Delete the test calendar and verify it no longer appears in the list

If the calendar does not appear in the dashboard, verify the locationId matches your active sub-account.

Next Steps

Read the full Calendar CRUD guide for advanced scheduling configurations and availability patterns. Set up Free Slots to check availability before booking, or configure Appointment CRUD to create bookings on your new calendar.

Stay sharp. New guides and playbooks as they drop.