API ReferenceCampaigns
Update a campaign
PATCH /api/v1/campaign/{id} — change name, concurrency, retry, schedule, or circuit-breaker. Locked once completed, failed, or archived.
PATCH /api/v1/campaign/{campaign_id}Partial update. Cannot change the target agent (agent_id), source_type, or source_id — create a new campaign for those.
Request body
| Field | Type | Notes |
|---|---|---|
name | string | 1..255 characters. |
max_concurrency | int | Capped at the lower of the org ceiling and the available caller-number count (from the org's default telephony config). |
telephony_configuration_id | int | Switch the campaign to a different telephony config. Best done before the campaign moves into running. |
retry_config | object | Full block — replaces entirely. Accepts the backoff and per-reason delay fields. |
schedule_config | object | Full block — replaces entirely. |
circuit_breaker | object | Full block — replaces entirely. |
Each *_config block is replaced wholesale, not merged — send the complete object.
Response
200 OK with the updated campaign.
Examples
curl -X PATCH https://dashboard.zoxa.ai/api/v1/campaign/7 \
-H "X-API-Key: zsk_..." \
-H "Content-Type: application/json" \
-d '{
"max_concurrency": 10,
"retry_config": {
"enabled": true,
"max_retries": 3,
"retry_delay_seconds": 300,
"backoff_multiplier": 2.0,
"retry_delay_cap_seconds": 3600,
"retry_on_busy": true,
"retry_on_no_answer": true,
"retry_on_voicemail": true
}
}'Errors
| Status | detail | When |
|---|---|---|
400 | "Cannot update a completed campaign" / "Cannot update a failed campaign" | Campaign is in a terminal state. |
400 | "max_concurrency (X) cannot exceed Y" | Above org ceiling. |
400 | "telephony_configuration_not_found" | The telephony_configuration_id you passed doesn't exist or doesn't belong to your org. |
409 | "Unarchive the campaign first" | Campaign is archived. |
404 | "Campaign not found" | Id not in your org. |