
GoHighLevel runs on one current REST surface-API v2 at services.leadconnectorhq.com, gated by a date-based Version header and either OAuth 2.0 or a Private Integration Token. The v1 API reached end-of-support on December 31, 2025 but has not been switched off, which is the biggest source of stale integrations in the ecosystem. On the agent side the verdict is unusually clean: HighLevel ships a first-party, generally available remote MCP server, so you do not need a community wrapper to give Claude write access to contacts, conversations, calendars and invoices.
Version: 2021-07-28; v1 end-of-supportMost CRMs in this category still depend on community MCP wrappers or on Zapier as an intermediary. GoHighLevel does not: HighLevel publishes and operates its own remote Model Context Protocol server, authenticated with the same scopes and tokens as the REST API.
HighLevel operates a remote HTTP MCP server at /mcp/anthropic/v2, fronting hundreds of operations across roughly 40 API domains through one unified toolset-search, fetch, search_operations, describe_operation, execute_operation, list_locations. Auth is OAuth consent or a Private Integration Token. Two caveats: the richer endpoint is Claude-only today, and every request targets a single sub-account.
Four entries below are official HighLevel properties; the community server predates the first-party release and is now largely redundant for Claude users. Zapier reaches GoHighLevel only indirectly, via its LeadConnector app.
Per-client endpoint tuned for Claude, full toolset over ~40 domains. Add via Settings › Connectors or claude mcp add.
Endpoint for any HTTP MCP client, with a narrower set of core tools. Configured in .mcp.json with a pit- bearer token and locationId header.
Canonical docs: endpoints, auth, tool list and per-client setup. Cite this rather than a third-party MCP directory, which lags the official inventory.
The reverse direction: GoHighLevel AI Agents consuming external MCP servers inside a workflow, with Bearer, API key, OAuth2 or custom header auth. Prebuilt targets include Exa and Tavily.
Widely referenced Node server wrapping API v2. Useful only if you must self-host the transport instead of calling the hosted endpoint.
An official server removes the two risks that stall agent projects elsewhere: an unmaintained wrapper that breaks on the next API change, and an auth model that cannot be scoped. The MCP layer inherits the REST scope system, so a token minted for contacts.readonly gives an agent exactly that. The limit to plan around is tenancy, one call addresses one sub-account, and an agency must use list_locations to move between clients. Against ActiveCampaign, Brevo or Klaviyo, GoHighLevel leads on first-party MCP availability and trails on client coverage.
Everything current lives under one host and one docs site. The legacy v1 host rest.gohighlevel.com/v1 and the Stoplight docs are both on the way out and are not reference material.
| Base URL | https://services.leadconnectorhq.com |
| Current version | v2 CURRENT |
| Version header | Version: 2021-07-28 on most endpoints; 2021-04-15 on older ones; v3 on a few rebuilt ones |
| Response format | JSON |
| Auth | OAuth 2.0 authorization code, or a Private Integration Token as Authorization: Bearer pit-… |
| Tenancy | Company (agency) token vs Location (sub-account) token; most business endpoints need a locationId |
| Pagination | Mixed-limit + skip on list endpoints, pageLimit + searchAfter on POST /contacts/search |
| Webhooks | 50+ events; signature verification ships in the official TypeScript SDK |
| Docs home | marketplace.gohighlevel.com/docs |
| Client timeout | Not published by HighLevel, use 30s client-side and retry on 429 |
The API spans roughly 40 domains, contacts, conversations, opportunities, calendars, payments, products, invoices, social planner, blogs, emails, forms, surveys, with hundreds of operations. The shape of any integration is decided by two things: which token type you hold, and whether the endpoint has been rebuilt on a newer version header. Get either wrong and the errors will not name the cause.
Required for public marketplace apps installed across many accounts. Tokens are exchanged at /oauth/token. Access tokens last roughly 24 hours; refresh tokens last up to one year and are single-use-once exchanged, the original is invalid and a new one arrives in the same response. A client that keeps the old refresh token locks itself out on the next cycle.
A PIT is a static OAuth 2.0 access token created under Settings › Private Integrations at agency or sub-account level. Scopes are chosen at creation, the value is shown once, and it is sent as Authorization: Bearer pit-…. This is the intended path for internal tools and no-code platforms. Make, n8n, Zapier and custom scripts. It replaces the v1 API key, which was unrestricted and should be retired wherever it survives. HighLevel advises against PITs for public apps and recommends rotating every 90 days.
A company token addresses agency-level APIs; a location token addresses one sub-account. Multi-tenant apps mint a location token from an agency token via POST /oauth/locationToken-which is why a token that works in Postman for one client returns empty arrays for another.
OAuth apps and PITs are both scope-gated at creation. A missing scope does not always surface as a permission error, agents and scripts often see empty result sets instead. When an MCP tool or SDK call returns nothing for data you can see in the UI, check the token’s scopes before debugging the request body. The MCP server inherits scopes from the token you connected with.
| Limit | Value | Notes |
|---|---|---|
| Burst | 100 requests / 10 seconds | The officially documented ceiling |
| Sustained rate | 600 requests/minute | Derived directly from the burst window |
| Daily cap | 200,000 requests/day | Hard ceiling per counted resource |
| Counting scope | Per Marketplace app, per resource | Resource = Location or Company, so each sub-account has its own budget |
| SMTP relay sending | 1,500 emails/day | Exceeding it deletes SMTP credentials across all dedicated domains |
| LC Email in-app | 150,000/day shared, 450,000/day dedicated | After a 7-day ramp from 250/day; resets 00:00:01 UTC |
The per-app, per-resource rule matters for agencies: a fleet of sub-accounts does not share one 200,000-request pool, but one noisy sync job can exhaust a single client’s day. The workaround pattern: page reads through POST /contacts/search with searchAfter rather than looping skip, use POST /contacts/upsert instead of read-then-write pairs, drive change detection from webhooks instead of polling, and back off against the 10-second burst window rather than a fixed sleep. These API limits are separate from the email caps above: hitting the API ceiling throttles requests, hitting the SMTP relay cap destroys credentials.
HighLevel maintains three language SDKs plus a CLI and an app scaffold, all generated from the API spec and published under the GoHighLevel GitHub organisation. The TypeScript client is the most complete and the only one with built-in OAuth refresh, session storage and webhook signature verification.
| Language | Package | Install | Repo |
|---|---|---|---|
| TypeScript / JS | @gohighlevel/api-client | npm i @gohighlevel/api-client | highlevel-api-sdk |
| PHP | gohighlevel/api-client | composer require gohighlevel/api-client | highlevel-api-php |
| Python | gohighlevel-api-client | pip install gohighlevel-api-client | highlevel-api-python |
| CLI | ghl-cli | See repo README | ghl-cli |
| App scaffold | ghl-marketplace-app-template | git clone the repo | app template |
The published Python release is v1.0.0-beta.1 from November 19, 2025, with repo activity to June 25, 2026. Official, but explicitly beta: pin the version and keep a raw requests fallback. The TypeScript client reached v3.0.0 on May 1, 2026; the PHP client (PHP 7.4+) was updated through June 22, 2026. The app scaffold is the oldest artefact at June 2025-check its OAuth flow against current docs first.
First-party clients arrived late, so a long tail of community wrappers still circulates, many written against v1 and its unrestricted API key. That is the filter: if a library authenticates with a bare API key and points at rest.gohighlevel.com, it targets a dead surface no matter how recent the README. The most durable community assets are not SDKs but the MCP servers above and the maintained Make modules, which track v2.
The fifteen endpoints below carry most integration traffic. The full reference, products, workflows, social planner, forms, surveys, blogs, is at marketplace.gohighlevel.com/docs. Paths are relative to https://services.leadconnectorhq.com.
| Resource | Methods | Description |
|---|---|---|
| Contacts /contacts/ | GET, POST | List and create contacts in a location |
| Contacts /contacts/{contactId} | GET, PUT, DELETE | Read, update or delete one contact |
| Contacts /contacts/upsert | POST | Create or update by email/phone, the idempotent write |
| Contacts /contacts/search | POST | Filtered search with cursor pagination; needs Version: v3 |
| Conversations /conversations/ | GET, POST | List and create threads across all channels |
| Conversations /conversations/messages | POST | Send outbound on SMS, Email, WhatsApp, FB, IG |
| Opportunities /opportunities/ | GET, POST | Create and list pipeline opportunities |
| Opportunities /opportunities/search | GET | Filter by pipeline, stage, status, owner |
| Calendars /calendars/ | GET, POST | Manage calendars and availability |
| Calendars /calendars/events/appointments | POST | Book an appointment against a calendar |
| Locations /locations/{locationId} | GET, PUT | Read or update a sub-account |
| OAuth /oauth/token | POST | Exchange an auth code or refresh token for an access token |
| OAuth /oauth/locationToken | POST | Mint a sub-account token from an agency token |
| Emails /emails/builder | GET, POST | Manage templates used by campaigns and workflows |
| Invoices /invoices/ | GET, POST | Create and list invoices, recurring included |
import requests
BASE = "https://services.leadconnectorhq.com"
TOKEN = "pit-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" # Private Integration Token
LOCATION_ID = "your_sub_account_location_id"
headers = {
"Authorization": f"Bearer {TOKEN}",
"Version": "2021-07-28", # required date-based API version header
"Accept": "application/json",
"Content-Type": "application/json",
}
# Upsert a contact in a sub-account (location)
payload = {
"locationId": LOCATION_ID,
"firstName": "Ada",
"lastName": "Lovelace",
"email": "ada@example.com",
"tags": ["smtpedia-demo"],
}
r = requests.post(f"{BASE}/contacts/upsert", headers=headers, json=payload, timeout=30)
r.raise_for_status()
print(r.json())
# Search: newer endpoint, requires Version: v3 instead of the date header
r2 = requests.post(
f"{BASE}/contacts/search",
headers={**headers, "Version": "v3"},
json={"locationId": LOCATION_ID, "pageLimit": 20},
timeout=30,
)
print(r2.json())// Official SDK: npm install @gohighlevel/api-client
import HighLevel from '@gohighlevel/api-client';
const ghl = new HighLevel({
privateIntegrationToken: process.env.GHL_PIT, // pit-...
});
const contact = await ghl.contacts.getContact({ contactId: 'contact-uuid' });
console.log(contact);
// Raw fetch equivalent, no SDK:
const res = await fetch('https://services.leadconnectorhq.com/contacts/upsert', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.GHL_PIT}`,
Version: '2021-07-28', // required
Accept: 'application/json',
'Content-Type': 'application/json',
},
body: JSON.stringify({
locationId: process.env.GHL_LOCATION_ID,
firstName: 'Ada',
email: 'ada@example.com',
}),
});
console.log(await res.json());# Claude Code, per-client endpoint (richest toolset)
claude mcp add --transport http leadconnector https://services.leadconnectorhq.com/mcp/anthropic/v2
# Universal endpoint for any HTTP MCP client, via .mcp.json
{
"mcpServers": {
"leadconnector": {
"type": "http",
"url": "https://services.leadconnectorhq.com/mcp/",
"headers": {
"Authorization": "Bearer pit-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"locationId": "your_sub_account_location_id"
}
}
}
}HighLevel states v1 reached end-of-support on December 31, 2025 with no further updates or support, while confirming existing connections keep working and there is no immediate shutoff. Because v1 still answers, many agency automations run on unrestricted v1 keys with no sunset date. Treat every working v1 integration as live technical debt: a v1 key grants broad access to all data, while v2 PITs and OAuth apps are scope-limited. Do not build against rest.gohighlevel.com/v1 or the Stoplight docs.
Most endpoints expect Version: 2021-07-28, older ones accept 2021-04-15, and a few rebuilt ones, confirmed on POST /contacts/search-require the literal string v3. The wrong value produces field-level validation errors rather than a clean version error. That v3 is a header value, not a released API v3: the help centre still describes v3 as “the next API milestone”.
Every refresh exchange invalidates the token you presented and returns a new one. A worker that caches the refresh token at boot, or two workers sharing a credential store without locking, succeeds once then fails permanently with an invalid-grant error that looks like a revoked app. Persist the new refresh token in the same transaction as the access token, and serialise refreshes across processes. Access tokens last about 24 hours, so a failed rotation stays invisible for a day.
The API host is services.leadconnectorhq.com, the help centre is help.leadconnectorhq.com, and the WordPress plugin and Zapier app are both listed as LeadConnector, searching Zapier for “GoHighLevel” returns nothing. The split affects sending too: LC Email runs on Mailgun, so DNS records point at mailgun.org hosts the UI never names.
@gohighlevel/api-client released v3.0.0, adding automatic OAuth refresh, pluggable session storage and webhook signature verification.marketplace.gohighlevel.com/docs, with the legacy Stoplight docs slated for deprecation.gohighlevel-api-client v1.0.0-beta.1.Product changes land at ideas.gohighlevel.com/changelog; API changes at marketplace.gohighlevel.com/docs. Watch both: the streams do not mirror each other.
v1 reached end-of-support on December 31, 2025. Existing connections keep working, but no updates or technical support are provided. There is no published shutdown date-the official migration post says there is no immediate shutoff. Because v1 still answers today, plan the move on your own timetable rather than waiting for a forcing date.
Three changes. Swap the host: rest.gohighlevel.com/v1 becomes services.leadconnectorhq.com. Replace the bare API key with a Private Integration Token or a full OAuth 2.0 app, choosing scopes deliberately, v1 keys were unrestricted, so anything you forget to grant returns nothing. Add the Version header to every request, normally 2021-07-28. Rework pagination last, since list endpoints and POST /contacts/search page differently.
A PIT is a static access token created under Settings › Private Integrations, scoped at creation and shown once. It needs no refresh flow, which makes it right for internal scripts and no-code tools like Make, n8n and Zapier. OAuth 2.0 is the multi-tenant path: a user installs your app, you receive tokens per account and handle refresh rotation. HighLevel advises against PITs for public apps and recommends rotating them every 90 days.
A burst of 100 requests per 10 seconds and a daily ceiling of 200,000 requests, counted per Marketplace app per resource, a Location or a Company. That is roughly 600 requests per minute sustained. These are API limits only: email sending has separate daily caps, and the SMTP-credential path is capped at 1,500 emails per day with credential deletion as the penalty.
Call POST /oauth/locationToken with your company-level token and the target location. The response is a token scoped to that sub-account, which you then use for contacts, conversations, calendars and every other business endpoint. This mint-per-client pattern drives almost every agency-scale automation, and it is why an agency token alone returns nothing from sub-account endpoints.
Yes, a first-party, generally available remote MCP server. The Claude-tuned endpoint is /mcp/anthropic/v2 on services.leadconnectorhq.com; a narrower universal endpoint at /mcp/ serves any HTTP MCP client. Auth is OAuth consent or a PIT, and the toolset fronts hundreds of operations across roughly 40 API domains. Two limits: wider client support (OpenAI, Cursor, Windsurf, VS Code) is planned rather than shipped, and each session addresses one sub-account. Setup is in the official MCP documentation.
This review follows our email infrastructure testing methodology. We disclose affiliate relationships in our editorial independence policy.