POST/campaigns/:campaignId/start

Start outreach for a ready campaign, or resume a paused one. Same behavior as the dashboard Start / Resume controls.

0 credits. Kicks off real LinkedIn outbound — confirm before calling. The campaign must already have an agent assigned (assignedTemplateId). Create agents and connect LinkedIn in the dashboard.

Current statusBehavior
READY_TO_SENDStart → CAMPAIGN_IN_PROGRESS (action: started)
FAILED with leadsStart → CAMPAIGN_IN_PROGRESS (action: started)
CAMPAIGN_PAUSEDResume → CAMPAIGN_IN_PROGRESS (action: resumed)
CAMPAIGN_IN_PROGRESSNo-op success (action: noop)
COMPLETED / DONE409 conflict (API does not restart completed campaigns)
FAILED with no leads409 conflict — add leads first
Other (e.g. still preparing)409 conflict

Typical flow

  1. Dashboard: create campaign, assign an agent, connect LinkedIn
  2. API: add leads (POST …/leads) if needed
  3. POST …/start → outreach runs
  4. POST …/pause / POST …/start again to pause / resume
POST /campaigns/search_abc/start
X-API-Key: sk_live_...
Content-Type: application/json
{}

Body must be empty or {}. Any other fields → 400 validation_error.

{
  "campaignId": "search_abc",
  "action": "started",
  "status": "CAMPAIGN_IN_PROGRESS",
  "campaign": {
    "id": "search_abc",
    "name": "Q3 outbound",
    "status": "CAMPAIGN_IN_PROGRESS",
    "totalLeads": 120,
    "assignedTemplateId": "tpl_...",
    "stats": {
      "connectionRequestsSent": 80,
      "connectionRequestsAccepted": 20,
      "acceptanceRate": 25.0,
      "messagesSent": 40,
      "repliesReceived": 8,
      "replyRate": 20.0
    }
  }
}
FieldValues
campaignIdSame as path
actionstarted | resumed | noop
statusPost-call status (usually CAMPAIGN_IN_PROGRESS)
campaignSame shape as GET /campaigns/:id
Error codeWhen
validation_errorBody has extra fields, or no agent assigned
not_foundUnknown campaign / template
account_disconnectedAgent's LinkedIn account not connected
plan_requiredPlan inactive (usually blocked at auth)
conflictWrong status / no leads on FAILED / completed
rate_limitedOver the start/pause limit (30 / minute)
upstream_unavailableTemporary failure while resuming — retry

MCP: start_campaign (campaignId only) — confirm with the user before calling.