What is a Workflow Campaign?
A campaign runs one published workflow version over a batch of contacts. Where the run endpoint handles one contact per request, a campaign takes uploads of up to 150,000 rows and turns each accepted row into an execution when started. Two things are fixed at creation time:- The version pin. Passing
"version": nullpins the latest published version at that moment; publishing newer versions later never changes a created campaign. - The entry schema. Uploads are validated against the pinned version’s start-node fields.
draft → scheduled → running → (paused ↔ running) → completed or aborted.
Running a campaign
1
Create the campaign
Use the Create Campaign API with the workflow to run:
2
Fetch the CSV template
The template endpoint returns the exact header row this campaign expects — the pinned version’s declared fields in author order:
3
Upload entries
Upload contacts with the Upload Entries API — as CSV or as a JSON array; the Validation runs in two stages. A whole-upload shape check first — an undeclared column rejects everything with
Content-Type header decides:- CSV
- JSON
422 unknown_field, a missing required column with missing_required_field, and nothing is persisted. Then rows are validated individually: failures are reported per row (invalid_phone, invalid_field_type, missing_required_value, duplicate_reference_id, …) while good rows are accepted. For CSV, row counts the header as line 1, so the first data row is 2.4
Start the campaign
5
Monitor progress
List executions as they progress, filtered by status or outcome:And pull the aggregated report — the
termination_reasons keys are your end nodes’ labels, and funnel counts attempts per node of your definition:Next Steps
Workflow Campaign APIs
Every campaign endpoint in detail
Workflow Execution APIs
Follow one contact node by node
Quickstart
Build and publish the workflow a campaign runs
Batch Calling
Single-call batches, when you don’t need a graph

