POST
/v1/campaigns/launchLaunch a campaign
Create a campaign, optionally add a batch of leads, and optionally start it — all in one call. Runs the same three steps as create, add-leads, and start, in sequence, against the exact same underlying logic.
Only campaign creation can fail the whole request
Leads and start are best-effort after that and reported back per-step instead of rolled back — a campaign that got created but had a few leads rejected, or failed to start (e.g. no verified sender yet), still exists and is inspectable via Get campaign. Nothing is silently deleted because a later step failed.
Request
| Authorization | Bearer YOUR_API_KEY |
| Content-Type | application/json |
Parameters
| Field | Type | Required | Description |
|---|---|---|---|
| name, mail, senderIds, aiPrompt, scheduleType, ... | — | Required | Same fields as Create a campaign — the campaign to create. |
| leads | object[] | Optional | Same shape as Add leads — { fields: { email, firstName, ... } }[], 1–10,000 items. Omit to create an empty campaign. |
| start | boolean | Optional | true to launch immediately once leads are added; omit or false to save as DRAFT. |
curl -X POST "https://api.stynar.com/v1/campaigns/launch" \
-H "Authorization: Bearer esk_your_key_here" \
-H "Content-Type: application/json" \
-d '{"name":"Q3 outbound","mail":{"subject":"Quick question about {{company}}","body":"<p>Hi {{firstName}},</p>..."},"senderIds":["sender_abc123"],"leads":[{"fields":{"email":"jane@acme.com","firstName":"Jane","company":"Acme"}}],"start":true}'Response
✓ 201 Created
201 response
{
"campaign": {
"campaignId": "cmp_abc123",
"name": "Q3 outbound",
"status": "RUNNING"
},
"leads": {
"added": 1,
"skipped": {
"duplicatesInRequest": 0,
"duplicatesInDB": 0,
"invalidLeads": 0
}
},
"started": true
}Response fields
Errors
| Status | Code | Meaning |
|---|---|---|
| ✕ 401 Unauthorized | UNAUTHORIZED | Missing, malformed, unknown, revoked, or expired key. |
| ✕ 403 Forbidden | API_ACCESS_DISABLED | Your account doesn't currently have API access. |
| ✕ 403 Forbidden | INSUFFICIENT_SCOPE | The key doesn't have the scope this endpoint requires. |
| ✕ 404 Not Found | NOT_FOUND | Unknown route, or a resource that doesn't exist / isn't yours. |
| ✕ 409 Conflict | CONFLICT | The action can't be applied to the resource's current state. |
| ✕ 429 Too Many Requests | RATE_LIMIT_EXCEEDED | Per-minute or per-second limit hit. |
| ✕ 429 Too Many Requests | QUOTA_EXCEEDED | Monthly quota exhausted. |
| ✕ 500 Internal Server Error | INTERNAL_ERROR | Something broke on Stynar's end. |