Send a campaign now
Start sending a draft or scheduled campaign immediately to its contact_ids, or to the smart list's current members. Real messages go out and usage is charged to the wallet.
POST
https://api.centerfy.ai/webhooks/inbound/campaigns/:id/start Headers
| Header | Required | Value | Description |
|---|---|---|---|
x-api-key | Yes | your sub-account API key (cfy_…) | Authenticates the request; or use Authorization: Bearer <key>. |
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id | string (uuid) | Yes | The campaign id. |
Example
curl -X POST "https://api.centerfy.ai/webhooks/inbound/campaigns/{id}/start" \
-H "x-api-key: $CENTERFY_API_KEY" import { CenterfyClient } from "@centerfy/sdk";
const centerfy = new CenterfyClient({ apiKey: process.env.CENTERFY_API_KEY! });
const result = await centerfy.campaigns.start("<campaignId>");
console.log(result); centerfy campaigns start <campaignId> MCP tool: centerfy_campaigns_start (see MCP server)
Response
{
"status": "success",
"campaign": {
"id": "4b7e1c2d-3a4f-4e5d-9c8b-7a6f5e4d3c2b",
"name": "October promo",
"campaign_type": "email",
"status": "completed",
"subject": "20% off this week",
"message_content": "<p>Hi there, our October sale is on.</p>",
"contact_ids": [
"3f1c2a9e-7b4d-4c8a-9e2f-1a2b3c4d5e6f",
"6a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d"
],
"smart_list_id": null,
"start_date": "2026-10-06T10:05:00.000Z",
"business_hours_enabled": false,
"business_hours_config": null,
"progress": 100,
"contacted": 2,
"success": 2,
"pending": 0,
"opened_count": 0,
"clicked_count": 0,
"unsubscribed_count": 0,
"created_at": "2026-10-06T10:00:00.000Z",
"updated_at": "2026-10-06T10:00:00.000Z"
},
"summary": {
"total": 2,
"sent": 2,
"failed": 0
}
}Errors
400— if the content (subject/body) is missing or there are no recipients.402— if the wallet balance is too low (nothing is sent and the campaign is left as it was).409— unless the campaign is draft or scheduled, or if it changed state while starting.502— with campaign_id if the send failed; the campaign is marked failed.404— if the campaign is not in this sub-account.
Notes
Returns 200 with the updated campaign and a send summary (summary may be null) when the send finishes quickly. A large send that is still going after about 8 seconds returns 202 with { campaign_id, campaign_status: “running”, recipients, accepted: true } and continues in the background — poll Get a campaign or Get campaign stats.