Skip to main content
POST
cURL
Validation happens in two stages. First a whole-upload shape check: every column must be a system field (reference_id, mobile_number, name, email) or a field the pinned version’s start node declares — otherwise the entire upload is rejected with 422 unknown_field or missing_required_field and nothing is persisted. Then each row is validated individually: bad rows land in failures with a code (invalid_phone, invalid_field_type, missing_required_value, …) while good rows are accepted.
Re-uploading a row whose earlier version failed validation replaces it in place — such rows are counted in both accepted and corrected. Fetch the expected header with the CSV template endpoint. Uploads are capped at 32 MB and 150,000 rows.

Authorizations

Authorization
string
header
required

Bearer authentication header of the form Bearer <token>, where <token> is your auth token.

Path Parameters

campaign_id
string<uuid>
required

The unique id of the campaign

Body

The body is of type string.

Example:

"mobile_number,name,city\n+919876543210,Asha,Pune\n+919876543211,Ravi,Mumbai\n"

Response

Per-row upload result

accepted
integer
required

Rows inserted, including corrections of previously failed rows.

corrected
integer
required

Subset of accepted that replaced a failed_validation row from an earlier upload.

failed
integer
required

Rows that failed validation.

entries_count
integer
required

The campaign's total entries after this upload.

failures
object[]
required
Maximum array length: 1000
warnings
object[]

Accepted rows with a non-blocking issue, e.g. missing_default_recipient on a phone-less row when the workflow dials entry.mobile_number.

Maximum array length: 1000