Create a campaign
Request body
| Field | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Campaign display name |
dial_mode | string | Yes | "preview", "progressive", or "predictive" |
voice_agent_id | string | No | Attach a voice agent to handle answered calls |
post_answer_action | string | No | "connect_agent" (default), "connect_voice_agent", or "run_flow" |
predictive_target_abandon | number | No | Target abandon rate for predictive mode (max 0.03 — TRAI hard cap) |
predictive_max_wait_s | number | No | Max seconds an answered lead waits for an agent in predictive mode |
campaigns:write | Status: 201 Created
Response
Returns aCampaignResponse object with id, name, dial_mode, status ("draft"), timestamps, and all configured fields.
List campaigns
Returns all campaigns for the tenant bound to your API key.campaigns:read | Status: 200 OK
Get a campaign
campaigns:read | Status: 200 OK
Returns 404 if the campaign does not exist or belongs to a different tenant.
Update a campaign
PATCH semantics — only include the fields you want to change.campaigns:write | Status: 200 OK
Delete a campaign
campaigns:write | Status: 204 No Content
Returns 409 Conflict if the campaign is in a state that cannot be deleted (e.g., currently running).
Errors
| Status | Condition |
|---|---|
404 | Campaign not found or belongs to another tenant |
409 | Campaign is in a state that prevents the operation |
422 | Validation error (e.g., predictive_target_abandon > 0.03) |

