Marketing & SEO
Google Search Console
Request indexing, removals, users and index reports for your sites.
15 endpoints
Read GoHighLevel workflows, statistics and funnel steps through MCP or REST. Connect your sub-account to an AI agent, reporting workflow or script.
13 tools Read and write
Yes. HighLevel has a public REST API and official MCP servers with more than 550 operations (checked 27 Oct 2026). Its workflow create and update endpoints work only on selected sub-accounts, and its funnels API only lists. Cotlet runs 13 tools hosted for the rest, over MCP for agents and REST for scripts.
| What you need | Official MCP | GitHub server | Cotlet |
|---|---|---|---|
| Contacts, conversations, opportunities, payments | Yes, 550+ operations | Yes, through the API | Use the official MCP |
| Build a workflow on any sub-account | Selected sub-accounts only | Same limit | Yes, as a draft |
| Version history and test runs | No endpoint | No endpoint | Yes |
| Funnel page SEO and publish | Read only | Read only | Yes, publish after your OK |
| Allowed by HighLevel's terms | Yes, official | Yes, official API | Uses the web app |
Checked 27 Oct 2026. Sources: HighLevel API: LeadConnector MCP Server · HighLevel API: Workflows · HighLevel API: Funnels · HighLevel Support: Workflow Builder Walkthrough · HighLevel pricing
Use your own account in its Cotlet Cloud Browser.
Connect your agent or create a Cotlet API key.
Ask your agent or send an HTTP request.
We never keep your HighLevel password, and no workflow goes live until you approve it. Who can see your session
Use MCP with your AI agent, or HTTP requests in n8n, Make, Zapier and scripts. Follow the MCP setup below or jump to the REST guide.
Enable GoHighLevel for agents. Sign up, log in to HighLevel in its Cloud Browser, then press Enable for agents.
Paste the Cotlet address. Add https://cotlet.dev/mcp/v1 as an MCP server or connector in your agent.
Approve the connection. Chat apps ask you to sign in to Cotlet. Editors, n8n and scripts use an API key from the console.
One shared address, https://cotlet.dev/mcp/v1, also carries HighLevel next to your other apps. Keep HighLevel's own MCP server connected for contacts and conversations; Cotlet adds the builder tools next to it. If you enable HighLevel after connecting, refresh the connector so the new tools show up.
Settings > Connectors > Add custom connector
URL: https://cotlet.dev/mcp/v1/connect
Claude Code:
claude mcp add --transport http cotlet-gohighlevel \
https://cotlet.dev/mcp/v1 \
--header "Authorization: Bearer $COTLET_API_KEY" Settings > Apps & Connectors > Create
MCP server URL: https://cotlet.dev/mcp/v1/connect
Authentication: OAuth // ~/.cursor/mcp.json
{
"mcpServers": {
"cotlet-gohighlevel": {
"url": "https://cotlet.dev/mcp/v1",
"headers": { "Authorization": "Bearer ${env:COTLET_API_KEY}" }
}
}
} # ~/.codex/config.toml
[mcp_servers.cotlet-gohighlevel]
url = "https://cotlet.dev/mcp/v1"
bearer_token_env_var = "COTLET_API_KEY" MCP Client Tool (inside an AI Agent)
Transport: HTTP Streamable
URL: https://cotlet.dev/mcp/v1
Auth: Bearer, <your key>
Tool: gohighlevel_read Make: MCP Client > Call a tool
Zapier: MCP Client by Zapier > Run Tool
Server URL: https://cotlet.dev/mcp/v1
Token: <your key>
Tool: gohighlevel_write Create a Cotlet API key with access to GoHighLevel and its read operations. Store it as COTLET_API_KEY in your environment or automation platform's credential store.
Sign in to GoHighLevel in its Cotlet Cloud Browser and enable the app for agents. Your sub-account user needs permission for Automation > Workflows and Sites > Funnels.
curl https://cotlet.dev/api/v1/gohighlevel/workflows \
-H "Authorization: Bearer $COTLET_API_KEY" A successful REST call puts the tool output in result. This illustrative response excerpt omits call IDs, messages and credit details.
{
"status": "success",
"app": "gohighlevel",
"tool": "list_workflows",
"result": {
"workflows": [
{
"id": "wf_1042",
"name": "New lead follow-up",
"status": "published"
}
]
}
} Read result.workflows; workflow listing has no pagination input. Use a returned workflow id for details, statistics and version reads.
Filter by status or name query when needed. Compare draft or published state and current statistics as well as IDs when refreshing an audit.
Funnel and workflow access follows the selected sub-account. These reporting reads do not edit, publish or enroll contacts in an automation.
| Tool | Connect through | Example workflow |
|---|---|---|
| n8n | HTTP Request | Read workflow lists and details into a trigger-and-action audit without editing or publishing workflows. |
| Make | HTTP > Make a request | Combine workflow IDs and statistics into a sub-account automation performance report. |
| Python or Node.js | REST API | Read funnels and their steps into a page-title and description review sheet without changing pages. |
Send Authorization: Bearer <your Cotlet API key> in request headers. You configure the schedule, destination and record comparisons.
Cotlet reads GoHighLevel; your workflow steps write to your chosen destination. These HTTP workflows do not require a native Cotlet connector or a prebuilt template.
Python and Node.js can use the same HTTP requests without an AI agent. Keep access keys in credentials, outside shared workflow exports.
The API and MCP reference lists operations and inputs. The REST API guide explains authentication, errors and approvals.
Read only. Stats cover the last 30 days for triggers, as Stats View does, and HighLevel does not let you edit a workflow while Stats View is on.
Returns each workflow with its ID, name and whether it is a draft or published. Reads the Workflow List under Automation > Workflows. The IDs feed every other workflow tool.
MCP callgohighlevel_read → list_workflows
REST endpointGET https://cotlet.dev/api/v1/gohighlevel/workflows
| Name | Type | Description |
|---|---|---|
| status string | string | Filter by status: draft or published. |
| query string | string | Part of a workflow name. |
{
"workflows": [
{
"id": "wf_1042",
"name": "New lead follow-up",
"status": "published"
},
{
"id": "wf_1077",
"name": "Missed call text back",
"status": "published"
},
{
"id": "wf_1103",
"name": "Review request",
"status": "draft"
}
]
} Returns the workflow status, every trigger with its settings, and every action in the order the builder shows them, including conditional, drip and goal actions with their branches. Reads what the Workflow Builder shows. Changes nothing, and does not open a published workflow for editing.
MCP callgohighlevel_read → get_workflow
REST endpointGET https://cotlet.dev/api/v1/gohighlevel/workflows/{workflow_id}
| Name | Type | Description |
|---|---|---|
| workflow_id string required | string | Workflow ID from list_workflows. |
{
"workflow_id": "workflow_8c41d2"
} {
"id": "wf_1042",
"name": "New lead follow-up",
"status": "published",
"triggers": [
{
"name": "Contact Added",
"settings": {
"filter": "Tag is lead"
}
}
],
"actions": [
{
"id": "act_1",
"name": "Send Email",
"settings": {
"template": "Welcome"
}
},
{
"id": "act_2",
"name": "Assign to User",
"settings": {
"user": "Maya R."
}
}
]
} Returns what Stats View shows. Each trigger has attempted, matched and unmatched contacts; HighLevel counts the last 30 days for triggers. Each communication action has its delivery and engagement numbers. Reads only, so it never turns Stats View into an edit lock for your team.
MCP callgohighlevel_read → get_workflow_stats
REST endpointGET https://cotlet.dev/api/v1/gohighlevel/workflows/{workflow_id}/stats
| Name | Type | Description |
|---|---|---|
| workflow_id string required | string | Workflow ID from list_workflows. |
{
"workflow_id": "workflow_8c41d2"
} {
"workflow_id": "wf_1042",
"triggers": [
{
"name": "Contact Added",
"attempted": 412,
"matched": 388,
"unmatched": 24
}
],
"actions": [
{
"name": "Send Email",
"sent": 388,
"delivered": 379,
"opened": 201
}
]
} Returns the versions that the History icon in the Workflow Builder lists, each with an ID and the time it was saved. Use get_workflow for the current steps. Reads only, nothing is restored.
MCP callgohighlevel_read → list_workflow_versions
REST endpointGET https://cotlet.dev/api/v1/gohighlevel/workflow-versions
| Name | Type | Description |
|---|---|---|
| workflow_id string required | string | Workflow ID from list_workflows. |
{
"workflow_id": "workflow_8c41d2"
} {
"workflow_id": "wf_1077",
"versions": [
{
"id": "ver_7",
"saved_at": "2026-10-20T14:05:00Z"
},
{
"id": "ver_6",
"saved_at": "2026-10-12T09:41:00Z"
}
]
} Triggers and actions go into drafts only. Publishing and test runs wait for your OK, because they can message contacts.
Creates the workflow from scratch in the Workflow List and returns its ID. It starts as a draft, so no contact enters it and nothing is sent. It reaches no one, so it needs no confirmation. You remove it from the Workflow List in the app if you do not want it.
MCP callgohighlevel_write → create_workflow
REST endpointPOST https://cotlet.dev/api/v1/gohighlevel/workflows
| Name | Type | Description |
|---|---|---|
| name string required | string | Workflow name. |
| folder string | string | Name of an existing workflow folder to put it in. |
{
"name": "New lead follow-up"
} {
"id": "wf_1120",
"name": "New lead follow-up",
"status": "draft"
} Clicks Add New Trigger, picks the trigger by name, fills in its settings and saves. A workflow can have several triggers, and each starts the workflow when its own conditions are met. Works on drafts only, so no contact is affected. It returns an error that names the field when the builder rejects the settings.
MCP callgohighlevel_write → add_workflow_trigger
REST endpointPOST https://cotlet.dev/api/v1/gohighlevel/workflows/{workflow_id}/trigger
| Name | Type | Description |
|---|---|---|
| workflow_id string required | string | Workflow ID from list_workflows. |
| trigger string required | string | Trigger name as the builder lists it, for example Contact Added or Appointment Booked. |
| settings object | object | Trigger settings as the builder shows them, such as filters. |
{
"workflow_id": "workflow_8c41d2",
"trigger": "trigger"
} {
"workflow_id": "wf_1120",
"trigger": {
"name": "Contact Added",
"settings": {
"filter": "Tag is lead"
}
},
"saved": true
} Clicks the + button in the workflow line, picks the action by name, fills in its settings and saves. Works on drafts only, so the action sends nothing until the workflow is published. Integration-powered actions that need a connected account return an error that says to connect it in the app first.
MCP callgohighlevel_write → add_workflow_action
REST endpointPOST https://cotlet.dev/api/v1/gohighlevel/workflows/{workflow_id}/action
| Name | Type | Description |
|---|---|---|
| workflow_id string required | string | Workflow ID from list_workflows. |
| action string required | string | Action name as the builder lists it, for example Send Email or Assign to User. |
| settings object | object | Action settings as the builder shows them. |
| after_action_id string | string | Action ID to add it after. Without it the action goes at the end. |
{
"workflow_id": "workflow_8c41d2",
"action": "action"
} {
"workflow_id": "wf_1120",
"action": {
"id": "act_1",
"name": "Send Email",
"settings": {
"template": "Welcome"
}
},
"saved": true
} Uses the Draft/Publish toggle. A published workflow starts enrolling contacts and runs its actions, which can send email and SMS to your contacts. HighLevel says saving and publishing are separate, so the tool saves any unsaved changes before it publishes. By default you confirm each call; you can switch that off for this tool.
MCP callgohighlevel_write → set_workflow_status
REST endpointPUT https://cotlet.dev/api/v1/gohighlevel/workflows/{workflow_id}/status
| Name | Type | Description |
|---|---|---|
| workflow_id string required | string | Workflow ID from list_workflows. |
| status string required | string | draft or published. |
{
"workflow_id": "workflow_8c41d2",
"status": "status"
} {
"workflow_id": "wf_1120",
"status": "published"
} Clicks Test Workflow, selects the contact and clicks Run Test, then reports what the run shows for each step. The run can send messages to that contact. HighLevel notes that a test on a contact is not exact, especially when you reuse the same contact. By default you confirm each call; you can switch that off for this tool.
MCP callgohighlevel_write → test_workflow
REST endpointPOST https://cotlet.dev/api/v1/gohighlevel/contacts/{contact_id}/workflows/{workflow_id}/test
| Name | Type | Description |
|---|---|---|
| workflow_id string required | string | Workflow ID from list_workflows. |
| contact_id string required | string | ID of the contact to run the test on. |
{
"workflow_id": "workflow_8c41d2",
"contact_id": "contact_8c41d2"
} {
"workflow_id": "wf_1120",
"contact": "Sam Rivera",
"steps": [
{
"name": "Send Email",
"result": "Executed"
},
{
"name": "Assign to User",
"result": "Executed"
}
]
} Saving a page change and publishing are separate in HighLevel, and here too. Nothing goes live until publish_funnel runs.
Returns each funnel with its ID, name and the number of steps. Reads the list under Sites > Funnels. The IDs feed list_funnel_steps, update_funnel_page_seo and publish_funnel.
MCP callgohighlevel_read → list_funnels
REST endpointGET https://cotlet.dev/api/v1/gohighlevel/funnels
| Name | Type | Description |
|---|---|---|
| query string | string | Part of a funnel name. |
{
"funnels": [
{
"id": "fn_208",
"name": "Spring Promo",
"steps": 3
},
{
"id": "fn_215",
"name": "Free Consultation",
"steps": 2
}
]
} Returns each step in the funnel with its ID, page name, URL path and the page title and meta description, empty when none is set. Reads the Steps tab of the funnel. Does not open the page builder.
MCP callgohighlevel_read → list_funnel_steps
REST endpointGET https://cotlet.dev/api/v1/gohighlevel/funnel-steps
| Name | Type | Description |
|---|---|---|
| funnel_id string required | string | Funnel ID from list_funnels. |
{
"funnel_id": "funnel_8c41d2"
} {
"funnel_id": "fn_208",
"steps": [
{
"id": "st_1",
"page_name": "Landing",
"url_path": "/spring",
"title": "Spring Promo for Local Studios",
"description": ""
},
{
"id": "st_2",
"page_name": "Thank you",
"url_path": "/thank-you",
"title": "",
"description": ""
}
]
} Opens the page settings of the step and writes the SEO fields, then saves the funnel as a new version. HighLevel says publishing is a separate click, so the change is not live until publish_funnel runs. It reaches no one until then, so it needs no confirmation.
MCP callgohighlevel_write → update_funnel_page_seo
REST endpointPATCH https://cotlet.dev/api/v1/gohighlevel/steps/{step_id}/funnels/{funnel_id}/page-seo
| Name | Type | Description |
|---|---|---|
| funnel_id string required | string | Funnel ID from list_funnels. |
| step_id string required | string | Step ID from list_funnel_steps. |
| title string | string | Page title. |
| description string | string | Meta description. |
{
"funnel_id": "funnel_8c41d2",
"step_id": "step_8c41d2"
} {
"funnel_id": "fn_208",
"step_id": "st_2",
"title": "Thank you for booking",
"description": "Your spring consultation is booked. Check your email for details.",
"saved": true,
"live": false
} Clicks Publish, which makes the saved version live for visitors. If the funnel has no domain, HighLevel asks you to attach one; the tool stops and says so instead of choosing a domain. By default you confirm each call; you can switch that off for this tool.
MCP callgohighlevel_write → publish_funnel
REST endpointPOST https://cotlet.dev/api/v1/gohighlevel/funnels/{funnel_id}/publish
| Name | Type | Description |
|---|---|---|
| funnel_id string required | string | Funnel ID from list_funnels. |
{
"funnel_id": "funnel_8c41d2"
} {
"funnel_id": "fn_208",
"published": true,
"domain": "promo.example.com"
} Your logged-in HighLevel profile, encrypted with AES-256-GCM, in Finland. Not the password.
The 13 GoHighLevel tools. Never the cookie.
The sub-account you open: workflows, funnels, and the contacts a workflow touches.
Billing, plan, password, two-factor and deleting.
A new device may ask for a code. You type it in, we never do.
Disable for agents, reset the browser, or sign out of the session in HighLevel.
Our site scores A+ on Qualys SSL Labs, securityheaders.com and Mozilla Observatory (live results). There is no SOC 2 report or third-party pentest yet.
"Use of any robot, spider or other automatic device, process or means to access the Platform for any purpose, including monitoring or copying any of the material on the Platform."
The same list bans use that could "disable, overburden, damage, or impair the Platform". The clause has no exception for the official API. If your job fits the API or the official MCP server, use them: they are the sanctioned route. Cotlet works through the HighLevel web app in your own login, but HighLevel could still read it as automation. We found no public case of a HighLevel account closed for automation (checked 27 Oct 2026).
Build in a draft first. A published workflow starts messaging contacts, so read the draft with get_workflow before you approve.
HighLevel ships builder changes often. When it moves a button or renames a field, the fix happens on our side and your prompts keep working. status.cotlet.dev watches the site, console and API every 3 minutes.
| Action | Undo |
|---|---|
| Create a workflow | Remove it from the Workflow List in HighLevel |
| Add a trigger or action to a draft | Edit or delete the step in the Workflow Builder, or restore a version from History |
| Publish a workflow | Switch it back to draft; contacts already enrolled keep their place |
| Test a workflow | No, messages the test sent are out |
| Save funnel page SEO | Change the fields again; it is not live until published |
| Publish a funnel | Publish an earlier saved version |
3 of 13 tools ask first: set_workflow_status, test_workflow and publish_funnel, the three that can reach contacts or visitors. Drafts, triggers, actions and SEO fields reach nobody, so they run at once. Switch the wait off per tool for a scheduled run.
HighLevel says changes to upcoming actions reach contacts already in a published workflow. The agent edits drafts only.
{
"name": "create_workflow",
"arguments": {
"name": "New lead follow-up"
}
} curl -X POST https://cotlet.dev/api/v1/gohighlevel/workflows \
-H "Authorization: Bearer $COTLET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"name":"New lead follow-up"}' {
"id": "wf_1120",
"name": "New lead follow-up",
"status": "draft"
} Scripts and cron jobs reach the same tools over REST at /api/v1/gohighlevel, with the same key and price. A failed call costs nothing. The tools table lists the REST path of each tool.
About $14 a monthfor a sub-account that builds 4 workflows a month, 2,390 credits. Your HighLevel plan is billed by HighLevel as before.
| Job | Calls | Credits |
|---|---|---|
| Build a workflow from a brief | 7 × 4 | 280 |
| Weekly workflow stats report | 9 × 4 | 360 |
| Test and publish a workflow | 3 × 4 | 120 |
| Read a workflow history | 2 × 2 | 40 |
| Fix funnel page titles | 9 × 1 | 90 |
| Cloud Browser, 30 days | 1,500 | |
| Total | 2,390 |
The month is our example: 4 new workflows, a weekly report over 8, and one funnel SEO pass. HighLevel's own plans run $97, $297 or $497 a month, with "Basic API Access" on the $297 plan. Dollars at the $29 pack rate.
| Credits | Price, one time | Calls at 10 credits | Per 1,000 credits |
|---|---|---|---|
| 5,000 | $29 | 500 | $5.80 |
| 15,000 | $79 | 1,500 | $5.27 |
| 32,000 | $149 | 3,200 | $4.66 |
| 60,000 | $249 | 6,000 | $4.15 |
Only successful calls use credits; failed calls and timeouts cost nothing. At a balance of 0 calls pause, never a surprise charge. Authenticate with the Authorization: Bearer header.
| Option | What it does | Where it stops |
|---|---|---|
| HighLevel official MCP server | OAuth, more than 550 read, create, update and delete operations, per-client endpoints for Claude, ChatGPT, Codex and Cursor. | Workflow create and update work on selected sub-accounts only. Funnels are read only. |
| BusyBee3333/Go-High-Level-MCP-2026-Complete | Community server, 123 stars, last push 11 Sep 2026, claims 927 tools on the v3 API. | Calls the API with your token, so the same endpoint limits apply. The README points to a separate product for workflow building. |
| mastanley13/GoHighLevel-MCP | Community server, 195 stars. | Last push 6 Jul 2025. |
| tenfoldmarc/ghl-mcp | Community server for Claude Code, 19 stars, 70+ tools. | Workflow tools: list and add a contact to a workflow. |
| Zapier and n8n | Both list HighLevel and call its API. | Same endpoints, so no workflow building where the API is closed. |
For contacts, conversations, calendars, opportunities and payments, connect HighLevel's official server: it is free, hosted and sanctioned. Cotlet is for the builder jobs it does not cover on your account. A community server saves you a Cotlet bill and costs you the upkeep.
Take Group sp. z o.o. runs Cotlet. It is a software company registered in Poland, EU (VAT PL6342984273), working since 2019, founded by Bart Krawczyk (Co-founder, CTO) and Jake Slugocki (Co-founder, SEO, sales and marketing). Write to contact@cotlet.dev with questions about the GoHighLevel tools.
Yes. Call Cotlet's REST API from a script or an HTTP step in n8n, Make or Zapier with your Cotlet key. MCP is the alternative for AI agents; you do not need to connect an agent to use REST.
Create a free account at https://cotlet.dev, open GoHighLevel under Integrations in the console and log in to HighLevel in its Cloud Browser. The trial starts with your first app, no card asked.
HighLevel's pricing page lists Basic API Access on the Unlimited plan and Advanced API Access on Agency Pro, and does not list API access on Starter (checked 27 Oct 2026). Cotlet works in your signed-in session instead of an API token, so it needs the HighLevel login, not an API plan.
HighLevel documents its workflow create and update endpoints as limited availability, enabled for selected sub-accounts only. Any other sub-account receives 403 WORKFLOW_API_NOT_ENABLED_FOR_LOCATION. Reading the workflow list works without that.
HighLevel's Terms of Service (last updated June 2026) list as prohibited "Use of any robot, spider or other automatic device, process or means to access the Platform for any purpose, including monitoring or copying any of the material on the Platform." HighLevel documents the API and MCP servers as its route for automation. Cotlet works in your own signed-in session and does not bypass MFA or CAPTCHAs; read the terms and decide for your account.
Yes. HighLevel documents a Webhook Integration Guide and a Webhook Logs Dashboard. Cotlet does not replace them: use webhooks for events and run your agent for the builder jobs.
Yes. Connect both to the same agent. The official one handles contacts, conversations, calendars, opportunities and payments, and Cotlet handles the workflow builder and funnel pages.
Only the door is different. Both expose the same 13 tools, inputs and answers, with one API key and one price. Agents use MCP; scripts and HTTP steps use REST.
No. Cotlet is independent and not affiliated with HighLevel.
Free 7-day trial with 2,000 credits, no card needed.
May we use Google Analytics to see which pages help people? It sets cookies only if you accept. No ads, and we never sell data. Cookie policy