Suppress a number (idempotent)
Adding a number already on the list is a no-op rather than an error, so a replayed webhook or a retried job cannot fail here. Use lockout90d for an opt-out, which becomes contactable again on a date, rather than a permanent suppression.
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/dnc" \ -H "Content-Type: application/json" \ -d '{ "e164": "+919876543210", "lockout90d": false, "reason": "Asked to be removed during a call on 2026-08-20.", "source": "manual" }'{ "data": { "createdAt": "2026-08-25T09:14:22Z", "e164": "+919876543210", "expiresAt": "2026-11-23T09:14:22Z", "id": "8814", "reason": "Asked to be removed during a call on 2026-08-20.", "removedAt": null, "removedReason": null, "source": "manual", "sourceCallId": null }}Revoke one consent record
⚠️ Revoking consent does NOT stop calls on its own: the ledger passes or warns, it never blocks. Only the suppression list blocks. If the recipient asked not to be called, use the opt-out endpoint, which revokes and suppresses in one transaction.
Suppress many numbers at once (CSV upload)
Up to 1,000 per request, as one transaction — it either all lands or none of it does. This is how you bring an existing suppression list with you.