# 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/](#get--calendars-) — Get Calendars
- [POST /calendars/](#post--calendars-) — Create Calendar
- [GET /calendars/appointments/{appointmentId}/notes](#get--calendars-appointments-appointmentId-notes) — Get Notes
- [POST /calendars/appointments/{appointmentId}/notes](#post--calendars-appointments-appointmentId-notes) — Create Note
- [DELETE /calendars/appointments/{appointmentId}/notes/{noteId}](#delete--calendars-appointments-appointmentId-notes-noteId) — Delete Note
- [PUT /calendars/appointments/{appointmentId}/notes/{noteId}](#put--calendars-appointments-appointmentId-notes-noteId) — Update Note
- [GET /calendars/blocked-slots](#get--calendars-blocked-slots) — Get Blocked Slots
- [GET /calendars/events](#get--calendars-events) — Get Calendar Events
- [POST /calendars/events/appointments](#post--calendars-events-appointments) — Create appointment
- [GET /calendars/events/appointments/{eventId}](#get--calendars-events-appointments-eventId) — Get Appointment
- [PUT /calendars/events/appointments/{eventId}](#put--calendars-events-appointments-eventId) — Update Appointment
- [POST /calendars/events/block-slots](#post--calendars-events-block-slots) — Create Block Slot
- [PUT /calendars/events/block-slots/{eventId}](#put--calendars-events-block-slots-eventId) — Update Block Slot
- [DELETE /calendars/events/{eventId}](#delete--calendars-events-eventId) — Delete Event
- [GET /calendars/groups](#get--calendars-groups) — Get Groups
- [POST /calendars/groups](#post--calendars-groups) — Create Calendar Group
- [POST /calendars/groups/validate-slug](#post--calendars-groups-validate-slug) — Validate group slug
- [DELETE /calendars/groups/{groupId}](#delete--calendars-groups-groupId) — Delete Group
- [PUT /calendars/groups/{groupId}](#put--calendars-groups-groupId) — Update Group
- [PUT /calendars/groups/{groupId}/status](#put--calendars-groups-groupId-status) — Disable Group
- [GET /calendars/resources/{resourceType}](#get--calendars-resources-resourceType) — List Calendar Resources
- [POST /calendars/resources/{resourceType}](#post--calendars-resources-resourceType) — Create Calendar Resource
- [DELETE /calendars/resources/{resourceType}/{id}](#delete--calendars-resources-resourceType-id) — Delete Calendar Resource
- [GET /calendars/resources/{resourceType}/{id}](#get--calendars-resources-resourceType-id) — Get Calendar Resource
- [PUT /calendars/resources/{resourceType}/{id}](#put--calendars-resources-resourceType-id) — Update Calendar Resource
- [POST /calendars/schedules](#post--calendars-schedules) — Create user availability schedule
- [GET /calendars/schedules/search](#get--calendars-schedules-search) — List user availability schedule
- [DELETE /calendars/schedules/{id}](#delete--calendars-schedules-id) — Delete user availability schedule
- [GET /calendars/schedules/{id}](#get--calendars-schedules-id) — Get user availability schedule
- [PUT /calendars/schedules/{id}](#put--calendars-schedules-id) — Update user availability schedule
- [DELETE /calendars/schedules/{id}/associations/{calendarId}](#delete--calendars-schedules-id-associations-calendarId) — Remove user availability schedule from a calendar
- [PUT /calendars/schedules/{id}/associations/{calendarId}](#put--calendars-schedules-id-associations-calendarId) — Apply user availability schedule to a calendar
- [DELETE /calendars/{calendarId}](#delete--calendars-calendarId) — Delete Calendar
- [GET /calendars/{calendarId}](#get--calendars-calendarId) — Get Calendar
- [PUT /calendars/{calendarId}](#put--calendars-calendarId) — Update Calendar
- [GET /calendars/{calendarId}/free-slots](#get--calendars-calendarId-free-slots) — Get Free Slots
- [GET /calendars/{calendarId}/notifications](#get--calendars-calendarId-notifications) — Get notifications
- [POST /calendars/{calendarId}/notifications](#post--calendars-calendarId-notifications) — Create notification
- [DELETE /calendars/{calendarId}/notifications/{notificationId}](#delete--calendars-calendarId-notifications-notificationId) — Delete Notification
- [GET /calendars/{calendarId}/notifications/{notificationId}](#get--calendars-calendarId-notifications-notificationId) — Get notification
- [PUT /calendars/{calendarId}/notifications/{notificationId}](#put--calendars-calendarId-notifications-notificationId) — Update notification

---

## GET /calendars/

**Summary:** Get Calendars

Get all calendars in a location.

**Version Header:** `2021-04-15`

**Operation ID:** `get-calendars`

**Tags:** Calendars

### cURL

```bash
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)

```python
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

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

```bash
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)

```python
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

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

```bash
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)

```python
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

```json
{
  "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)<br>  - **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

```bash
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)

```python
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

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

```bash
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)

```python
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

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

```bash
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)

```python
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

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

```bash
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)

```python
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

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

```bash
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)

```python
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

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

```bash
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)

```python
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

```json
{
  "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.locationConfigurations`or `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<br>  - **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

```bash
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)

```python
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

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

```bash
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)

```python
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

```json
{
  "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.locationConfigurations`or `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<br>  - **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

```bash
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)

```python
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

```json
{
  "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<br>  - **locationId** (string) (required) (e.g. `C2QujeCh8ZnC7al2InWR`): Location Id<br>... |
| `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

```bash
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)

```python
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

```json
{
  "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<br>  - **locationId** (string) (required) (e.g. `C2QujeCh8ZnC7al2InWR`): Location Id<br>... |
| `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

```bash
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)

```python
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

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

```bash
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)

```python
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

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

```bash
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)

```python
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

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

```bash
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)

```python
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

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

```bash
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)

```python
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

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

```bash
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)

```python
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

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

```bash
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)

```python
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

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

```bash
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)

```python
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

```json
{
  "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:<br>  - **locationId** (string) (required): Location ID of the resource<br>  - **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

```bash
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)

```python
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

```json
{
  "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<br>  - **name** (string) (required) (e.g. `yoga room`): Name of the resource<br>  - *... |
| `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

```bash
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)

```python
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

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

```bash
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)

```python
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

```json
{
  "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<br>  - **name** (string) (required) (e.g. `yoga room`): Name of the resource<br>  - *... |
| `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

```bash
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)

```python
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

```json
{
  "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<br>  - **name** (string) (required) (e.g. `yoga room`): Name of the resource<br>  - *... |
| `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

```bash
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)

```python
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

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

```bash
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)

```python
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

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

```bash
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)

```python
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

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

```bash
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)

```python
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

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

```bash
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)

```python
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

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

```bash
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)

```python
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

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

```bash
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)

```python
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

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

```bash
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)

```python
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

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

```bash
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)

```python
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

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

```bash
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)

```python
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

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

```bash
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)

```python
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

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

```bash
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)

```python
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

```json
{
  "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:<br>  - **_id** (string): Notification ID<br>  - **receiverType** (string) (e.g. `contact`)<br>  - **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

```bash
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)

```python
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

```json
{
  "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:<br>  - **_id** (string): Notification ID<br>  - **receiverType** (string) (e.g. `contact`)<br>  - **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

```bash
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)

```python
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

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

```bash
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)

```python
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

```json
{
  "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<br>  - **receiverType** (string) (e.g. `contact`)<br>  - **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

```bash
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)

```python
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

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