Email Campaigns Setup
List and retrieve email marketing campaigns from your GoHighLevel sub-account. This endpoint gives you programmatic access to campaign data including status, statistics, and configuration. This quick-start covers authentication, fetching campaigns, and interpreting the results.
Prerequisites
Before making your first Email Campaigns call, confirm you have:
- A GoHighLevel sub-account with the Email Marketing feature enabled
- At least one email campaign created (draft or sent) under Marketing > Emails
- Access to Settings > Integrations > Private Integrations in your sub-account
- A REST client such as Postman, Insomnia, or
curlin your terminal - Your sub-account’s
locationId(found in Settings > Business Profile)
If you do not have any campaigns yet, create one through Marketing > Emails in the GHL dashboard before testing the API.
Set Up Authentication
The Email Campaigns endpoint requires a Private Integration Token (PIT) with the marketing scope.
Navigate to Settings > Integrations > Private Integrations. Click Create New Integration, name it “Email Campaigns API,” and enable the marketing scope. Click Save and copy the generated token.
Pass this token in the Authorization header as a Bearer token. Set your base URL to https://services.leadconnectorhq.com. Include the Version: 2021-07-28 header with each request.
Make Your First Call
List all email campaigns for your sub-account:
GET /marketing/campaigns?locationId=your-location-id
Authorization: Bearer {your-pit-token}
This returns all campaigns across all statuses: draft, scheduled, sending, sent, and paused. Each campaign object includes the id, name, status, type, and basic statistics.
You can filter results by adding query parameters:
status— filter by"draft","scheduled","sent","sending", or"paused"limit— number of results per page (default 20)offset— pagination offset for fetching additional pages
To retrieve a single campaign with full details, use GET /marketing/campaigns/{campaignId} with the campaign ID from the list response.
Handle the Response
A successful call returns a 200 status with campaign data:
{
"campaigns": [
{
"id": "camp-001",
"name": "March Newsletter",
"status": "sent",
"type": "email",
"sentAt": "2026-03-01T09:00:00Z",
"stats": {
"sent": 1250,
"delivered": 1230,
"opened": 487,
"clicked": 98,
"bounced": 20,
"unsubscribed": 3
}
}
],
"total": 15
}
The stats object provides delivery and engagement metrics. Use delivered, opened, and clicked to calculate open rates and click-through rates. High bounced counts may indicate list quality issues.
Common errors: 401 means your token is invalid or the marketing scope is not enabled. 404 on a single campaign lookup means the campaign ID does not exist. An empty campaigns array means no campaigns have been created for this location.
Test Your Setup
Run through this checklist to confirm everything works:
- List all campaigns with
GET /marketing/campaignsand verify results appear - Filter by status — add
status=sentand confirm only sent campaigns return - Get a single campaign with
GET /marketing/campaigns/{id}using an ID from the list - Check stats — verify the
statsobject contains delivery and engagement numbers - Cross-reference the results with Marketing > Emails in the GHL dashboard
If campaigns are not returning, verify your locationId is correct and that campaigns exist in the dashboard. Newly created draft campaigns should appear immediately.
Next Steps
Read the full Email Campaigns Guide for advanced reporting patterns and campaign analysis workflows. From here, explore Email Template CRUD for managing reusable email templates and Media Library for uploading email assets.