Send Campaign
Run prechecks on a draft campaign and enqueue it for sending via the background worker. The worker sends messages to every contact targeted by the campaign; track progress with Campaign Stats.
POST /api/v1/campaigns/{campaign_id}/send
This endpoint is asynchronous — it returns 202 Accepted as soon as the campaign is queued. Actual delivery happens in the background. Use webhooks (message.sent, message.delivered, message.read, message.failed) to monitor individual messages.
If the campaign was created with scheduled_at, it auto-sends at that time — you do not need to call this endpoint. Only call this for draft campaigns.
Path parameters
| Parameter | Type | Description |
|---|---|---|
campaign_id | string | Campaign ID returned from Create Campaign |
Request body
No body required.
Example request
curl -X POST https://server.waplify.io/api/v1/campaigns/507f1f77bcf86cd799439060/send \
-H "Authorization: Bearer wapl_your_api_key"
Success response (202 Accepted)
{
"status": "accepted",
"message": "Campaign send queued and will run in background",
"campaign_id": "507f1f77bcf86cd799439060",
"task_id": "f5a1f9d4-2c5c-4c9f-9d1b-3e2d1a1f9d4f",
"timestamp": "2026-06-15T10:00:00Z"
}
| Field | Description |
|---|---|
task_id | Background worker task ID (for internal tracing) |
status | accepted — the campaign has been queued, not delivered |
Error responses
Campaign not found
// 404 Not Found
{
"error": "not_found",
"message": "Campaign not found"
}
Invalid campaign ID
// 400 Bad Request
{
"error": "bad_request",
"message": "Invalid campaign_id"
}
Precheck failed
If the underlying template is no longer approved, media is missing, the WhatsApp account is inactive, or the user has insufficient wallet credits, the precheck returns a 400 with a descriptive message.
// 400 Bad Request
{
"error": "bad_request",
"message": "Campaign cannot be sent: template is not APPROVED"
}
What happens next
- API returns
202— your campaign is queued - The background worker starts sending messages
- For each recipient, webhooks fire as WhatsApp processes the message:
message.sent→message.delivered→message.read - Campaign Stats reflect real-time counts as messages move through the pipeline
- When the worker finishes, the campaign's
statusbecomescompleted
Set up webhooks to get push notifications for every message. Polling Campaign Stats works for batch summaries but webhooks are the only way to react to individual message events in real time.