curl --request POST \
--url https://app.thinnest.ai/api/v1/campaigns/{id}/cancel \
--header 'Authorization: Bearer <token>'const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
fetch('https://app.thinnest.ai/api/v1/campaigns/{id}/cancel', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://app.thinnest.ai/api/v1/campaigns/{id}/cancel"
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, headers=headers)
print(response.text){
"id": "cmp_1f2e3d4c-5b6a-4798-8a7b-6c5d4e3f2a1b",
"agent": "ag_8d7c6b5a-4e3f-4a2b-9c1d-0e9f8a7b6c5d",
"name": "Six-month check-up reminders",
"kind": "voice",
"status": "cancelled",
"template": null,
"purpose": "Hello, this is Asha calling from Sunrise Dental Clinic.",
"counts": {
"recipients": 180,
"sent": 0,
"delivered": 0,
"read": 0,
"replied": 0,
"failed": 0,
"skipped": 0
},
"scheduledAt": "2026-10-07T04:30:00.000Z",
"startedAt": null,
"finishedAt": "2026-10-06T10:20:05.118Z",
"createdAt": "2026-10-06T10:00:01.874Z",
"lastError": null
}{
"error": "Send a valid API key as `Authorization: Bearer <key>`."
}{
"error": "This API key is read-only: it can read everything but change nothing."
}{
"error": "That campaign was not found."
}{
"error": "Only a draft, sending or paused campaign can be cancelled. This one is sent."
}{
"error": "Over 240 requests a minute. Slow down and retry."
}Cancel Campaign
Stops a draft, sending or paused campaign for good and sets finishedAt. Messages already handed to WhatsApp, and calls already placed, still complete. This cannot be undone, and it is also how you get rid of a draft you do not want: campaigns cannot be edited or deleted, so cancel it and create a new one. A build key may do this, since it only ever stops sends.
curl --request POST \
--url https://app.thinnest.ai/api/v1/campaigns/{id}/cancel \
--header 'Authorization: Bearer <token>'const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
fetch('https://app.thinnest.ai/api/v1/campaigns/{id}/cancel', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://app.thinnest.ai/api/v1/campaigns/{id}/cancel"
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, headers=headers)
print(response.text){
"id": "cmp_1f2e3d4c-5b6a-4798-8a7b-6c5d4e3f2a1b",
"agent": "ag_8d7c6b5a-4e3f-4a2b-9c1d-0e9f8a7b6c5d",
"name": "Six-month check-up reminders",
"kind": "voice",
"status": "cancelled",
"template": null,
"purpose": "Hello, this is Asha calling from Sunrise Dental Clinic.",
"counts": {
"recipients": 180,
"sent": 0,
"delivered": 0,
"read": 0,
"replied": 0,
"failed": 0,
"skipped": 0
},
"scheduledAt": "2026-10-07T04:30:00.000Z",
"startedAt": null,
"finishedAt": "2026-10-06T10:20:05.118Z",
"createdAt": "2026-10-06T10:00:01.874Z",
"lastError": null
}{
"error": "Send a valid API key as `Authorization: Bearer <key>`."
}{
"error": "This API key is read-only: it can read everything but change nothing."
}{
"error": "That campaign was not found."
}{
"error": "Only a draft, sending or paused campaign can be cancelled. This one is sent."
}{
"error": "Over 240 requests a minute. Slow down and retry."
}Authorizations
Your API key (ta_live_…) from Settings → API keys, sent as Authorization: Bearer <key>. Keep it on a server: it can message every customer you have. A key is full, build or read-only; a request its level does not allow is refused with 403.
Headers
Developers only: the customer workspace this request acts in — its org_… id from POST /customers. Leave it out to act in your own workspace.
"org_3fKq9TzQ1mN8vB2xR7cLpA"
Path Parameters
The campaign's id (cmp_…), as Create Campaign and List Campaigns return it.
Response
Cancelled. The campaign as it now is.
A WhatsApp broadcast or a calling campaign, with its results.
The campaign's id.
"cmp_9a3b7c21-4d5e-4f60-8a1b-2c3d4e5f6a7b"
A calling campaign: the agent that makes the calls. A broadcast: the agent that answers replies to it.
"ag_5c4a5f93-2b1e-4c0a-9d3f-7e8a1b2c3d4e"
The campaign's name, as the console lists it.
whatsapp for a broadcast, voice for a calling campaign.
whatsapp, voice draft until launched (a scheduled campaign stays a draft until scheduledAt), sending while it runs, paused when stopped for now, then sent, failed (it could not run; see lastError) or cancelled.
draft, sending, paused, sent, failed, cancelled A broadcast's template name. null on a calling campaign.
A calling campaign's opening line: the sentence the agent opens each call with, copied from the agent when the campaign was created (editing the agent later does not change it). null on a broadcast.
How far the campaign has got, person by person.
Show child attributes
Show child attributes
When a scheduled campaign starts itself. null when it is started by hand.
When it started sending. null while a draft.
When it finished or was cancelled. null while it can still send.
When it was created.
Why the campaign last stopped or failed, when it did. Cleared when it is launched or resumed.