# GHL API — Complete Endpoint Index

> Generated from 22 OpenAPI JSON specification files
> Total endpoints: 282

---

## Table of Contents

- [Associations (10 endpoints)](#associations)
- [Businesses (5 endpoints)](#businesses)
- [Calendars (41 endpoints)](#calendars)
- [Campaigns (1 endpoints)](#campaigns)
- [Companies (1 endpoints)](#companies)
- [Contacts (32 endpoints)](#contacts)
- [Conversations (29 endpoints)](#conversations)
- [Courses (1 endpoints)](#courses)
- [Custom Fields (8 endpoints)](#custom-fields)
- [Emails (5 endpoints)](#emails)
- [Forms (3 endpoints)](#forms)
- [Funnels (7 endpoints)](#funnels)
- [Invoices (42 endpoints)](#invoices)
- [Links (6 endpoints)](#links)
- [Locations (29 endpoints)](#locations)
- [Media (7 endpoints)](#media)
- [OAuth (3 endpoints)](#oauth)
- [Objects (9 endpoints)](#objects)
- [Opportunities (12 endpoints)](#opportunities)
- [Payments (23 endpoints)](#payments)
- [Users (7 endpoints)](#users)
- [Workflows (1 endpoints)](#workflows)

---

## Version Header Summary

| Category | Version Header |
|----------|---------------|
| Associations | `2021-07-28` |
| Businesses | `2021-07-28` |
| Calendars | `2021-04-15` |
| Campaigns | `2021-07-28` |
| Companies | `2021-07-28` |
| Contacts | `2021-07-28` |
| Conversations | `2021-04-15` |
| Courses | `2021-07-28` |
| Custom Fields | `2021-07-28` |
| Emails | `2021-07-28` |
| Forms | `2021-07-28` |
| Funnels | `2021-07-28` |
| Invoices | `2021-07-28` |
| Links | `2021-04-15, 2021-07-28` |
| Locations | `2021-07-28` |
| Media | `2021-07-28` |
| OAuth | `2021-07-28` |
| Objects | `2021-07-28` |
| Opportunities | `2021-07-28` |
| Payments | `2021-07-28` |
| Users | `2021-07-28` |
| Workflows | `2021-07-28` |

---

## Common API Quirks & Patterns

### User-Agent
All requests to GHL API require a `User-Agent` header. Without it, you may get 403 errors.

### POST as GET
Some endpoints use POST with a search body instead of GET (e.g., `/contacts/search`, `/opportunities/search`). This is because search parameters can be complex JSON.

### fieldValueString vs value
When updating custom fields, use `fieldValueString` for text-based fields and `value` for numeric fields. Check the field type first via schema discovery.

### DELETE with body
Some DELETE endpoints accept a request body (non-standard but supported by GHL).

### Pagination
Pagination varies by endpoint. Some use `offset`/`limit`, others use cursor-based pagination with `startAfter`.

---

## Associations

| Method | Path | Summary | Version | Deprecated |
|--------|------|---------|---------|------------|
| `GET` | `/associations/` | Get all associations for a sub-account / location | `2021-07-28` | — |
| `POST` | `/associations/` | Create Association | `2021-07-28` | — |
| `GET` | `/associations/key/{key_name}` | Get association key by key name | `2021-07-28` | — |
| `GET` | `/associations/objectKey/{objectKey}` | Get association by object keys | `2021-07-28` | — |
| `POST` | `/associations/relations` | Create Relation for you associated entities. | `2021-07-28` | — |
| `GET` | `/associations/relations/{recordId}` | Get all relations By record Id | `2021-07-28` | — |
| `DELETE` | `/associations/relations/{relationId}` | Delete Relation | `2021-07-28` | — |
| `DELETE` | `/associations/{associationId}` | Delete Association | `2021-07-28` | — |
| `GET` | `/associations/{associationId}` | Get association by ID | `2021-07-28` | — |
| `PUT` | `/associations/{associationId}` | Update Association By Id | `2021-07-28` | — |

## Businesses

| Method | Path | Summary | Version | Deprecated |
|--------|------|---------|---------|------------|
| `GET` | `/businesses/` | Get Businesses by Location | `2021-07-28` | — |
| `POST` | `/businesses/` | Create Business | `2021-07-28` | — |
| `DELETE` | `/businesses/{businessId}` | Delete Business | `2021-07-28` | — |
| `GET` | `/businesses/{businessId}` | Get Business | `2021-07-28` | — |
| `PUT` | `/businesses/{businessId}` | Update Business | `2021-07-28` | — |

## Calendars

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

| Method | Path | Summary | Version | Deprecated |
|--------|------|---------|---------|------------|
| `GET` | `/calendars/` | Get Calendars | `2021-04-15` | — |
| `POST` | `/calendars/` | Create Calendar | `2021-04-15` | — |
| `GET` | `/calendars/appointments/{appointmentId}/notes` | Get Notes | `2021-04-15` | — |
| `POST` | `/calendars/appointments/{appointmentId}/notes` | Create Note | `2021-04-15` | — |
| `DELETE` | `/calendars/appointments/{appointmentId}/notes/{noteId}` | Delete Note | `2021-04-15` | — |
| `PUT` | `/calendars/appointments/{appointmentId}/notes/{noteId}` | Update Note | `2021-04-15` | — |
| `GET` | `/calendars/blocked-slots` | Get Blocked Slots | `2021-04-15` | — |
| `GET` | `/calendars/events` | Get Calendar Events | `2021-04-15` | — |
| `POST` | `/calendars/events/appointments` | Create appointment | `2021-04-15` | — |
| `GET` | `/calendars/events/appointments/{eventId}` | Get Appointment | `2021-04-15` | — |
| `PUT` | `/calendars/events/appointments/{eventId}` | Update Appointment | `2021-04-15` | — |
| `POST` | `/calendars/events/block-slots` | Create Block Slot | `2021-04-15` | — |
| `PUT` | `/calendars/events/block-slots/{eventId}` | Update Block Slot | `2021-04-15` | — |
| `DELETE` | `/calendars/events/{eventId}` | Delete Event | `2021-04-15` | — |
| `GET` | `/calendars/groups` | Get Groups | `2021-04-15` | — |
| `POST` | `/calendars/groups` | Create Calendar Group | `2021-04-15` | — |
| `POST` | `/calendars/groups/validate-slug` | Validate group slug | `2021-04-15` | — |
| `DELETE` | `/calendars/groups/{groupId}` | Delete Group | `2021-04-15` | — |
| `PUT` | `/calendars/groups/{groupId}` | Update Group | `2021-04-15` | — |
| `PUT` | `/calendars/groups/{groupId}/status` | Disable Group | `2021-04-15` | — |
| `GET` | `/calendars/resources/{resourceType}` | List Calendar Resources | `2021-04-15` | — |
| `POST` | `/calendars/resources/{resourceType}` | Create Calendar Resource | `2021-04-15` | — |
| `DELETE` | `/calendars/resources/{resourceType}/{id}` | Delete Calendar Resource | `2021-04-15` | — |
| `GET` | `/calendars/resources/{resourceType}/{id}` | Get Calendar Resource | `2021-04-15` | — |
| `PUT` | `/calendars/resources/{resourceType}/{id}` | Update Calendar Resource | `2021-04-15` | — |
| `POST` | `/calendars/schedules` | Create user availability schedule | `2021-04-15` | — |
| `GET` | `/calendars/schedules/search` | List user availability schedule | `2021-04-15` | — |
| `DELETE` | `/calendars/schedules/{id}` | Delete user availability schedule | `2021-04-15` | — |
| `GET` | `/calendars/schedules/{id}` | Get user availability schedule | `2021-04-15` | — |
| `PUT` | `/calendars/schedules/{id}` | Update user availability schedule | `2021-04-15` | — |
| `DELETE` | `/calendars/schedules/{id}/associations/{calendarId}` | Remove user availability schedule from a calendar | `2021-04-15` | — |
| `PUT` | `/calendars/schedules/{id}/associations/{calendarId}` | Apply user availability schedule to a calendar | `2021-04-15` | — |
| `DELETE` | `/calendars/{calendarId}` | Delete Calendar | `2021-04-15` | — |
| `GET` | `/calendars/{calendarId}` | Get Calendar | `2021-04-15` | — |
| `PUT` | `/calendars/{calendarId}` | Update Calendar | `2021-04-15` | — |
| `GET` | `/calendars/{calendarId}/free-slots` | Get Free Slots | `2021-04-15` | — |
| `GET` | `/calendars/{calendarId}/notifications` | Get notifications | `2021-04-15` | — |
| `POST` | `/calendars/{calendarId}/notifications` | Create notification | `2021-04-15` | — |
| `DELETE` | `/calendars/{calendarId}/notifications/{notificationId}` | Delete Notification | `2021-04-15` | — |
| `GET` | `/calendars/{calendarId}/notifications/{notificationId}` | Get notification | `2021-04-15` | — |
| `PUT` | `/calendars/{calendarId}/notifications/{notificationId}` | Update notification | `2021-04-15` | — |

## Campaigns

| Method | Path | Summary | Version | Deprecated |
|--------|------|---------|---------|------------|
| `GET` | `/campaigns/` | Get Campaigns | `2021-07-28` | — |

## Companies

| Method | Path | Summary | Version | Deprecated |
|--------|------|---------|---------|------------|
| `GET` | `/companies/{companyId}` | Get Company | `2021-07-28` | — |

## Contacts

> ⚠️ **Deprecation:** `GET /contacts/` is deprecated. Use `POST /contacts/search` instead.

| Method | Path | Summary | Version | Deprecated |
|--------|------|---------|---------|------------|
| `GET` | `/contacts/` | Get Contacts | `2021-07-28` | ⚠️ YES |
| `POST` | `/contacts/` | Create Contact | `2021-07-28` | — |
| `POST` | `/contacts/bulk/business` | Add/Remove Contacts From Business | `2021-07-28` | — |
| `POST` | `/contacts/bulk/tags/update/{type}` | Update Contacts Tags | `2021-07-28` | — |
| `GET` | `/contacts/business/{businessId}` | Get Contacts By BusinessId | `2021-07-28` | — |
| `POST` | `/contacts/search` | Search Contacts | `2021-07-28` | — |
| `GET` | `/contacts/search/duplicate` | Get Duplicate Contact | `2021-07-28` | — |
| `POST` | `/contacts/upsert` | Upsert Contact | `2021-07-28` | — |
| `DELETE` | `/contacts/{contactId}` | Delete Contact | `2021-07-28` | — |
| `GET` | `/contacts/{contactId}` | Get Contact | `2021-07-28` | — |
| `PUT` | `/contacts/{contactId}` | Update Contact | `2021-07-28` | — |
| `GET` | `/contacts/{contactId}/appointments` | Get Appointments for Contact | `2021-07-28` | — |
| `DELETE` | `/contacts/{contactId}/campaigns/removeAll` | Remove Contact From Every Campaign | `2021-07-28` | — |
| `DELETE` | `/contacts/{contactId}/campaigns/{campaignId}` | Remove Contact From Campaign | `2021-07-28` | — |
| `POST` | `/contacts/{contactId}/campaigns/{campaignId}` | Add Contact to Campaign | `2021-07-28` | — |
| `DELETE` | `/contacts/{contactId}/followers` | Remove Followers | `2021-07-28` | — |
| `POST` | `/contacts/{contactId}/followers` | Add Followers | `2021-07-28` | — |
| `GET` | `/contacts/{contactId}/notes` | Get All Notes | `2021-07-28` | — |
| `POST` | `/contacts/{contactId}/notes` | Create Note | `2021-07-28` | — |
| `DELETE` | `/contacts/{contactId}/notes/{id}` | Delete Note | `2021-07-28` | — |
| `GET` | `/contacts/{contactId}/notes/{id}` | Get Note | `2021-07-28` | — |
| `PUT` | `/contacts/{contactId}/notes/{id}` | Update Note | `2021-07-28` | — |
| `DELETE` | `/contacts/{contactId}/tags` | Remove Tags | `2021-07-28` | — |
| `POST` | `/contacts/{contactId}/tags` | Add Tags | `2021-07-28` | — |
| `GET` | `/contacts/{contactId}/tasks` | Get all Tasks | `2021-07-28` | — |
| `POST` | `/contacts/{contactId}/tasks` | Create Task | `2021-07-28` | — |
| `DELETE` | `/contacts/{contactId}/tasks/{taskId}` | Delete Task | `2021-07-28` | — |
| `GET` | `/contacts/{contactId}/tasks/{taskId}` | Get Task | `2021-07-28` | — |
| `PUT` | `/contacts/{contactId}/tasks/{taskId}` | Update Task | `2021-07-28` | — |
| `PUT` | `/contacts/{contactId}/tasks/{taskId}/completed` | Update Task Completed | `2021-07-28` | — |
| `DELETE` | `/contacts/{contactId}/workflow/{workflowId}` | Delete Contact from Workflow | `2021-07-28` | — |
| `POST` | `/contacts/{contactId}/workflow/{workflowId}` | Add Contact to Workflow | `2021-07-28` | — |

## Conversations

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

| Method | Path | Summary | Version | Deprecated |
|--------|------|---------|---------|------------|
| `POST` | `/conversations/` | Create Conversation | `2021-04-15` | — |
| `GET` | `/conversations/locations/{locationId}/messages/{messageId}/transcription` | Get transcription by Message ID | `2021-04-15` | — |
| `GET` | `/conversations/locations/{locationId}/messages/{messageId}/transcription/download` | Download transcription by Message ID | `2021-04-15` | — |
| `POST` | `/conversations/messages` | Send a new message | `2021-04-15` | — |
| `DELETE` | `/conversations/messages/email/{emailMessageId}/schedule` | Cancel a scheduled email message. | `—` | — |
| `GET` | `/conversations/messages/email/{id}` | Get email by Id | `—` | — |
| `GET` | `/conversations/messages/export` | Export messages by location ID | `2021-04-15` | — |
| `POST` | `/conversations/messages/inbound` | Add an inbound message | `2021-04-15` | — |
| `POST` | `/conversations/messages/outbound` | Add an external outbound call | `2021-04-15` | — |
| `POST` | `/conversations/messages/review-reply` | Send a review reply to Google My Business | `2021-04-15` | — |
| `POST` | `/conversations/messages/upload` | Upload file attachments | `2021-04-15` | — |
| `POST` | `/conversations/messages/upload/complete` | Complete file upload | `2021-04-15` | — |
| `POST` | `/conversations/messages/upload/initiate` | Initiate file upload to GCS | `2021-04-15` | — |
| `GET` | `/conversations/messages/{id}` | Get message by message id | `2021-04-15` | — |
| `PUT` | `/conversations/messages/{messageId}/attachments` | Add message attachments | `2021-04-15` | — |
| `GET` | `/conversations/messages/{messageId}/locations/{locationId}/recording` | Get Recording by Message ID | `2021-04-15` | — |
| `DELETE` | `/conversations/messages/{messageId}/schedule` | Cancel a scheduled message. | `2021-04-15` | — |
| `PUT` | `/conversations/messages/{messageId}/status` | Update message status | `2021-04-15` | — |
| `GET` | `/conversations/preferences/custom-subtypes` | Get All Custom Subtypes | `2021-04-15` | — |
| `POST` | `/conversations/preferences/custom-subtypes` | Create Custom Subtype | `2021-04-15` | — |
| `PUT` | `/conversations/preferences/custom-subtypes/{id}` | Update Custom Subtype | `2021-04-15` | — |
| `GET` | `/conversations/preferences/unsubscriptions/status` | Get Contact Unsubscription Status | `2021-04-15` | — |
| `POST` | `/conversations/preferences/unsubscriptions/user-change` | User Subscription Change | `2021-04-15` | — |
| `POST` | `/conversations/providers/live-chat/typing` | Agent/Ai-Bot is typing a message indicator for live chat | `2021-04-15` | — |
| `GET` | `/conversations/search` | Search Conversations | `2021-04-15` | — |
| `DELETE` | `/conversations/{conversationId}` | Delete Conversation | `2021-04-15` | — |
| `GET` | `/conversations/{conversationId}` | Get Conversation | `2021-04-15` | — |
| `PUT` | `/conversations/{conversationId}` | Update Conversation | `2021-04-15` | — |
| `GET` | `/conversations/{conversationId}/messages` | Get messages by conversation id | `2021-04-15` | — |

## Courses

| Method | Path | Summary | Version | Deprecated |
|--------|------|---------|---------|------------|
| `POST` | `/courses/courses-exporter/public/import` | Import Courses | `2021-07-28` | — |

## Custom Fields

| Method | Path | Summary | Version | Deprecated |
|--------|------|---------|---------|------------|
| `POST` | `/custom-fields/` | Create Custom Field | `2021-07-28` | — |
| `POST` | `/custom-fields/folder` | Create Custom Field Folder | `2021-07-28` | — |
| `DELETE` | `/custom-fields/folder/{id}` | Delete Custom Field Folder | `2021-07-28` | — |
| `PUT` | `/custom-fields/folder/{id}` | Update Custom Field Folder Name | `2021-07-28` | — |
| `GET` | `/custom-fields/object-key/{objectKey}` | Get Custom Fields By Object Key | `2021-07-28` | — |
| `DELETE` | `/custom-fields/{id}` | Delete Custom Field By Id | `2021-07-28` | — |
| `GET` | `/custom-fields/{id}` | Get Custom Field / Folder By Id | `2021-07-28` | — |
| `PUT` | `/custom-fields/{id}` | Update Custom Field By Id | `2021-07-28` | — |

## Emails

| Method | Path | Summary | Version | Deprecated |
|--------|------|---------|---------|------------|
| `GET` | `/emails/builder` | Fetch email templates | `2021-07-28` | — |
| `POST` | `/emails/builder` | Create a new template | `2021-07-28` | — |
| `POST` | `/emails/builder/data` | Update a template | `2021-07-28` | — |
| `DELETE` | `/emails/builder/{locationId}/{templateId}` | Delete a template | `2021-07-28` | — |
| `GET` | `/emails/schedule` | Get Campaigns | `2021-07-28` | — |

## Forms

| Method | Path | Summary | Version | Deprecated |
|--------|------|---------|---------|------------|
| `GET` | `/forms/` | Get Forms | `2021-07-28` | — |
| `GET` | `/forms/submissions` | Get Forms Submissions | `2021-07-28` | — |
| `POST` | `/forms/upload-custom-files` | Upload files to custom fields | `2021-07-28` | — |

## Funnels

| Method | Path | Summary | Version | Deprecated |
|--------|------|---------|---------|------------|
| `GET` | `/funnels/funnel/list` | Fetch List of Funnels | `—` | — |
| `POST` | `/funnels/lookup/redirect` | Create Redirect | `2021-07-28` | — |
| `GET` | `/funnels/lookup/redirect/list` | Fetch List of Redirects | `2021-07-28` | — |
| `DELETE` | `/funnels/lookup/redirect/{id}` | Delete Redirect By Id | `2021-07-28` | — |
| `PATCH` | `/funnels/lookup/redirect/{id}` | Update Redirect By Id | `2021-07-28` | — |
| `GET` | `/funnels/page` | Fetch list of funnel pages | `—` | — |
| `GET` | `/funnels/page/count` | Fetch count of funnel pages | `—` | — |

## Invoices

| Method | Path | Summary | Version | Deprecated |
|--------|------|---------|---------|------------|
| `GET` | `/invoices/` | List invoices | `2021-07-28` | — |
| `POST` | `/invoices/` | Create Invoice | `2021-07-28` | — |
| `POST` | `/invoices/estimate` | Create New Estimate | `2021-07-28` | — |
| `GET` | `/invoices/estimate/list` | List Estimates | `2021-07-28` | — |
| `GET` | `/invoices/estimate/number/generate` | Generate Estimate Number | `2021-07-28` | — |
| `PATCH` | `/invoices/estimate/stats/last-visited-at` | Update estimate last visited at | `2021-07-28` | — |
| `GET` | `/invoices/estimate/template` | List Estimate Templates | `2021-07-28` | — |
| `POST` | `/invoices/estimate/template` | Create Estimate Template | `2021-07-28` | — |
| `GET` | `/invoices/estimate/template/preview` | Preview Estimate Template | `2021-07-28` | — |
| `DELETE` | `/invoices/estimate/template/{templateId}` | Delete Estimate Template | `2021-07-28` | — |
| `PUT` | `/invoices/estimate/template/{templateId}` | Update Estimate Template | `2021-07-28` | — |
| `DELETE` | `/invoices/estimate/{estimateId}` | Delete Estimate | `2021-07-28` | — |
| `PUT` | `/invoices/estimate/{estimateId}` | Update Estimate | `2021-07-28` | — |
| `POST` | `/invoices/estimate/{estimateId}/invoice` | Create Invoice from Estimate | `2021-07-28` | — |
| `POST` | `/invoices/estimate/{estimateId}/send` | Send Estimate | `2021-07-28` | — |
| `GET` | `/invoices/generate-invoice-number` | Generate Invoice Number | `2021-07-28` | — |
| `GET` | `/invoices/schedule` | List schedules | `2021-07-28` | — |
| `POST` | `/invoices/schedule` | Create Invoice Schedule | `2021-07-28` | — |
| `DELETE` | `/invoices/schedule/{scheduleId}` | Delete schedule | `2021-07-28` | — |
| `GET` | `/invoices/schedule/{scheduleId}` | Get an schedule | `2021-07-28` | — |
| `PUT` | `/invoices/schedule/{scheduleId}` | Update schedule | `2021-07-28` | — |
| `POST` | `/invoices/schedule/{scheduleId}/auto-payment` | Manage Auto payment for an schedule invoice | `2021-07-28` | — |
| `POST` | `/invoices/schedule/{scheduleId}/cancel` | Cancel an scheduled invoice | `2021-07-28` | — |
| `POST` | `/invoices/schedule/{scheduleId}/schedule` | Schedule an schedule invoice | `2021-07-28` | — |
| `POST` | `/invoices/schedule/{scheduleId}/updateAndSchedule` | Update scheduled recurring invoice | `2021-07-28` | — |
| `GET` | `/invoices/settings` | Get Invoice Settings | `2021-07-28` | — |
| `PATCH` | `/invoices/stats/last-visited-at` | Update invoice last visited at | `2021-07-28` | — |
| `GET` | `/invoices/template` | List templates | `2021-07-28` | — |
| `POST` | `/invoices/template` | Create template | `2021-07-28` | — |
| `DELETE` | `/invoices/template/{templateId}` | Delete template | `2021-07-28` | — |
| `GET` | `/invoices/template/{templateId}` | Get an template | `2021-07-28` | — |
| `PUT` | `/invoices/template/{templateId}` | Update template | `2021-07-28` | — |
| `PATCH` | `/invoices/template/{templateId}/late-fees-configuration` | Update template late fees configuration | `2021-07-28` | — |
| `PATCH` | `/invoices/template/{templateId}/payment-methods-configuration` | Update template late fees configuration | `2021-07-28` | — |
| `POST` | `/invoices/text2pay` | Create & Send | `2021-07-28` | — |
| `DELETE` | `/invoices/{invoiceId}` | Delete invoice | `2021-07-28` | — |
| `GET` | `/invoices/{invoiceId}` | Get invoice | `2021-07-28` | — |
| `PUT` | `/invoices/{invoiceId}` | Update invoice | `2021-07-28` | — |
| `PATCH` | `/invoices/{invoiceId}/late-fees-configuration` | Update invoice late fees configuration | `2021-07-28` | — |
| `POST` | `/invoices/{invoiceId}/record-payment` | Record a manual payment for an invoice | `2021-07-28` | — |
| `POST` | `/invoices/{invoiceId}/send` | Send invoice | `2021-07-28` | — |
| `POST` | `/invoices/{invoiceId}/void` | Void invoice | `2021-07-28` | — |

## Links

> ⚠️ **Mixed Versions:** Most Links endpoints use `2021-07-28`, but `GET /links/search` uses `Version: 2021-04-15`.

| Method | Path | Summary | Version | Deprecated |
|--------|------|---------|---------|------------|
| `GET` | `/links/` | Get Links | `2021-07-28` | — |
| `POST` | `/links/` | Create Link | `2021-07-28` | — |
| `GET` | `/links/id/{linkId}` | Get Link by ID | `2021-07-28` | — |
| `GET` | `/links/search` | Search Trigger Links | `2021-04-15` | — |
| `DELETE` | `/links/{linkId}` | Delete Link | `2021-07-28` | — |
| `PUT` | `/links/{linkId}` | Update Link | `2021-07-28` | — |

## Locations

| Method | Path | Summary | Version | Deprecated |
|--------|------|---------|---------|------------|
| `POST` | `/locations/` | Create Sub-Account (Formerly Location) | `2021-07-28` | — |
| `GET` | `/locations/search` | Search | `2021-07-28` | — |
| `DELETE` | `/locations/{locationId}` | Delete Sub-Account (Formerly Location) | `2021-07-28` | — |
| `GET` | `/locations/{locationId}` | Get Sub-Account (Formerly Location) | `2021-07-28` | — |
| `PUT` | `/locations/{locationId}` | Put Sub-Account (Formerly Location) | `2021-07-28` | — |
| `GET` | `/locations/{locationId}/customFields` | Get Custom Fields | `2021-07-28` | — |
| `POST` | `/locations/{locationId}/customFields` | Create Custom Field | `2021-07-28` | — |
| `POST` | `/locations/{locationId}/customFields/upload` | Uploads File to customFields | `2021-07-28` | — |
| `DELETE` | `/locations/{locationId}/customFields/{id}` | Delete Custom Field | `2021-07-28` | — |
| `GET` | `/locations/{locationId}/customFields/{id}` | Get Custom Field | `2021-07-28` | — |
| `PUT` | `/locations/{locationId}/customFields/{id}` | Update Custom Field | `2021-07-28` | — |
| `GET` | `/locations/{locationId}/customValues` | Get Custom Values | `2021-07-28` | — |
| `POST` | `/locations/{locationId}/customValues` | Create Custom Value | `2021-07-28` | — |
| `DELETE` | `/locations/{locationId}/customValues/{id}` | Delete Custom Value | `2021-07-28` | — |
| `GET` | `/locations/{locationId}/customValues/{id}` | Get Custom Value | `2021-07-28` | — |
| `PUT` | `/locations/{locationId}/customValues/{id}` | Update Custom Value | `2021-07-28` | — |
| `POST` | `/locations/{locationId}/recurring-tasks` | Create Recurring Task | `2021-07-28` | — |
| `DELETE` | `/locations/{locationId}/recurring-tasks/{id}` | Delete Recurring Task | `2021-07-28` | — |
| `GET` | `/locations/{locationId}/recurring-tasks/{id}` | Get Recurring Task By Id | `2021-07-28` | — |
| `PUT` | `/locations/{locationId}/recurring-tasks/{id}` | Update Recurring Task | `2021-07-28` | — |
| `GET` | `/locations/{locationId}/tags` | Get Tags | `2021-07-28` | — |
| `POST` | `/locations/{locationId}/tags` | Create Tag | `2021-07-28` | — |
| `DELETE` | `/locations/{locationId}/tags/{tagId}` | Delete tag | `2021-07-28` | — |
| `GET` | `/locations/{locationId}/tags/{tagId}` | Get tag by id | `2021-07-28` | — |
| `PUT` | `/locations/{locationId}/tags/{tagId}` | Update tag | `2021-07-28` | — |
| `POST` | `/locations/{locationId}/tasks/search` | Task Search Filter | `2021-07-28` | — |
| `GET` | `/locations/{locationId}/templates` | GET all or email/sms templates | `2021-07-28` | — |
| `DELETE` | `/locations/{locationId}/templates/{id}` | DELETE an email/sms template | `2021-07-28` | — |
| `GET` | `/locations/{locationId}/timezones` | Fetch Timezones | `2021-07-28` | — |

## Media

| Method | Path | Summary | Version | Deprecated |
|--------|------|---------|---------|------------|
| `PUT` | `/medias/delete-files` | Bulk Delete / Trash Files or Folders | `2021-07-28` | — |
| `GET` | `/medias/files` | Get List of Files/ Folders | `2021-07-28` | — |
| `POST` | `/medias/folder` | Create Folder | `2021-07-28` | — |
| `PUT` | `/medias/update-files` | Bulk Update Files/ Folders | `2021-07-28` | — |
| `POST` | `/medias/upload-file` | Upload File into Media Storage | `2021-07-28` | — |
| `DELETE` | `/medias/{id}` | Delete File or Folder | `2021-07-28` | — |
| `POST` | `/medias/{id}` | Update File/ Folder | `2021-07-28` | — |

## OAuth

| Method | Path | Summary | Version | Deprecated |
|--------|------|---------|---------|------------|
| `GET` | `/oauth/installedLocations` | Get Location where app is installed | `2021-07-28` | — |
| `POST` | `/oauth/locationToken` | Get Location Access Token from Agency Token | `2021-07-28` | — |
| `POST` | `/oauth/token` | Get Access Token | `—` | — |

## Objects

> ⚠️ **Schema Discovery:** Use `GET /objects/{key}?locationId=LOC_ID` with `Version: 2021-07-28` for schema discovery. Object key for custom objects must include `custom_objects.` prefix.

| Method | Path | Summary | Version | Deprecated |
|--------|------|---------|---------|------------|
| `GET` | `/objects/` | Get all objects for a location | `2021-07-28` | — |
| `POST` | `/objects/` | Create Custom Object | `2021-07-28` | — |
| `GET` | `/objects/{key}` | Get Object Schema by key / id | `2021-07-28` | — |
| `PUT` | `/objects/{key}` | Update Object Schema By Key / Id | `2021-07-28` | — |
| `POST` | `/objects/{schemaKey}/records` | Create Record | `2021-07-28` | — |
| `POST` | `/objects/{schemaKey}/records/search` | Search Object Records | `2021-07-28` | — |
| `DELETE` | `/objects/{schemaKey}/records/{id}` | Delete Record | `2021-07-28` | — |
| `GET` | `/objects/{schemaKey}/records/{id}` | Get Record By Id | `2021-07-28` | — |
| `PUT` | `/objects/{schemaKey}/records/{id}` | Update Record | `2021-07-28` | — |

## Opportunities

> ⚠️ **Search Quirk:** The `POST /opportunities/search` endpoint sometimes has issues filtering by `contactId` directly. Use the newer search endpoint or work around with custom filters.

| Method | Path | Summary | Version | Deprecated |
|--------|------|---------|---------|------------|
| `POST` | `/opportunities/` | Create Opportunity | `2021-07-28` | — |
| `GET` | `/opportunities/lost-reason` | Get lost reason | `2021-07-28` | — |
| `GET` | `/opportunities/pipelines` | Get Pipelines | `2021-07-28` | — |
| `GET` | `/opportunities/search` | Search Opportunity | `2021-07-28` | — |
| `POST` | `/opportunities/search` | Search Opportunities | `2021-07-28` | — |
| `POST` | `/opportunities/upsert` | Upsert Opportunity | `2021-07-28` | — |
| `DELETE` | `/opportunities/{id}` | Delete Opportunity | `2021-07-28` | — |
| `GET` | `/opportunities/{id}` | Get Opportunity | `2021-07-28` | — |
| `PUT` | `/opportunities/{id}` | Update Opportunity | `2021-07-28` | — |
| `DELETE` | `/opportunities/{id}/followers` | Remove Followers | `2021-07-28` | — |
| `POST` | `/opportunities/{id}/followers` | Add Followers | `2021-07-28` | — |
| `PUT` | `/opportunities/{id}/status` | Update Opportunity Status | `2021-07-28` | — |

## Payments

| Method | Path | Summary | Version | Deprecated |
|--------|------|---------|---------|------------|
| `DELETE` | `/payments/coupon` | Delete Coupon | `2021-07-28` | — |
| `GET` | `/payments/coupon` | Fetch Coupon | `2021-07-28` | — |
| `POST` | `/payments/coupon` | Create Coupon | `2021-07-28` | — |
| `PUT` | `/payments/coupon` | Update Coupon | `2021-07-28` | — |
| `GET` | `/payments/coupon/list` | List Coupons | `2021-07-28` | — |
| `PUT` | `/payments/custom-provider/capabilities` | Custom-provider marketplace app update capabilities | `2021-07-28` | — |
| `GET` | `/payments/custom-provider/connect` | Fetch given provider config | `2021-07-28` | — |
| `POST` | `/payments/custom-provider/connect` | Create new provider config | `2021-07-28` | — |
| `POST` | `/payments/custom-provider/disconnect` | Disconnect existing provider config | `2021-07-28` | — |
| `DELETE` | `/payments/custom-provider/provider` | Deleting an existing integration | `2021-07-28` | — |
| `POST` | `/payments/custom-provider/provider` | Create new integration | `2021-07-28` | — |
| `GET` | `/payments/integrations/provider/whitelabel` | List White-label Integration Providers | `2021-07-28` | — |
| `POST` | `/payments/integrations/provider/whitelabel` | Create White-label Integration Provider | `2021-07-28` | — |
| `GET` | `/payments/orders` | List Orders | `2021-07-28` | — |
| `GET` | `/payments/orders/{orderId}` | Get Order by ID | `2021-07-28` | — |
| `GET` | `/payments/orders/{orderId}/fulfillments` | List fulfillment | `2021-07-28` | — |
| `POST` | `/payments/orders/{orderId}/fulfillments` | Create order fulfillment | `2021-07-28` | — |
| `GET` | `/payments/orders/{orderId}/notes` | List Order Notes | `2021-07-28` | — |
| `POST` | `/payments/orders/{orderId}/record-payment` | Record Order Payment | `2021-07-28` | — |
| `GET` | `/payments/subscriptions` | List Subscriptions | `2021-07-28` | — |
| `GET` | `/payments/subscriptions/{subscriptionId}` | Get Subscription by ID | `2021-07-28` | — |
| `GET` | `/payments/transactions` | List Transactions | `2021-07-28` | — |
| `GET` | `/payments/transactions/{transactionId}` | Get Transaction by ID | `2021-07-28` | — |

## Users

> ⚠️ **Deprecations:** Email update is deprecated. User deletion is asynchronous (returns 202 Accepted). `GET /users/` is deprecated — use `GET /users/search` instead.

| Method | Path | Summary | Version | Deprecated |
|--------|------|---------|---------|------------|
| `GET` | `/users/` | Get User by Location | `2021-07-28` | ⚠️ YES |
| `POST` | `/users/` | Create User | `2021-07-28` | — |
| `GET` | `/users/search` | Search Users | `2021-07-28` | — |
| `POST` | `/users/search/filter-by-email` | Filter Users by Email | `2021-07-28` | — |
| `DELETE` | `/users/{userId}` | Delete User | `2021-07-28` | — |
| `GET` | `/users/{userId}` | Get User | `2021-07-28` | — |
| `PUT` | `/users/{userId}` | Update User | `2021-07-28` | — |

## Workflows

| Method | Path | Summary | Version | Deprecated |
|--------|------|---------|---------|------------|
| `GET` | `/workflows/` | Get Workflow | `2021-07-28` | — |

---

*Documentation generated from GHL OpenAPI specifications. Always verify against the official GHL API documentation for the latest changes.*