← All posts

October 9, 2026 · 9 min read

GoHighLevel API Guide (2026): API Key, Documentation, Rate Limits, Webhooks and MCP

Arslan Mumtaz

By Arslan Mumtaz, software engineer and GoHighLevel & AI automation specialist

The GoHighLevel API is how you connect HighLevel to anything its built-in integrations don't cover: a custom booking app, a database, an ERP, a client portal or your own AI agent. This guide covers what you need to get it working in production: authentication, headers, rate limits, the endpoints most builds use, webhooks and the mistakes that cause most failed integrations.

1. The basics and the API documentation

Authorization: Bearer <your token>
Version: 2021-07-28
Content-Type: application/json
Accept: application/json

Many endpoints take 2021-07-28, but newer reference pages (contacts, for example) show v3. Don't guess: copy the value from each endpoint's page and keep it in one constant in your code, so a future version change is a one-line fix.

2. Getting a GoHighLevel API key

Older tutorials tell you to copy an "API key" from the sub-account settings. That was the v1 API, which is end-of-life. In v2 the "API key" is a Private Integration token: go to Settings → Private Integrations → Create new Integration, name it, tick only the scopes you need, and copy the token straight away, because it's only shown once. For apps used by many accounts, use OAuth instead (below).

3. Authentication: Private Integration token or OAuth?

HighLevel supports two ways to authenticate with the v2 API.

Private Integration tokenOAuth 2.0 (Marketplace app)
Best forYour own integration with one sub-account or your agencyApps installed on many sub-accounts, or anything you sell
How you get itSettings → Private Integrations → Create new Integration, pick scopes, copy the tokenCreate an app in the Marketplace developer portal, then run the OAuth install flow
Token lifeStatic. Rotate every 90 days (old and new both work for 7 days)Access tokens expire daily and must be refreshed
WebhooksNot availableAvailable (50+ event types)
Watch out forThe token is shown once. Store it as a secret straight awayRefresh logic and token storage per install

Rule of thumb: one business connecting its own systems → Private Integration token. Anything installed across many sub-accounts, or anything that needs HighLevel to push events to you → OAuth. If you don't see Private Integrations in settings, the HighLevel docs say to check it's enabled in Labs.

Only give a token the scopes it needs. A token that can only read and write contacts does far less damage if it leaks than one with full access.

4. Rate limits

For imports and syncs, queue the work and retry 429 responses with exponential backoff. If you serve several sub-accounts, back off per sub-account, not globally:

async function ghl(path, options = {}, attempt = 0) {
  const res = await fetch("https://services.leadconnectorhq.com" + path, {
    ...options,
    headers: {
      Authorization: "Bearer " + process.env.GHL_TOKEN,
      Version: GHL_VERSION, // one constant, not scattered strings
      "Content-Type": "application/json",
      ...options.headers,
    },
  });
  if (res.status === 429 && attempt < 5) {
    // back off, with a little jitter, then retry
    const wait = 1000 * 2 ** attempt + Math.random() * 250;
    await new Promise((r) => setTimeout(r, wait));
    return ghl(path, options, attempt + 1);
  }
  if (!res.ok) throw new Error(res.status + " " + (await res.text()));
  return res.json();
}

5. The endpoints most builds use

JobEndpointNotes
Create or update a contactPOST /contacts/upsertMatches existing contacts by email/phone using the location's duplicate settings. Use this instead of create, to avoid duplicates.
Find contactsPOST /contacts/searchFiltered, paginated search.
Tag a contactPOST /contacts/:id/tagsTags are the simplest way to start a workflow from outside HighLevel.
Pipeline deals/opportunitiesCreate, update stage and status, search.
Bookings/calendarsGet free slots, create and update appointments.
Messages/conversationsRead conversations and send SMS or email. US texting still needs A2P 10DLC.
Custom dataCustom fields, custom values, custom objectsStore data HighLevel has no standard field for.

Example: create or update a lead from your own app.

curl -X POST "https://services.leadconnectorhq.com/contacts/upsert" \
  -H "Authorization: Bearer $GHL_TOKEN" \
  -H "Version: <version from the endpoint's docs page>" \
  -H "Content-Type: application/json" \
  -d '{
    "locationId": "YOUR_LOCATION_ID",
    "firstName": "Sam",
    "email": "sam@example.com",
    "phone": "+15555550123",
    "tags": ["website-lead"],
    "source": "Custom booking app"
  }'

Paths and fields change as HighLevel updates the API, so treat this table as a map and confirm the exact request on each endpoint's docs page.

6. Getting data out: webhooks

There are two ways HighLevel can tell your system something happened:

For app webhooks, follow HighLevel's guide:

7. The HighLevel MCP server (AI assistants)

HighLevel also runs an official MCP server, so AI assistants such as Claude and ChatGPT can work with a sub-account directly. Claude connects to https://services.leadconnectorhq.com/mcp/anthropic/v2 and ChatGPT or Codex to /mcp/openai/v2/. You sign in with OAuth, pick the sub-account and approve scopes. Instead of hundreds of separate tools it exposes four (list locations, search operations, describe an operation, execute it) covering 550+ API operations.

It's useful for reporting, quick lookups and admin tasks you'd otherwise do by hand. Setup steps are in the GoHighLevel MCP server guide. For production automations that must run the same way every time, a workflow or API code is still the better choice.

8. Mistakes that break GoHighLevel integrations

  1. Creating instead of upserting contacts, which fills the CRM with duplicates.
  2. Hard-coding the Version header in dozens of places, so a version change means hunting through the code.
  3. No 429 handling, so bulk imports fail halfway through.
  4. Choosing a Private Integration token and later needing webhooks, which means rebuilding the auth as an OAuth app.
  5. Losing the token because it's only shown once, then having to rotate it everywhere.
  6. Not verifying webhook signatures, so anyone who finds the URL can send fake events.
  7. Doing heavy work before responding to a webhook, which causes timeouts, retries and double processing.
  8. Using v1 code from old tutorials. v1 is end-of-life.

9. API, workflow custom code or n8n?

The API is also how custom AI agents read and update the CRM. See the GoHighLevel AI automation guide and the Agent Studio guide.

10. Real examples

Need a GoHighLevel API integration built?

I'm Arslan Mumtaz, a software engineer who builds GoHighLevel API integrations, webhooks and custom apps for businesses and agencies in the US, UK, Europe and Australia. See AI & automation and pricing, or start with a $97 audit of what you want to connect.

Work with me

Still losing leads to voicemail or slow follow-up?

I build speed-to-lead, retention and AI automation systems in GoHighLevel, with custom code where the platform falls short.

More articles