Create a campaign (as a draft)
A campaign is a recipient list plus a pacing, retry and calling-window policy. It is created as a draft and dials nothing until you launch it. 🔴 agentId can never be changed afterwards — duplicate the campaign to use a different agent.
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
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
curl -X POST "https://example.com/v1/campaigns" \ -H "Content-Type: application/json" \ -d '{ "agentId": "9f1c2d84-4e3a-4f6c-b902-7d1e8a33c451", "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" }}Every compliance check recorded for this campaign's calls
The audit trail for the whole run: every check that passed, warned or blocked, in the order it ran. This is what a complaint is answered with.
Copy this campaign and its recipients to a draft
The way to re-run a list, or to change the agent — which the original campaign will not let you do.