Location CRUD Setup
Create, read, update, delete, and search sub-account locations in GoHighLevel. Locations are the core organizational unit in GHL, representing individual businesses or clients. This quick-start walks you through the full location lifecycle via the API.
Prerequisites
Before making your first Location CRUD call, confirm you have:
- A GoHighLevel agency account (location management requires agency-level access)
- Access to Settings > Integrations > Private Integrations at the agency level
- A REST client such as Postman, Insomnia, or
curlin your terminal - Your agency’s
companyId(found in Settings > Company) - Understanding that creating locations may consume seats on your GHL plan
Location CRUD operations are agency-level. You cannot create or delete locations from within a sub-account. You need an Agency PIT, not a sub-account PIT.
Set Up Authentication
All Location CRUD endpoints require a Private Integration Token (PIT) with the locations scope, created at the agency level.
Navigate to your agency dashboard, then Settings > Integrations > Private Integrations. Click Create New Integration, name it “Location Manager,” and enable the locations scope. Click Save and copy the generated token.
Pass this token in the Authorization header as a Bearer token. Set your base URL to https://services.leadconnectorhq.com. Include Content-Type: application/json and the Version: 2021-07-28 header.
Make Your First Call
Start by creating a new location. Send a POST request to /locations:
POST /locations
Authorization: Bearer {your-agency-pit-token}
Content-Type: application/json
{
"companyId": "your-company-id",
"name": "Acme Plumbing",
"address": "123 Main St",
"city": "Austin",
"state": "TX",
"postalCode": "78701",
"country": "US",
"phone": "+15551234567",
"email": "[email protected]",
"timezone": "America/Chicago"
}
Key fields: companyId and name are required. Include address, city, state, postalCode, and country for complete business profiles. The timezone field accepts IANA identifiers (use the Timezone Handler endpoint to list valid options).
To read, use GET /locations/{id}. To update, use PUT /locations/{id}. To delete, use DELETE /locations/{id}. To search, use GET /locations/search?companyId={id}&query=acme.
Handle the Response
A successful POST returns a 200 status with the full location object:
{
"location": {
"id": "loc-456",
"companyId": "your-company-id",
"name": "Acme Plumbing",
"address": "123 Main St",
"city": "Austin",
"state": "TX",
"timezone": "America/Chicago",
"dateAdded": "2026-03-07T12:00:00Z"
}
}
Save the location.id. This is the locationId used across all sub-account level endpoints in every other GHL API module. Common errors: 400 means required fields are missing. 401 means your token is invalid or not agency-level. 403 means your plan has reached its location limit.
Test Your Setup
Run through this checklist to confirm everything works:
- Create a test location with
POST /locationsand save the returnedid - Read it with
GET /locations/{id}and verify all fields - Update the name with
PUT /locations/{id} - Search for it with
GET /locations/search?query=testand confirm it appears - Delete the test location with
DELETE /locations/{id}when finished
If creation fails with 403, check your GHL plan’s location limit. If search returns empty, verify the companyId matches your agency and allow a moment for indexing.
Next Steps
Read the full Location CRUD Guide for bulk provisioning, snapshot deployment, and multi-location management patterns. From here, explore Location Tags for organizing locations and Location Custom Fields for extending location data models.