Update campaign
curl --request PATCH \
--url https://app.autocalls.ai/api/user/campaign/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"timezone": "<string>",
"schedule_windows": [
{}
],
"allowed_hours_start_time": "<string>",
"allowed_hours_end_time": "<string>",
"allowed_days": [
{}
],
"scheduled_start_at": "<string>",
"max_retries": 123,
"retry_interval": 123,
"mark_complete_when_no_leads": true,
"assistant_id": 123,
"max_calls_in_parallel": 123,
"phone_number_ids": [
{}
],
"retry_on_voicemail": true,
"retry_on_goal_incomplete": true,
"goal_completion_variable": "<string>",
"fallback_channel": "<string>",
"fallback_whatsapp_sender_id": 123,
"fallback_whatsapp_template_id": 123,
"fallback_variable_mapping": {},
"fallback_sms_from_phone_number_id": 123,
"fallback_sms_body": "<string>",
"whatsapp_sender_id": 123,
"whatsapp_template_id": 123,
"text_variable_mapping": {},
"messages_per_minute": 123,
"sms_from_phone_number_id": 123,
"sms_body": "<string>"
}
'import requests
url = "https://app.autocalls.ai/api/user/campaign/{id}"
payload = {
"name": "<string>",
"timezone": "<string>",
"schedule_windows": [{}],
"allowed_hours_start_time": "<string>",
"allowed_hours_end_time": "<string>",
"allowed_days": [{}],
"scheduled_start_at": "<string>",
"max_retries": 123,
"retry_interval": 123,
"mark_complete_when_no_leads": True,
"assistant_id": 123,
"max_calls_in_parallel": 123,
"phone_number_ids": [{}],
"retry_on_voicemail": True,
"retry_on_goal_incomplete": True,
"goal_completion_variable": "<string>",
"fallback_channel": "<string>",
"fallback_whatsapp_sender_id": 123,
"fallback_whatsapp_template_id": 123,
"fallback_variable_mapping": {},
"fallback_sms_from_phone_number_id": 123,
"fallback_sms_body": "<string>",
"whatsapp_sender_id": 123,
"whatsapp_template_id": 123,
"text_variable_mapping": {},
"messages_per_minute": 123,
"sms_from_phone_number_id": 123,
"sms_body": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
timezone: '<string>',
schedule_windows: [{}],
allowed_hours_start_time: '<string>',
allowed_hours_end_time: '<string>',
allowed_days: [{}],
scheduled_start_at: '<string>',
max_retries: 123,
retry_interval: 123,
mark_complete_when_no_leads: true,
assistant_id: 123,
max_calls_in_parallel: 123,
phone_number_ids: [{}],
retry_on_voicemail: true,
retry_on_goal_incomplete: true,
goal_completion_variable: '<string>',
fallback_channel: '<string>',
fallback_whatsapp_sender_id: 123,
fallback_whatsapp_template_id: 123,
fallback_variable_mapping: {},
fallback_sms_from_phone_number_id: 123,
fallback_sms_body: '<string>',
whatsapp_sender_id: 123,
whatsapp_template_id: 123,
text_variable_mapping: {},
messages_per_minute: 123,
sms_from_phone_number_id: 123,
sms_body: '<string>'
})
};
fetch('https://app.autocalls.ai/api/user/campaign/{id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://app.autocalls.ai/api/user/campaign/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'name' => '<string>',
'timezone' => '<string>',
'schedule_windows' => [
[
]
],
'allowed_hours_start_time' => '<string>',
'allowed_hours_end_time' => '<string>',
'allowed_days' => [
[
]
],
'scheduled_start_at' => '<string>',
'max_retries' => 123,
'retry_interval' => 123,
'mark_complete_when_no_leads' => true,
'assistant_id' => 123,
'max_calls_in_parallel' => 123,
'phone_number_ids' => [
[
]
],
'retry_on_voicemail' => true,
'retry_on_goal_incomplete' => true,
'goal_completion_variable' => '<string>',
'fallback_channel' => '<string>',
'fallback_whatsapp_sender_id' => 123,
'fallback_whatsapp_template_id' => 123,
'fallback_variable_mapping' => [
],
'fallback_sms_from_phone_number_id' => 123,
'fallback_sms_body' => '<string>',
'whatsapp_sender_id' => 123,
'whatsapp_template_id' => 123,
'text_variable_mapping' => [
],
'messages_per_minute' => 123,
'sms_from_phone_number_id' => 123,
'sms_body' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://app.autocalls.ai/api/user/campaign/{id}"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"timezone\": \"<string>\",\n \"schedule_windows\": [\n {}\n ],\n \"allowed_hours_start_time\": \"<string>\",\n \"allowed_hours_end_time\": \"<string>\",\n \"allowed_days\": [\n {}\n ],\n \"scheduled_start_at\": \"<string>\",\n \"max_retries\": 123,\n \"retry_interval\": 123,\n \"mark_complete_when_no_leads\": true,\n \"assistant_id\": 123,\n \"max_calls_in_parallel\": 123,\n \"phone_number_ids\": [\n {}\n ],\n \"retry_on_voicemail\": true,\n \"retry_on_goal_incomplete\": true,\n \"goal_completion_variable\": \"<string>\",\n \"fallback_channel\": \"<string>\",\n \"fallback_whatsapp_sender_id\": 123,\n \"fallback_whatsapp_template_id\": 123,\n \"fallback_variable_mapping\": {},\n \"fallback_sms_from_phone_number_id\": 123,\n \"fallback_sms_body\": \"<string>\",\n \"whatsapp_sender_id\": 123,\n \"whatsapp_template_id\": 123,\n \"text_variable_mapping\": {},\n \"messages_per_minute\": 123,\n \"sms_from_phone_number_id\": 123,\n \"sms_body\": \"<string>\"\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.patch("https://app.autocalls.ai/api/user/campaign/{id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"timezone\": \"<string>\",\n \"schedule_windows\": [\n {}\n ],\n \"allowed_hours_start_time\": \"<string>\",\n \"allowed_hours_end_time\": \"<string>\",\n \"allowed_days\": [\n {}\n ],\n \"scheduled_start_at\": \"<string>\",\n \"max_retries\": 123,\n \"retry_interval\": 123,\n \"mark_complete_when_no_leads\": true,\n \"assistant_id\": 123,\n \"max_calls_in_parallel\": 123,\n \"phone_number_ids\": [\n {}\n ],\n \"retry_on_voicemail\": true,\n \"retry_on_goal_incomplete\": true,\n \"goal_completion_variable\": \"<string>\",\n \"fallback_channel\": \"<string>\",\n \"fallback_whatsapp_sender_id\": 123,\n \"fallback_whatsapp_template_id\": 123,\n \"fallback_variable_mapping\": {},\n \"fallback_sms_from_phone_number_id\": 123,\n \"fallback_sms_body\": \"<string>\",\n \"whatsapp_sender_id\": 123,\n \"whatsapp_template_id\": 123,\n \"text_variable_mapping\": {},\n \"messages_per_minute\": 123,\n \"sms_from_phone_number_id\": 123,\n \"sms_body\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.autocalls.ai/api/user/campaign/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"timezone\": \"<string>\",\n \"schedule_windows\": [\n {}\n ],\n \"allowed_hours_start_time\": \"<string>\",\n \"allowed_hours_end_time\": \"<string>\",\n \"allowed_days\": [\n {}\n ],\n \"scheduled_start_at\": \"<string>\",\n \"max_retries\": 123,\n \"retry_interval\": 123,\n \"mark_complete_when_no_leads\": true,\n \"assistant_id\": 123,\n \"max_calls_in_parallel\": 123,\n \"phone_number_ids\": [\n {}\n ],\n \"retry_on_voicemail\": true,\n \"retry_on_goal_incomplete\": true,\n \"goal_completion_variable\": \"<string>\",\n \"fallback_channel\": \"<string>\",\n \"fallback_whatsapp_sender_id\": 123,\n \"fallback_whatsapp_template_id\": 123,\n \"fallback_variable_mapping\": {},\n \"fallback_sms_from_phone_number_id\": 123,\n \"fallback_sms_body\": \"<string>\",\n \"whatsapp_sender_id\": 123,\n \"whatsapp_template_id\": 123,\n \"text_variable_mapping\": {},\n \"messages_per_minute\": 123,\n \"sms_from_phone_number_id\": 123,\n \"sms_body\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"message": "Campaign updated successfully",
"data": {
"id": 1,
"name": "Spring Renewals",
"channel": "call",
"status": "in-progress",
"assistant_id": 42,
"timezone": "Europe/Bucharest",
"max_calls_in_parallel": 3,
"messages_per_minute": 10,
"schedule_windows": [
{ "start": "09:00", "end": "12:00" },
{ "start": "14:00", "end": "18:00" }
],
"scheduled_start_at": null,
"allowed_hours_start_time": "09:00:00",
"allowed_hours_end_time": "12:00:00",
"allowed_days": ["monday", "tuesday", "wednesday", "thursday", "friday"],
"max_retries": 3,
"retry_interval": 60,
"retry_on_voicemail": false,
"retry_on_goal_incomplete": false,
"goal_completion_variable": null,
"mark_complete_when_no_leads": false,
"phone_number_ids": [11, 12],
"whatsapp_sender_id": null,
"whatsapp_template_id": null,
"sms_from_phone_number_id": null,
"sms_body": null,
"text_variable_mapping": null,
"fallback_channel": null,
"fallback_whatsapp_sender_id": null,
"fallback_whatsapp_template_id": null,
"fallback_sms_from_phone_number_id": null,
"fallback_sms_body": null,
"fallback_variable_mapping": null,
"created_at": "2026-07-24 10:00:00",
"updated_at": "2026-10-05 14:30:00"
}
}
{
"message": "This account has no active plan, so this feature is not available."
}
{
"message": "Campaign not found"
}
{
"message": "The channel of an existing campaign cannot be changed.",
"errors": {
"channel": ["The channel of an existing campaign cannot be changed."]
}
}
{
"message": "The status cannot be changed here. Start or stop the campaign instead.",
"errors": {
"status": ["The status cannot be changed here. Start or stop the campaign instead."]
}
}
{
"message": "The priority field is not supported.",
"errors": {
"priority": ["The priority field is not supported."]
}
}
{
"message": "Map every placeholder of the WhatsApp template to a lead variable. Missing: 2.",
"errors": {
"text_variable_mapping": ["Map every placeholder of the WhatsApp template to a lead variable. Missing: 2."]
}
}
{
"message": "The scheduled start date cannot be before today.",
"errors": {
"scheduled_start_at": ["The scheduled start date cannot be before today."]
}
}
Campaigns
Update campaign
Change the settings of a call, WhatsApp, or SMS campaign
PATCH
/
user
/
campaign
/
{id}
Update campaign
curl --request PATCH \
--url https://app.autocalls.ai/api/user/campaign/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"timezone": "<string>",
"schedule_windows": [
{}
],
"allowed_hours_start_time": "<string>",
"allowed_hours_end_time": "<string>",
"allowed_days": [
{}
],
"scheduled_start_at": "<string>",
"max_retries": 123,
"retry_interval": 123,
"mark_complete_when_no_leads": true,
"assistant_id": 123,
"max_calls_in_parallel": 123,
"phone_number_ids": [
{}
],
"retry_on_voicemail": true,
"retry_on_goal_incomplete": true,
"goal_completion_variable": "<string>",
"fallback_channel": "<string>",
"fallback_whatsapp_sender_id": 123,
"fallback_whatsapp_template_id": 123,
"fallback_variable_mapping": {},
"fallback_sms_from_phone_number_id": 123,
"fallback_sms_body": "<string>",
"whatsapp_sender_id": 123,
"whatsapp_template_id": 123,
"text_variable_mapping": {},
"messages_per_minute": 123,
"sms_from_phone_number_id": 123,
"sms_body": "<string>"
}
'import requests
url = "https://app.autocalls.ai/api/user/campaign/{id}"
payload = {
"name": "<string>",
"timezone": "<string>",
"schedule_windows": [{}],
"allowed_hours_start_time": "<string>",
"allowed_hours_end_time": "<string>",
"allowed_days": [{}],
"scheduled_start_at": "<string>",
"max_retries": 123,
"retry_interval": 123,
"mark_complete_when_no_leads": True,
"assistant_id": 123,
"max_calls_in_parallel": 123,
"phone_number_ids": [{}],
"retry_on_voicemail": True,
"retry_on_goal_incomplete": True,
"goal_completion_variable": "<string>",
"fallback_channel": "<string>",
"fallback_whatsapp_sender_id": 123,
"fallback_whatsapp_template_id": 123,
"fallback_variable_mapping": {},
"fallback_sms_from_phone_number_id": 123,
"fallback_sms_body": "<string>",
"whatsapp_sender_id": 123,
"whatsapp_template_id": 123,
"text_variable_mapping": {},
"messages_per_minute": 123,
"sms_from_phone_number_id": 123,
"sms_body": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
timezone: '<string>',
schedule_windows: [{}],
allowed_hours_start_time: '<string>',
allowed_hours_end_time: '<string>',
allowed_days: [{}],
scheduled_start_at: '<string>',
max_retries: 123,
retry_interval: 123,
mark_complete_when_no_leads: true,
assistant_id: 123,
max_calls_in_parallel: 123,
phone_number_ids: [{}],
retry_on_voicemail: true,
retry_on_goal_incomplete: true,
goal_completion_variable: '<string>',
fallback_channel: '<string>',
fallback_whatsapp_sender_id: 123,
fallback_whatsapp_template_id: 123,
fallback_variable_mapping: {},
fallback_sms_from_phone_number_id: 123,
fallback_sms_body: '<string>',
whatsapp_sender_id: 123,
whatsapp_template_id: 123,
text_variable_mapping: {},
messages_per_minute: 123,
sms_from_phone_number_id: 123,
sms_body: '<string>'
})
};
fetch('https://app.autocalls.ai/api/user/campaign/{id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://app.autocalls.ai/api/user/campaign/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'name' => '<string>',
'timezone' => '<string>',
'schedule_windows' => [
[
]
],
'allowed_hours_start_time' => '<string>',
'allowed_hours_end_time' => '<string>',
'allowed_days' => [
[
]
],
'scheduled_start_at' => '<string>',
'max_retries' => 123,
'retry_interval' => 123,
'mark_complete_when_no_leads' => true,
'assistant_id' => 123,
'max_calls_in_parallel' => 123,
'phone_number_ids' => [
[
]
],
'retry_on_voicemail' => true,
'retry_on_goal_incomplete' => true,
'goal_completion_variable' => '<string>',
'fallback_channel' => '<string>',
'fallback_whatsapp_sender_id' => 123,
'fallback_whatsapp_template_id' => 123,
'fallback_variable_mapping' => [
],
'fallback_sms_from_phone_number_id' => 123,
'fallback_sms_body' => '<string>',
'whatsapp_sender_id' => 123,
'whatsapp_template_id' => 123,
'text_variable_mapping' => [
],
'messages_per_minute' => 123,
'sms_from_phone_number_id' => 123,
'sms_body' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://app.autocalls.ai/api/user/campaign/{id}"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"timezone\": \"<string>\",\n \"schedule_windows\": [\n {}\n ],\n \"allowed_hours_start_time\": \"<string>\",\n \"allowed_hours_end_time\": \"<string>\",\n \"allowed_days\": [\n {}\n ],\n \"scheduled_start_at\": \"<string>\",\n \"max_retries\": 123,\n \"retry_interval\": 123,\n \"mark_complete_when_no_leads\": true,\n \"assistant_id\": 123,\n \"max_calls_in_parallel\": 123,\n \"phone_number_ids\": [\n {}\n ],\n \"retry_on_voicemail\": true,\n \"retry_on_goal_incomplete\": true,\n \"goal_completion_variable\": \"<string>\",\n \"fallback_channel\": \"<string>\",\n \"fallback_whatsapp_sender_id\": 123,\n \"fallback_whatsapp_template_id\": 123,\n \"fallback_variable_mapping\": {},\n \"fallback_sms_from_phone_number_id\": 123,\n \"fallback_sms_body\": \"<string>\",\n \"whatsapp_sender_id\": 123,\n \"whatsapp_template_id\": 123,\n \"text_variable_mapping\": {},\n \"messages_per_minute\": 123,\n \"sms_from_phone_number_id\": 123,\n \"sms_body\": \"<string>\"\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.patch("https://app.autocalls.ai/api/user/campaign/{id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"timezone\": \"<string>\",\n \"schedule_windows\": [\n {}\n ],\n \"allowed_hours_start_time\": \"<string>\",\n \"allowed_hours_end_time\": \"<string>\",\n \"allowed_days\": [\n {}\n ],\n \"scheduled_start_at\": \"<string>\",\n \"max_retries\": 123,\n \"retry_interval\": 123,\n \"mark_complete_when_no_leads\": true,\n \"assistant_id\": 123,\n \"max_calls_in_parallel\": 123,\n \"phone_number_ids\": [\n {}\n ],\n \"retry_on_voicemail\": true,\n \"retry_on_goal_incomplete\": true,\n \"goal_completion_variable\": \"<string>\",\n \"fallback_channel\": \"<string>\",\n \"fallback_whatsapp_sender_id\": 123,\n \"fallback_whatsapp_template_id\": 123,\n \"fallback_variable_mapping\": {},\n \"fallback_sms_from_phone_number_id\": 123,\n \"fallback_sms_body\": \"<string>\",\n \"whatsapp_sender_id\": 123,\n \"whatsapp_template_id\": 123,\n \"text_variable_mapping\": {},\n \"messages_per_minute\": 123,\n \"sms_from_phone_number_id\": 123,\n \"sms_body\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.autocalls.ai/api/user/campaign/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"timezone\": \"<string>\",\n \"schedule_windows\": [\n {}\n ],\n \"allowed_hours_start_time\": \"<string>\",\n \"allowed_hours_end_time\": \"<string>\",\n \"allowed_days\": [\n {}\n ],\n \"scheduled_start_at\": \"<string>\",\n \"max_retries\": 123,\n \"retry_interval\": 123,\n \"mark_complete_when_no_leads\": true,\n \"assistant_id\": 123,\n \"max_calls_in_parallel\": 123,\n \"phone_number_ids\": [\n {}\n ],\n \"retry_on_voicemail\": true,\n \"retry_on_goal_incomplete\": true,\n \"goal_completion_variable\": \"<string>\",\n \"fallback_channel\": \"<string>\",\n \"fallback_whatsapp_sender_id\": 123,\n \"fallback_whatsapp_template_id\": 123,\n \"fallback_variable_mapping\": {},\n \"fallback_sms_from_phone_number_id\": 123,\n \"fallback_sms_body\": \"<string>\",\n \"whatsapp_sender_id\": 123,\n \"whatsapp_template_id\": 123,\n \"text_variable_mapping\": {},\n \"messages_per_minute\": 123,\n \"sms_from_phone_number_id\": 123,\n \"sms_body\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"message": "Campaign updated successfully",
"data": {
"id": 1,
"name": "Spring Renewals",
"channel": "call",
"status": "in-progress",
"assistant_id": 42,
"timezone": "Europe/Bucharest",
"max_calls_in_parallel": 3,
"messages_per_minute": 10,
"schedule_windows": [
{ "start": "09:00", "end": "12:00" },
{ "start": "14:00", "end": "18:00" }
],
"scheduled_start_at": null,
"allowed_hours_start_time": "09:00:00",
"allowed_hours_end_time": "12:00:00",
"allowed_days": ["monday", "tuesday", "wednesday", "thursday", "friday"],
"max_retries": 3,
"retry_interval": 60,
"retry_on_voicemail": false,
"retry_on_goal_incomplete": false,
"goal_completion_variable": null,
"mark_complete_when_no_leads": false,
"phone_number_ids": [11, 12],
"whatsapp_sender_id": null,
"whatsapp_template_id": null,
"sms_from_phone_number_id": null,
"sms_body": null,
"text_variable_mapping": null,
"fallback_channel": null,
"fallback_whatsapp_sender_id": null,
"fallback_whatsapp_template_id": null,
"fallback_sms_from_phone_number_id": null,
"fallback_sms_body": null,
"fallback_variable_mapping": null,
"created_at": "2026-07-24 10:00:00",
"updated_at": "2026-10-05 14:30:00"
}
}
{
"message": "This account has no active plan, so this feature is not available."
}
{
"message": "Campaign not found"
}
{
"message": "The channel of an existing campaign cannot be changed.",
"errors": {
"channel": ["The channel of an existing campaign cannot be changed."]
}
}
{
"message": "The status cannot be changed here. Start or stop the campaign instead.",
"errors": {
"status": ["The status cannot be changed here. Start or stop the campaign instead."]
}
}
{
"message": "The priority field is not supported.",
"errors": {
"priority": ["The priority field is not supported."]
}
}
{
"message": "Map every placeholder of the WhatsApp template to a lead variable. Missing: 2.",
"errors": {
"text_variable_mapping": ["Map every placeholder of the WhatsApp template to a lead variable. Missing: 2."]
}
}
{
"message": "The scheduled start date cannot be before today.",
"errors": {
"scheduled_start_at": ["The scheduled start date cannot be before today."]
}
}
Change the settings of a campaign you own, including one that is running. Only the fields you send change: everything you leave out stays as it is, and a list you send (
schedule_windows, allowed_days, phone_number_ids) replaces the current one.
You can send back the data object of Get campaign as it is, with your changes applied. The channel of a campaign cannot be changed, and you start or stop it with Update campaign status.
Changes to a running campaign apply to calls and messages placed after the update. Calls already in progress or queued finish with the previous settings.
Path Parameters
integer
required
The ID of the campaign to update
Request Body
Shared
string
Campaign name. Maximum 255 characters.
string
IANA timezone for the send/call windows (e.g.
America/New_York).array
1 to 6 daily windows as objects with
start and end in HH:MM. A window runs overnight when end is earlier than start (e.g. 16:00 → 02:00). Replaces the current windows.string
Legacy single-window start (
HH:MM). Sets the start of the first window when schedule_windows is not sent.string
Legacy single-window end (
HH:MM). Sets the end of the first window when schedule_windows is not sent. Overnight when end < start.array
Weekdays when calls or messages can go out:
monday … sunday. At least one. Replaces the current days.string
ISO 8601 date and time to start the campaign automatically. Without an offset it is read in the campaign timezone. The date cannot be before today.A campaign that isn’t running (for example
draft, paused or completed) becomes scheduled and starts by itself at that time. A running campaign keeps running. Set to null to clear it: a scheduled campaign goes back to draft.integer
Max retry attempts per lead. Range: 1–5.
integer
Minutes between retries. Range: 10–4320.
boolean
true completes the campaign once every lead has been processed. false keeps it waiting for new leads, which campaigns fed by an automation or the API need.Turning it off doesn’t reopen a campaign that has already completed: start it again with Update campaign status.Call campaigns
integer
An OUTBOUND assistant you own. Changing it also moves the campaign to that assistant’s timezone, unless you send
timezone in the same request. The goal variable is cleared if the new assistant doesn’t have it as a True/False post-call variable.integer
Concurrent calls, up to your plan’s limit (max 10).
array
The numbers to call from. Replaces the whole pool. Send
[] to remove all numbers; calls then use the assistant’s own number. Numbers you add must be available to your account.boolean
Retry when a call hits voicemail.
boolean
Keep retrying until the goal variable is true. Turning it off clears
goal_completion_variable.string
A True/False (
bool) post-call variable of the campaign’s assistant, used with retry_on_goal_incomplete. It is cleared while retry_on_goal_incomplete is off.string
Text follow-up after the last call retry:
whatsapp or sms. Set to null to turn the follow-up off, which also clears its settings. Switching between whatsapp and sms clears the settings of the other one.integer
WhatsApp sender for the follow-up. A new sender also needs
fallback_whatsapp_template_id.integer
An approved template on that sender. Placeholders it shares with the current follow-up template keep their mapping; if it has other placeholders, send the full
fallback_variable_mapping in the same request.object
Maps every placeholder of the follow-up template (e.g.
"1") to a lead variable key, and nothing else.integer
SMS-capable number for the follow-up, available to your account.
string
Follow-up SMS text. Max 1600 characters. Supports
{{variable}} placeholders.WhatsApp campaigns
integer
A sender you own. A new sender also needs
whatsapp_template_id.integer
An approved template on that sender. Placeholders it shares with the current template keep their mapping; if it has other placeholders, send the full
text_variable_mapping in the same request.object
Maps every template placeholder (e.g.
"1") to a lead variable key, and nothing else. Replaces the current mapping.integer
Per-campaign send rate. Range: 1–10.
SMS campaigns
integer
An SMS-capable number available to your account.
string
Message text. Max 1600 characters. Supports
{{variable}} placeholders.integer
Per-campaign send rate. Range: 1–10.
Example Requests
Rename and set new calling windows
{
"name": "Spring Renewals",
"schedule_windows": [
{ "start": "09:00", "end": "12:00" },
{ "start": "14:00", "end": "18:00" }
]
}
Keep waiting for leads from an automation
The campaign keeps waiting for new leads instead of completing once its current leads have been processed.{
"mark_complete_when_no_leads": false
}
Replace the phone number pool
The campaign calls from exactly these numbers. Send[] to remove them all and call from the assistant’s own number.
{
"phone_number_ids": [11, 14, 15]
}
Schedule a start
Without an offset, the time is read in the campaign timezone. The campaign becomesscheduled and starts by itself at that time. Send null to clear it.
{
"scheduled_start_at": "2026-10-12T09:00:00"
}
Response
string
Success message
object
The campaign after the update, in the same shape as Get campaign.
Error responses
The account has no active plan, its plan doesn’t include campaigns, or campaigns are turned off for it.
The campaign does not exist or does not belong to you. Also returned for a campaign beyond your plan’s campaign limit.
Validation errors, a change of
channel or status, or an unknown field. Nothing is saved.{
"message": "Campaign updated successfully",
"data": {
"id": 1,
"name": "Spring Renewals",
"channel": "call",
"status": "in-progress",
"assistant_id": 42,
"timezone": "Europe/Bucharest",
"max_calls_in_parallel": 3,
"messages_per_minute": 10,
"schedule_windows": [
{ "start": "09:00", "end": "12:00" },
{ "start": "14:00", "end": "18:00" }
],
"scheduled_start_at": null,
"allowed_hours_start_time": "09:00:00",
"allowed_hours_end_time": "12:00:00",
"allowed_days": ["monday", "tuesday", "wednesday", "thursday", "friday"],
"max_retries": 3,
"retry_interval": 60,
"retry_on_voicemail": false,
"retry_on_goal_incomplete": false,
"goal_completion_variable": null,
"mark_complete_when_no_leads": false,
"phone_number_ids": [11, 12],
"whatsapp_sender_id": null,
"whatsapp_template_id": null,
"sms_from_phone_number_id": null,
"sms_body": null,
"text_variable_mapping": null,
"fallback_channel": null,
"fallback_whatsapp_sender_id": null,
"fallback_whatsapp_template_id": null,
"fallback_sms_from_phone_number_id": null,
"fallback_sms_body": null,
"fallback_variable_mapping": null,
"created_at": "2026-07-24 10:00:00",
"updated_at": "2026-10-05 14:30:00"
}
}
{
"message": "This account has no active plan, so this feature is not available."
}
{
"message": "Campaign not found"
}
{
"message": "The channel of an existing campaign cannot be changed.",
"errors": {
"channel": ["The channel of an existing campaign cannot be changed."]
}
}
{
"message": "The status cannot be changed here. Start or stop the campaign instead.",
"errors": {
"status": ["The status cannot be changed here. Start or stop the campaign instead."]
}
}
{
"message": "The priority field is not supported.",
"errors": {
"priority": ["The priority field is not supported."]
}
}
{
"message": "Map every placeholder of the WhatsApp template to a lead variable. Missing: 2.",
"errors": {
"text_variable_mapping": ["Map every placeholder of the WhatsApp template to a lead variable. Missing: 2."]
}
}
{
"message": "The scheduled start date cannot be before today.",
"errors": {
"scheduled_start_at": ["The scheduled start date cannot be before today."]
}
}
Notes
- Only the fields you send change. A list you send (
schedule_windows,allowed_days,phone_number_ids) replaces the current one - You can send back the
dataobject of Get campaign as it is. Its read-only fields (id,created_at,updated_at) are ignored, and so arechannelandstatuswhile they keep their current values - Fields of another channel are ignored.
phone_number_idson a WhatsApp or SMS campaign returns 422 - Changing
channelreturns 422 (“The channel of an existing campaign cannot be changed.”). Changingstatusalso returns 422: start or stop the campaign with Update campaign status - An unknown field returns 422 (“The X field is not supported.”)
- When a request returns an error, nothing is saved
- Running campaigns can be edited. Changes apply to calls and messages placed after the update; calls already in progress or queued finish with the previous settings
- Leading and trailing spaces are removed from text values, and an empty string counts as
null - If your plan limits the number of campaigns, only your newest campaigns up to that limit can be updated; older ones return 404

