Update a campaign. Only while it is a draft or scheduled.
Everything freezes once the campaign leaves draft: a running campaign is paused, edited and relaunched, not edited in place. agentId cannot be changed at any point.
Requires the write scope. A key with less gets 403 insufficient_scope.
Authorization: Bearer tone_live_… or tone_test_…. The prefix IS the environment: a test key reaches only the sandbox, and no request field bridges the two.
In: header
Path Parameters
The campaign's id.
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
application/json
application/json
application/json
application/json
application/json
application/json
application/json
application/json
curl -X PATCH "https://example.com/v1/campaigns/string" \ -H "Content-Type: application/json" \ -d '{ "autoPauseBelowPaise": 50000, "callsPerMinute": 10, "endsAt": "2026-09-07T14:00:00Z", "maxConcurrent": 4, "name": "COD confirmations — September", "numberId": "9f1c2d84-4e3a-4f6c-b902-7d1e8a33c451", "retryAttempts": 1, "retryBackoff": "fixed", "retryIntervalMinutes": 60, "retryOn": [ "no_answer", "busy" ], "startsAt": "2026-09-01T04:00:00Z", "weekdays": 31, "windowEndMinute": 1260, "windowStartMinute": 540 }'{ "data": { "agent": { "id": "9f1c2d84-4e3a-4f6c-b902-7d1e8a33c451", "name": "Order confirmation" }, "archivedAt": null, "autoPauseBelowPaise": 50000, "completedAt": null, "createdAt": "2026-08-25T09:14:22Z", "environment": "live", "id": "9f1c2d84-4e3a-4f6c-b902-7d1e8a33c451", "launchedAt": "2026-09-01T04:00:00Z", "name": "COD confirmations — September", "number": { "e164": "+918045678901", "id": "4c8b1e77-3d2a-4f5b-9e6c-8a7b6c5d4e3f" }, "pacing": { "callsPerMinute": 10, "maxConcurrent": 4 }, "pausedReason": "operator", "preflight": { "callable": 0, "checks": [ { "outcome": "pass", "reason": "Outside the 09:00-21:00 IST window for promotional calls.", "type": "time_window" } ], "computedAt": "2026-09-01T03:58:12Z", "estimatedCostPaise": { "high": 480000, "low": 120000 }, "excluded": "invalid_number", "excludedE164s": {}, "total": 0, "walletBalancePaise": 500000 }, "progress": { "connected": 244, "dialed": 320, "excluded": 31, "spentPaise": 146400, "total": 500 }, "purpose": "transactional", "retries": { "attempts": 1, "backoff": "linear", "intervalMinutes": 60, "on": [ "no_answer", "busy" ] }, "schedule": { "endsAt": "2026-09-07T14:00:00Z", "startsAt": "2026-09-01T04:00:00Z", "weekdays": 31, "windowEndMinute": 1260, "windowStartMinute": 540 }, "status": "running", "updatedAt": "2026-08-25T09:14:22Z" }}Return an archived campaign to the list
The inverse of archiving. Nothing else changes.
Run the pre-dial compliance gate for one number, without dialling
Runs the exact checks an outbound call runs (DLT, A2P declaration, calling window, DNC, carrier DND, consent) and records the same audit rows. Returns the verdict instead of enforcing it — use it to pre-flight a number you dial on your own infrastructure.