Campaigns API
Create and manage WhatsApp marketing campaigns. Schedule messages, track delivery, and monitor performance.
List Campaigns
Get all campaigns with status and metrics.
GET /api/campaigns
Response:
[
{
"id": 1,
"name": "Summer Sale Campaign",
"templateId": 1,
"contactListId": 1,
"status": "completed",
"scheduledFor": "2025-01-01T10:00:00.000Z",
"totalRecipients": 100,
"messagesSent": 100,
"messagesDelivered": 95,
"messagesRead": 80,
"createdAt": "2025-01-01T00:00:00.000Z"
},
{
"id": 2,
"name": "Flash Sale Alert",
"templateId": 2,
"contactListId": 2,
"status": "scheduled",
"scheduledFor": "2025-12-25T10:00:00.000Z",
"totalRecipients": 50,
"messagesSent": 0,
"messagesDelivered": 0,
"messagesRead": 0,
"createdAt": "2025-01-02T00:00:00.000Z"
}
]
cURL Example:
curl -X GET "https://waflow.edesy.in/api/campaigns" \
-H "Content-Type: application/json" \
-b cookies.txt
Create Campaign
Create a new campaign for scheduling or immediate execution.
POST /api/campaigns
Request Body:
{
"name": "Flash Sale Alert",
"templateId": 1,
"contactListId": 1,
"scheduledFor": "2025-12-25T10:00:00.000Z",
"variables": {
"discount": "50%",
"endDate": "December 31st"
}
}
Parameters:
| Field | Type | Required | Description |
|---|---|---|---|
| name | string | Yes | Campaign name |
| templateId | number | Yes | ID of the template to use |
| contactListId | number | Yes | ID of the contact list |
| scheduledFor | string | No | ISO 8601 datetime (omit for immediate send) |
| variables | object | No | Variable values for the template |
Response:
{
"id": 2,
"name": "Flash Sale Alert",
"templateId": 1,
"contactListId": 1,
"status": "scheduled",
"scheduledFor": "2025-12-25T10:00:00.000Z",
"totalRecipients": 50,
"variables": {
"discount": "50%",
"endDate": "December 31st"
},
"createdAt": "2025-01-01T00:00:00.000Z"
}
JavaScript Example:
const response = await fetch('https://waflow.edesy.in/api/campaigns', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
credentials: 'include',
body: JSON.stringify({
name: 'Flash Sale Alert',
templateId: 1,
contactListId: 1,
scheduledFor: '2025-12-25T10:00:00.000Z',
variables: {
discount: '50%',
endDate: 'December 31st'
}
})
});
const campaign = await response.json();
console.log(campaign);
Trigger Campaign (One-Shot)
Create and execute a campaign in a single API call. Perfect for transactional messages or quick sends.
POST /api/campaigns/trigger
Request Body:
{
"campaignName": "Flash Sale Alert",
"templateId": 1,
"contacts": {
"phoneNumbers": ["+1234567890", "+1987654321"]
},
"variables": {
"firstName": "Customer",
"discount": "20%"
},
"options": {
"autoExecute": true,
"skipDuplicatePhones": true
}
}
Contact Options:
You can specify recipients in multiple ways:
// By phone numbers
"contacts": {
"phoneNumbers": ["+1234567890", "+1987654321"]
}
// By contact IDs
"contacts": {
"contactIds": [1, 2, 3, 4, 5]
}
// By contact list ID
"contacts": {
"contactListId": 1
}
Options:
| Option | Type | Default | Description |
|---|---|---|---|
| autoExecute | boolean | true | Send immediately after creation |
| skipDuplicatePhones | boolean | true | Skip duplicate phone numbers |
Response:
{
"success": true,
"message": "Campaign created and queued for immediate execution",
"campaign": {
"id": 3,
"name": "Flash Sale Alert",
"status": "active",
"templateId": 1,
"contactListId": 5,
"totalRecipients": 2,
"variables": {
"firstName": "Customer",
"discount": "20%"
},
"createdAt": "2025-01-01T00:00:00.000Z"
},
"contacts": {
"total": 2,
"existing": 2,
"created": 0
},
"execution": {
"immediate": true,
"estimatedStartTime": "Within 1 minute"
},
"tracking": {
"campaignId": 3,
"statusCheckUrl": "/api/campaigns/3",
"analyticsUrl": "/api/analytics/campaigns/3"
}
}
cURL Example:
curl -X POST "https://waflow.edesy.in/api/campaigns/trigger" \
-H "Content-Type: application/json" \
-b cookies.txt \
-d '{
"campaignName": "Flash Sale Alert",
"templateId": 1,
"contacts": {
"phoneNumbers": ["+1234567890", "+1987654321"]
},
"variables": {
"firstName": "Customer",
"discount": "20%"
},
"options": {
"autoExecute": true,
"skipDuplicatePhones": true
}
}'
Campaign Status
Campaigns progress through these statuses:
| Status | Description |
|---|---|
draft |
Created but not scheduled |
scheduled |
Scheduled for future execution |
active |
Currently sending messages |
paused |
Temporarily stopped |
completed |
All messages sent |
failed |
Execution failed |
Scheduling Best Practices
- Time zones - All times are in UTC. Convert from local time before sending.
- Optimal timing - Schedule during business hours for better engagement
- Stagger large campaigns - Very large campaigns are automatically staggered
- Avoid spam hours - Don't schedule messages late at night
Rate Limits
| Operation | Limit |
|---|---|
| List campaigns | 100 requests/minute |
| Create campaign | 60 requests/minute |
| Trigger campaign | 100 per day |
| Messages per campaign | Subject to WhatsApp limits |