Campaigns API
Retrieve campaign information and detailed stats via the API. Use this to power external reporting dashboards, sync campaign data to your data warehouse, or build custom analytics views.
Campaigns are read-only via API
The Campaign Object
A campaign represents a single email send — either a one-time broadcast or a scheduled message. The stats object is included when you retrieve a single campaign using the id query parameter.
{
"id": "clx_camp_april_nl_id",
"name": "April Newsletter",
"subject": "What's new this April 🌱",
"status": "sent",
"scheduledAt": null,
"sentAt": "2026-04-15T10:00:00Z",
"totalRecipients": 5420,
"stats": {
"sent": 5420,
"delivered": 5388,
"opened": 2168,
"uniqueOpens": 1945,
"clicked": 542,
"uniqueClicks": 487,
"bounced": 32,
"complained": 4,
"unsubscribed": 18
},
"createdAt": "2026-04-10T09:00:00Z"
}| Field | Type | Description |
|---|---|---|
| id | string | Unique campaign identifier |
| name | string | Internal campaign name (not shown to recipients) |
| subject | string | Email subject line |
| status | enum | draft, scheduled, sending, sent, paused, or cancelled |
| scheduledAt | string | null | ISO 8601 scheduled send time, or null if sent immediately |
| sentAt | string | null | ISO 8601 time sending completed, null if not yet sent |
| totalRecipients | integer | Number of contacts the campaign was sent to |
| stats.sent | integer | Total send attempts |
| stats.delivered | integer | Emails accepted by recipient mail servers |
| stats.opened | integer | Total open events (includes re-opens by same contact) |
| stats.uniqueOpens | integer | Unique contacts who opened at least once |
| stats.clicked | integer | Total click events |
| stats.uniqueClicks | integer | Unique contacts who clicked at least once |
| stats.bounced | integer | Hard + soft bounce count |
| stats.complained | integer | Spam complaint count |
| stats.unsubscribed | integer | Unsubscribe count from this campaign |
Endpoints
Campaign endpoints require the campaigns:read scope.
List Campaigns
/api/v1/campaignsscope: campaigns:readReturns a paginated list of campaigns. Pass the id query parameter to retrieve a single campaign with full stats. Supports filtering by status.
Parameters
| Name | Type | In | Required | Description |
|---|---|---|---|---|
| page | integer | query | optional | Page number (default: 1) |
| limit | integer | query | optional | Results per page, max 100 (default: 50) |
| id | string | query | optional | Retrieve a single campaign by ID — includes full stats object |
| status | string | query | optional | Filter by status: draft, scheduled, sending, sent, paused, cancelled |
Response
{
"data": [
{
"id": "clx_camp_april_nl_id",
"name": "April Newsletter",
"subject": "What's new this April 🌱",
"status": "sent",
"scheduledAt": null,
"sentAt": "2026-04-15T10:00:00Z",
"totalRecipients": 5420,
"stats": {
"sent": 5420,
"delivered": 5388,
"opened": 2168,
"uniqueOpens": 1945,
"clicked": 542,
"uniqueClicks": 487,
"bounced": 32,
"complained": 4,
"unsubscribed": 18
},
"createdAt": "2026-04-10T09:00:00Z"
},
{
"id": "clx_camp_march_nl_id",
"name": "March Newsletter",
"subject": "Spring into better workflows",
"status": "sent",
"scheduledAt": "2026-03-18T10:00:00Z",
"sentAt": "2026-03-18T10:02:00Z",
"totalRecipients": 5180,
"stats": {
"sent": 5180,
"delivered": 5151,
"opened": 2020,
"uniqueOpens": 1804,
"clicked": 498,
"uniqueClicks": 441,
"bounced": 29,
"complained": 2,
"unsubscribed": 14
},
"createdAt": "2026-03-10T10:00:00Z"
}
],
"pagination": {
"page": 1,
"limit": 50,
"total": 24,
"totalPages": 1
}
}Understanding Campaign Stats
Stats are updated in real time as emails are delivered, opened, and clicked. Here are the key derived metrics you can calculate from the stats object:
# Derived metrics from stats fields:
Open Rate = (uniqueOpens / delivered) * 100
Click-to-Open Rate = (uniqueClicks / uniqueOpens) * 100
Bounce Rate = (bounced / sent) * 100
Complaint Rate = (complained / delivered) * 100
Unsubscribe Rate = (unsubscribed / delivered) * 100
# Example:
# Open Rate = (1945 / 5388) * 100 = 36.1%
# CTOR = (487 / 1945) * 100 = 25.0%
# Bounce = (32 / 5420) * 100 = 0.59%Apple Mail Privacy Protection
Building a reporting dashboard?
Pull campaign stats via the API and combine with your product data for attribution analysis.