Campaign flows are built in the dashboard UI — creating and editing flows via API is not available currently. The REST API provides operational control: triggering a run, pausing it, and resuming after a pause. Full API-driven campaign creation is on the roadmap.
Campaign design — flows, segments, templates, and triggers — happens in the dashboard. Once a campaign is configured, the REST API handles runtime control.

Endpoints

EndpointMethodDescription
POST /v1/campaigns/{id}/triggerPOSTStart a run for API-triggered campaigns
POST /v1/campaigns/{id}/pausePOSTPause a running campaign
POST /v1/campaigns/{id}/resumePOSTResume pending executions after a pause
GET /v1/campaigns/{id}/statusGETCurrent campaign state and execution counts

POST /v1/campaigns/{id}/trigger

Starts a run for a campaign configured with an API trigger in the dashboard. Has no effect on campaigns with scheduled, event, or manual triggers.
id
string
required
Campaign id.
{
  "idempotency_key": "run_2026-03-28_batch_1"
}
idempotency_key
string
Optional. Prevents duplicate runs on retry — the same key within 24 hours returns the original run id instead of starting a new run.
Responses
StatusMeaning
202Run accepted; processing starts asynchronously. Returns { run_id, status: "RUNNING" }
402Insufficient free balance for estimated audience cost
404Campaign not found
409Campaign already running, or not configured for API trigger

POST /v1/campaigns/{id}/pause

Stops enqueuing new contact executions. Executions already in progress complete their current node before stopping. Responses
StatusMeaning
200Paused. Returns { status: "PAUSED" }.
409Campaign already paused or completed

POST /v1/campaigns/{id}/resume

Resumes pending executions after a PAUSED, PAUSED_ERROR, or PAUSED_BALANCE state. Behavior
  • Enqueues tasks only for executions still pending — contacts already completed or failed are not re-run.
  • Per-contact idempotency keys prevent double sends if the worker crashes between resume and execution.
  • Validates balance vs. estimated cost for remaining audience before accepting.
Pause reasons and how to resolve:
Pause stateCauseResolution
PAUSEDManual operator pauseCall resume directly
PAUSED_ERRORProvider outage / circuit breakerWait for provider recovery, then resume
PAUSED_BALANCEFree balance hit €0Top up balance, then resume
After a balance top-up (including auto-reload), campaigns do not resume automatically. You must call POST /v1/campaigns/{id}/resume explicitly after adding funds.
Responses
StatusMeaning
200Resume accepted; processing continues asynchronously
402Insufficient balance for remaining audience
404Campaign not found
409Campaign not in a resumable state

GET /v1/campaigns/{id}/status

Returns the current campaign state and a breakdown of per-contact execution counts.
{
  "campaign_id": "cmp_a1b2c3",
  "status": "PAUSED_BALANCE",
  "trigger": "api",
  "executions": {
    "total": 5000,
    "pending": 1842,
    "processing": 0,
    "completed": 3058,
    "failed": 87,
    "skipped": 13
  },
  "paused_at": "2026-03-28T10:42:00Z",
  "pause_reason": "PAUSED_BALANCE"
}
status
string
Campaign-level state: DRAFT, SCHEDULED, RUNNING, PAUSED, PAUSED_ERROR, PAUSED_BALANCE, COMPLETED, COMPLETED_PARTIAL.
executions.skipped
number
Contacts where a SEND node determined the contact was ineligible — no consent, device not RCS-capable with fallback: none, or channel not approved.
pause_reason
string
Matches status when paused: PAUSED, PAUSED_ERROR, or PAUSED_BALANCE.

Campaigns in depth

Node types, execution states, triggers, and idempotency.

Billing API

Balance and usage — check before triggering large runs.

Webhooks

Receive campaign events in real time.