Skip to main content
The reference is generated from the API itself, so what is here is what is live. Each module below has a guide in the Documentation tab that explains its concepts. Read the guide first, then the endpoints.

Base URL and authentication

Endpoint paths already include the /api prefix. Every request carries an API key as a bearer token:
Keys and scopes are covered in Authentication. Ids, envelopes, dates, pagination, error codes and rate limits are covered once, in Conventions.

Modules

Tags, calendars, custom fields and custom values are read from your CRM directly; the platform does not proxy them. See CRM resources and GoHighLevel resources for which ids each setting wants.

Choose the smallest operation

List available tools includes capabilities too: Appointment Booking, Live Transfer and Add a Tag share the catalog with Service Area Check and Check a Tag. There is no separate capability-list endpoint. Read Get campaign to see installed abilities, and use Update campaign to configure them:
  • capabilities.appointment_booking, capabilities.live_transfer, capabilities.add_tag
  • tools.smart_service_area, tools.check_tag
The catalog lists what is available; it does not mean those abilities are installed. Zero capabilities is valid. Capability settings belong in these campaign fields, while Update a tool description only changes when an installed execution tool should be used. The complete agent read is still useful for a configuration screen. The focused script read removes platform-managed content and returns the editable text. Setting CRM context fields configures which lead data the agent receives; it does not update contact values in the CRM.

Resource design

Read-only synchronization details live under the campaign’s metadata, separate from its editable settings. inventoryVersion covers capabilities and tools only; send it as expectedVersion when you want to reject edits based on an older read. Ordinary partial updates can omit it. inventoryFreshness tells you whether that inventory was checked live or came from the last stored snapshot. A cached read does not certify the current live configuration. Do not send metadata in an update. Calling uses two independent switches: calling.speedToLead for immediate calls and calling.powerDialer for scheduled calls. Both are supported for confirmation campaigns too. The older combined dialing selector is compatibility input only. The public JSON is a product contract. It does not mirror MongoDB collections, internal field names or the voice provider’s configuration. The server translates between them. One resource can combine information stored in several places. Internal storage can change while this contract remains stable. Settings live on their resource: script, speech and CRM context on the agent; audience, calling rules and outcome prompts on the campaign. Send only the fields you intend to change. An omitted setting is preserved. Supplied arrays replace the relevant list; contextFields: [] explicitly clears the managed CRM block. Outcome maps merge by key, so editing callback wording leaves opt-out wording alone. Use a compact view when you only need part of a resource. It changes the response shape, not permission checks. The operation page documents each representation. Capabilities, workflow nodes and test runs retain their own operations because they have identities, lifecycle rules or effects beyond changing a setting. “Fewer endpoints” must still leave it clear whether a request edits configuration, installs an ability, removes something, or initiates a call. CRM administration belongs to the connected CRM’s own API. This reference has no GHL proxy endpoints. Campaign reads report the calendar already selected; the builder chatbot uses private, permission-checked lookups when it needs to help someone select a different calendar, tag or pipeline.

Compatibility with earlier clients

Earlier routes remain available for existing clients but are omitted from the public reference and generated tools. New integrations should use the resource operations below: Notes subscriptions are workflow settings. The legacy outcome route’s notes switch does not become an outcome detection prompt. The GHL module only answers for a sub-account with GoHighLevel connected. A sub-account that keeps its contacts on the platform uses Native Contacts and Native Calendar instead.

How to read an endpoint page

  • The description ends with the required API key scope. A key without it gets 403 with InsufficientScope and the scope named.
  • The request panel shows required fields first. Optional fields are collapsed. Expand them; the interesting settings are usually there.
  • The responses list every status the endpoint can return, with the error code in each body. The codes are defined in Conventions.
  • Every page is available as Markdown by appending .md to its URL, and the whole reference is at /llms-full.txt for an assistant’s context window.

What is not here

Only customer-facing operations are published. Saved cards and Stripe Connect setup, webhooks and events are not part of the public reference, so some scopes in the scope table have no endpoint here. If you need one of those, ask in Support. There is no official SDK. The API is plain REST over HTTPS and every endpoint page shows the exact request, so any HTTP client works. For an AI assistant, use the MCP endpoint instead of hand-wiring tools.