curl --request POST \
--url https://app.thinnest.ai/api/v1/campaigns/{id}/launch \
--header 'Authorization: Bearer <token>'const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
fetch('https://app.thinnest.ai/api/v1/campaigns/{id}/launch', 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}/launch"
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": "sending",
"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": null,
"startedAt": "2026-10-06T10:12:40.903Z",
"finishedAt": null,
"createdAt": "2026-10-06T10:00:01.874Z",
"lastError": null,
"message": "Calling started. The agent rings people a few at a time, as lines free up."
}{
"error": "Send a valid API key as `Authorization: Bearer <key>`."
}{
"error": "Campaigns need a paid plan. Pay as you go has no monthly fee, and you top up to send."
}{
"error": "This API key is read-only: it can read everything but change nothing."
}{
"error": "That campaign was not found."
}{
"error": "A cancelled campaign cannot be started."
}{
"error": "The agent this campaign calls from has no number to call on. Point one at it on Phone Numbers."
}{
"error": "Over 240 requests a minute. Slow down and retry."
}Launch Campaign
Starts a draft, as the console’s Send or Start button does, re-running its checks at the moment they matter: your plan must include campaigns, a calling campaign’s agent must still have a number that answers phone calls (and, for promotional calls, is licensed for them), and your balance must cover the send. If the balance covers only part of it, the campaign starts and message says how far it goes; the rest stays queued until you top up. Messages go out in the background; calls are paced by your free call lines. A campaign already sending answers 200 and is left alone, and a scheduled draft launched here starts now instead of waiting. Needs a full key.
curl --request POST \
--url https://app.thinnest.ai/api/v1/campaigns/{id}/launch \
--header 'Authorization: Bearer <token>'const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
fetch('https://app.thinnest.ai/api/v1/campaigns/{id}/launch', 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}/launch"
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": "sending",
"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": null,
"startedAt": "2026-10-06T10:12:40.903Z",
"finishedAt": null,
"createdAt": "2026-10-06T10:00:01.874Z",
"lastError": null,
"message": "Calling started. The agent rings people a few at a time, as lines free up."
}{
"error": "Send a valid API key as `Authorization: Bearer <key>`."
}{
"error": "Campaigns need a paid plan. Pay as you go has no monthly fee, and you top up to send."
}{
"error": "This API key is read-only: it can read everything but change nothing."
}{
"error": "That campaign was not found."
}{
"error": "A cancelled campaign cannot be started."
}{
"error": "The agent this campaign calls from has no number to call on. Point one at it on Phone Numbers."
}{
"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
Started (or already sending). The campaign as it now is, plus message.
The campaign, plus a sentence about what just happened.
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.
What happened, in a sentence you can show a person: how many people it will reach, that sending or calling started (and, when the balance covers only part of it, how far it goes), or — on create with launch: true — why the launch was refused and the campaign kept as a draft.
"Created. 412 people will receive it."