Campaigns API
Create, manage, and monitor outreach campaigns. Launch campaigns, track execution progress, and retrieve performance stats.
Campaign statuses: DRAFT ACTIVE PAUSED STOPPED COMPLETED ARCHIVED
List Campaigns
/api/campaignsList campaigns with cursor-based pagination. Supports filtering by status, folder, and search.
Query Parameters
| Parameter | Type | Description |
|---|---|---|
status | string | Filter by status (DRAFT, ACTIVE, etc.) |
search | string | Search by campaign name |
folderId | string | Filter by folder ID |
cursor | string | Cursor for next page (from previous response) |
limit | number | Results per page (default: 20, max: 50) |
curl --location --request GET 'http://outreach.weezly.com/api/campaigns' \
--header 'X-API-KEY: sk_live_YOUR_API_KEY'{
"campaigns": [
{
"id": "cm3camp456",
"name": "Q1 SaaS Founders Outreach",
"status": "ACTIVE",
"folderId": null,
"totalLeads": 150,
"leadsProcessed": 87,
"leadsCompleted": 65,
"leadsReplied": 12,
"leadsFailed": 3,
"leadList": {
"id": "cm3list789",
"name": "SaaS Founders — West Coast",
"leadCount": 150
},
"senders": [
{ "id": "cs1", "account": { "id": "acc1", "linkedinName": "John Smith", "linkedinPhotoUrl": "https://..." } }
],
"createdAt": "2026-05-20T08:00:00.000Z",
"updatedAt": "2026-06-05T14:30:00.000Z"
}
],
"nextCursor": "cm3camp789"
}Create Campaign
/api/campaignsCreate a new campaign in DRAFT status. You must add steps and senders before launching.
Request Body
| Parameter | Type | Description |
|---|---|---|
namerequired | string | Campaign name |
leadListIdrequired | string | ID of the lead list to use |
excludeListIds | string[] | Lead list IDs to exclude |
curl --location --request POST 'http://outreach.weezly.com/api/campaigns' \
--header 'X-API-KEY: sk_live_YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"name": "Q2 Enterprise Outreach",
"leadListId": "cm3list789abc",
"excludeListIds": [
"cm3list_exclude1"
]
}'{
"campaign": {
"id": "cm3camp_new789",
"name": "Q2 Enterprise Outreach",
"status": "DRAFT",
"leadListId": "cm3list789abc",
"leadList": { "id": "cm3list789abc", "name": "Enterprise CTOs", "leadCount": 89 },
"totalLeads": 0,
"createdAt": "2026-06-07T10:00:00.000Z"
}
}Response Codes
| 201 | Campaign created |
| 400 | Name and leadListId required |
| 404 | Lead list not found |
| 401 | Unauthorized |
Get Campaign
/api/campaigns/:idGet full campaign details including stats, steps, and senders.
curl --location --request GET 'http://outreach.weezly.com/api/campaigns/:id' \
--header 'X-API-KEY: sk_live_YOUR_API_KEY'{
"campaign": {
"id": "cm3camp456",
"name": "Q1 SaaS Founders Outreach",
"status": "ACTIVE",
"timezone": "America/Los_Angeles",
"workingHoursStart": 540,
"workingHoursEnd": 1020,
"workingDays": [1, 2, 3, 4, 5],
"leadList": { "id": "cm3list789", "name": "SaaS Founders", "leadCount": 150 },
"steps": [
{ "id": "step1", "type": "CONNECTION_REQUEST", "order": 1, "delayDays": 0 },
{ "id": "step2", "type": "MESSAGE", "order": 2, "delayDays": 3 }
],
"senders": [
{ "id": "cs1", "account": { "id": "acc1", "linkedinName": "John Smith" } }
],
"totalLeads": 150,
"totalExecutions": 150,
"leadsProcessed": 87,
"leadsCompleted": 65,
"leadsReplied": 12,
"leadsFailed": 3,
"connectionsSent": 150,
"connectionsAccepted": 45,
"messagesSent": 45,
"inmailsSent": 0,
"createdAt": "2026-05-20T08:00:00.000Z"
}
}Update Campaign
/api/campaigns/:idUpdate campaign settings. Only editable in DRAFT or PAUSED status (except folderId which can always be changed).
Request Body
| Parameter | Type | Description |
|---|---|---|
name | string | Campaign name |
folderId | string|null | Move to folder (null to unfile) |
timezone | string | IANA timezone (e.g. "America/New_York") |
workingHoursStart | number | Start time in minutes from midnight (e.g. 540 = 9:00 AM) |
workingHoursEnd | number | End time in minutes from midnight (e.g. 1020 = 5:00 PM) |
workingDays | number[] | Working days (1=Mon, 7=Sun) |
curl --location --request PATCH 'http://outreach.weezly.com/api/campaigns/:id' \
--header 'X-API-KEY: sk_live_YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"name": "Updated Campaign Name",
"folderId": null
}'Response Codes
| 200 | Campaign updated |
| 400 | Campaign is not editable in current status |
| 404 | Campaign not found |
Delete Campaign
/api/campaigns/:idDelete a campaign. Only allowed for DRAFT, ARCHIVED, STOPPED, or COMPLETED campaigns.
curl --location --request DELETE 'http://outreach.weezly.com/api/campaigns/:id' \
--header 'X-API-KEY: sk_live_YOUR_API_KEY'{ "success": true }Response Codes
| 200 | Campaign deleted |
| 400 | Cannot delete active campaigns — stop first |
| 404 | Campaign not found |
Launch Campaign
/api/campaigns/:id/launchLaunch a DRAFT campaign. Creates execution records and begins processing leads.
curl --location --request POST 'http://outreach.weezly.com/api/campaigns/:id/launch' \
--header 'X-API-KEY: sk_live_YOUR_API_KEY'{
"campaign": {
"id": "cm3camp456",
"status": "ACTIVE",
"totalLeads": 150
}
}Response Codes
| 200 | Campaign launched |
| 400 | Campaign must be in DRAFT status / missing steps or senders |
| 503 | Background job service unavailable — campaign reverted to DRAFT |
Stop Campaign
/api/campaigns/:id/stopStop an active campaign. All pending executions are cancelled.
curl --location --request POST 'http://outreach.weezly.com/api/campaigns/:id/stop' \
--header 'X-API-KEY: sk_live_YOUR_API_KEY'{ "campaign": { "id": "cm3camp456", "status": "STOPPED" } }Pause Campaign
/api/campaigns/:id/pausePause an active campaign. Executions are suspended but not cancelled.
curl --location --request POST 'http://outreach.weezly.com/api/campaigns/:id/pause' \
--header 'X-API-KEY: sk_live_YOUR_API_KEY'{ "campaign": { "id": "cm3camp456", "status": "PAUSED" } }Resume Campaign
/api/campaigns/:id/resumeResume a paused campaign.
curl --location --request POST 'http://outreach.weezly.com/api/campaigns/:id/resume' \
--header 'X-API-KEY: sk_live_YOUR_API_KEY'{ "campaign": { "id": "cm3camp456", "status": "ACTIVE" } }Duplicate Campaign
/api/campaigns/:id/duplicateDuplicate a campaign as a new DRAFT. Copies all steps and settings with remapped IDs.
curl --location --request POST 'http://outreach.weezly.com/api/campaigns/:id/duplicate' \
--header 'X-API-KEY: sk_live_YOUR_API_KEY'{
"campaign": {
"id": "cm3camp_dup123",
"name": "Q1 SaaS Founders Outreach (copy)",
"status": "DRAFT"
}
}Campaign Leads
/api/campaigns/:id/leadsGet leads in a campaign with their execution status, current step, and next step.
Query Parameters
| Parameter | Type | Description |
|---|---|---|
status | string | Filter by execution status: PENDING, ACTIVE, WAITING, COMPLETED, FAILED, STOPPED_REPLY |
search | string | Search by lead name or company |
page | number | Page number (default: 1) |
limit | number | Results per page (default: 25) |
curl --location --request GET 'http://outreach.weezly.com/api/campaigns/:id/leads' \
--header 'X-API-KEY: sk_live_YOUR_API_KEY'{
"executions": [
{
"id": "cm3exec789",
"status": "WAITING",
"currentStepOrder": 2,
"nextRunAt": "2026-06-08T10:30:00.000Z",
"lead": {
"id": "cm3lead_001",
"fullName": "Sarah Chen",
"company": "TechStartup Inc.",
"photoUrl": "https://..."
},
"assignedAccount": {
"id": "acc1",
"linkedinName": "John Smith"
},
"currentStepType": "MESSAGE",
"nextStepType": "IF_CONNECTION"
}
],
"total": 150,
"page": 1,
"totalPages": 6
}Campaign Stats
/api/campaigns/:id/statsGet daily activity stats for a campaign.
Query Parameters
| Parameter | Type | Description |
|---|---|---|
days | number | Number of days of history (default: 7) |
curl --location --request GET 'http://outreach.weezly.com/api/campaigns/:id/stats' \
--header 'X-API-KEY: sk_live_YOUR_API_KEY'{
"daily": [
{ "date": "2026-06-01", "connections": 12, "messages": 5, "inmails": 0, "replies": 2 },
{ "date": "2026-06-02", "connections": 15, "messages": 8, "inmails": 0, "replies": 1 },
{ "date": "2026-06-03", "connections": 10, "messages": 12, "inmails": 2, "replies": 3 }
]
}Campaign Steps
/api/campaigns/:id/stepsGet all campaign sequence steps with their configuration.
curl --location --request GET 'http://outreach.weezly.com/api/campaigns/:id/steps' \
--header 'X-API-KEY: sk_live_YOUR_API_KEY'{
"steps": [
{
"id": "step1",
"type": "CONNECTION_REQUEST",
"order": 1,
"branchId": null,
"parentStepId": null,
"delayDays": 0,
"delayHours": 0,
"inviteNote": "Hi {{firstName}}, I noticed we're both in the SaaS space...",
"withdrawAfterDays": 25
},
{
"id": "step2",
"type": "IF_CONNECTION",
"order": 2,
"branchId": null,
"parentStepId": "step1"
},
{
"id": "step3",
"type": "MESSAGE",
"order": 3,
"branchId": "step2_true",
"parentStepId": "step2",
"delayDays": 1,
"messageText": "Great to connect, {{firstName}}! I wanted to share..."
}
]
}Campaign Step Types
| Type | Description |
|---|---|
| CONNECTION_REQUEST | Send a LinkedIn connection request with optional note |
| MESSAGE | Send a direct message to a connected lead |
| VIDEO_MESSAGE | Send a video message (recorded or AI-generated) |
| VOICE_NOTE | Send a voice note message |
| INMAIL | Send a LinkedIn InMail |
| VIEW_PROFILE | View the lead's LinkedIn profile |
| LIKE_POST | Like the lead's latest post |
| REACT_TO_POST | React to the lead's latest post |
| COMMENT_ON_POST | AI-generated comment on the lead's latest post |
| FOLLOW_PROFILE | Follow the lead's LinkedIn profile |
| IF_CONNECTION | Branch: check if connection was accepted |
| IF_OPEN_PROFILE | Branch: check if profile is open |
| END | End the sequence |
Execution Statuses
| Status | Description |
|---|---|
| PENDING | Not yet started — waiting for scheduled time |
| ACTIVE | Currently being processed |
| WAITING | Waiting for delay between steps |
| COMPLETED | All steps finished successfully |
| FAILED | Step failed after retries |
| STOPPED_REPLY | Lead replied — execution stopped automatically |