Email Campaigns API
Create, edit, schedule, send and measure email campaigns from the API.
Manage the full campaign lifecycle: draft, audience, schedule, send and results. Every request is scoped to the organization that owns the API key.
List campaigns
GET /api/v1/email/campaigns| Parameter | Type | Description |
|---|---|---|
status | string | Optional draft, scheduled, sending, sent, paused or archived. |
limit | number | Rows to return, 1-200 (default 50). |
curl -H "x-api-key: org_api_key" \
"https://growth.example.com/api/v1/email/campaigns?status=sent&limit=10"{
"campaigns": [
{
"id": "k17...",
"name": "August newsletter",
"status": "sent",
"scheduledAt": null,
"sentAt": 1785312000000,
"stats": { "queued": 0, "sent": 1240, "delivered": 1231, "opened": 502, "clicked": 88, "bounced": 9, "complained": 0, "unsubscribed": 3 },
"createdAt": 1785225600000
}
],
"sampleLimited": false
}Get one campaign
GET /api/v1/email/campaigns/:campaignIdReturns the full campaign, including contentBlocks, audienceTags and audienceFilters. GET /api/v1/email/campaigns/:campaignId/analytics adds the activity timeline and top clicked links; GET /api/v1/email/campaigns/:campaignId/recipients?cursor=&limit= pages through who received it and what they did.
Create a campaign
POST /api/v1/email/campaigns| Field | Type | Description |
|---|---|---|
name | string | Required internal name. |
subject | string | Required subject line. |
contentBlocks | array | Required, at least one { "type": "...", "props": { ... } } block. |
previewText | string | Inbox preview text. |
fromAddress | string | Overrides the sending application's from address. |
replyTo | string | Reply-to address. |
audienceTags | string[] | Subscribers must carry every tag listed. |
audienceFilters | array | { "field", "operator", "value?", "key?" } filters, ANDed together. |
curl -X POST -H "x-api-key: org_api_key" -H "Content-Type: application/json" \
-d '{"name":"August newsletter","subject":"What shipped in August","contentBlocks":[{"type":"text","props":{"markdown":"# Hello\n\nHere is what shipped."}}],"audienceTags":["customers"]}' \
"https://growth.example.com/api/v1/email/campaigns"The campaign is created as a draft. A block with no recognized type falls back to rendering props.markdown.
Update, schedule and archive
PATCH /api/v1/email/campaigns/:campaignId
POST /api/v1/email/campaigns/:campaignId/schedule
DELETE /api/v1/email/campaigns/:campaignId