Prerequisites
- A published agent — campaigns bind only published agents. See Create & publish an agent.
- The campaign worker and Campaign Engine running (otherwise
startreturns503).
campaigns:write / campaigns:read scopes — a workspace API key that carries them can run the whole flow (no admin role required).
1
Create the campaign
draft.Agents are bound per channel: use
voice_agent_id for voice, whatsapp_agent_id for whatsapp, and both for whatsapp_voice. The bound agent must be published and match the channel.2
Add recipients
Add them one at a time, with per-recipient variables:Or bulk-upload a CSV or
.xlsx file (multipart) to POST /campaigns/{id}/recipients/import. Recipients are deduplicated per (campaign, phone); up to 50,000 per campaign.3
Publish
Lock the configuration so the run is reproducible:After publishing, config
PATCH is rejected (409) — a published campaign is a reusable template.4
Start
scheduled → running. Calls are placed within the campaign’s business hours, retrying per the schedule.5
Monitor
Track progress and per-recipient outcomes:List responses are paged: pass
?limit= (default 20, max 100) and ?offset=. Attempts and recipients report pagination.total; the event log pages without one.Recipients end as completed, no_answer, or failed; the campaign completes completed (zero failures) or failed.Pause, resume, and re-run
- Pause / resume —
POST /campaigns/{id}/pausehalts new attempts;POST /campaigns/{id}/startresumes. - Re-run — a finished campaign is terminal and read-only. To run it again, clone it (
POST /campaigns/{id}/clone): the clone copies the config into a freshdraftwith no recipients (its source recorded incloned_from_campaign_id). Publish the clone, add a new recipient list, thenstart.
Campaign lifecycle
How a run executes under the hood.
WhatsApp campaigns
Template + voice-escalation flow.

