Files
2026-05-30 14:31:19 -06:00

21 KiB

GHL Emails API

Endpoints: 5 Base URL: https://rest.gohighlevel.com/v1

Version Header(s): 2021-07-28


Endpoints


GET /emails/builder

Summary: Fetch email templates

Fetch email templates by location id

Version Header: 2021-07-28

Operation ID: fetch-template

Tags: Templates

cURL

curl -X GET 'https://rest.gohighlevel.com/v1/emails/builder?locationId=VALUE&limit=VALUE&offset=VALUE&search=VALUE&sortByDate=VALUE&archived=VALUE&builderVersion=1&name=VALUE&parentId=VALUE&originId=VALUE&templatesOnly=VALUE' \
  -H 'Authorization: Bearer YOUR_API_TOKEN' \
  -H 'Version: 2021-07-28' \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -H 'User-Agent: YourApp/1.0'

Python (http.client)

import http.client
import json

conn = http.client.HTTPSConnection('rest.gohighlevel.com')

headers = {
    'Authorization': 'Bearer YOUR_API_TOKEN',
    'Version': '2021-07-28',
    'Content-Type': 'application/json',
    'Accept': 'application/json',
    'User-Agent': 'YourApp/1.0',
}

conn.request('GET', '/v1/emails/builder?locationId=VALUE&limit=VALUE&offset=VALUE&search=VALUE&sortByDate=VALUE&archived=VALUE&builderVersion=VALUE&name=VALUE&parentId=VALUE&originId=VALUE&templatesOnly=VALUE', headers=headers)

response = conn.getresponse()
data = json.loads(response.read().decode())
print(json.dumps(data, indent=2))
conn.close()

n8n HTTP Node

{
  "name": "GHL - GET builder",
  "type": "n8n-nodes-base.httpRequest",
  "parameters": {
    "method": "GET",
    "url": "https://rest.gohighlevel.com/v1/emails/builder",
    "authentication": "genericCredentialType",
    "genericAuthType": "httpHeaderAuth",
    "sendHeaders": true,
    "headerParameters": {
      "parameters": [
        {
          "name": "Authorization",
          "value": "Bearer YOUR_API_TOKEN"
        },
        {
          "name": "Version",
          "value": "2021-07-28"
        },
        {
          "name": "Content-Type",
          "value": "application/json"
        },
        {
          "name": "Accept",
          "value": "application/json"
        },
        {
          "name": "User-Agent",
          "value": "YourApp/1.0"
        }
      ]
    },
    "sendBody": false,
    "bodyParameters": {
      "parameters": []
    },
    "options": {},
    "sendQuery": true,
    "queryParameters": {
      "parameters": [
        {
          "name": "locationId",
          "value": "VALUE"
        },
        {
          "name": "limit",
          "value": "VALUE"
        },
        {
          "name": "offset",
          "value": "VALUE"
        },
        {
          "name": "search",
          "value": "VALUE"
        },
        {
          "name": "sortByDate",
          "value": "VALUE"
        },
        {
          "name": "archived",
          "value": "VALUE"
        },
        {
          "name": "builderVersion",
          "value": "VALUE"
        },
        {
          "name": "name",
          "value": "VALUE"
        },
        {
          "name": "parentId",
          "value": "VALUE"
        },
        {
          "name": "originId",
          "value": "VALUE"
        },
        {
          "name": "templatesOnly",
          "value": "VALUE"
        }
      ]
    }
  }
}

To use in n8n:

  1. Add an HTTP Request node
  2. Switch to JSON mode (Parameters → use RAW JSON)
  3. Paste the JSON above
  4. Update YOUR_API_TOKEN with your actual GHL API key

Request Parameters

Name Location Type Required Description
locationId Query string
limit Query string
offset Query string
search Query string
sortByDate Query string
archived Query string
builderVersion Query string (values: 1, 2)
name Query string
parentId Query string
originId Query string
templatesOnly Query string

Response Codes

Code Description Schema
200 Success - name (string) (e.g. New Template): template name
- updatedBy (string) (e.g. John Doe): updated by
- isPlainText (boolean) (...
400 Bad Request Standard error response for bad requests (400). Contains message, statusCode fields.
401 Unauthorized Standard error response for unauthorized requests (401). Contains message, statusCode fields.
404 Not Found
422 Unprocessable Entity Standard error response for unprocessable entity (422). Contains message, statusCode, errors array fields.

⚠️ Special Notes & Quirks

⚠️ User-Agent Required: All GHL API requests require a User-Agent HTTP header. Requests without it may be rejected with a 403 error.


POST /emails/builder

Summary: Create a new template

Create a new template

Version Header: 2021-07-28

Operation ID: create-template

Tags: Templates

cURL

curl -X POST 'https://rest.gohighlevel.com/v1/emails/builder' \
  -H 'Authorization: Bearer YOUR_API_TOKEN' \
  -H 'Version: 2021-07-28' \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -H 'User-Agent: YourApp/1.0' \
  -d '{}'  # See request body schema below

Python (http.client)

import http.client
import json

conn = http.client.HTTPSConnection('rest.gohighlevel.com')

headers = {
    'Authorization': 'Bearer YOUR_API_TOKEN',
    'Version': '2021-07-28',
    'Content-Type': 'application/json',
    'Accept': 'application/json',
    'User-Agent': 'YourApp/1.0',
}

payload = json.dumps({})
conn.request('POST', '/v1/emails/builder', body=payload, headers=headers)

response = conn.getresponse()
data = json.loads(response.read().decode())
print(json.dumps(data, indent=2))
conn.close()

n8n HTTP Node

{
  "name": "GHL - POST builder",
  "type": "n8n-nodes-base.httpRequest",
  "parameters": {
    "method": "POST",
    "url": "https://rest.gohighlevel.com/v1/emails/builder",
    "authentication": "genericCredentialType",
    "genericAuthType": "httpHeaderAuth",
    "sendHeaders": true,
    "headerParameters": {
      "parameters": [
        {
          "name": "Authorization",
          "value": "Bearer YOUR_API_TOKEN"
        },
        {
          "name": "Version",
          "value": "2021-07-28"
        },
        {
          "name": "Content-Type",
          "value": "application/json"
        },
        {
          "name": "Accept",
          "value": "application/json"
        },
        {
          "name": "User-Agent",
          "value": "YourApp/1.0"
        }
      ]
    },
    "sendBody": true,
    "bodyParameters": {
      "parameters": []
    },
    "options": {}
  }
}

To use in n8n:

  1. Add an HTTP Request node
  2. Switch to JSON mode (Parameters → use RAW JSON)
  3. Paste the JSON above
  4. Update YOUR_API_TOKEN with your actual GHL API key

Request Body Schema

  • locationId (string) (required) (e.g. ve9EPM428h8vShlRW1KT)
  • title (string) (e.g. template title)
  • type (string) (required)
  • updatedBy (string) (e.g. zYy3YOUuHxgomU1uYJty)
  • builderVersion (string)
  • name (string) (e.g. Template1)
  • parentId (string) (e.g. zYy3YOUuHxgomU1uYJty)
  • templateDataUrl (string) (e.g. ``)
  • importProvider (string) (required)
  • importURL (string) (e.g. https://tplshare.com/fhYJ3Mi)
  • templateSource (string) (e.g. template_library)
  • isPlainText (boolean) (e.g. False)

Response Codes

Code Description Schema
201 Success - redirect (string) (required) (e.g. 66e811229245fc098765590): template id
- traceId (string) (required) (e.g. `0c52e980-41f6-4be7-8c...
400 Bad Request Standard error response for bad requests (400). Contains message, statusCode fields.
401 Unauthorized Standard error response for unauthorized requests (401). Contains message, statusCode fields.
404 Not Found
422 Unprocessable Entity Standard error response for unprocessable entity (422). Contains message, statusCode, errors array fields.

⚠️ Special Notes & Quirks

⚠️ User-Agent Required: All GHL API requests require a User-Agent HTTP header. Requests without it may be rejected with a 403 error.


POST /emails/builder/data

Summary: Update a template

Update a template

Version Header: 2021-07-28

Operation ID: update-template

Tags: Templates

cURL

curl -X POST 'https://rest.gohighlevel.com/v1/emails/builder/data' \
  -H 'Authorization: Bearer YOUR_API_TOKEN' \
  -H 'Version: 2021-07-28' \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -H 'User-Agent: YourApp/1.0' \
  -d '{}'  # See request body schema below

Python (http.client)

import http.client
import json

conn = http.client.HTTPSConnection('rest.gohighlevel.com')

headers = {
    'Authorization': 'Bearer YOUR_API_TOKEN',
    'Version': '2021-07-28',
    'Content-Type': 'application/json',
    'Accept': 'application/json',
    'User-Agent': 'YourApp/1.0',
}

payload = json.dumps({})
conn.request('POST', '/v1/emails/builder/data', body=payload, headers=headers)

response = conn.getresponse()
data = json.loads(response.read().decode())
print(json.dumps(data, indent=2))
conn.close()

n8n HTTP Node

{
  "name": "GHL - POST data",
  "type": "n8n-nodes-base.httpRequest",
  "parameters": {
    "method": "POST",
    "url": "https://rest.gohighlevel.com/v1/emails/builder/data",
    "authentication": "genericCredentialType",
    "genericAuthType": "httpHeaderAuth",
    "sendHeaders": true,
    "headerParameters": {
      "parameters": [
        {
          "name": "Authorization",
          "value": "Bearer YOUR_API_TOKEN"
        },
        {
          "name": "Version",
          "value": "2021-07-28"
        },
        {
          "name": "Content-Type",
          "value": "application/json"
        },
        {
          "name": "Accept",
          "value": "application/json"
        },
        {
          "name": "User-Agent",
          "value": "YourApp/1.0"
        }
      ]
    },
    "sendBody": true,
    "bodyParameters": {
      "parameters": []
    },
    "options": {}
  }
}

To use in n8n:

  1. Add an HTTP Request node
  2. Switch to JSON mode (Parameters → use RAW JSON)
  3. Paste the JSON above
  4. Update YOUR_API_TOKEN with your actual GHL API key

Request Body Schema

  • locationId (string) (required) (e.g. ve9EPM428h8vShlRW1KT)
  • templateId (string) (required) (e.g. zYy3YOUuHxgomU1uYJty)
  • updatedBy (string) (required) (e.g. zYy3YOUuHxgomU1uYJty)
  • dnd (string) (required) (e.g. {elements:[], attrs:{}, templateSettings:{}})
  • html (string) (required) (e.g. ``)
  • editorType (string) (required)
  • previewText (string) (e.g. zYy3YOUuHxgomU1uYJty)
  • isPlainText (boolean) (e.g. false)

Response Codes

Code Description Schema
201 Success - ok (string) (e.g. true): ok
- traceId (string) (e.g. 0c52e980-41f6-4be7-8c4b-32332ss): trace id
- previewUrl (string) (e.g....
400 Bad Request Standard error response for bad requests (400). Contains message, statusCode fields.
401 Unauthorized Standard error response for unauthorized requests (401). Contains message, statusCode fields.
404 Not Found
422 Unprocessable Entity Standard error response for unprocessable entity (422). Contains message, statusCode, errors array fields.

⚠️ Special Notes & Quirks

⚠️ User-Agent Required: All GHL API requests require a User-Agent HTTP header. Requests without it may be rejected with a 403 error.


DELETE /emails/builder/{locationId}/{templateId}

Summary: Delete a template

Delete a template

Version Header: 2021-07-28

Operation ID: delete-template

Tags: Templates

cURL

curl -X DELETE 'https://rest.gohighlevel.com/v1/emails/builder/VALUE/VALUE' \
  -H 'Authorization: Bearer YOUR_API_TOKEN' \
  -H 'Version: 2021-07-28' \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -H 'User-Agent: YourApp/1.0'

Python (http.client)

import http.client
import json

conn = http.client.HTTPSConnection('rest.gohighlevel.com')

headers = {
    'Authorization': 'Bearer YOUR_API_TOKEN',
    'Version': '2021-07-28',
    'Content-Type': 'application/json',
    'Accept': 'application/json',
    'User-Agent': 'YourApp/1.0',
}

conn.request('DELETE', '/v1/emails/builder/VALUE/VALUE', headers=headers)

response = conn.getresponse()
data = json.loads(response.read().decode())
print(json.dumps(data, indent=2))
conn.close()

n8n HTTP Node

{
  "name": "GHL - DELETE VALUE",
  "type": "n8n-nodes-base.httpRequest",
  "parameters": {
    "method": "DELETE",
    "url": "https://rest.gohighlevel.com/v1/emails/builder/VALUE/VALUE",
    "authentication": "genericCredentialType",
    "genericAuthType": "httpHeaderAuth",
    "sendHeaders": true,
    "headerParameters": {
      "parameters": [
        {
          "name": "Authorization",
          "value": "Bearer YOUR_API_TOKEN"
        },
        {
          "name": "Version",
          "value": "2021-07-28"
        },
        {
          "name": "Content-Type",
          "value": "application/json"
        },
        {
          "name": "Accept",
          "value": "application/json"
        },
        {
          "name": "User-Agent",
          "value": "YourApp/1.0"
        }
      ]
    },
    "sendBody": false,
    "bodyParameters": {
      "parameters": []
    },
    "options": {}
  }
}

To use in n8n:

  1. Add an HTTP Request node
  2. Switch to JSON mode (Parameters → use RAW JSON)
  3. Paste the JSON above
  4. Update YOUR_API_TOKEN with your actual GHL API key

Request Parameters

Name Location Type Required Description
locationId Path string
templateId Path string

Response Codes

Code Description Schema
200 Success - ok (string) (e.g. true): ok
- traceId (string) (e.g. 0c52e980-41f6-4be7-8c4b-32332ss): trace id
400 Bad Request Standard error response for bad requests (400). Contains message, statusCode fields.
401 Unauthorized Standard error response for unauthorized requests (401). Contains message, statusCode fields.
404 Not Found
422 Unprocessable Entity Standard error response for unprocessable entity (422). Contains message, statusCode, errors array fields.

⚠️ Special Notes & Quirks

⚠️ User-Agent Required: All GHL API requests require a User-Agent HTTP header. Requests without it may be rejected with a 403 error.


GET /emails/schedule

Summary: Get Campaigns

Get Campaigns

Version Header: 2021-07-28

Operation ID: fetch-campaigns

Tags: Campaigns

cURL

curl -X GET 'https://rest.gohighlevel.com/v1/emails/schedule?locationId=VALUE&limit=VALUE&offset=VALUE&status=active&emailStatus=all&name=VALUE&parentId=VALUE&limitedFields=VALUE&archived=VALUE&campaignsOnly=VALUE&showStats=VALUE' \
  -H 'Authorization: Bearer YOUR_API_TOKEN' \
  -H 'Version: 2021-07-28' \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -H 'User-Agent: YourApp/1.0'

Python (http.client)

import http.client
import json

conn = http.client.HTTPSConnection('rest.gohighlevel.com')

headers = {
    'Authorization': 'Bearer YOUR_API_TOKEN',
    'Version': '2021-07-28',
    'Content-Type': 'application/json',
    'Accept': 'application/json',
    'User-Agent': 'YourApp/1.0',
}

conn.request('GET', '/v1/emails/schedule?locationId=VALUE&limit=VALUE&offset=VALUE&status=VALUE&emailStatus=VALUE&name=VALUE&parentId=VALUE&limitedFields=VALUE&archived=VALUE&campaignsOnly=VALUE&showStats=VALUE', headers=headers)

response = conn.getresponse()
data = json.loads(response.read().decode())
print(json.dumps(data, indent=2))
conn.close()

n8n HTTP Node

{
  "name": "GHL - GET schedule",
  "type": "n8n-nodes-base.httpRequest",
  "parameters": {
    "method": "GET",
    "url": "https://rest.gohighlevel.com/v1/emails/schedule",
    "authentication": "genericCredentialType",
    "genericAuthType": "httpHeaderAuth",
    "sendHeaders": true,
    "headerParameters": {
      "parameters": [
        {
          "name": "Authorization",
          "value": "Bearer YOUR_API_TOKEN"
        },
        {
          "name": "Version",
          "value": "2021-07-28"
        },
        {
          "name": "Content-Type",
          "value": "application/json"
        },
        {
          "name": "Accept",
          "value": "application/json"
        },
        {
          "name": "User-Agent",
          "value": "YourApp/1.0"
        }
      ]
    },
    "sendBody": false,
    "bodyParameters": {
      "parameters": []
    },
    "options": {},
    "sendQuery": true,
    "queryParameters": {
      "parameters": [
        {
          "name": "locationId",
          "value": "VALUE"
        },
        {
          "name": "limit",
          "value": "VALUE"
        },
        {
          "name": "offset",
          "value": "VALUE"
        },
        {
          "name": "status",
          "value": "VALUE"
        },
        {
          "name": "emailStatus",
          "value": "VALUE"
        },
        {
          "name": "name",
          "value": "VALUE"
        },
        {
          "name": "parentId",
          "value": "VALUE"
        },
        {
          "name": "limitedFields",
          "value": "VALUE"
        },
        {
          "name": "archived",
          "value": "VALUE"
        },
        {
          "name": "campaignsOnly",
          "value": "VALUE"
        },
        {
          "name": "showStats",
          "value": "VALUE"
        }
      ]
    }
  }
}

To use in n8n:

  1. Add an HTTP Request node
  2. Switch to JSON mode (Parameters → use RAW JSON)
  3. Paste the JSON above
  4. Update YOUR_API_TOKEN with your actual GHL API key

Request Parameters

Name Location Type Required Description
locationId Query string Location ID to fetch campaigns from
limit Query number Maximum number of campaigns to return. Defaults to 10, maximum is 100
offset Query number Number of campaigns to skip for pagination
status Query string Filter by schedule status (values: active, pause, complete, cancelled, retry, draft, resend-sched...
emailStatus Query string Filter by email delivery status (values: all, not-started, paused, cancelled, processing, resumed...
name Query string Filter campaigns by name
parentId Query string Filter campaigns by parent folder ID
limitedFields Query boolean When true, returns only essential campaign fields like id, templateDataDownloadUrl, updatedAt, ty...
archived Query boolean Filter archived campaigns
campaignsOnly Query boolean Return only campaigns, excluding folders
showStats Query boolean When true, returns campaign statistics including delivered count, opened count, clicked count and...

Response Codes

Code Description Schema
200 Success - schedules (array of ScheduleDto) (required): The list of campaigns
- total (array) (required): The total number of campaigns
- **tr...
400 Bad Request Standard error response for bad requests (400). Contains message, statusCode fields.
401 Unauthorized Standard error response for unauthorized requests (401). Contains message, statusCode fields.
403 The token does not have access to this location - statusCode (number) (e.g. 403)
- message (string) (e.g. The token does not have access to this location)
404 Not Found - statusCode (number) (e.g. 404)
- message (string) (e.g. Not Found)
- error (string) (e.g. `The requested resource was not f...
422 Unprocessable Entity Standard error response for unprocessable entity (422). Contains message, statusCode, errors array fields.

⚠️ Special Notes & Quirks

⚠️ User-Agent Required: All GHL API requests require a User-Agent HTTP header. Requests without it may be rejected with a 403 error.


Documentation generated from GHL OpenAPI specifications. Verify against official docs for latest changes.