Files
2026-05-30 14:31:19 -06:00

155 KiB

GHL Calendars API

⚠️ Version Header: All Calendars endpoints use Version: 2021-04-15 (different from most other APIs which use 2021-07-28).

Endpoints: 41 Base URL: https://rest.gohighlevel.com/v1

Version Header(s): 2021-04-15


Endpoints


GET /calendars/

Summary: Get Calendars

Get all calendars in a location.

Version Header: 2021-04-15

Operation ID: get-calendars

Tags: Calendars

cURL

curl -X GET 'https://rest.gohighlevel.com/v1/calendars/?locationId=ve9EPM428h8vShlRW1KT&groupId=BqTwX8QFwXzpegMve9EQ&showDrafted=VALUE' \
  -H 'Authorization: Bearer YOUR_API_TOKEN' \
  -H 'Version: 2021-04-15' \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -H 'User-Agent: YourApp/1.0'

Python (http.client)

import http.client
import json

conn = http.client.HTTPSConnection('rest.gohighlevel.com')

headers = {
    'Authorization': 'Bearer YOUR_API_TOKEN',
    'Version': '2021-04-15',
    'Content-Type': 'application/json',
    'Accept': 'application/json',
    'User-Agent': 'YourApp/1.0',
}

conn.request('GET', '/v1/calendars/?locationId=ve9EPM428h8vShlRW1KT&groupId=BqTwX8QFwXzpegMve9EQ&showDrafted=VALUE', headers=headers)

response = conn.getresponse()
data = json.loads(response.read().decode())
print(json.dumps(data, indent=2))
conn.close()

n8n HTTP Node

{
  "name": "GHL - GET calendars",
  "type": "n8n-nodes-base.httpRequest",
  "parameters": {
    "method": "GET",
    "url": "https://rest.gohighlevel.com/v1/calendars/",
    "authentication": "genericCredentialType",
    "genericAuthType": "httpHeaderAuth",
    "sendHeaders": true,
    "headerParameters": {
      "parameters": [
        {
          "name": "Authorization",
          "value": "Bearer YOUR_API_TOKEN"
        },
        {
          "name": "Version",
          "value": "2021-04-15"
        },
        {
          "name": "Content-Type",
          "value": "application/json"
        },
        {
          "name": "Accept",
          "value": "application/json"
        },
        {
          "name": "User-Agent",
          "value": "YourApp/1.0"
        }
      ]
    },
    "sendBody": false,
    "bodyParameters": {
      "parameters": []
    },
    "options": {},
    "sendQuery": true,
    "queryParameters": {
      "parameters": [
        {
          "name": "locationId",
          "value": "ve9EPM428h8vShlRW1KT"
        },
        {
          "name": "groupId",
          "value": "BqTwX8QFwXzpegMve9EQ"
        },
        {
          "name": "showDrafted",
          "value": "VALUE"
        }
      ]
    }
  }
}

To use in n8n:

  1. Add an HTTP Request node
  2. Switch to JSON mode (Parameters → use RAW JSON)
  3. Paste the JSON above
  4. Update YOUR_API_TOKEN with your actual GHL API key

Request Parameters

Name Location Type Required Description
locationId Query string Location Id [example: ve9EPM428h8vShlRW1KT]
groupId Query string Group Id [example: BqTwX8QFwXzpegMve9EQ]
showDrafted Query boolean Show drafted

Response Codes

Code Description Schema
200 Successful response - calendars (array of CalendarDTO)
400 Bad Request Standard error response for bad requests (400). Contains message, statusCode fields.
401 Unauthorized Standard error response for unauthorized requests (401). Contains message, statusCode fields.

⚠️ Special Notes & Quirks

⚠️ User-Agent Required: All GHL API requests require a User-Agent HTTP header. Requests without it may be rejected with a 403 error.


POST /calendars/

Summary: Create Calendar

Create calendar in a location.

Version Header: 2021-04-15

Operation ID: create-calendar

Tags: Calendars

cURL

curl -X POST 'https://rest.gohighlevel.com/v1/calendars/' \
  -H 'Authorization: Bearer YOUR_API_TOKEN' \
  -H 'Version: 2021-04-15' \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -H 'User-Agent: YourApp/1.0' \
  -d '{}'  # See request body schema below

Python (http.client)

import http.client
import json

conn = http.client.HTTPSConnection('rest.gohighlevel.com')

headers = {
    'Authorization': 'Bearer YOUR_API_TOKEN',
    'Version': '2021-04-15',
    'Content-Type': 'application/json',
    'Accept': 'application/json',
    'User-Agent': 'YourApp/1.0',
}

payload = json.dumps({})
conn.request('POST', '/v1/calendars/', body=payload, headers=headers)

response = conn.getresponse()
data = json.loads(response.read().decode())
print(json.dumps(data, indent=2))
conn.close()

n8n HTTP Node

{
  "name": "GHL - POST calendars",
  "type": "n8n-nodes-base.httpRequest",
  "parameters": {
    "method": "POST",
    "url": "https://rest.gohighlevel.com/v1/calendars/",
    "authentication": "genericCredentialType",
    "genericAuthType": "httpHeaderAuth",
    "sendHeaders": true,
    "headerParameters": {
      "parameters": [
        {
          "name": "Authorization",
          "value": "Bearer YOUR_API_TOKEN"
        },
        {
          "name": "Version",
          "value": "2021-04-15"
        },
        {
          "name": "Content-Type",
          "value": "application/json"
        },
        {
          "name": "Accept",
          "value": "application/json"
        },
        {
          "name": "User-Agent",
          "value": "YourApp/1.0"
        }
      ]
    },
    "sendBody": true,
    "bodyParameters": {
      "parameters": []
    },
    "options": {}
  }
}

To use in n8n:

  1. Add an HTTP Request node
  2. Switch to JSON mode (Parameters → use RAW JSON)
  3. Paste the JSON above
  4. Update YOUR_API_TOKEN with your actual GHL API key

Request Body Schema

  • isActive (boolean): Should the created calendar be active or draft
  • notifications (array of CalendarNotification): 🚨 Deprecated! Please use 'Calendar Notifications APIs' instead.
  • locationId (string) (required) (e.g. ocQHyuzHvysMo5N5VsXc)
  • groupId (string) (e.g. BqTwX8QFwXzpegMve9EQ): Group Id
  • teamMembers (array of TeamMember): Team members are required for calendars of type: Round Robin, Collective, Class, Service. Personal calendar must have exactly one team member.
  • eventType (string)
  • name (string) (required) (e.g. test calendar)
  • description (string) (e.g. this is used for testing)
  • slug (string) (e.g. test1)
  • widgetSlug (string) (e.g. test1)
  • calendarType (string)
  • widgetType (string) (e.g. classic): Calendar widget type. Choose "default" for "neo" and "classic" for "classic" layout.
  • eventTitle (string)
  • eventColor (string)
  • meetingLocation (string): 🚨 Deprecated! Use locationConfigurations.location or teamMembers[].locationConfigurations.location instead.
  • locationConfigurations (array of LocationConfiguration): Meeting location configuration for event calendar
  • slotDuration (number): This controls the duration of the meeting
  • slotDurationUnit (string): Unit for slot duration.
  • 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.
  • 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.
  • 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.
  • 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) (e.g. days): Unit for minimum scheduling notice
  • allowBookingFor (number): Minimum number of days/weeks/months for which to allow booking events
  • allowBookingForUnit (string) (e.g. days): Unit for controlling the duration for which booking would be allowed for
  • openHours (array of OpenHour): 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 (Recurring)
  • 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)
  • 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.
    • availabilities (array of Availability): This is only to set the custom availability. For standard availability, use the openHours property
    • guestType (string)
    • consentLabel (string)
    • calendarCoverImage (string) (e.g. https://path-to-image.com)
    • lookBusyConfig (string): Look Busy Configuration

Response Codes

Code Description Schema
200 Successful response - calendar (CalendarDTO) (required)
400 Bad Request Standard error response for bad requests (400). Contains message, statusCode fields.
401 Unauthorized Standard error response for unauthorized requests (401). Contains message, statusCode fields.

⚠️ Special Notes & Quirks

⚠️ User-Agent Required: All GHL API requests require a User-Agent HTTP header. Requests without it may be rejected with a 403 error.


GET /calendars/appointments/{appointmentId}/notes

Summary: Get Notes

Get Appointment Notes

Version Header: 2021-04-15

Operation ID: get-appointment-notes

Tags: Appointment Notes

cURL

curl -X GET 'https://rest.gohighlevel.com/v1/calendars/appointments/VALUE/notes?limit=10&offset=VALUE' \
  -H 'Authorization: Bearer YOUR_API_TOKEN' \
  -H 'Version: 2021-04-15' \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -H 'User-Agent: YourApp/1.0'

Python (http.client)

import http.client
import json

conn = http.client.HTTPSConnection('rest.gohighlevel.com')

headers = {
    'Authorization': 'Bearer YOUR_API_TOKEN',
    'Version': '2021-04-15',
    'Content-Type': 'application/json',
    'Accept': 'application/json',
    'User-Agent': 'YourApp/1.0',
}

conn.request('GET', '/v1/calendars/appointments/VALUE/notes?limit=10&offset=VALUE', headers=headers)

response = conn.getresponse()
data = json.loads(response.read().decode())
print(json.dumps(data, indent=2))
conn.close()

n8n HTTP Node

{
  "name": "GHL - GET notes",
  "type": "n8n-nodes-base.httpRequest",
  "parameters": {
    "method": "GET",
    "url": "https://rest.gohighlevel.com/v1/calendars/appointments/VALUE/notes",
    "authentication": "genericCredentialType",
    "genericAuthType": "httpHeaderAuth",
    "sendHeaders": true,
    "headerParameters": {
      "parameters": [
        {
          "name": "Authorization",
          "value": "Bearer YOUR_API_TOKEN"
        },
        {
          "name": "Version",
          "value": "2021-04-15"
        },
        {
          "name": "Content-Type",
          "value": "application/json"
        },
        {
          "name": "Accept",
          "value": "application/json"
        },
        {
          "name": "User-Agent",
          "value": "YourApp/1.0"
        }
      ]
    },
    "sendBody": false,
    "bodyParameters": {
      "parameters": []
    },
    "options": {},
    "sendQuery": true,
    "queryParameters": {
      "parameters": [
        {
          "name": "limit",
          "value": 10
        },
        {
          "name": "offset",
          "value": "VALUE"
        }
      ]
    }
  }
}

To use in n8n:

  1. Add an HTTP Request node
  2. Switch to JSON mode (Parameters → use RAW JSON)
  3. Paste the JSON above
  4. Update YOUR_API_TOKEN with your actual GHL API key

Request Parameters

Name Location Type Required Description
limit Query number Limit of notes to fetch [example: 10]
offset Query number Offset of notes to fetch
appointmentId Path string Appointment ID

Response Codes

Code Description Schema
200 Successful response - notes (array of GetNoteSchema)
- hasMore (boolean) (e.g. True)
400 Bad Request Standard error response for bad requests (400). Contains message, statusCode fields.
401 Unauthorized Standard error response for unauthorized requests (401). Contains message, statusCode fields.

⚠️ Special Notes & Quirks

⚠️ User-Agent Required: All GHL API requests require a User-Agent HTTP header. Requests without it may be rejected with a 403 error.


POST /calendars/appointments/{appointmentId}/notes

Summary: Create Note

Create Note

Version Header: 2021-04-15

Operation ID: create-appointment-note

Tags: Appointment Notes

cURL

curl -X POST 'https://rest.gohighlevel.com/v1/calendars/appointments/VALUE/notes' \
  -H 'Authorization: Bearer YOUR_API_TOKEN' \
  -H 'Version: 2021-04-15' \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -H 'User-Agent: YourApp/1.0' \
  -d '{}'  # See request body schema below

Python (http.client)

import http.client
import json

conn = http.client.HTTPSConnection('rest.gohighlevel.com')

headers = {
    'Authorization': 'Bearer YOUR_API_TOKEN',
    'Version': '2021-04-15',
    'Content-Type': 'application/json',
    'Accept': 'application/json',
    'User-Agent': 'YourApp/1.0',
}

payload = json.dumps({})
conn.request('POST', '/v1/calendars/appointments/VALUE/notes', body=payload, headers=headers)

response = conn.getresponse()
data = json.loads(response.read().decode())
print(json.dumps(data, indent=2))
conn.close()

n8n HTTP Node

{
  "name": "GHL - POST notes",
  "type": "n8n-nodes-base.httpRequest",
  "parameters": {
    "method": "POST",
    "url": "https://rest.gohighlevel.com/v1/calendars/appointments/VALUE/notes",
    "authentication": "genericCredentialType",
    "genericAuthType": "httpHeaderAuth",
    "sendHeaders": true,
    "headerParameters": {
      "parameters": [
        {
          "name": "Authorization",
          "value": "Bearer YOUR_API_TOKEN"
        },
        {
          "name": "Version",
          "value": "2021-04-15"
        },
        {
          "name": "Content-Type",
          "value": "application/json"
        },
        {
          "name": "Accept",
          "value": "application/json"
        },
        {
          "name": "User-Agent",
          "value": "YourApp/1.0"
        }
      ]
    },
    "sendBody": true,
    "bodyParameters": {
      "parameters": []
    },
    "options": {}
  }
}

To use in n8n:

  1. Add an HTTP Request node
  2. Switch to JSON mode (Parameters → use RAW JSON)
  3. Paste the JSON above
  4. Update YOUR_API_TOKEN with your actual GHL API key

Request Parameters

Name Location Type Required Description
appointmentId Path string Appointment ID

Request Body Schema

  • userId (string) (e.g. GCs5KuzPqTls7vWclkEV)
  • body (string) (required) (e.g. lorem ipsum): Note body

Response Codes

Code Description Schema
201 Successful response - note (GetNoteSchema)
400 Bad Request Standard error response for bad requests (400). Contains message, statusCode fields.
401 Unauthorized Standard error response for unauthorized requests (401). Contains message, statusCode fields.

⚠️ Special Notes & Quirks

⚠️ User-Agent Required: All GHL API requests require a User-Agent HTTP header. Requests without it may be rejected with a 403 error.


DELETE /calendars/appointments/{appointmentId}/notes/{noteId}

Summary: Delete Note

Delete Note

Version Header: 2021-04-15

Operation ID: delete-appointment-note

Tags: Appointment Notes

cURL

curl -X DELETE 'https://rest.gohighlevel.com/v1/calendars/appointments/VALUE/notes/{noteId}' \
  -H 'Authorization: Bearer YOUR_API_TOKEN' \
  -H 'Version: 2021-04-15' \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -H 'User-Agent: YourApp/1.0'

Python (http.client)

import http.client
import json

conn = http.client.HTTPSConnection('rest.gohighlevel.com')

headers = {
    'Authorization': 'Bearer YOUR_API_TOKEN',
    'Version': '2021-04-15',
    'Content-Type': 'application/json',
    'Accept': 'application/json',
    'User-Agent': 'YourApp/1.0',
}

conn.request('DELETE', '/v1/calendars/appointments/VALUE/notes/{noteId}', headers=headers)

response = conn.getresponse()
data = json.loads(response.read().decode())
print(json.dumps(data, indent=2))
conn.close()

n8n HTTP Node

{
  "name": "GHL - DELETE {noteId}",
  "type": "n8n-nodes-base.httpRequest",
  "parameters": {
    "method": "DELETE",
    "url": "https://rest.gohighlevel.com/v1/calendars/appointments/VALUE/notes/{noteId}",
    "authentication": "genericCredentialType",
    "genericAuthType": "httpHeaderAuth",
    "sendHeaders": true,
    "headerParameters": {
      "parameters": [
        {
          "name": "Authorization",
          "value": "Bearer YOUR_API_TOKEN"
        },
        {
          "name": "Version",
          "value": "2021-04-15"
        },
        {
          "name": "Content-Type",
          "value": "application/json"
        },
        {
          "name": "Accept",
          "value": "application/json"
        },
        {
          "name": "User-Agent",
          "value": "YourApp/1.0"
        }
      ]
    },
    "sendBody": false,
    "bodyParameters": {
      "parameters": []
    },
    "options": {}
  }
}

To use in n8n:

  1. Add an HTTP Request node
  2. Switch to JSON mode (Parameters → use RAW JSON)
  3. Paste the JSON above
  4. Update YOUR_API_TOKEN with your actual GHL API key

Request Parameters

Name Location Type Required Description
appointmentId Path string Appointment ID

Response Codes

Code Description Schema
200 Successful response - success (boolean) (e.g. True)
400 Bad Request Standard error response for bad requests (400). Contains message, statusCode fields.
401 Unauthorized Standard error response for unauthorized requests (401). Contains message, statusCode fields.

⚠️ Special Notes & Quirks

⚠️ User-Agent Required: All GHL API requests require a User-Agent HTTP header. Requests without it may be rejected with a 403 error.


PUT /calendars/appointments/{appointmentId}/notes/{noteId}

Summary: Update Note

Update Note

Version Header: 2021-04-15

Operation ID: update-appointment-note

Tags: Appointment Notes

cURL

curl -X PUT 'https://rest.gohighlevel.com/v1/calendars/appointments/VALUE/notes/{noteId}' \
  -H 'Authorization: Bearer YOUR_API_TOKEN' \
  -H 'Version: 2021-04-15' \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -H 'User-Agent: YourApp/1.0' \
  -d '{}'  # See request body schema below

Python (http.client)

import http.client
import json

conn = http.client.HTTPSConnection('rest.gohighlevel.com')

headers = {
    'Authorization': 'Bearer YOUR_API_TOKEN',
    'Version': '2021-04-15',
    'Content-Type': 'application/json',
    'Accept': 'application/json',
    'User-Agent': 'YourApp/1.0',
}

payload = json.dumps({})
conn.request('PUT', '/v1/calendars/appointments/VALUE/notes/{noteId}', body=payload, headers=headers)

response = conn.getresponse()
data = json.loads(response.read().decode())
print(json.dumps(data, indent=2))
conn.close()

n8n HTTP Node

{
  "name": "GHL - PUT {noteId}",
  "type": "n8n-nodes-base.httpRequest",
  "parameters": {
    "method": "PUT",
    "url": "https://rest.gohighlevel.com/v1/calendars/appointments/VALUE/notes/{noteId}",
    "authentication": "genericCredentialType",
    "genericAuthType": "httpHeaderAuth",
    "sendHeaders": true,
    "headerParameters": {
      "parameters": [
        {
          "name": "Authorization",
          "value": "Bearer YOUR_API_TOKEN"
        },
        {
          "name": "Version",
          "value": "2021-04-15"
        },
        {
          "name": "Content-Type",
          "value": "application/json"
        },
        {
          "name": "Accept",
          "value": "application/json"
        },
        {
          "name": "User-Agent",
          "value": "YourApp/1.0"
        }
      ]
    },
    "sendBody": true,
    "bodyParameters": {
      "parameters": []
    },
    "options": {}
  }
}

To use in n8n:

  1. Add an HTTP Request node
  2. Switch to JSON mode (Parameters → use RAW JSON)
  3. Paste the JSON above
  4. Update YOUR_API_TOKEN with your actual GHL API key

Request Parameters

Name Location Type Required Description
appointmentId Path string Appointment ID

Request Body Schema

  • userId (string) (e.g. GCs5KuzPqTls7vWclkEV)
  • body (string) (required) (e.g. lorem ipsum): Note body

Response Codes

Code Description Schema
200 Successful response - note (GetNoteSchema)
400 Bad Request Standard error response for bad requests (400). Contains message, statusCode fields.
401 Unauthorized Standard error response for unauthorized requests (401). Contains message, statusCode fields.

⚠️ Special Notes & Quirks

⚠️ User-Agent Required: All GHL API requests require a User-Agent HTTP header. Requests without it may be rejected with a 403 error.


GET /calendars/blocked-slots

Summary: Get Blocked Slots

Get Blocked Slots

Version Header: 2021-04-15

Operation ID: get-blocked-slots

Tags: Calendar Events

cURL

curl -X GET 'https://rest.gohighlevel.com/v1/calendars/blocked-slots?locationId=0007BWpSzSwfiuSl0tR2&userId=CVokAlI8fgw4WYWoCtQz&calendarId=BqTwX8QFwXzpegMve9EQ&groupId=ocQHyuzHvysMo5N5VsXc&startTime=1680373800000&endTime=1680978599999' \
  -H 'Authorization: Bearer YOUR_API_TOKEN' \
  -H 'Version: 2021-04-15' \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -H 'User-Agent: YourApp/1.0'

Python (http.client)

import http.client
import json

conn = http.client.HTTPSConnection('rest.gohighlevel.com')

headers = {
    'Authorization': 'Bearer YOUR_API_TOKEN',
    'Version': '2021-04-15',
    'Content-Type': 'application/json',
    'Accept': 'application/json',
    'User-Agent': 'YourApp/1.0',
}

conn.request('GET', '/v1/calendars/blocked-slots?locationId=0007BWpSzSwfiuSl0tR2&userId=CVokAlI8fgw4WYWoCtQz&calendarId=BqTwX8QFwXzpegMve9EQ&groupId=ocQHyuzHvysMo5N5VsXc&startTime=1680373800000&endTime=1680978599999', headers=headers)

response = conn.getresponse()
data = json.loads(response.read().decode())
print(json.dumps(data, indent=2))
conn.close()

n8n HTTP Node

{
  "name": "GHL - GET blocked-slots",
  "type": "n8n-nodes-base.httpRequest",
  "parameters": {
    "method": "GET",
    "url": "https://rest.gohighlevel.com/v1/calendars/blocked-slots",
    "authentication": "genericCredentialType",
    "genericAuthType": "httpHeaderAuth",
    "sendHeaders": true,
    "headerParameters": {
      "parameters": [
        {
          "name": "Authorization",
          "value": "Bearer YOUR_API_TOKEN"
        },
        {
          "name": "Version",
          "value": "2021-04-15"
        },
        {
          "name": "Content-Type",
          "value": "application/json"
        },
        {
          "name": "Accept",
          "value": "application/json"
        },
        {
          "name": "User-Agent",
          "value": "YourApp/1.0"
        }
      ]
    },
    "sendBody": false,
    "bodyParameters": {
      "parameters": []
    },
    "options": {},
    "sendQuery": true,
    "queryParameters": {
      "parameters": [
        {
          "name": "locationId",
          "value": "0007BWpSzSwfiuSl0tR2"
        },
        {
          "name": "userId",
          "value": "CVokAlI8fgw4WYWoCtQz"
        },
        {
          "name": "calendarId",
          "value": "BqTwX8QFwXzpegMve9EQ"
        },
        {
          "name": "groupId",
          "value": "ocQHyuzHvysMo5N5VsXc"
        },
        {
          "name": "startTime",
          "value": "1680373800000"
        },
        {
          "name": "endTime",
          "value": "1680978599999"
        }
      ]
    }
  }
}

To use in n8n:

  1. Add an HTTP Request node
  2. Switch to JSON mode (Parameters → use RAW JSON)
  3. Paste the JSON above
  4. Update YOUR_API_TOKEN with your actual GHL API key

Request Parameters

Name Location Type Required Description
locationId Query string Location Id [example: 0007BWpSzSwfiuSl0tR2]
userId Query string User Id - Owner of an appointment. Either of userId, groupId or calendarId is required [example: ...
calendarId Query string Either of calendarId, userId or groupId is required [example: BqTwX8QFwXzpegMve9EQ]
groupId Query string Either of groupId, calendarId or userId is required [example: ocQHyuzHvysMo5N5VsXc]
startTime Query string Start Time (in millis) [example: 1680373800000]
endTime Query string End Time (in millis) [example: 1680978599999]

Response Codes

Code Description Schema
200 Successful response - events (array of CalendarEventDTO)
400 Bad Request Standard error response for bad requests (400). Contains message, statusCode fields.
401 Unauthorized Standard error response for unauthorized requests (401). Contains message, statusCode fields.

⚠️ Special Notes & Quirks

⚠️ User-Agent Required: All GHL API requests require a User-Agent HTTP header. Requests without it may be rejected with a 403 error.


GET /calendars/events

Summary: Get Calendar Events

Get Calendar Events

Version Header: 2021-04-15

Operation ID: get-calendar-events

Tags: Calendar Events

cURL

curl -X GET 'https://rest.gohighlevel.com/v1/calendars/events?locationId=0007BWpSzSwfiuSl0tR2&userId=CVokAlI8fgw4WYWoCtQz&calendarId=BqTwX8QFwXzpegMve9EQ&groupId=ocQHyuzHvysMo5N5VsXc&startTime=1680373800000&endTime=1680978599999' \
  -H 'Authorization: Bearer YOUR_API_TOKEN' \
  -H 'Version: 2021-04-15' \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -H 'User-Agent: YourApp/1.0'

Python (http.client)

import http.client
import json

conn = http.client.HTTPSConnection('rest.gohighlevel.com')

headers = {
    'Authorization': 'Bearer YOUR_API_TOKEN',
    'Version': '2021-04-15',
    'Content-Type': 'application/json',
    'Accept': 'application/json',
    'User-Agent': 'YourApp/1.0',
}

conn.request('GET', '/v1/calendars/events?locationId=0007BWpSzSwfiuSl0tR2&userId=CVokAlI8fgw4WYWoCtQz&calendarId=BqTwX8QFwXzpegMve9EQ&groupId=ocQHyuzHvysMo5N5VsXc&startTime=1680373800000&endTime=1680978599999', headers=headers)

response = conn.getresponse()
data = json.loads(response.read().decode())
print(json.dumps(data, indent=2))
conn.close()

n8n HTTP Node

{
  "name": "GHL - GET events",
  "type": "n8n-nodes-base.httpRequest",
  "parameters": {
    "method": "GET",
    "url": "https://rest.gohighlevel.com/v1/calendars/events",
    "authentication": "genericCredentialType",
    "genericAuthType": "httpHeaderAuth",
    "sendHeaders": true,
    "headerParameters": {
      "parameters": [
        {
          "name": "Authorization",
          "value": "Bearer YOUR_API_TOKEN"
        },
        {
          "name": "Version",
          "value": "2021-04-15"
        },
        {
          "name": "Content-Type",
          "value": "application/json"
        },
        {
          "name": "Accept",
          "value": "application/json"
        },
        {
          "name": "User-Agent",
          "value": "YourApp/1.0"
        }
      ]
    },
    "sendBody": false,
    "bodyParameters": {
      "parameters": []
    },
    "options": {},
    "sendQuery": true,
    "queryParameters": {
      "parameters": [
        {
          "name": "locationId",
          "value": "0007BWpSzSwfiuSl0tR2"
        },
        {
          "name": "userId",
          "value": "CVokAlI8fgw4WYWoCtQz"
        },
        {
          "name": "calendarId",
          "value": "BqTwX8QFwXzpegMve9EQ"
        },
        {
          "name": "groupId",
          "value": "ocQHyuzHvysMo5N5VsXc"
        },
        {
          "name": "startTime",
          "value": "1680373800000"
        },
        {
          "name": "endTime",
          "value": "1680978599999"
        }
      ]
    }
  }
}

To use in n8n:

  1. Add an HTTP Request node
  2. Switch to JSON mode (Parameters → use RAW JSON)
  3. Paste the JSON above
  4. Update YOUR_API_TOKEN with your actual GHL API key

Request Parameters

Name Location Type Required Description
locationId Query string Location Id [example: 0007BWpSzSwfiuSl0tR2]
userId Query string User Id - Owner of an appointment. Either of userId, groupId or calendarId is required [example: ...
calendarId Query string Either of calendarId, userId or groupId is required [example: BqTwX8QFwXzpegMve9EQ]
groupId Query string Either of groupId, calendarId or userId is required [example: ocQHyuzHvysMo5N5VsXc]
startTime Query string Start Time (in millis) [example: 1680373800000]
endTime Query string End Time (in millis) [example: 1680978599999]

Response Codes

Code Description Schema
200 Successful response - events (array of CalendarEventDTO)
400 Bad Request Standard error response for bad requests (400). Contains message, statusCode fields.
401 Unauthorized Standard error response for unauthorized requests (401). Contains message, statusCode fields.

⚠️ Special Notes & Quirks

⚠️ User-Agent Required: All GHL API requests require a User-Agent HTTP header. Requests without it may be rejected with a 403 error.


POST /calendars/events/appointments

Summary: Create appointment

Create appointment

Version Header: 2021-04-15

Operation ID: create-appointment

Tags: Calendar Events

cURL

curl -X POST 'https://rest.gohighlevel.com/v1/calendars/events/appointments' \
  -H 'Authorization: Bearer YOUR_API_TOKEN' \
  -H 'Version: 2021-04-15' \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -H 'User-Agent: YourApp/1.0' \
  -d '{}'  # See request body schema below

Python (http.client)

import http.client
import json

conn = http.client.HTTPSConnection('rest.gohighlevel.com')

headers = {
    'Authorization': 'Bearer YOUR_API_TOKEN',
    'Version': '2021-04-15',
    'Content-Type': 'application/json',
    'Accept': 'application/json',
    'User-Agent': 'YourApp/1.0',
}

payload = json.dumps({})
conn.request('POST', '/v1/calendars/events/appointments', body=payload, headers=headers)

response = conn.getresponse()
data = json.loads(response.read().decode())
print(json.dumps(data, indent=2))
conn.close()

n8n HTTP Node

{
  "name": "GHL - POST appointments",
  "type": "n8n-nodes-base.httpRequest",
  "parameters": {
    "method": "POST",
    "url": "https://rest.gohighlevel.com/v1/calendars/events/appointments",
    "authentication": "genericCredentialType",
    "genericAuthType": "httpHeaderAuth",
    "sendHeaders": true,
    "headerParameters": {
      "parameters": [
        {
          "name": "Authorization",
          "value": "Bearer YOUR_API_TOKEN"
        },
        {
          "name": "Version",
          "value": "2021-04-15"
        },
        {
          "name": "Content-Type",
          "value": "application/json"
        },
        {
          "name": "Accept",
          "value": "application/json"
        },
        {
          "name": "User-Agent",
          "value": "YourApp/1.0"
        }
      ]
    },
    "sendBody": true,
    "bodyParameters": {
      "parameters": []
    },
    "options": {}
  }
}

To use in n8n:

  1. Add an HTTP Request node
  2. Switch to JSON mode (Parameters → use RAW JSON)
  3. Paste the JSON above
  4. Update YOUR_API_TOKEN with your actual GHL API key

Request Body Schema

  • title (string) (e.g. Test Event): Title

  • meetingLocationType (string) (e.g. custom): Meeting location type.

  • If address is provided in the request body, the meetingLocationType defaults to custom.

    • meetingLocationId (string) (e.g. custom_0): The unique identifier for the meeting location.
  • This value can be found in calendar.locationConfigurationsor calendar.teamMembers[].locationConfigurations

    • overrideLocationConfig (boolean) (e.g. True): Flag to override location config
  • false - If only meetingLocationId is provided

  • true - If only meetingLocationType is provided

    • appointmentStatus (string) (e.g. confirmed)
    • assignedUserId (string) (e.g. 0007BWpSzSwfiuSl0tR2): Assigned User Id
    • description (string) (e.g. Booking a call to discuss the project): Appointment Description
    • address (string) (e.g. Zoom): Appointment Address
    • ignoreDateRange (boolean) (e.g. False): If set to true, the minimum scheduling notice and date range would be ignored
    • toNotify (boolean) (e.g. False): If set to false, the automations will not run
    • ignoreFreeSlotValidation (boolean) (e.g. True): If true the time slot validation would be avoided for any appointment creation (even the ignoreDateRange)
    • rrule (string): RRULE as per the iCalendar (RFC 5545) specification for recurring events. DTSTART is not required, instance ids are calculated on the basis of startTime of the event. The rrule only be applied if ignoreFreeSlotValidation is true.
    • calendarId (string) (required) (e.g. CVokAlI8fgw4WYWoCtQz): Calendar Id
    • locationId (string) (required) (e.g. C2QujeCh8ZnC7al2InWR): Location Id
    • contactId (string) (required) (e.g. 0007BWpSzSwfiuSl0tR2): Contact Id
    • startTime (string) (required) (e.g. 2021-06-23T03:30:00+05:30): Start Time
    • endTime (string) (e.g. 2021-06-23T04:30:00+05:30): End Time

Response Codes

Code Description Schema
200 Successful response - calendarId (string) (required) (e.g. CVokAlI8fgw4WYWoCtQz): Calendar Id
- locationId (string) (required) (e.g. `C2QujeCh8ZnC7al2InW...
400 Bad Request Standard error response for bad requests (400). Contains message, statusCode fields.
401 Unauthorized Standard error response for unauthorized requests (401). Contains message, statusCode fields.

⚠️ Special Notes & Quirks

⚠️ User-Agent Required: All GHL API requests require a User-Agent HTTP header. Requests without it may be rejected with a 403 error.


GET /calendars/events/appointments/{eventId}

Summary: Get Appointment

Get appointment by ID

Version Header: 2021-04-15

Operation ID: get-appointment

Tags: Calendar Events

cURL

curl -X GET 'https://rest.gohighlevel.com/v1/calendars/events/appointments/VALUE' \
  -H 'Authorization: Bearer YOUR_API_TOKEN' \
  -H 'Version: 2021-04-15' \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -H 'User-Agent: YourApp/1.0'

Python (http.client)

import http.client
import json

conn = http.client.HTTPSConnection('rest.gohighlevel.com')

headers = {
    'Authorization': 'Bearer YOUR_API_TOKEN',
    'Version': '2021-04-15',
    'Content-Type': 'application/json',
    'Accept': 'application/json',
    'User-Agent': 'YourApp/1.0',
}

conn.request('GET', '/v1/calendars/events/appointments/VALUE', headers=headers)

response = conn.getresponse()
data = json.loads(response.read().decode())
print(json.dumps(data, indent=2))
conn.close()

n8n HTTP Node

{
  "name": "GHL - GET VALUE",
  "type": "n8n-nodes-base.httpRequest",
  "parameters": {
    "method": "GET",
    "url": "https://rest.gohighlevel.com/v1/calendars/events/appointments/VALUE",
    "authentication": "genericCredentialType",
    "genericAuthType": "httpHeaderAuth",
    "sendHeaders": true,
    "headerParameters": {
      "parameters": [
        {
          "name": "Authorization",
          "value": "Bearer YOUR_API_TOKEN"
        },
        {
          "name": "Version",
          "value": "2021-04-15"
        },
        {
          "name": "Content-Type",
          "value": "application/json"
        },
        {
          "name": "Accept",
          "value": "application/json"
        },
        {
          "name": "User-Agent",
          "value": "YourApp/1.0"
        }
      ]
    },
    "sendBody": false,
    "bodyParameters": {
      "parameters": []
    },
    "options": {}
  }
}

To use in n8n:

  1. Add an HTTP Request node
  2. Switch to JSON mode (Parameters → use RAW JSON)
  3. Paste the JSON above
  4. Update YOUR_API_TOKEN with your actual GHL API key

Request Parameters

Name Location Type Required Description
eventId Path string Event Id or Instance id. For recurring appointments send masterEventId to modify original series.

Response Codes

Code Description Schema
200 Successful response - event (CalendarEventDTO)
400 Bad Request Standard error response for bad requests (400). Contains message, statusCode fields.
401 Unauthorized Standard error response for unauthorized requests (401). Contains message, statusCode fields.

⚠️ Special Notes & Quirks

⚠️ User-Agent Required: All GHL API requests require a User-Agent HTTP header. Requests without it may be rejected with a 403 error.


PUT /calendars/events/appointments/{eventId}

Summary: Update Appointment

Update appointment

Version Header: 2021-04-15

Operation ID: edit-appointment

Tags: Calendar Events

cURL

curl -X PUT 'https://rest.gohighlevel.com/v1/calendars/events/appointments/VALUE' \
  -H 'Authorization: Bearer YOUR_API_TOKEN' \
  -H 'Version: 2021-04-15' \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -H 'User-Agent: YourApp/1.0' \
  -d '{}'  # See request body schema below

Python (http.client)

import http.client
import json

conn = http.client.HTTPSConnection('rest.gohighlevel.com')

headers = {
    'Authorization': 'Bearer YOUR_API_TOKEN',
    'Version': '2021-04-15',
    'Content-Type': 'application/json',
    'Accept': 'application/json',
    'User-Agent': 'YourApp/1.0',
}

payload = json.dumps({})
conn.request('PUT', '/v1/calendars/events/appointments/VALUE', body=payload, headers=headers)

response = conn.getresponse()
data = json.loads(response.read().decode())
print(json.dumps(data, indent=2))
conn.close()

n8n HTTP Node

{
  "name": "GHL - PUT VALUE",
  "type": "n8n-nodes-base.httpRequest",
  "parameters": {
    "method": "PUT",
    "url": "https://rest.gohighlevel.com/v1/calendars/events/appointments/VALUE",
    "authentication": "genericCredentialType",
    "genericAuthType": "httpHeaderAuth",
    "sendHeaders": true,
    "headerParameters": {
      "parameters": [
        {
          "name": "Authorization",
          "value": "Bearer YOUR_API_TOKEN"
        },
        {
          "name": "Version",
          "value": "2021-04-15"
        },
        {
          "name": "Content-Type",
          "value": "application/json"
        },
        {
          "name": "Accept",
          "value": "application/json"
        },
        {
          "name": "User-Agent",
          "value": "YourApp/1.0"
        }
      ]
    },
    "sendBody": true,
    "bodyParameters": {
      "parameters": []
    },
    "options": {}
  }
}

To use in n8n:

  1. Add an HTTP Request node
  2. Switch to JSON mode (Parameters → use RAW JSON)
  3. Paste the JSON above
  4. Update YOUR_API_TOKEN with your actual GHL API key

Request Parameters

Name Location Type Required Description
eventId Path string Event Id or Instance id. For recurring appointments send masterEventId to modify original series.

Request Body Schema

  • title (string) (e.g. Test Event): Title

  • meetingLocationType (string) (e.g. custom): Meeting location type.

  • If address is provided in the request body, the meetingLocationType defaults to custom.

    • meetingLocationId (string) (e.g. custom_0): The unique identifier for the meeting location.
  • This value can be found in calendar.locationConfigurationsor calendar.teamMembers[].locationConfigurations

    • overrideLocationConfig (boolean) (e.g. True): Flag to override location config
  • false - If only meetingLocationId is provided

  • true - If only meetingLocationType is provided

    • appointmentStatus (string) (e.g. confirmed)
    • assignedUserId (string) (e.g. 0007BWpSzSwfiuSl0tR2): Assigned User Id
    • description (string) (e.g. Booking a call to discuss the project): Appointment Description
    • address (string) (e.g. Zoom): Appointment Address
    • ignoreDateRange (boolean) (e.g. False): If set to true, the minimum scheduling notice and date range would be ignored
    • toNotify (boolean) (e.g. False): If set to false, the automations will not run
    • ignoreFreeSlotValidation (boolean) (e.g. True): If true the time slot validation would be avoided for any appointment creation (even the ignoreDateRange)
    • rrule (string): RRULE as per the iCalendar (RFC 5545) specification for recurring events. DTSTART is not required, instance ids are calculated on the basis of startTime of the event. The rrule only be applied if ignoreFreeSlotValidation is true.
    • calendarId (string) (e.g. CVokAlI8fgw4WYWoCtQz): Calendar Id
    • startTime (string) (e.g. 2021-06-23T03:30:00+05:30): Start Time
    • endTime (string) (e.g. 2021-06-23T04:30:00+05:30): End Time

Response Codes

Code Description Schema
200 Successful response - calendarId (string) (required) (e.g. CVokAlI8fgw4WYWoCtQz): Calendar Id
- locationId (string) (required) (e.g. `C2QujeCh8ZnC7al2InW...
400 Bad Request Standard error response for bad requests (400). Contains message, statusCode fields.
401 Unauthorized Standard error response for unauthorized requests (401). Contains message, statusCode fields.

⚠️ Special Notes & Quirks

⚠️ User-Agent Required: All GHL API requests require a User-Agent HTTP header. Requests without it may be rejected with a 403 error.


POST /calendars/events/block-slots

Summary: Create Block Slot

Create block slot

Version Header: 2021-04-15

Operation ID: create-block-slot

Tags: Calendar Events

cURL

curl -X POST 'https://rest.gohighlevel.com/v1/calendars/events/block-slots' \
  -H 'Authorization: Bearer YOUR_API_TOKEN' \
  -H 'Version: 2021-04-15' \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -H 'User-Agent: YourApp/1.0' \
  -d '{}'  # See request body schema below

Python (http.client)

import http.client
import json

conn = http.client.HTTPSConnection('rest.gohighlevel.com')

headers = {
    'Authorization': 'Bearer YOUR_API_TOKEN',
    'Version': '2021-04-15',
    'Content-Type': 'application/json',
    'Accept': 'application/json',
    'User-Agent': 'YourApp/1.0',
}

payload = json.dumps({})
conn.request('POST', '/v1/calendars/events/block-slots', body=payload, headers=headers)

response = conn.getresponse()
data = json.loads(response.read().decode())
print(json.dumps(data, indent=2))
conn.close()

n8n HTTP Node

{
  "name": "GHL - POST block-slots",
  "type": "n8n-nodes-base.httpRequest",
  "parameters": {
    "method": "POST",
    "url": "https://rest.gohighlevel.com/v1/calendars/events/block-slots",
    "authentication": "genericCredentialType",
    "genericAuthType": "httpHeaderAuth",
    "sendHeaders": true,
    "headerParameters": {
      "parameters": [
        {
          "name": "Authorization",
          "value": "Bearer YOUR_API_TOKEN"
        },
        {
          "name": "Version",
          "value": "2021-04-15"
        },
        {
          "name": "Content-Type",
          "value": "application/json"
        },
        {
          "name": "Accept",
          "value": "application/json"
        },
        {
          "name": "User-Agent",
          "value": "YourApp/1.0"
        }
      ]
    },
    "sendBody": true,
    "bodyParameters": {
      "parameters": []
    },
    "options": {}
  }
}

To use in n8n:

  1. Add an HTTP Request node
  2. Switch to JSON mode (Parameters → use RAW JSON)
  3. Paste the JSON above
  4. Update YOUR_API_TOKEN with your actual GHL API key

Request Body Schema

  • title (string) (e.g. Test Event): Title
  • calendarId (string) (required) (e.g. CVokAlI8fgw4WYWoCtQz): Either calendarId or assignedUserId can be set, not both.
  • assignedUserId (string) (e.g. CVokAlI8fgw4WYWoCtQz): Either calendarId or assignedUserId can be set, not both.
  • locationId (string) (required) (e.g. C2QujeCh8ZnC7al2InWR): Location Id
  • startTime (string) (e.g. 2021-06-23T03:30:00+05:30): Start Time
  • endTime (string) (e.g. 2021-06-23T04:30:00+05:30): End Time

Response Codes

Code Description Schema
201 Successful response - id (string) (required) (e.g. 0TkCdp9PfvLeWKYRRvIz): Id
- locationId (string) (required) (e.g. C2QujeCh8ZnC7al2InWR): Location Id
...
400 Bad Request Standard error response for bad requests (400). Contains message, statusCode fields.
401 Unauthorized Standard error response for unauthorized requests (401). Contains message, statusCode fields.

⚠️ Special Notes & Quirks

⚠️ User-Agent Required: All GHL API requests require a User-Agent HTTP header. Requests without it may be rejected with a 403 error.


PUT /calendars/events/block-slots/{eventId}

Summary: Update Block Slot

Update block slot by ID

Version Header: 2021-04-15

Operation ID: edit-block-slot

Tags: Calendar Events

cURL

curl -X PUT 'https://rest.gohighlevel.com/v1/calendars/events/block-slots/VALUE' \
  -H 'Authorization: Bearer YOUR_API_TOKEN' \
  -H 'Version: 2021-04-15' \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -H 'User-Agent: YourApp/1.0' \
  -d '{}'  # See request body schema below

Python (http.client)

import http.client
import json

conn = http.client.HTTPSConnection('rest.gohighlevel.com')

headers = {
    'Authorization': 'Bearer YOUR_API_TOKEN',
    'Version': '2021-04-15',
    'Content-Type': 'application/json',
    'Accept': 'application/json',
    'User-Agent': 'YourApp/1.0',
}

payload = json.dumps({})
conn.request('PUT', '/v1/calendars/events/block-slots/VALUE', body=payload, headers=headers)

response = conn.getresponse()
data = json.loads(response.read().decode())
print(json.dumps(data, indent=2))
conn.close()

n8n HTTP Node

{
  "name": "GHL - PUT VALUE",
  "type": "n8n-nodes-base.httpRequest",
  "parameters": {
    "method": "PUT",
    "url": "https://rest.gohighlevel.com/v1/calendars/events/block-slots/VALUE",
    "authentication": "genericCredentialType",
    "genericAuthType": "httpHeaderAuth",
    "sendHeaders": true,
    "headerParameters": {
      "parameters": [
        {
          "name": "Authorization",
          "value": "Bearer YOUR_API_TOKEN"
        },
        {
          "name": "Version",
          "value": "2021-04-15"
        },
        {
          "name": "Content-Type",
          "value": "application/json"
        },
        {
          "name": "Accept",
          "value": "application/json"
        },
        {
          "name": "User-Agent",
          "value": "YourApp/1.0"
        }
      ]
    },
    "sendBody": true,
    "bodyParameters": {
      "parameters": []
    },
    "options": {}
  }
}

To use in n8n:

  1. Add an HTTP Request node
  2. Switch to JSON mode (Parameters → use RAW JSON)
  3. Paste the JSON above
  4. Update YOUR_API_TOKEN with your actual GHL API key

Request Parameters

Name Location Type Required Description
eventId Path string Event Id or Instance id. For recurring appointments send masterEventId to modify original series.

Request Body Schema

  • title (string) (e.g. Test Event): Title
  • calendarId (string) (required) (e.g. CVokAlI8fgw4WYWoCtQz): Either calendarId or assignedUserId can be set, not both.
  • assignedUserId (string) (e.g. CVokAlI8fgw4WYWoCtQz): Either calendarId or assignedUserId can be set, not both.
  • locationId (string) (required) (e.g. C2QujeCh8ZnC7al2InWR): Location Id
  • startTime (string) (e.g. 2021-06-23T03:30:00+05:30): Start Time
  • endTime (string) (e.g. 2021-06-23T04:30:00+05:30): End Time

Response Codes

Code Description Schema
201 Successful response - id (string) (required) (e.g. 0TkCdp9PfvLeWKYRRvIz): Id
- locationId (string) (required) (e.g. C2QujeCh8ZnC7al2InWR): Location Id
...
400 Bad Request Standard error response for bad requests (400). Contains message, statusCode fields.
401 Unauthorized Standard error response for unauthorized requests (401). Contains message, statusCode fields.

⚠️ Special Notes & Quirks

⚠️ User-Agent Required: All GHL API requests require a User-Agent HTTP header. Requests without it may be rejected with a 403 error.


DELETE /calendars/events/{eventId}

Summary: Delete Event

Delete event by ID

Version Header: 2021-04-15

Operation ID: delete-event

Tags: Calendar Events

cURL

curl -X DELETE 'https://rest.gohighlevel.com/v1/calendars/events/VALUE' \
  -H 'Authorization: Bearer YOUR_API_TOKEN' \
  -H 'Version: 2021-04-15' \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -H 'User-Agent: YourApp/1.0'

Python (http.client)

import http.client
import json

conn = http.client.HTTPSConnection('rest.gohighlevel.com')

headers = {
    'Authorization': 'Bearer YOUR_API_TOKEN',
    'Version': '2021-04-15',
    'Content-Type': 'application/json',
    'Accept': 'application/json',
    'User-Agent': 'YourApp/1.0',
}

conn.request('DELETE', '/v1/calendars/events/VALUE', headers=headers)

response = conn.getresponse()
data = json.loads(response.read().decode())
print(json.dumps(data, indent=2))
conn.close()

n8n HTTP Node

{
  "name": "GHL - DELETE VALUE",
  "type": "n8n-nodes-base.httpRequest",
  "parameters": {
    "method": "DELETE",
    "url": "https://rest.gohighlevel.com/v1/calendars/events/VALUE",
    "authentication": "genericCredentialType",
    "genericAuthType": "httpHeaderAuth",
    "sendHeaders": true,
    "headerParameters": {
      "parameters": [
        {
          "name": "Authorization",
          "value": "Bearer YOUR_API_TOKEN"
        },
        {
          "name": "Version",
          "value": "2021-04-15"
        },
        {
          "name": "Content-Type",
          "value": "application/json"
        },
        {
          "name": "Accept",
          "value": "application/json"
        },
        {
          "name": "User-Agent",
          "value": "YourApp/1.0"
        }
      ]
    },
    "sendBody": false,
    "bodyParameters": {
      "parameters": []
    },
    "options": {}
  }
}

To use in n8n:

  1. Add an HTTP Request node
  2. Switch to JSON mode (Parameters → use RAW JSON)
  3. Paste the JSON above
  4. Update YOUR_API_TOKEN with your actual GHL API key

Request Parameters

Name Location Type Required Description
eventId Path string Event Id or Instance id. For recurring appointments send masterEventId to modify original series.

Response Codes

Code Description Schema
201 Successful response - succeeded (boolean) (e.g. True)
400 Bad Request Standard error response for bad requests (400). Contains message, statusCode fields.
401 Unauthorized Standard error response for unauthorized requests (401). Contains message, statusCode fields.

⚠️ Special Notes & Quirks

⚠️ User-Agent Required: All GHL API requests require a User-Agent HTTP header. Requests without it may be rejected with a 403 error.


GET /calendars/groups

Summary: Get Groups

Get all calendar groups in a location.

Version Header: 2021-04-15

Operation ID: get-groups

Tags: Calendar Groups

cURL

curl -X GET 'https://rest.gohighlevel.com/v1/calendars/groups?locationId=ve9EPM428h8vShlRW1KT' \
  -H 'Authorization: Bearer YOUR_API_TOKEN' \
  -H 'Version: 2021-04-15' \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -H 'User-Agent: YourApp/1.0'

Python (http.client)

import http.client
import json

conn = http.client.HTTPSConnection('rest.gohighlevel.com')

headers = {
    'Authorization': 'Bearer YOUR_API_TOKEN',
    'Version': '2021-04-15',
    'Content-Type': 'application/json',
    'Accept': 'application/json',
    'User-Agent': 'YourApp/1.0',
}

conn.request('GET', '/v1/calendars/groups?locationId=ve9EPM428h8vShlRW1KT', headers=headers)

response = conn.getresponse()
data = json.loads(response.read().decode())
print(json.dumps(data, indent=2))
conn.close()

n8n HTTP Node

{
  "name": "GHL - GET groups",
  "type": "n8n-nodes-base.httpRequest",
  "parameters": {
    "method": "GET",
    "url": "https://rest.gohighlevel.com/v1/calendars/groups",
    "authentication": "genericCredentialType",
    "genericAuthType": "httpHeaderAuth",
    "sendHeaders": true,
    "headerParameters": {
      "parameters": [
        {
          "name": "Authorization",
          "value": "Bearer YOUR_API_TOKEN"
        },
        {
          "name": "Version",
          "value": "2021-04-15"
        },
        {
          "name": "Content-Type",
          "value": "application/json"
        },
        {
          "name": "Accept",
          "value": "application/json"
        },
        {
          "name": "User-Agent",
          "value": "YourApp/1.0"
        }
      ]
    },
    "sendBody": false,
    "bodyParameters": {
      "parameters": []
    },
    "options": {},
    "sendQuery": true,
    "queryParameters": {
      "parameters": [
        {
          "name": "locationId",
          "value": "ve9EPM428h8vShlRW1KT"
        }
      ]
    }
  }
}

To use in n8n:

  1. Add an HTTP Request node
  2. Switch to JSON mode (Parameters → use RAW JSON)
  3. Paste the JSON above
  4. Update YOUR_API_TOKEN with your actual GHL API key

Request Parameters

Name Location Type Required Description
locationId Query string Location Id [example: ve9EPM428h8vShlRW1KT]

Response Codes

Code Description Schema
200 Successful response - groups (array of GroupDTO)
400 Bad Request Standard error response for bad requests (400). Contains message, statusCode fields.
401 Unauthorized Standard error response for unauthorized requests (401). Contains message, statusCode fields.

⚠️ Special Notes & Quirks

⚠️ User-Agent Required: All GHL API requests require a User-Agent HTTP header. Requests without it may be rejected with a 403 error.

📌 Slug Validation: Use the POST /calendars/groups/validate-slug endpoint before creating a group to ensure the slug is unique.


POST /calendars/groups

Summary: Create Calendar Group

Create Calendar Group

Version Header: 2021-04-15

Operation ID: create-calendar-group

Tags: Calendar Groups

cURL

curl -X POST 'https://rest.gohighlevel.com/v1/calendars/groups' \
  -H 'Authorization: Bearer YOUR_API_TOKEN' \
  -H 'Version: 2021-04-15' \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -H 'User-Agent: YourApp/1.0' \
  -d '{}'  # See request body schema below

Python (http.client)

import http.client
import json

conn = http.client.HTTPSConnection('rest.gohighlevel.com')

headers = {
    'Authorization': 'Bearer YOUR_API_TOKEN',
    'Version': '2021-04-15',
    'Content-Type': 'application/json',
    'Accept': 'application/json',
    'User-Agent': 'YourApp/1.0',
}

payload = json.dumps({})
conn.request('POST', '/v1/calendars/groups', body=payload, headers=headers)

response = conn.getresponse()
data = json.loads(response.read().decode())
print(json.dumps(data, indent=2))
conn.close()

n8n HTTP Node

{
  "name": "GHL - POST groups",
  "type": "n8n-nodes-base.httpRequest",
  "parameters": {
    "method": "POST",
    "url": "https://rest.gohighlevel.com/v1/calendars/groups",
    "authentication": "genericCredentialType",
    "genericAuthType": "httpHeaderAuth",
    "sendHeaders": true,
    "headerParameters": {
      "parameters": [
        {
          "name": "Authorization",
          "value": "Bearer YOUR_API_TOKEN"
        },
        {
          "name": "Version",
          "value": "2021-04-15"
        },
        {
          "name": "Content-Type",
          "value": "application/json"
        },
        {
          "name": "Accept",
          "value": "application/json"
        },
        {
          "name": "User-Agent",
          "value": "YourApp/1.0"
        }
      ]
    },
    "sendBody": true,
    "bodyParameters": {
      "parameters": []
    },
    "options": {}
  }
}

To use in n8n:

  1. Add an HTTP Request node
  2. Switch to JSON mode (Parameters → use RAW JSON)
  3. Paste the JSON above
  4. Update YOUR_API_TOKEN with your actual GHL API key

Request Body Schema

  • locationId (string) (required) (e.g. ocQHyuzHvysMo5N5VsXc)
  • name (string) (required) (e.g. group a)
  • description (string) (required) (e.g. group description)
  • slug (string) (required) (e.g. 15-mins)
  • isActive (boolean) (e.g. True)

Response Codes

Code Description Schema
201 Successful response - group (GroupDTO)
400 Bad Request Standard error response for bad requests (400). Contains message, statusCode fields.
401 Unauthorized Standard error response for unauthorized requests (401). Contains message, statusCode fields.

⚠️ Special Notes & Quirks

⚠️ User-Agent Required: All GHL API requests require a User-Agent HTTP header. Requests without it may be rejected with a 403 error.

📌 Slug Validation: Use the POST /calendars/groups/validate-slug endpoint before creating a group to ensure the slug is unique.


POST /calendars/groups/validate-slug

Summary: Validate group slug

Validate if group slug is available or not.

Version Header: 2021-04-15

Operation ID: validate-groups-slug

Tags: Calendar Groups

cURL

curl -X POST 'https://rest.gohighlevel.com/v1/calendars/groups/validate-slug' \
  -H 'Authorization: Bearer YOUR_API_TOKEN' \
  -H 'Version: 2021-04-15' \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -H 'User-Agent: YourApp/1.0' \
  -d '{}'  # See request body schema below

Python (http.client)

import http.client
import json

conn = http.client.HTTPSConnection('rest.gohighlevel.com')

headers = {
    'Authorization': 'Bearer YOUR_API_TOKEN',
    'Version': '2021-04-15',
    'Content-Type': 'application/json',
    'Accept': 'application/json',
    'User-Agent': 'YourApp/1.0',
}

payload = json.dumps({})
conn.request('POST', '/v1/calendars/groups/validate-slug', body=payload, headers=headers)

response = conn.getresponse()
data = json.loads(response.read().decode())
print(json.dumps(data, indent=2))
conn.close()

n8n HTTP Node

{
  "name": "GHL - POST validate-slug",
  "type": "n8n-nodes-base.httpRequest",
  "parameters": {
    "method": "POST",
    "url": "https://rest.gohighlevel.com/v1/calendars/groups/validate-slug",
    "authentication": "genericCredentialType",
    "genericAuthType": "httpHeaderAuth",
    "sendHeaders": true,
    "headerParameters": {
      "parameters": [
        {
          "name": "Authorization",
          "value": "Bearer YOUR_API_TOKEN"
        },
        {
          "name": "Version",
          "value": "2021-04-15"
        },
        {
          "name": "Content-Type",
          "value": "application/json"
        },
        {
          "name": "Accept",
          "value": "application/json"
        },
        {
          "name": "User-Agent",
          "value": "YourApp/1.0"
        }
      ]
    },
    "sendBody": true,
    "bodyParameters": {
      "parameters": []
    },
    "options": {}
  }
}

To use in n8n:

  1. Add an HTTP Request node
  2. Switch to JSON mode (Parameters → use RAW JSON)
  3. Paste the JSON above
  4. Update YOUR_API_TOKEN with your actual GHL API key

Request Body Schema

  • locationId (string) (required) (e.g. ve9EPM428h8vShlRW1KT): Location Id
  • slug (string) (required) (e.g. calendar-1): Slug

Response Codes

Code Description Schema
200 Successful response - available (boolean) (required)
400 Bad Request Standard error response for bad requests (400). Contains message, statusCode fields.
401 Unauthorized Standard error response for unauthorized requests (401). Contains message, statusCode fields.

⚠️ Special Notes & Quirks

⚠️ User-Agent Required: All GHL API requests require a User-Agent HTTP header. Requests without it may be rejected with a 403 error.

📌 Slug Validation: Use the POST /calendars/groups/validate-slug endpoint before creating a group to ensure the slug is unique.


DELETE /calendars/groups/{groupId}

Summary: Delete Group

Delete Group

Version Header: 2021-04-15

Operation ID: delete-group

Tags: Calendar Groups

cURL

curl -X DELETE 'https://rest.gohighlevel.com/v1/calendars/groups/ocQHyuzHvysMo5N5VsXc' \
  -H 'Authorization: Bearer YOUR_API_TOKEN' \
  -H 'Version: 2021-04-15' \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -H 'User-Agent: YourApp/1.0'

Python (http.client)

import http.client
import json

conn = http.client.HTTPSConnection('rest.gohighlevel.com')

headers = {
    'Authorization': 'Bearer YOUR_API_TOKEN',
    'Version': '2021-04-15',
    'Content-Type': 'application/json',
    'Accept': 'application/json',
    'User-Agent': 'YourApp/1.0',
}

conn.request('DELETE', '/v1/calendars/groups/ocQHyuzHvysMo5N5VsXc', headers=headers)

response = conn.getresponse()
data = json.loads(response.read().decode())
print(json.dumps(data, indent=2))
conn.close()

n8n HTTP Node

{
  "name": "GHL - DELETE ocQHyuzHvysMo5N5VsXc",
  "type": "n8n-nodes-base.httpRequest",
  "parameters": {
    "method": "DELETE",
    "url": "https://rest.gohighlevel.com/v1/calendars/groups/ocQHyuzHvysMo5N5VsXc",
    "authentication": "genericCredentialType",
    "genericAuthType": "httpHeaderAuth",
    "sendHeaders": true,
    "headerParameters": {
      "parameters": [
        {
          "name": "Authorization",
          "value": "Bearer YOUR_API_TOKEN"
        },
        {
          "name": "Version",
          "value": "2021-04-15"
        },
        {
          "name": "Content-Type",
          "value": "application/json"
        },
        {
          "name": "Accept",
          "value": "application/json"
        },
        {
          "name": "User-Agent",
          "value": "YourApp/1.0"
        }
      ]
    },
    "sendBody": false,
    "bodyParameters": {
      "parameters": []
    },
    "options": {}
  }
}

To use in n8n:

  1. Add an HTTP Request node
  2. Switch to JSON mode (Parameters → use RAW JSON)
  3. Paste the JSON above
  4. Update YOUR_API_TOKEN with your actual GHL API key

Request Parameters

Name Location Type Required Description
groupId Path string Group Id [example: ocQHyuzHvysMo5N5VsXc]

Response Codes

Code Description Schema
200 Successful response - success (boolean) (e.g. true): Success
400 Bad Request Standard error response for bad requests (400). Contains message, statusCode fields.
401 Unauthorized Standard error response for unauthorized requests (401). Contains message, statusCode fields.

⚠️ Special Notes & Quirks

⚠️ User-Agent Required: All GHL API requests require a User-Agent HTTP header. Requests without it may be rejected with a 403 error.

📌 Slug Validation: Use the POST /calendars/groups/validate-slug endpoint before creating a group to ensure the slug is unique.


PUT /calendars/groups/{groupId}

Summary: Update Group

Update Group by group ID

Version Header: 2021-04-15

Operation ID: edit-group

Tags: Calendar Groups

cURL

curl -X PUT 'https://rest.gohighlevel.com/v1/calendars/groups/ocQHyuzHvysMo5N5VsXc' \
  -H 'Authorization: Bearer YOUR_API_TOKEN' \
  -H 'Version: 2021-04-15' \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -H 'User-Agent: YourApp/1.0' \
  -d '{}'  # See request body schema below

Python (http.client)

import http.client
import json

conn = http.client.HTTPSConnection('rest.gohighlevel.com')

headers = {
    'Authorization': 'Bearer YOUR_API_TOKEN',
    'Version': '2021-04-15',
    'Content-Type': 'application/json',
    'Accept': 'application/json',
    'User-Agent': 'YourApp/1.0',
}

payload = json.dumps({})
conn.request('PUT', '/v1/calendars/groups/ocQHyuzHvysMo5N5VsXc', body=payload, headers=headers)

response = conn.getresponse()
data = json.loads(response.read().decode())
print(json.dumps(data, indent=2))
conn.close()

n8n HTTP Node

{
  "name": "GHL - PUT ocQHyuzHvysMo5N5VsXc",
  "type": "n8n-nodes-base.httpRequest",
  "parameters": {
    "method": "PUT",
    "url": "https://rest.gohighlevel.com/v1/calendars/groups/ocQHyuzHvysMo5N5VsXc",
    "authentication": "genericCredentialType",
    "genericAuthType": "httpHeaderAuth",
    "sendHeaders": true,
    "headerParameters": {
      "parameters": [
        {
          "name": "Authorization",
          "value": "Bearer YOUR_API_TOKEN"
        },
        {
          "name": "Version",
          "value": "2021-04-15"
        },
        {
          "name": "Content-Type",
          "value": "application/json"
        },
        {
          "name": "Accept",
          "value": "application/json"
        },
        {
          "name": "User-Agent",
          "value": "YourApp/1.0"
        }
      ]
    },
    "sendBody": true,
    "bodyParameters": {
      "parameters": []
    },
    "options": {}
  }
}

To use in n8n:

  1. Add an HTTP Request node
  2. Switch to JSON mode (Parameters → use RAW JSON)
  3. Paste the JSON above
  4. Update YOUR_API_TOKEN with your actual GHL API key

Request Parameters

Name Location Type Required Description
groupId Path string Group Id [example: ocQHyuzHvysMo5N5VsXc]

Request Body Schema

  • name (string) (required) (e.g. group a)
  • description (string) (required) (e.g. group description)
  • slug (string) (required) (e.g. 15-mins)

Response Codes

Code Description Schema
200 Successful response - group (GroupDTO)
400 Bad Request Standard error response for bad requests (400). Contains message, statusCode fields.
401 Unauthorized Standard error response for unauthorized requests (401). Contains message, statusCode fields.

⚠️ Special Notes & Quirks

⚠️ User-Agent Required: All GHL API requests require a User-Agent HTTP header. Requests without it may be rejected with a 403 error.

📌 Slug Validation: Use the POST /calendars/groups/validate-slug endpoint before creating a group to ensure the slug is unique.


PUT /calendars/groups/{groupId}/status

Summary: Disable Group

Disable Group

Version Header: 2021-04-15

Operation ID: disable-group

Tags: Calendar Groups

cURL

curl -X PUT 'https://rest.gohighlevel.com/v1/calendars/groups/ocQHyuzHvysMo5N5VsXc/status' \
  -H 'Authorization: Bearer YOUR_API_TOKEN' \
  -H 'Version: 2021-04-15' \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -H 'User-Agent: YourApp/1.0' \
  -d '{}'  # See request body schema below

Python (http.client)

import http.client
import json

conn = http.client.HTTPSConnection('rest.gohighlevel.com')

headers = {
    'Authorization': 'Bearer YOUR_API_TOKEN',
    'Version': '2021-04-15',
    'Content-Type': 'application/json',
    'Accept': 'application/json',
    'User-Agent': 'YourApp/1.0',
}

payload = json.dumps({})
conn.request('PUT', '/v1/calendars/groups/ocQHyuzHvysMo5N5VsXc/status', body=payload, headers=headers)

response = conn.getresponse()
data = json.loads(response.read().decode())
print(json.dumps(data, indent=2))
conn.close()

n8n HTTP Node

{
  "name": "GHL - PUT status",
  "type": "n8n-nodes-base.httpRequest",
  "parameters": {
    "method": "PUT",
    "url": "https://rest.gohighlevel.com/v1/calendars/groups/ocQHyuzHvysMo5N5VsXc/status",
    "authentication": "genericCredentialType",
    "genericAuthType": "httpHeaderAuth",
    "sendHeaders": true,
    "headerParameters": {
      "parameters": [
        {
          "name": "Authorization",
          "value": "Bearer YOUR_API_TOKEN"
        },
        {
          "name": "Version",
          "value": "2021-04-15"
        },
        {
          "name": "Content-Type",
          "value": "application/json"
        },
        {
          "name": "Accept",
          "value": "application/json"
        },
        {
          "name": "User-Agent",
          "value": "YourApp/1.0"
        }
      ]
    },
    "sendBody": true,
    "bodyParameters": {
      "parameters": []
    },
    "options": {}
  }
}

To use in n8n:

  1. Add an HTTP Request node
  2. Switch to JSON mode (Parameters → use RAW JSON)
  3. Paste the JSON above
  4. Update YOUR_API_TOKEN with your actual GHL API key

Request Parameters

Name Location Type Required Description
groupId Path string Group Id [example: ocQHyuzHvysMo5N5VsXc]

Request Body Schema

  • isActive (boolean) (required) (e.g. True): Is Active?

Response Codes

Code Description Schema
200 Successful response - success (boolean) (e.g. true): Success
400 Bad Request Standard error response for bad requests (400). Contains message, statusCode fields.
401 Unauthorized Standard error response for unauthorized requests (401). Contains message, statusCode fields.

⚠️ Special Notes & Quirks

⚠️ User-Agent Required: All GHL API requests require a User-Agent HTTP header. Requests without it may be rejected with a 403 error.

📌 Slug Validation: Use the POST /calendars/groups/validate-slug endpoint before creating a group to ensure the slug is unique.


GET /calendars/resources/{resourceType}

Summary: List Calendar Resources

List calendar resources by resource type and location ID

Version Header: 2021-04-15

Operation ID: fetch-calendar-resources

Tags: Calendar Resources: Rooms & Equipments

cURL

curl -X GET 'https://rest.gohighlevel.com/v1/calendars/resources/VALUE?locationId=VALUE&limit=VALUE&skip=VALUE' \
  -H 'Authorization: Bearer YOUR_API_TOKEN' \
  -H 'Version: 2021-04-15' \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -H 'User-Agent: YourApp/1.0'

Python (http.client)

import http.client
import json

conn = http.client.HTTPSConnection('rest.gohighlevel.com')

headers = {
    'Authorization': 'Bearer YOUR_API_TOKEN',
    'Version': '2021-04-15',
    'Content-Type': 'application/json',
    'Accept': 'application/json',
    'User-Agent': 'YourApp/1.0',
}

conn.request('GET', '/v1/calendars/resources/VALUE?locationId=VALUE&limit=VALUE&skip=VALUE', headers=headers)

response = conn.getresponse()
data = json.loads(response.read().decode())
print(json.dumps(data, indent=2))
conn.close()

n8n HTTP Node

{
  "name": "GHL - GET VALUE",
  "type": "n8n-nodes-base.httpRequest",
  "parameters": {
    "method": "GET",
    "url": "https://rest.gohighlevel.com/v1/calendars/resources/VALUE",
    "authentication": "genericCredentialType",
    "genericAuthType": "httpHeaderAuth",
    "sendHeaders": true,
    "headerParameters": {
      "parameters": [
        {
          "name": "Authorization",
          "value": "Bearer YOUR_API_TOKEN"
        },
        {
          "name": "Version",
          "value": "2021-04-15"
        },
        {
          "name": "Content-Type",
          "value": "application/json"
        },
        {
          "name": "Accept",
          "value": "application/json"
        },
        {
          "name": "User-Agent",
          "value": "YourApp/1.0"
        }
      ]
    },
    "sendBody": false,
    "bodyParameters": {
      "parameters": []
    },
    "options": {},
    "sendQuery": true,
    "queryParameters": {
      "parameters": [
        {
          "name": "locationId",
          "value": "VALUE"
        },
        {
          "name": "limit",
          "value": "VALUE"
        },
        {
          "name": "skip",
          "value": "VALUE"
        }
      ]
    }
  }
}

To use in n8n:

  1. Add an HTTP Request node
  2. Switch to JSON mode (Parameters → use RAW JSON)
  3. Paste the JSON above
  4. Update YOUR_API_TOKEN with your actual GHL API key

Request Parameters

Name Location Type Required Description
resourceType Path string Calendar Resource Type (values: equipments, rooms)
locationId Query string
limit Query number
skip Query number

Response Codes

Code Description Schema
200 Calendar resources listed array of:
- locationId (string) (required): Location ID of the resource
- name (string) (required) (e.g. yoga room): Name of the reso...
400 Bad Request Standard error response for bad requests (400). Contains message, statusCode fields.
401 Unauthorized Standard error response for unauthorized requests (401). Contains message, statusCode fields.

⚠️ Special Notes & Quirks

⚠️ User-Agent Required: All GHL API requests require a User-Agent HTTP header. Requests without it may be rejected with a 403 error.


POST /calendars/resources/{resourceType}

Summary: Create Calendar Resource

Create calendar resource by resource type

Version Header: 2021-04-15

Operation ID: create-calendar-resource

Tags: Calendar Resources: Rooms & Equipments

cURL

curl -X POST 'https://rest.gohighlevel.com/v1/calendars/resources/VALUE' \
  -H 'Authorization: Bearer YOUR_API_TOKEN' \
  -H 'Version: 2021-04-15' \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -H 'User-Agent: YourApp/1.0' \
  -d '{}'  # See request body schema below

Python (http.client)

import http.client
import json

conn = http.client.HTTPSConnection('rest.gohighlevel.com')

headers = {
    'Authorization': 'Bearer YOUR_API_TOKEN',
    'Version': '2021-04-15',
    'Content-Type': 'application/json',
    'Accept': 'application/json',
    'User-Agent': 'YourApp/1.0',
}

payload = json.dumps({})
conn.request('POST', '/v1/calendars/resources/VALUE', body=payload, headers=headers)

response = conn.getresponse()
data = json.loads(response.read().decode())
print(json.dumps(data, indent=2))
conn.close()

n8n HTTP Node

{
  "name": "GHL - POST VALUE",
  "type": "n8n-nodes-base.httpRequest",
  "parameters": {
    "method": "POST",
    "url": "https://rest.gohighlevel.com/v1/calendars/resources/VALUE",
    "authentication": "genericCredentialType",
    "genericAuthType": "httpHeaderAuth",
    "sendHeaders": true,
    "headerParameters": {
      "parameters": [
        {
          "name": "Authorization",
          "value": "Bearer YOUR_API_TOKEN"
        },
        {
          "name": "Version",
          "value": "2021-04-15"
        },
        {
          "name": "Content-Type",
          "value": "application/json"
        },
        {
          "name": "Accept",
          "value": "application/json"
        },
        {
          "name": "User-Agent",
          "value": "YourApp/1.0"
        }
      ]
    },
    "sendBody": true,
    "bodyParameters": {
      "parameters": []
    },
    "options": {}
  }
}

To use in n8n:

  1. Add an HTTP Request node
  2. Switch to JSON mode (Parameters → use RAW JSON)
  3. Paste the JSON above
  4. Update YOUR_API_TOKEN with your actual GHL API key

Request Parameters

Name Location Type Required Description
resourceType Path string Calendar Resource Type (values: equipments, rooms)

Request Body Schema

  • locationId (string) (required)

  • name (string) (required)

  • description (string) (required)

  • quantity (number) (required): Quantity of the equipment.

  • outOfService (number) (required): Quantity of the out of service equipment.

  • capacity (number) (required): Capacity of the room.

  • calendarIds (array) (required): Service calendar IDs to be mapped with the resource.

    One equipment can only be mapped with one service calendar.

One room can be mapped with multiple service calendars.

Response Codes

Code Description Schema
201 Calendar resource created - locationId (string) (required): Location ID of the resource
- name (string) (required) (e.g. yoga room): Name of the resource
- *...
400 Bad Request Standard error response for bad requests (400). Contains message, statusCode fields.
401 Unauthorized Standard error response for unauthorized requests (401). Contains message, statusCode fields.

⚠️ Special Notes & Quirks

⚠️ User-Agent Required: All GHL API requests require a User-Agent HTTP header. Requests without it may be rejected with a 403 error.


DELETE /calendars/resources/{resourceType}/{id}

Summary: Delete Calendar Resource

Delete calendar resource by ID

Version Header: 2021-04-15

Operation ID: delete-calendar-resource

Tags: Calendar Resources: Rooms & Equipments

cURL

curl -X DELETE 'https://rest.gohighlevel.com/v1/calendars/resources/VALUE/VALUE' \
  -H 'Authorization: Bearer YOUR_API_TOKEN' \
  -H 'Version: 2021-04-15' \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -H 'User-Agent: YourApp/1.0'

Python (http.client)

import http.client
import json

conn = http.client.HTTPSConnection('rest.gohighlevel.com')

headers = {
    'Authorization': 'Bearer YOUR_API_TOKEN',
    'Version': '2021-04-15',
    'Content-Type': 'application/json',
    'Accept': 'application/json',
    'User-Agent': 'YourApp/1.0',
}

conn.request('DELETE', '/v1/calendars/resources/VALUE/VALUE', headers=headers)

response = conn.getresponse()
data = json.loads(response.read().decode())
print(json.dumps(data, indent=2))
conn.close()

n8n HTTP Node

{
  "name": "GHL - DELETE VALUE",
  "type": "n8n-nodes-base.httpRequest",
  "parameters": {
    "method": "DELETE",
    "url": "https://rest.gohighlevel.com/v1/calendars/resources/VALUE/VALUE",
    "authentication": "genericCredentialType",
    "genericAuthType": "httpHeaderAuth",
    "sendHeaders": true,
    "headerParameters": {
      "parameters": [
        {
          "name": "Authorization",
          "value": "Bearer YOUR_API_TOKEN"
        },
        {
          "name": "Version",
          "value": "2021-04-15"
        },
        {
          "name": "Content-Type",
          "value": "application/json"
        },
        {
          "name": "Accept",
          "value": "application/json"
        },
        {
          "name": "User-Agent",
          "value": "YourApp/1.0"
        }
      ]
    },
    "sendBody": false,
    "bodyParameters": {
      "parameters": []
    },
    "options": {}
  }
}

To use in n8n:

  1. Add an HTTP Request node
  2. Switch to JSON mode (Parameters → use RAW JSON)
  3. Paste the JSON above
  4. Update YOUR_API_TOKEN with your actual GHL API key

Request Parameters

Name Location Type Required Description
resourceType Path string Calendar Resource Type (values: equipments, rooms)
id Path string Calendar Resource ID

Response Codes

Code Description Schema
200 Calendar resource deleted - success (boolean) (e.g. true): Success
400 Bad Request Standard error response for bad requests (400). Contains message, statusCode fields.
401 Unauthorized Standard error response for unauthorized requests (401). Contains message, statusCode fields.

⚠️ Special Notes & Quirks

⚠️ User-Agent Required: All GHL API requests require a User-Agent HTTP header. Requests without it may be rejected with a 403 error.


GET /calendars/resources/{resourceType}/{id}

Summary: Get Calendar Resource

Get calendar resource by ID

Version Header: 2021-04-15

Operation ID: get-calendar-resource

Tags: Calendar Resources: Rooms & Equipments

cURL

curl -X GET 'https://rest.gohighlevel.com/v1/calendars/resources/VALUE/VALUE' \
  -H 'Authorization: Bearer YOUR_API_TOKEN' \
  -H 'Version: 2021-04-15' \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -H 'User-Agent: YourApp/1.0'

Python (http.client)

import http.client
import json

conn = http.client.HTTPSConnection('rest.gohighlevel.com')

headers = {
    'Authorization': 'Bearer YOUR_API_TOKEN',
    'Version': '2021-04-15',
    'Content-Type': 'application/json',
    'Accept': 'application/json',
    'User-Agent': 'YourApp/1.0',
}

conn.request('GET', '/v1/calendars/resources/VALUE/VALUE', headers=headers)

response = conn.getresponse()
data = json.loads(response.read().decode())
print(json.dumps(data, indent=2))
conn.close()

n8n HTTP Node

{
  "name": "GHL - GET VALUE",
  "type": "n8n-nodes-base.httpRequest",
  "parameters": {
    "method": "GET",
    "url": "https://rest.gohighlevel.com/v1/calendars/resources/VALUE/VALUE",
    "authentication": "genericCredentialType",
    "genericAuthType": "httpHeaderAuth",
    "sendHeaders": true,
    "headerParameters": {
      "parameters": [
        {
          "name": "Authorization",
          "value": "Bearer YOUR_API_TOKEN"
        },
        {
          "name": "Version",
          "value": "2021-04-15"
        },
        {
          "name": "Content-Type",
          "value": "application/json"
        },
        {
          "name": "Accept",
          "value": "application/json"
        },
        {
          "name": "User-Agent",
          "value": "YourApp/1.0"
        }
      ]
    },
    "sendBody": false,
    "bodyParameters": {
      "parameters": []
    },
    "options": {}
  }
}

To use in n8n:

  1. Add an HTTP Request node
  2. Switch to JSON mode (Parameters → use RAW JSON)
  3. Paste the JSON above
  4. Update YOUR_API_TOKEN with your actual GHL API key

Request Parameters

Name Location Type Required Description
resourceType Path string Calendar Resource Type (values: equipments, rooms)
id Path string Calendar Resource ID

Response Codes

Code Description Schema
200 Calendar resource fetched - locationId (string) (required): Location ID of the resource
- name (string) (required) (e.g. yoga room): Name of the resource
- *...
400 Bad Request Standard error response for bad requests (400). Contains message, statusCode fields.
401 Unauthorized Standard error response for unauthorized requests (401). Contains message, statusCode fields.

⚠️ Special Notes & Quirks

⚠️ User-Agent Required: All GHL API requests require a User-Agent HTTP header. Requests without it may be rejected with a 403 error.


PUT /calendars/resources/{resourceType}/{id}

Summary: Update Calendar Resource

Update calendar resource by ID

Version Header: 2021-04-15

Operation ID: update-calendar-resource

Tags: Calendar Resources: Rooms & Equipments

cURL

curl -X PUT 'https://rest.gohighlevel.com/v1/calendars/resources/VALUE/VALUE' \
  -H 'Authorization: Bearer YOUR_API_TOKEN' \
  -H 'Version: 2021-04-15' \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -H 'User-Agent: YourApp/1.0' \
  -d '{}'  # See request body schema below

Python (http.client)

import http.client
import json

conn = http.client.HTTPSConnection('rest.gohighlevel.com')

headers = {
    'Authorization': 'Bearer YOUR_API_TOKEN',
    'Version': '2021-04-15',
    'Content-Type': 'application/json',
    'Accept': 'application/json',
    'User-Agent': 'YourApp/1.0',
}

payload = json.dumps({})
conn.request('PUT', '/v1/calendars/resources/VALUE/VALUE', body=payload, headers=headers)

response = conn.getresponse()
data = json.loads(response.read().decode())
print(json.dumps(data, indent=2))
conn.close()

n8n HTTP Node

{
  "name": "GHL - PUT VALUE",
  "type": "n8n-nodes-base.httpRequest",
  "parameters": {
    "method": "PUT",
    "url": "https://rest.gohighlevel.com/v1/calendars/resources/VALUE/VALUE",
    "authentication": "genericCredentialType",
    "genericAuthType": "httpHeaderAuth",
    "sendHeaders": true,
    "headerParameters": {
      "parameters": [
        {
          "name": "Authorization",
          "value": "Bearer YOUR_API_TOKEN"
        },
        {
          "name": "Version",
          "value": "2021-04-15"
        },
        {
          "name": "Content-Type",
          "value": "application/json"
        },
        {
          "name": "Accept",
          "value": "application/json"
        },
        {
          "name": "User-Agent",
          "value": "YourApp/1.0"
        }
      ]
    },
    "sendBody": true,
    "bodyParameters": {
      "parameters": []
    },
    "options": {}
  }
}

To use in n8n:

  1. Add an HTTP Request node
  2. Switch to JSON mode (Parameters → use RAW JSON)
  3. Paste the JSON above
  4. Update YOUR_API_TOKEN with your actual GHL API key

Request Parameters

Name Location Type Required Description
resourceType Path string Calendar Resource Type (values: equipments, rooms)
id Path string Calendar Resource ID

Request Body Schema

  • locationId (string)

  • name (string)

  • description (string)

  • quantity (number): Quantity of the equipment.

  • outOfService (number): Quantity of the out of service equipment.

  • capacity (number): Capacity of the room.

  • calendarIds (array): Service calendar IDs to be mapped with the resource.

    One equipment can only be mapped with one service calendar.

One room can be mapped with multiple service calendars.

  • isActive (boolean)

Response Codes

Code Description Schema
200 Calendar resource updated - locationId (string) (required): Location ID of the resource
- name (string) (required) (e.g. yoga room): Name of the resource
- *...
400 Bad Request Standard error response for bad requests (400). Contains message, statusCode fields.
401 Unauthorized Standard error response for unauthorized requests (401). Contains message, statusCode fields.

⚠️ Special Notes & Quirks

⚠️ User-Agent Required: All GHL API requests require a User-Agent HTTP header. Requests without it may be rejected with a 403 error.


POST /calendars/schedules

Summary: Create user availability schedule

Create new schedule with specified rules, timezone, location, user and calendar associations.

Version Header: 2021-04-15

Operation ID: createSchedule

Tags: Availability

cURL

curl -X POST 'https://rest.gohighlevel.com/v1/calendars/schedules' \
  -H 'Authorization: Bearer YOUR_API_TOKEN' \
  -H 'Version: 2021-04-15' \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -H 'User-Agent: YourApp/1.0' \
  -d '{}'  # See request body schema below

Python (http.client)

import http.client
import json

conn = http.client.HTTPSConnection('rest.gohighlevel.com')

headers = {
    'Authorization': 'Bearer YOUR_API_TOKEN',
    'Version': '2021-04-15',
    'Content-Type': 'application/json',
    'Accept': 'application/json',
    'User-Agent': 'YourApp/1.0',
}

payload = json.dumps({})
conn.request('POST', '/v1/calendars/schedules', body=payload, headers=headers)

response = conn.getresponse()
data = json.loads(response.read().decode())
print(json.dumps(data, indent=2))
conn.close()

n8n HTTP Node

{
  "name": "GHL - POST schedules",
  "type": "n8n-nodes-base.httpRequest",
  "parameters": {
    "method": "POST",
    "url": "https://rest.gohighlevel.com/v1/calendars/schedules",
    "authentication": "genericCredentialType",
    "genericAuthType": "httpHeaderAuth",
    "sendHeaders": true,
    "headerParameters": {
      "parameters": [
        {
          "name": "Authorization",
          "value": "Bearer YOUR_API_TOKEN"
        },
        {
          "name": "Version",
          "value": "2021-04-15"
        },
        {
          "name": "Content-Type",
          "value": "application/json"
        },
        {
          "name": "Accept",
          "value": "application/json"
        },
        {
          "name": "User-Agent",
          "value": "YourApp/1.0"
        }
      ]
    },
    "sendBody": true,
    "bodyParameters": {
      "parameters": []
    },
    "options": {}
  }
}

To use in n8n:

  1. Add an HTTP Request node
  2. Switch to JSON mode (Parameters → use RAW JSON)
  3. Paste the JSON above
  4. Update YOUR_API_TOKEN with your actual GHL API key

Request Body Schema

  • rules (array of ScheduleRuleDTO) (e.g. [{'type': 'wday', 'day': 'monday', 'intervals': [{'from': '09:00', 'to': '17:00'}]}]): Schedule rules defining when the schedule is active
  • timezone (string) (required) (e.g. America/New_York): Timezone for the schedule (IANA timezone identifier)
  • locationId (string) (required) (e.g. IkqiJlXJ7o9h61tCHHod): Location ID where this schedule applies
  • name (string) (required) (e.g. Business Hours Schedule): Human-readable name for the schedule
  • userId (string) (required) (e.g. IkqiJlXJ7o9h61tCHHod): User ID associated with the schedule
  • calendarIds (array) (e.g. ['WvVX9LpvlBO6K506xLbp', 'XyZ8MnQrStUvWxYzAbCdEf']): Calendar IDs associated with the schedule

Response Codes

Code Description Schema
201 Schedule created successfully - schedule (string) (required): Schedule
400 Invalid request parameters Standard error response for bad requests (400). Contains message, statusCode fields.
401 User not authenticated Standard error response for unauthorized requests (401). Contains message, statusCode fields.
422 Validation errors in schedule rules or conflicting data Standard error response for unprocessable entity (422). Contains message, statusCode, errors array fields.

⚠️ Special Notes & Quirks

⚠️ User-Agent Required: All GHL API requests require a User-Agent HTTP header. Requests without it may be rejected with a 403 error.


GET /calendars/schedules/search

Summary: List user availability schedule

Retrieve user availability schedules based on various filters including location, calendar, and user. Supports pagination.

Version Header: 2021-04-15

Operation ID: getAllSchedules

Tags: Availability

cURL

curl -X GET 'https://rest.gohighlevel.com/v1/calendars/schedules/search?locationId=IkqiJlXJ7o9h61tCHHod&userId=IkqiJlXJ7o9h61tCHHod&calendarId=WvVX9LpvlBO6K506xLbp&skip=VALUE&limit=50' \
  -H 'Authorization: Bearer YOUR_API_TOKEN' \
  -H 'Version: 2021-04-15' \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -H 'User-Agent: YourApp/1.0'

Python (http.client)

import http.client
import json

conn = http.client.HTTPSConnection('rest.gohighlevel.com')

headers = {
    'Authorization': 'Bearer YOUR_API_TOKEN',
    'Version': '2021-04-15',
    'Content-Type': 'application/json',
    'Accept': 'application/json',
    'User-Agent': 'YourApp/1.0',
}

conn.request('GET', '/v1/calendars/schedules/search?locationId=IkqiJlXJ7o9h61tCHHod&userId=IkqiJlXJ7o9h61tCHHod&calendarId=WvVX9LpvlBO6K506xLbp&skip=VALUE&limit=50', headers=headers)

response = conn.getresponse()
data = json.loads(response.read().decode())
print(json.dumps(data, indent=2))
conn.close()

n8n HTTP Node

{
  "name": "GHL - GET search",
  "type": "n8n-nodes-base.httpRequest",
  "parameters": {
    "method": "GET",
    "url": "https://rest.gohighlevel.com/v1/calendars/schedules/search",
    "authentication": "genericCredentialType",
    "genericAuthType": "httpHeaderAuth",
    "sendHeaders": true,
    "headerParameters": {
      "parameters": [
        {
          "name": "Authorization",
          "value": "Bearer YOUR_API_TOKEN"
        },
        {
          "name": "Version",
          "value": "2021-04-15"
        },
        {
          "name": "Content-Type",
          "value": "application/json"
        },
        {
          "name": "Accept",
          "value": "application/json"
        },
        {
          "name": "User-Agent",
          "value": "YourApp/1.0"
        }
      ]
    },
    "sendBody": false,
    "bodyParameters": {
      "parameters": []
    },
    "options": {},
    "sendQuery": true,
    "queryParameters": {
      "parameters": [
        {
          "name": "locationId",
          "value": "IkqiJlXJ7o9h61tCHHod"
        },
        {
          "name": "userId",
          "value": "IkqiJlXJ7o9h61tCHHod"
        },
        {
          "name": "calendarId",
          "value": "WvVX9LpvlBO6K506xLbp"
        },
        {
          "name": "skip",
          "value": "VALUE"
        },
        {
          "name": "limit",
          "value": 50
        }
      ]
    }
  }
}

To use in n8n:

  1. Add an HTTP Request node
  2. Switch to JSON mode (Parameters → use RAW JSON)
  3. Paste the JSON above
  4. Update YOUR_API_TOKEN with your actual GHL API key

Request Parameters

Name Location Type Required Description
locationId Query string Location ID to filter schedules by [example: IkqiJlXJ7o9h61tCHHod]
userId Query string User ID to filter schedules by specific user [example: IkqiJlXJ7o9h61tCHHod]
calendarId Query string Calendar ID for filtering schedules by specific calendar [example: WvVX9LpvlBO6K506xLbp]
skip Query number Number of items to skip for pagination
limit Query number Maximum number of items to return (max 500) [example: 50]

Response Codes

Code Description Schema
200 Schedules retrieved successfully - schedules (array of ScheduleObjectResponseDTO) (required): Array of schedules
400 Invalid request parameters Standard error response for bad requests (400). Contains message, statusCode fields.
401 User not authenticated Standard error response for unauthorized requests (401). Contains message, statusCode fields.

⚠️ Special Notes & Quirks

⚠️ User-Agent Required: All GHL API requests require a User-Agent HTTP header. Requests without it may be rejected with a 403 error.


DELETE /calendars/schedules/{id}

Summary: Delete user availability schedule

Permanently remove a schedule and all its associated rules. This action cannot be undone.

Version Header: 2021-04-15

Operation ID: deleteSchedule

Tags: Availability

cURL

curl -X DELETE 'https://rest.gohighlevel.com/v1/calendars/schedules/sch123def456ghi789' \
  -H 'Authorization: Bearer YOUR_API_TOKEN' \
  -H 'Version: 2021-04-15' \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -H 'User-Agent: YourApp/1.0'

Python (http.client)

import http.client
import json

conn = http.client.HTTPSConnection('rest.gohighlevel.com')

headers = {
    'Authorization': 'Bearer YOUR_API_TOKEN',
    'Version': '2021-04-15',
    'Content-Type': 'application/json',
    'Accept': 'application/json',
    'User-Agent': 'YourApp/1.0',
}

conn.request('DELETE', '/v1/calendars/schedules/sch123def456ghi789', headers=headers)

response = conn.getresponse()
data = json.loads(response.read().decode())
print(json.dumps(data, indent=2))
conn.close()

n8n HTTP Node

{
  "name": "GHL - DELETE sch123def456ghi789",
  "type": "n8n-nodes-base.httpRequest",
  "parameters": {
    "method": "DELETE",
    "url": "https://rest.gohighlevel.com/v1/calendars/schedules/sch123def456ghi789",
    "authentication": "genericCredentialType",
    "genericAuthType": "httpHeaderAuth",
    "sendHeaders": true,
    "headerParameters": {
      "parameters": [
        {
          "name": "Authorization",
          "value": "Bearer YOUR_API_TOKEN"
        },
        {
          "name": "Version",
          "value": "2021-04-15"
        },
        {
          "name": "Content-Type",
          "value": "application/json"
        },
        {
          "name": "Accept",
          "value": "application/json"
        },
        {
          "name": "User-Agent",
          "value": "YourApp/1.0"
        }
      ]
    },
    "sendBody": false,
    "bodyParameters": {
      "parameters": []
    },
    "options": {}
  }
}

To use in n8n:

  1. Add an HTTP Request node
  2. Switch to JSON mode (Parameters → use RAW JSON)
  3. Paste the JSON above
  4. Update YOUR_API_TOKEN with your actual GHL API key

Request Parameters

Name Location Type Required Description
id Path string Unique identifier of the schedule to delete [example: sch123def456ghi789]

Response Codes

Code Description Schema
200 Schedule deleted successfully - success (boolean) (e.g. True): Whether the deletion was successful
400 Invalid request parameters Standard error response for bad requests (400). Contains message, statusCode fields.
401 User not authenticated Standard error response for unauthorized requests (401). Contains message, statusCode fields.
404 Schedule with the specified ID was not found

⚠️ Special Notes & Quirks

⚠️ User-Agent Required: All GHL API requests require a User-Agent HTTP header. Requests without it may be rejected with a 403 error.


GET /calendars/schedules/{id}

Summary: Get user availability schedule

Retrieve a specific schedule by its unique identifier. Returns detailed information including rules, timezone, and associated calendars/users.

Version Header: 2021-04-15

Operation ID: getScheduleById

Tags: Availability

cURL

curl -X GET 'https://rest.gohighlevel.com/v1/calendars/schedules/IkqiJlXJ7o9h61tCHHod' \
  -H 'Authorization: Bearer YOUR_API_TOKEN' \
  -H 'Version: 2021-04-15' \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -H 'User-Agent: YourApp/1.0'

Python (http.client)

import http.client
import json

conn = http.client.HTTPSConnection('rest.gohighlevel.com')

headers = {
    'Authorization': 'Bearer YOUR_API_TOKEN',
    'Version': '2021-04-15',
    'Content-Type': 'application/json',
    'Accept': 'application/json',
    'User-Agent': 'YourApp/1.0',
}

conn.request('GET', '/v1/calendars/schedules/IkqiJlXJ7o9h61tCHHod', headers=headers)

response = conn.getresponse()
data = json.loads(response.read().decode())
print(json.dumps(data, indent=2))
conn.close()

n8n HTTP Node

{
  "name": "GHL - GET IkqiJlXJ7o9h61tCHHod",
  "type": "n8n-nodes-base.httpRequest",
  "parameters": {
    "method": "GET",
    "url": "https://rest.gohighlevel.com/v1/calendars/schedules/IkqiJlXJ7o9h61tCHHod",
    "authentication": "genericCredentialType",
    "genericAuthType": "httpHeaderAuth",
    "sendHeaders": true,
    "headerParameters": {
      "parameters": [
        {
          "name": "Authorization",
          "value": "Bearer YOUR_API_TOKEN"
        },
        {
          "name": "Version",
          "value": "2021-04-15"
        },
        {
          "name": "Content-Type",
          "value": "application/json"
        },
        {
          "name": "Accept",
          "value": "application/json"
        },
        {
          "name": "User-Agent",
          "value": "YourApp/1.0"
        }
      ]
    },
    "sendBody": false,
    "bodyParameters": {
      "parameters": []
    },
    "options": {}
  }
}

To use in n8n:

  1. Add an HTTP Request node
  2. Switch to JSON mode (Parameters → use RAW JSON)
  3. Paste the JSON above
  4. Update YOUR_API_TOKEN with your actual GHL API key

Request Parameters

Name Location Type Required Description
id Path string Unique identifier of the schedule [example: IkqiJlXJ7o9h61tCHHod]

Response Codes

Code Description Schema
200 Schedule found and retrieved successfully - schedule (string) (required): Schedule
400 Invalid request parameters Standard error response for bad requests (400). Contains message, statusCode fields.
401 User not authenticated Standard error response for unauthorized requests (401). Contains message, statusCode fields.
404 Schedule with the specified ID was not found

⚠️ Special Notes & Quirks

⚠️ User-Agent Required: All GHL API requests require a User-Agent HTTP header. Requests without it may be rejected with a 403 error.


PUT /calendars/schedules/{id}

Summary: Update user availability schedule

Modify an existing schedule by updating its rules, timezone, and name All fields are optional - only provided fields will be updated.

Version Header: 2021-04-15

Operation ID: updateSchedule

Tags: Availability

cURL

curl -X PUT 'https://rest.gohighlevel.com/v1/calendars/schedules/sch123def456ghi789' \
  -H 'Authorization: Bearer YOUR_API_TOKEN' \
  -H 'Version: 2021-04-15' \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -H 'User-Agent: YourApp/1.0' \
  -d '{}'  # See request body schema below

Python (http.client)

import http.client
import json

conn = http.client.HTTPSConnection('rest.gohighlevel.com')

headers = {
    'Authorization': 'Bearer YOUR_API_TOKEN',
    'Version': '2021-04-15',
    'Content-Type': 'application/json',
    'Accept': 'application/json',
    'User-Agent': 'YourApp/1.0',
}

payload = json.dumps({})
conn.request('PUT', '/v1/calendars/schedules/sch123def456ghi789', body=payload, headers=headers)

response = conn.getresponse()
data = json.loads(response.read().decode())
print(json.dumps(data, indent=2))
conn.close()

n8n HTTP Node

{
  "name": "GHL - PUT sch123def456ghi789",
  "type": "n8n-nodes-base.httpRequest",
  "parameters": {
    "method": "PUT",
    "url": "https://rest.gohighlevel.com/v1/calendars/schedules/sch123def456ghi789",
    "authentication": "genericCredentialType",
    "genericAuthType": "httpHeaderAuth",
    "sendHeaders": true,
    "headerParameters": {
      "parameters": [
        {
          "name": "Authorization",
          "value": "Bearer YOUR_API_TOKEN"
        },
        {
          "name": "Version",
          "value": "2021-04-15"
        },
        {
          "name": "Content-Type",
          "value": "application/json"
        },
        {
          "name": "Accept",
          "value": "application/json"
        },
        {
          "name": "User-Agent",
          "value": "YourApp/1.0"
        }
      ]
    },
    "sendBody": true,
    "bodyParameters": {
      "parameters": []
    },
    "options": {}
  }
}

To use in n8n:

  1. Add an HTTP Request node
  2. Switch to JSON mode (Parameters → use RAW JSON)
  3. Paste the JSON above
  4. Update YOUR_API_TOKEN with your actual GHL API key

Request Parameters

Name Location Type Required Description
id Path string Unique identifier of the schedule to update [example: sch123def456ghi789]

Request Body Schema

  • name (string) (e.g. Updated Business Hours): Human-readable name for the schedule
  • rules (array of ScheduleRuleDTO) (e.g. [{'type': 'wday', 'day': 'monday', 'intervals': [{'from': '08:00', 'to': '18:00'}]}]): Updated schedule rules defining when the schedule is active
  • timezone (string) (e.g. America/Los_Angeles): Updated timezone for the schedule (IANA timezone identifier)

Response Codes

Code Description Schema
200 Schedule updated successfully - schedule (string) (required): Schedule
400 Invalid request parameters Standard error response for bad requests (400). Contains message, statusCode fields.
401 User not authenticated Standard error response for unauthorized requests (401). Contains message, statusCode fields.
404 Schedule with the specified ID was not found
422 Validation errors in schedule rules or conflicting data Standard error response for unprocessable entity (422). Contains message, statusCode, errors array fields.

⚠️ Special Notes & Quirks

⚠️ User-Agent Required: All GHL API requests require a User-Agent HTTP header. Requests without it may be rejected with a 403 error.


DELETE /calendars/schedules/{id}/associations/{calendarId}

Summary: Remove user availability schedule from a calendar

Removes the association between a team calendar and the given schedule by removing the calendarId from the schedule

Version Header: 2021-04-15

Operation ID: remove-calendar-from-schedule

Tags: Availability

cURL

curl -X DELETE 'https://rest.gohighlevel.com/v1/calendars/schedules/IkqiJlXJ7o9h61tCHHod/associations/WvVX9LpvlBO6K506xLbp' \
  -H 'Authorization: Bearer YOUR_API_TOKEN' \
  -H 'Version: 2021-04-15' \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -H 'User-Agent: YourApp/1.0'

Python (http.client)

import http.client
import json

conn = http.client.HTTPSConnection('rest.gohighlevel.com')

headers = {
    'Authorization': 'Bearer YOUR_API_TOKEN',
    'Version': '2021-04-15',
    'Content-Type': 'application/json',
    'Accept': 'application/json',
    'User-Agent': 'YourApp/1.0',
}

conn.request('DELETE', '/v1/calendars/schedules/IkqiJlXJ7o9h61tCHHod/associations/WvVX9LpvlBO6K506xLbp', headers=headers)

response = conn.getresponse()
data = json.loads(response.read().decode())
print(json.dumps(data, indent=2))
conn.close()

n8n HTTP Node

{
  "name": "GHL - DELETE WvVX9LpvlBO6K506xLbp",
  "type": "n8n-nodes-base.httpRequest",
  "parameters": {
    "method": "DELETE",
    "url": "https://rest.gohighlevel.com/v1/calendars/schedules/IkqiJlXJ7o9h61tCHHod/associations/WvVX9LpvlBO6K506xLbp",
    "authentication": "genericCredentialType",
    "genericAuthType": "httpHeaderAuth",
    "sendHeaders": true,
    "headerParameters": {
      "parameters": [
        {
          "name": "Authorization",
          "value": "Bearer YOUR_API_TOKEN"
        },
        {
          "name": "Version",
          "value": "2021-04-15"
        },
        {
          "name": "Content-Type",
          "value": "application/json"
        },
        {
          "name": "Accept",
          "value": "application/json"
        },
        {
          "name": "User-Agent",
          "value": "YourApp/1.0"
        }
      ]
    },
    "sendBody": false,
    "bodyParameters": {
      "parameters": []
    },
    "options": {}
  }
}

To use in n8n:

  1. Add an HTTP Request node
  2. Switch to JSON mode (Parameters → use RAW JSON)
  3. Paste the JSON above
  4. Update YOUR_API_TOKEN with your actual GHL API key

Request Parameters

Name Location Type Required Description
id Path string Unique identifier of the schedule [example: IkqiJlXJ7o9h61tCHHod]
calendarId Path string Unique identifier of the calendar to remove from the schedule [example: WvVX9LpvlBO6K506xLbp]

Response Codes

Code Description Schema
200 Calendar successfully removed from schedule - success (boolean) (e.g. True)
400 Schedule and calendar must belong to the same location Standard error response for bad requests (400). Contains message, statusCode fields.
401 User not authenticated Standard error response for unauthorized requests (401). Contains message, statusCode fields.
404 Schedule or calendar not found Standard error response for bad requests (400). Contains message, statusCode fields.

⚠️ Special Notes & Quirks

⚠️ User-Agent Required: All GHL API requests require a User-Agent HTTP header. Requests without it may be rejected with a 403 error.


PUT /calendars/schedules/{id}/associations/{calendarId}

Summary: Apply user availability schedule to a calendar

Associates a calendar with the given schedule by adding the calendarId to a schedule

Version Header: 2021-04-15

Operation ID: add-calendar-to-schedule

Tags: Availability

cURL

curl -X PUT 'https://rest.gohighlevel.com/v1/calendars/schedules/IkqiJlXJ7o9h61tCHHod/associations/WvVX9LpvlBO6K506xLbp' \
  -H 'Authorization: Bearer YOUR_API_TOKEN' \
  -H 'Version: 2021-04-15' \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -H 'User-Agent: YourApp/1.0'

Python (http.client)

import http.client
import json

conn = http.client.HTTPSConnection('rest.gohighlevel.com')

headers = {
    'Authorization': 'Bearer YOUR_API_TOKEN',
    'Version': '2021-04-15',
    'Content-Type': 'application/json',
    'Accept': 'application/json',
    'User-Agent': 'YourApp/1.0',
}

conn.request('PUT', '/v1/calendars/schedules/IkqiJlXJ7o9h61tCHHod/associations/WvVX9LpvlBO6K506xLbp', headers=headers)

response = conn.getresponse()
data = json.loads(response.read().decode())
print(json.dumps(data, indent=2))
conn.close()

n8n HTTP Node

{
  "name": "GHL - PUT WvVX9LpvlBO6K506xLbp",
  "type": "n8n-nodes-base.httpRequest",
  "parameters": {
    "method": "PUT",
    "url": "https://rest.gohighlevel.com/v1/calendars/schedules/IkqiJlXJ7o9h61tCHHod/associations/WvVX9LpvlBO6K506xLbp",
    "authentication": "genericCredentialType",
    "genericAuthType": "httpHeaderAuth",
    "sendHeaders": true,
    "headerParameters": {
      "parameters": [
        {
          "name": "Authorization",
          "value": "Bearer YOUR_API_TOKEN"
        },
        {
          "name": "Version",
          "value": "2021-04-15"
        },
        {
          "name": "Content-Type",
          "value": "application/json"
        },
        {
          "name": "Accept",
          "value": "application/json"
        },
        {
          "name": "User-Agent",
          "value": "YourApp/1.0"
        }
      ]
    },
    "sendBody": true,
    "bodyParameters": {
      "parameters": []
    },
    "options": {}
  }
}

To use in n8n:

  1. Add an HTTP Request node
  2. Switch to JSON mode (Parameters → use RAW JSON)
  3. Paste the JSON above
  4. Update YOUR_API_TOKEN with your actual GHL API key

Request Parameters

Name Location Type Required Description
id Path string Unique identifier of the schedule [example: IkqiJlXJ7o9h61tCHHod]
calendarId Path string Unique identifier of the team calendar to add to the schedule [example: WvVX9LpvlBO6K506xLbp]

Response Codes

Code Description Schema
200 Calendar successfully added to schedule - success (boolean) (e.g. True)
400 Schedule and calendar must belong to the same location Standard error response for bad requests (400). Contains message, statusCode fields.
401 User not authenticated Standard error response for unauthorized requests (401). Contains message, statusCode fields.
404 Schedule or calendar not found Standard error response for bad requests (400). Contains message, statusCode fields.

⚠️ Special Notes & Quirks

⚠️ User-Agent Required: All GHL API requests require a User-Agent HTTP header. Requests without it may be rejected with a 403 error.


DELETE /calendars/{calendarId}

Summary: Delete Calendar

Delete calendar by ID

Version Header: 2021-04-15

Operation ID: delete-calendar

Tags: Calendars

cURL

curl -X DELETE 'https://rest.gohighlevel.com/v1/calendars/ocQHyuzHvysMo5N5VsXc' \
  -H 'Authorization: Bearer YOUR_API_TOKEN' \
  -H 'Version: 2021-04-15' \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -H 'User-Agent: YourApp/1.0'

Python (http.client)

import http.client
import json

conn = http.client.HTTPSConnection('rest.gohighlevel.com')

headers = {
    'Authorization': 'Bearer YOUR_API_TOKEN',
    'Version': '2021-04-15',
    'Content-Type': 'application/json',
    'Accept': 'application/json',
    'User-Agent': 'YourApp/1.0',
}

conn.request('DELETE', '/v1/calendars/ocQHyuzHvysMo5N5VsXc', headers=headers)

response = conn.getresponse()
data = json.loads(response.read().decode())
print(json.dumps(data, indent=2))
conn.close()

n8n HTTP Node

{
  "name": "GHL - DELETE ocQHyuzHvysMo5N5VsXc",
  "type": "n8n-nodes-base.httpRequest",
  "parameters": {
    "method": "DELETE",
    "url": "https://rest.gohighlevel.com/v1/calendars/ocQHyuzHvysMo5N5VsXc",
    "authentication": "genericCredentialType",
    "genericAuthType": "httpHeaderAuth",
    "sendHeaders": true,
    "headerParameters": {
      "parameters": [
        {
          "name": "Authorization",
          "value": "Bearer YOUR_API_TOKEN"
        },
        {
          "name": "Version",
          "value": "2021-04-15"
        },
        {
          "name": "Content-Type",
          "value": "application/json"
        },
        {
          "name": "Accept",
          "value": "application/json"
        },
        {
          "name": "User-Agent",
          "value": "YourApp/1.0"
        }
      ]
    },
    "sendBody": false,
    "bodyParameters": {
      "parameters": []
    },
    "options": {}
  }
}

To use in n8n:

  1. Add an HTTP Request node
  2. Switch to JSON mode (Parameters → use RAW JSON)
  3. Paste the JSON above
  4. Update YOUR_API_TOKEN with your actual GHL API key

Request Parameters

Name Location Type Required Description
calendarId Path string Calendar Id [example: ocQHyuzHvysMo5N5VsXc]

Response Codes

Code Description Schema
200 Successful response - success (boolean) (required) (e.g. true): Success
400 Bad Request Standard error response for bad requests (400). Contains message, statusCode fields.
401 Unauthorized Standard error response for unauthorized requests (401). Contains message, statusCode fields.

⚠️ Special Notes & Quirks

⚠️ User-Agent Required: All GHL API requests require a User-Agent HTTP header. Requests without it may be rejected with a 403 error.


GET /calendars/{calendarId}

Summary: Get Calendar

Get calendar by ID

Version Header: 2021-04-15

Operation ID: get-calendar

Tags: Calendars

cURL

curl -X GET 'https://rest.gohighlevel.com/v1/calendars/ocQHyuzHvysMo5N5VsXc' \
  -H 'Authorization: Bearer YOUR_API_TOKEN' \
  -H 'Version: 2021-04-15' \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -H 'User-Agent: YourApp/1.0'

Python (http.client)

import http.client
import json

conn = http.client.HTTPSConnection('rest.gohighlevel.com')

headers = {
    'Authorization': 'Bearer YOUR_API_TOKEN',
    'Version': '2021-04-15',
    'Content-Type': 'application/json',
    'Accept': 'application/json',
    'User-Agent': 'YourApp/1.0',
}

conn.request('GET', '/v1/calendars/ocQHyuzHvysMo5N5VsXc', headers=headers)

response = conn.getresponse()
data = json.loads(response.read().decode())
print(json.dumps(data, indent=2))
conn.close()

n8n HTTP Node

{
  "name": "GHL - GET ocQHyuzHvysMo5N5VsXc",
  "type": "n8n-nodes-base.httpRequest",
  "parameters": {
    "method": "GET",
    "url": "https://rest.gohighlevel.com/v1/calendars/ocQHyuzHvysMo5N5VsXc",
    "authentication": "genericCredentialType",
    "genericAuthType": "httpHeaderAuth",
    "sendHeaders": true,
    "headerParameters": {
      "parameters": [
        {
          "name": "Authorization",
          "value": "Bearer YOUR_API_TOKEN"
        },
        {
          "name": "Version",
          "value": "2021-04-15"
        },
        {
          "name": "Content-Type",
          "value": "application/json"
        },
        {
          "name": "Accept",
          "value": "application/json"
        },
        {
          "name": "User-Agent",
          "value": "YourApp/1.0"
        }
      ]
    },
    "sendBody": false,
    "bodyParameters": {
      "parameters": []
    },
    "options": {}
  }
}

To use in n8n:

  1. Add an HTTP Request node
  2. Switch to JSON mode (Parameters → use RAW JSON)
  3. Paste the JSON above
  4. Update YOUR_API_TOKEN with your actual GHL API key

Request Parameters

Name Location Type Required Description
calendarId Path string Calendar Id [example: ocQHyuzHvysMo5N5VsXc]

Response Codes

Code Description Schema
200 Successful response - calendar (CalendarDTO) (required)
400 Bad Request Standard error response for bad requests (400). Contains message, statusCode fields.
401 Unauthorized Standard error response for unauthorized requests (401). Contains message, statusCode fields.

⚠️ Special Notes & Quirks

⚠️ User-Agent Required: All GHL API requests require a User-Agent HTTP header. Requests without it may be rejected with a 403 error.


PUT /calendars/{calendarId}

Summary: Update Calendar

Update calendar by ID.

Version Header: 2021-04-15

Operation ID: update-calendar

Tags: Calendars

cURL

curl -X PUT 'https://rest.gohighlevel.com/v1/calendars/ocQHyuzHvysMo5N5VsXc' \
  -H 'Authorization: Bearer YOUR_API_TOKEN' \
  -H 'Version: 2021-04-15' \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -H 'User-Agent: YourApp/1.0' \
  -d '{}'  # See request body schema below

Python (http.client)

import http.client
import json

conn = http.client.HTTPSConnection('rest.gohighlevel.com')

headers = {
    'Authorization': 'Bearer YOUR_API_TOKEN',
    'Version': '2021-04-15',
    'Content-Type': 'application/json',
    'Accept': 'application/json',
    'User-Agent': 'YourApp/1.0',
}

payload = json.dumps({})
conn.request('PUT', '/v1/calendars/ocQHyuzHvysMo5N5VsXc', body=payload, headers=headers)

response = conn.getresponse()
data = json.loads(response.read().decode())
print(json.dumps(data, indent=2))
conn.close()

n8n HTTP Node

{
  "name": "GHL - PUT ocQHyuzHvysMo5N5VsXc",
  "type": "n8n-nodes-base.httpRequest",
  "parameters": {
    "method": "PUT",
    "url": "https://rest.gohighlevel.com/v1/calendars/ocQHyuzHvysMo5N5VsXc",
    "authentication": "genericCredentialType",
    "genericAuthType": "httpHeaderAuth",
    "sendHeaders": true,
    "headerParameters": {
      "parameters": [
        {
          "name": "Authorization",
          "value": "Bearer YOUR_API_TOKEN"
        },
        {
          "name": "Version",
          "value": "2021-04-15"
        },
        {
          "name": "Content-Type",
          "value": "application/json"
        },
        {
          "name": "Accept",
          "value": "application/json"
        },
        {
          "name": "User-Agent",
          "value": "YourApp/1.0"
        }
      ]
    },
    "sendBody": true,
    "bodyParameters": {
      "parameters": []
    },
    "options": {}
  }
}

To use in n8n:

  1. Add an HTTP Request node
  2. Switch to JSON mode (Parameters → use RAW JSON)
  3. Paste the JSON above
  4. Update YOUR_API_TOKEN with your actual GHL API key

Request Parameters

Name Location Type Required Description
calendarId Path string Calendar Id [example: ocQHyuzHvysMo5N5VsXc]

Request Body Schema

  • notifications (array of CalendarNotification): 🚨 Deprecated! Please use 'Calendar Notifications APIs' instead.
  • groupId (string) (e.g. BqTwX8QFwXzpegMve9EQ): Group Id
  • teamMembers (array of TeamMember): Team members are required for calendars of type: Round Robin, Collective, Class, Service. Personal calendar must have exactly one team member.
  • eventType (string)
  • name (string) (e.g. test calendar)
  • description (string) (e.g. this is used for testing)
  • slug (string) (e.g. test1)
  • widgetSlug (string) (e.g. test1)
  • widgetType (string) (e.g. classic): Calendar widget type. Choose "default" for "neo" and "classic" for "classic" layout.
  • eventTitle (string)
  • eventColor (string)
  • locationConfigurations (array of LocationConfiguration): Meeting location configuration for event calendar
  • meetingLocation (string): 🚨 Deprecated! Use locationConfigurations.location or teamMembers[].locationConfigurations.location instead.
  • slotDuration (number): This controls the duration of the meeting
  • slotDurationUnit (string): Unit for slot duration.
  • preBufferUnit (string): Unit for pre-buffer.
  • 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.
  • slotBuffer (number): Slot-Buffer is additional time that can be added after an appointment, allowing for extra time to wrap up
  • preBuffer (number): Pre-Buffer is additional time that can be added before an appointment, allowing for extra time to get ready
  • appoinmentPerSlot (number)
  • appoinmentPerDay (number): Number of appointments that can be booked for a given day
  • allowBookingAfter (number): Minimum scheduling notice for events
  • allowBookingAfterUnit (string) (e.g. days): Unit for minimum scheduling notice
  • allowBookingFor (number): Minimum number of days/weeks/months for which to allow booking events
  • allowBookingForUnit (string) (e.g. days): Unit for controlling the duration for which booking would be allowed for
  • openHours (array of OpenHour)
  • enableRecurring (boolean): Enable recurring appointments for the calendars. Please note that only one member should be added in the calendar to enable this
  • recurring (Recurring)
  • 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)
  • 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 the custom availabilities and open hours will be considered.
    • availabilities (array of UpdateAvailability): This is only to set the custom availability. For standard availability, use the openHours property
    • guestType (string)
    • consentLabel (string)
    • calendarCoverImage (string)
    • lookBusyConfig (string): Look Busy Configuration
    • isActive (boolean)

Response Codes

Code Description Schema
200 Successful response - calendar (CalendarDTO) (required)
400 Bad Request Standard error response for bad requests (400). Contains message, statusCode fields.
401 Unauthorized Standard error response for unauthorized requests (401). Contains message, statusCode fields.

⚠️ Special Notes & Quirks

⚠️ User-Agent Required: All GHL API requests require a User-Agent HTTP header. Requests without it may be rejected with a 403 error.


GET /calendars/{calendarId}/free-slots

Summary: Get Free Slots

Get free slots for a calendar between a date range. Optionally a consumer can also request free slots in a particular timezone and also for a particular user.

Version Header: 2021-04-15

Operation ID: get-slots

Tags: Calendars

cURL

curl -X GET 'https://rest.gohighlevel.com/v1/calendars/ocQHyuzHvysMo5N5VsXc/free-slots?startDate=1548898600000&endDate=1601490599999&timezone=America/Chihuahua&userId=082goXVW3lIExEQPOnd3&userIds=VALUE' \
  -H 'Authorization: Bearer YOUR_API_TOKEN' \
  -H 'Version: 2021-04-15' \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -H 'User-Agent: YourApp/1.0'

Python (http.client)

import http.client
import json

conn = http.client.HTTPSConnection('rest.gohighlevel.com')

headers = {
    'Authorization': 'Bearer YOUR_API_TOKEN',
    'Version': '2021-04-15',
    'Content-Type': 'application/json',
    'Accept': 'application/json',
    'User-Agent': 'YourApp/1.0',
}

conn.request('GET', '/v1/calendars/ocQHyuzHvysMo5N5VsXc/free-slots?startDate=1548898600000&endDate=1601490599999&timezone=America/Chihuahua&userId=082goXVW3lIExEQPOnd3&userIds=VALUE', headers=headers)

response = conn.getresponse()
data = json.loads(response.read().decode())
print(json.dumps(data, indent=2))
conn.close()

n8n HTTP Node

{
  "name": "GHL - GET free-slots",
  "type": "n8n-nodes-base.httpRequest",
  "parameters": {
    "method": "GET",
    "url": "https://rest.gohighlevel.com/v1/calendars/ocQHyuzHvysMo5N5VsXc/free-slots",
    "authentication": "genericCredentialType",
    "genericAuthType": "httpHeaderAuth",
    "sendHeaders": true,
    "headerParameters": {
      "parameters": [
        {
          "name": "Authorization",
          "value": "Bearer YOUR_API_TOKEN"
        },
        {
          "name": "Version",
          "value": "2021-04-15"
        },
        {
          "name": "Content-Type",
          "value": "application/json"
        },
        {
          "name": "Accept",
          "value": "application/json"
        },
        {
          "name": "User-Agent",
          "value": "YourApp/1.0"
        }
      ]
    },
    "sendBody": false,
    "bodyParameters": {
      "parameters": []
    },
    "options": {},
    "sendQuery": true,
    "queryParameters": {
      "parameters": [
        {
          "name": "startDate",
          "value": 1548898600000
        },
        {
          "name": "endDate",
          "value": 1601490599999
        },
        {
          "name": "timezone",
          "value": "America/Chihuahua"
        },
        {
          "name": "userId",
          "value": "082goXVW3lIExEQPOnd3"
        },
        {
          "name": "userIds",
          "value": "VALUE"
        }
      ]
    }
  }
}

To use in n8n:

  1. Add an HTTP Request node
  2. Switch to JSON mode (Parameters → use RAW JSON)
  3. Paste the JSON above
  4. Update YOUR_API_TOKEN with your actual GHL API key

Request Parameters

Name Location Type Required Description
calendarId Path string Calendar Id [example: ocQHyuzHvysMo5N5VsXc]
startDate Query number Start Date (⚠️ Important: Date range cannot be more than 31 days) [example: 1548898600000]
endDate Query number End Date (⚠️ Important: Date range cannot be more than 31 days) [example: 1601490599999]
timezone Query string The timezone in which the free slots are returned [example: America/Chihuahua]
userId Query string The user for whom the free slots are returned [example: 082goXVW3lIExEQPOnd3]
userIds Query array The users for whom the free slots are returned

Response Codes

Code Description Schema
200 Availability map keyed by date (YYYY-MM-DD) object — no documented properties
400 Bad Request Standard error response for bad requests (400). Contains message, statusCode fields.
401 Unauthorized Standard error response for unauthorized requests (401). Contains message, statusCode fields.

⚠️ Special Notes & Quirks

⚠️ User-Agent Required: All GHL API requests require a User-Agent HTTP header. Requests without it may be rejected with a 403 error.


GET /calendars/{calendarId}/notifications

Summary: Get notifications

Get calendar notifications based on query

Version Header: 2021-04-15

Operation ID: get-event-notification

Tags: Calendar Notifications

cURL

curl -X GET 'https://rest.gohighlevel.com/v1/calendars/VALUE/notifications?isActive=VALUE&deleted=VALUE&limit=VALUE&skip=VALUE' \
  -H 'Authorization: Bearer YOUR_API_TOKEN' \
  -H 'Version: 2021-04-15' \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -H 'User-Agent: YourApp/1.0'

Python (http.client)

import http.client
import json

conn = http.client.HTTPSConnection('rest.gohighlevel.com')

headers = {
    'Authorization': 'Bearer YOUR_API_TOKEN',
    'Version': '2021-04-15',
    'Content-Type': 'application/json',
    'Accept': 'application/json',
    'User-Agent': 'YourApp/1.0',
}

conn.request('GET', '/v1/calendars/VALUE/notifications?isActive=VALUE&deleted=VALUE&limit=VALUE&skip=VALUE', headers=headers)

response = conn.getresponse()
data = json.loads(response.read().decode())
print(json.dumps(data, indent=2))
conn.close()

n8n HTTP Node

{
  "name": "GHL - GET notifications",
  "type": "n8n-nodes-base.httpRequest",
  "parameters": {
    "method": "GET",
    "url": "https://rest.gohighlevel.com/v1/calendars/VALUE/notifications",
    "authentication": "genericCredentialType",
    "genericAuthType": "httpHeaderAuth",
    "sendHeaders": true,
    "headerParameters": {
      "parameters": [
        {
          "name": "Authorization",
          "value": "Bearer YOUR_API_TOKEN"
        },
        {
          "name": "Version",
          "value": "2021-04-15"
        },
        {
          "name": "Content-Type",
          "value": "application/json"
        },
        {
          "name": "Accept",
          "value": "application/json"
        },
        {
          "name": "User-Agent",
          "value": "YourApp/1.0"
        }
      ]
    },
    "sendBody": false,
    "bodyParameters": {
      "parameters": []
    },
    "options": {},
    "sendQuery": true,
    "queryParameters": {
      "parameters": [
        {
          "name": "isActive",
          "value": "VALUE"
        },
        {
          "name": "deleted",
          "value": "VALUE"
        },
        {
          "name": "limit",
          "value": "VALUE"
        },
        {
          "name": "skip",
          "value": "VALUE"
        }
      ]
    }
  }
}

To use in n8n:

  1. Add an HTTP Request node
  2. Switch to JSON mode (Parameters → use RAW JSON)
  3. Paste the JSON above
  4. Update YOUR_API_TOKEN with your actual GHL API key

Request Parameters

Name Location Type Required Description
calendarId Path string
isActive Query boolean
deleted Query boolean
limit Query number Number of records to return
skip Query number Number of records to skip

Response Codes

Code Description Schema
200 Successful response array of:
- _id (string): Notification ID
- receiverType (string) (e.g. contact)
- additionalEmailIds (array) (e.g. `['example1...
400 Bad Request Standard error response for bad requests (400). Contains message, statusCode fields.
401 Unauthorized Standard error response for unauthorized requests (401). Contains message, statusCode fields.

⚠️ Special Notes & Quirks

⚠️ User-Agent Required: All GHL API requests require a User-Agent HTTP header. Requests without it may be rejected with a 403 error.


POST /calendars/{calendarId}/notifications

Summary: Create notification

Create Calendar notifications, either one or multiple. All notification settings must be for single calendar only

Version Header: 2021-04-15

Operation ID: create-event-notification

Tags: Calendar Notifications

cURL

curl -X POST 'https://rest.gohighlevel.com/v1/calendars/VALUE/notifications' \
  -H 'Authorization: Bearer YOUR_API_TOKEN' \
  -H 'Version: 2021-04-15' \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -H 'User-Agent: YourApp/1.0' \
  -d '{}'  # See request body schema below

Python (http.client)

import http.client
import json

conn = http.client.HTTPSConnection('rest.gohighlevel.com')

headers = {
    'Authorization': 'Bearer YOUR_API_TOKEN',
    'Version': '2021-04-15',
    'Content-Type': 'application/json',
    'Accept': 'application/json',
    'User-Agent': 'YourApp/1.0',
}

payload = json.dumps({})
conn.request('POST', '/v1/calendars/VALUE/notifications', body=payload, headers=headers)

response = conn.getresponse()
data = json.loads(response.read().decode())
print(json.dumps(data, indent=2))
conn.close()

n8n HTTP Node

{
  "name": "GHL - POST notifications",
  "type": "n8n-nodes-base.httpRequest",
  "parameters": {
    "method": "POST",
    "url": "https://rest.gohighlevel.com/v1/calendars/VALUE/notifications",
    "authentication": "genericCredentialType",
    "genericAuthType": "httpHeaderAuth",
    "sendHeaders": true,
    "headerParameters": {
      "parameters": [
        {
          "name": "Authorization",
          "value": "Bearer YOUR_API_TOKEN"
        },
        {
          "name": "Version",
          "value": "2021-04-15"
        },
        {
          "name": "Content-Type",
          "value": "application/json"
        },
        {
          "name": "Accept",
          "value": "application/json"
        },
        {
          "name": "User-Agent",
          "value": "YourApp/1.0"
        }
      ]
    },
    "sendBody": true,
    "bodyParameters": {
      "parameters": []
    },
    "options": {}
  }
}

To use in n8n:

  1. Add an HTTP Request node
  2. Switch to JSON mode (Parameters → use RAW JSON)
  3. Paste the JSON above
  4. Update YOUR_API_TOKEN with your actual GHL API key

Request Parameters

Name Location Type Required Description
calendarId Path string

Request Body Schema

array of:

  • receiverType (string) (required): notification recipient type
  • channel (string) (required): Notification channel
  • notificationType (string) (required): Notification type
  • isActive (boolean): Is the notification active
  • templateId (string): Template ID for email notification. Not necessary for in-App notification
  • body (string): Body for email notification. Not necessary for in-App notification
  • subject (string): Subject for email notification. Not necessary for in-App notification
  • afterTime (array of SchedulesDTO) (e.g. [{'timeOffset': 1, 'unit': 'hours'}]): Specifies the time after which the follow-up notification should be sent. This is not required for other notification types.
  • beforeTime (array of SchedulesDTO) (e.g. [{'timeOffset': 1, 'unit': 'hours'}]): Specifies the time before which the reminder notification should be sent. This is not required for other notification types.
  • additionalEmailIds (array) (e.g. ['example1@email.com', 'example2@email.com']): Additional email addresses to receive notifications.
  • additionalPhoneNumbers (array) (e.g. ['+919876744444', '+919876744445']): Additional phone numbers to receive notifications.
  • selectedUsers (array) (e.g. ['userId1', 'userId2', 'sub_account_admin']): Selected users for in-App and business email notifications. Supports user IDs and special keyword "sub_account_admin"
  • fromAddress (string): from address for email notification
  • fromName (string): from name for email/sms notification
  • fromNumber (string): from number for sms notification

Response Codes

Code Description Schema
200 Successful response array of:
- _id (string): Notification ID
- receiverType (string) (e.g. contact)
- additionalEmailIds (array) (e.g. `['example1...
400 Bad Request Standard error response for bad requests (400). Contains message, statusCode fields.
401 Unauthorized Standard error response for unauthorized requests (401). Contains message, statusCode fields.

⚠️ Special Notes & Quirks

⚠️ User-Agent Required: All GHL API requests require a User-Agent HTTP header. Requests without it may be rejected with a 403 error.


DELETE /calendars/{calendarId}/notifications/{notificationId}

Summary: Delete Notification

Delete notification

Version Header: 2021-04-15

Operation ID: delete-event-notification

Tags: Calendar Notifications

cURL

curl -X DELETE 'https://rest.gohighlevel.com/v1/calendars/VALUE/notifications/VALUE' \
  -H 'Authorization: Bearer YOUR_API_TOKEN' \
  -H 'Version: 2021-04-15' \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -H 'User-Agent: YourApp/1.0'

Python (http.client)

import http.client
import json

conn = http.client.HTTPSConnection('rest.gohighlevel.com')

headers = {
    'Authorization': 'Bearer YOUR_API_TOKEN',
    'Version': '2021-04-15',
    'Content-Type': 'application/json',
    'Accept': 'application/json',
    'User-Agent': 'YourApp/1.0',
}

conn.request('DELETE', '/v1/calendars/VALUE/notifications/VALUE', headers=headers)

response = conn.getresponse()
data = json.loads(response.read().decode())
print(json.dumps(data, indent=2))
conn.close()

n8n HTTP Node

{
  "name": "GHL - DELETE VALUE",
  "type": "n8n-nodes-base.httpRequest",
  "parameters": {
    "method": "DELETE",
    "url": "https://rest.gohighlevel.com/v1/calendars/VALUE/notifications/VALUE",
    "authentication": "genericCredentialType",
    "genericAuthType": "httpHeaderAuth",
    "sendHeaders": true,
    "headerParameters": {
      "parameters": [
        {
          "name": "Authorization",
          "value": "Bearer YOUR_API_TOKEN"
        },
        {
          "name": "Version",
          "value": "2021-04-15"
        },
        {
          "name": "Content-Type",
          "value": "application/json"
        },
        {
          "name": "Accept",
          "value": "application/json"
        },
        {
          "name": "User-Agent",
          "value": "YourApp/1.0"
        }
      ]
    },
    "sendBody": false,
    "bodyParameters": {
      "parameters": []
    },
    "options": {}
  }
}

To use in n8n:

  1. Add an HTTP Request node
  2. Switch to JSON mode (Parameters → use RAW JSON)
  3. Paste the JSON above
  4. Update YOUR_API_TOKEN with your actual GHL API key

Request Parameters

Name Location Type Required Description
calendarId Path string
notificationId Path string

Response Codes

Code Description Schema
200 Successful response - message (string) (required): Result of delete/update operation
400 Bad Request Standard error response for bad requests (400). Contains message, statusCode fields.
401 Unauthorized Standard error response for unauthorized requests (401). Contains message, statusCode fields.

⚠️ Special Notes & Quirks

⚠️ User-Agent Required: All GHL API requests require a User-Agent HTTP header. Requests without it may be rejected with a 403 error.


GET /calendars/{calendarId}/notifications/{notificationId}

Summary: Get notification

Find Event notification by notificationId

Version Header: 2021-04-15

Operation ID: find-event-notification

Tags: Calendar Notifications

cURL

curl -X GET 'https://rest.gohighlevel.com/v1/calendars/VALUE/notifications/VALUE' \
  -H 'Authorization: Bearer YOUR_API_TOKEN' \
  -H 'Version: 2021-04-15' \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -H 'User-Agent: YourApp/1.0'

Python (http.client)

import http.client
import json

conn = http.client.HTTPSConnection('rest.gohighlevel.com')

headers = {
    'Authorization': 'Bearer YOUR_API_TOKEN',
    'Version': '2021-04-15',
    'Content-Type': 'application/json',
    'Accept': 'application/json',
    'User-Agent': 'YourApp/1.0',
}

conn.request('GET', '/v1/calendars/VALUE/notifications/VALUE', headers=headers)

response = conn.getresponse()
data = json.loads(response.read().decode())
print(json.dumps(data, indent=2))
conn.close()

n8n HTTP Node

{
  "name": "GHL - GET VALUE",
  "type": "n8n-nodes-base.httpRequest",
  "parameters": {
    "method": "GET",
    "url": "https://rest.gohighlevel.com/v1/calendars/VALUE/notifications/VALUE",
    "authentication": "genericCredentialType",
    "genericAuthType": "httpHeaderAuth",
    "sendHeaders": true,
    "headerParameters": {
      "parameters": [
        {
          "name": "Authorization",
          "value": "Bearer YOUR_API_TOKEN"
        },
        {
          "name": "Version",
          "value": "2021-04-15"
        },
        {
          "name": "Content-Type",
          "value": "application/json"
        },
        {
          "name": "Accept",
          "value": "application/json"
        },
        {
          "name": "User-Agent",
          "value": "YourApp/1.0"
        }
      ]
    },
    "sendBody": false,
    "bodyParameters": {
      "parameters": []
    },
    "options": {}
  }
}

To use in n8n:

  1. Add an HTTP Request node
  2. Switch to JSON mode (Parameters → use RAW JSON)
  3. Paste the JSON above
  4. Update YOUR_API_TOKEN with your actual GHL API key

Request Parameters

Name Location Type Required Description
calendarId Path string
notificationId Path string

Response Codes

Code Description Schema
200 Successful response - _id (string): Notification ID
- receiverType (string) (e.g. contact)
- additionalEmailIds (array) (e.g. `['example1@email.com...
400 Bad Request Standard error response for bad requests (400). Contains message, statusCode fields.
401 Unauthorized Standard error response for unauthorized requests (401). Contains message, statusCode fields.

⚠️ Special Notes & Quirks

⚠️ User-Agent Required: All GHL API requests require a User-Agent HTTP header. Requests without it may be rejected with a 403 error.


PUT /calendars/{calendarId}/notifications/{notificationId}

Summary: Update notification

Update Event notification by id

Version Header: 2021-04-15

Operation ID: update-event-notification

Tags: Calendar Notifications

cURL

curl -X PUT 'https://rest.gohighlevel.com/v1/calendars/VALUE/notifications/VALUE' \
  -H 'Authorization: Bearer YOUR_API_TOKEN' \
  -H 'Version: 2021-04-15' \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -H 'User-Agent: YourApp/1.0' \
  -d '{}'  # See request body schema below

Python (http.client)

import http.client
import json

conn = http.client.HTTPSConnection('rest.gohighlevel.com')

headers = {
    'Authorization': 'Bearer YOUR_API_TOKEN',
    'Version': '2021-04-15',
    'Content-Type': 'application/json',
    'Accept': 'application/json',
    'User-Agent': 'YourApp/1.0',
}

payload = json.dumps({})
conn.request('PUT', '/v1/calendars/VALUE/notifications/VALUE', body=payload, headers=headers)

response = conn.getresponse()
data = json.loads(response.read().decode())
print(json.dumps(data, indent=2))
conn.close()

n8n HTTP Node

{
  "name": "GHL - PUT VALUE",
  "type": "n8n-nodes-base.httpRequest",
  "parameters": {
    "method": "PUT",
    "url": "https://rest.gohighlevel.com/v1/calendars/VALUE/notifications/VALUE",
    "authentication": "genericCredentialType",
    "genericAuthType": "httpHeaderAuth",
    "sendHeaders": true,
    "headerParameters": {
      "parameters": [
        {
          "name": "Authorization",
          "value": "Bearer YOUR_API_TOKEN"
        },
        {
          "name": "Version",
          "value": "2021-04-15"
        },
        {
          "name": "Content-Type",
          "value": "application/json"
        },
        {
          "name": "Accept",
          "value": "application/json"
        },
        {
          "name": "User-Agent",
          "value": "YourApp/1.0"
        }
      ]
    },
    "sendBody": true,
    "bodyParameters": {
      "parameters": []
    },
    "options": {}
  }
}

To use in n8n:

  1. Add an HTTP Request node
  2. Switch to JSON mode (Parameters → use RAW JSON)
  3. Paste the JSON above
  4. Update YOUR_API_TOKEN with your actual GHL API key

Request Parameters

Name Location Type Required Description
calendarId Path string
notificationId Path string

Request Body Schema

  • receiverType (string): Notification recipient type
  • additionalEmailIds (array) (e.g. ['example1@email.com', 'example2@email.com']): Additional email addresses to receive notifications.
  • additionalPhoneNumbers (array) (e.g. ['+919876744444', '+919876744445']): Additional phone numbers to receive notifications.
  • selectedUsers (array) (e.g. ['userId1', 'userId2', 'sub_account_admin']): Selected users for in-App and business email notifications. Supports user IDs and special keyword "sub_account_admin"
  • channel (string): Notification channel
  • notificationType (string): Notification type
  • isActive (boolean): Is the notification active
  • deleted (boolean): Marks the notification as deleted (soft delete)
  • templateId (string): Template ID for email notification
  • body (string): Body for email notification. Not necessary for in-App notification
  • subject (string): Subject for email notification. Not necessary for in-App notification
  • afterTime (array of SchedulesDTO) (e.g. [{'timeOffset': 1, 'unit': 'hours'}]): Specifies the time after which the follow-up notification should be sent. This is not required for other notification types.
  • beforeTime (array of SchedulesDTO) (e.g. [{'timeOffset': 1, 'unit': 'hours'}]): Specifies the time before which the reminder notification should be sent. This is not required for other notification types.
  • fromAddress (string): From address for email notification
  • fromNumber (string): from number for sms notification
  • fromName (string): From name for email/sms notification

Response Codes

Code Description Schema
200 Successful response - message (string) (required): Result of delete/update operation
400 Bad Request Standard error response for bad requests (400). Contains message, statusCode fields.
401 Unauthorized Standard error response for unauthorized requests (401). Contains message, statusCode fields.

⚠️ Special Notes & Quirks

⚠️ User-Agent Required: All GHL API requests require a User-Agent HTTP header. Requests without it may be rejected with a 403 error.


Documentation generated from GHL OpenAPI specifications. Verify against official docs for latest changes.