curl --request PUT \
--url https://api.callers.ai/campaigns/{campaignId} \
--header 'Authorization: <api-key>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "Customer follow-up calls",
"type": "CALL",
"isIncoming": false,
"steps": [
{
"id": "greeting",
"type": "OTHER",
"template": "Hello {{name}}, how can I help?",
"meeting": null,
"description": null
}
]
}
'import requests
url = "https://api.callers.ai/campaigns/{campaignId}"
payload = {
"name": "Customer follow-up calls",
"type": "CALL",
"isIncoming": False,
"steps": [
{
"id": "greeting",
"type": "OTHER",
"template": "Hello {{name}}, how can I help?",
"meeting": None,
"description": None
}
]
}
headers = {
"Authorization": "<api-key>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {Authorization: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: 'Customer follow-up calls',
type: 'CALL',
isIncoming: false,
steps: [
{
id: 'greeting',
type: 'OTHER',
template: 'Hello {{name}}, how can I help?',
meeting: null,
description: null
}
]
})
};
fetch('https://api.callers.ai/campaigns/{campaignId}', 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://api.callers.ai/campaigns/{campaignId}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'name' => 'Customer follow-up calls',
'type' => 'CALL',
'isIncoming' => false,
'steps' => [
[
'id' => 'greeting',
'type' => 'OTHER',
'template' => 'Hello {{name}}, how can I help?',
'meeting' => null,
'description' => null
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: <api-key>",
"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://api.callers.ai/campaigns/{campaignId}"
payload := strings.NewReader("{\n \"name\": \"Customer follow-up calls\",\n \"type\": \"CALL\",\n \"isIncoming\": false,\n \"steps\": [\n {\n \"id\": \"greeting\",\n \"type\": \"OTHER\",\n \"template\": \"Hello {{name}}, how can I help?\",\n \"meeting\": null,\n \"description\": null\n }\n ]\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("Authorization", "<api-key>")
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.put("https://api.callers.ai/campaigns/{campaignId}")
.header("Authorization", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"Customer follow-up calls\",\n \"type\": \"CALL\",\n \"isIncoming\": false,\n \"steps\": [\n {\n \"id\": \"greeting\",\n \"type\": \"OTHER\",\n \"template\": \"Hello {{name}}, how can I help?\",\n \"meeting\": null,\n \"description\": null\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.callers.ai/campaigns/{campaignId}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Authorization"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"Customer follow-up calls\",\n \"type\": \"CALL\",\n \"isIncoming\": false,\n \"steps\": [\n {\n \"id\": \"greeting\",\n \"type\": \"OTHER\",\n \"template\": \"Hello {{name}}, how can I help?\",\n \"meeting\": null,\n \"description\": null\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"status": "success",
"data": {
"id": "<string>",
"name": "<string>",
"active": true,
"firstInteractionAt": "<string>",
"completedAt": "<string>",
"callParams": {
"phonesFrom": [
"<string>"
],
"timezone": "<string>",
"daysOfWeek": [
"<string>"
],
"language": "<string>",
"approvedCountries": [
"<string>"
]
},
"organizationId": "<string>",
"webhooks": [
"<string>"
],
"slackUrl": "<string>",
"isIncoming": true,
"variables": [
"<string>"
],
"pauseNewChats": true,
"emailParams": {
"outboundConnectionIds": [
"<string>"
],
"inboundConnectionIds": [
"<string>"
],
"emailSelectionStrategy": "ROTATE",
"followUpSteps": [
{
"delayValue": 123,
"delayUnit": "min",
"contentMode": "HUMAN_TEMPLATE",
"body": "<string>",
"prompt": "<string>"
}
],
"followUpRespectSchedule": true,
"followUpOnlyIfNoReply": true,
"fallbackEnabled": true,
"retryFollowUp": true,
"signature": "<string>",
"signatureName": "<string>",
"defaultSubject": "<string>",
"timezone": "<string>"
},
"incomingPhoneNumber": "<string>",
"campaignGroupId": "<string>",
"campaignGroupName": "<string>"
}
}{
"status": "error",
"message": "<string>",
"data": [
{}
]
}{
"status": "error",
"message": "<string>"
}{
"status": "error",
"message": "<string>"
}{
"status": "error",
"message": "<string>"
}Replace campaign configuration
Replaces the complete writable campaign configuration using the same relaxed, defaulted schema as campaign creation. No phone number or voice is inferred from the organization. Omitted fields return to their schema defaults, supplied arrays replace existing arrays, empty arrays clear them, and null clears nullable fields. Use PATCH instead when changing only name, phoneNumbers, or webhooks. Lifecycle state is preserved unless the campaign is changed to a trigger campaign, which activates immediately. Ownership, audit, generated credentials, and provider-managed fields are preserved by the server.
curl --request PUT \
--url https://api.callers.ai/campaigns/{campaignId} \
--header 'Authorization: <api-key>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "Customer follow-up calls",
"type": "CALL",
"isIncoming": false,
"steps": [
{
"id": "greeting",
"type": "OTHER",
"template": "Hello {{name}}, how can I help?",
"meeting": null,
"description": null
}
]
}
'import requests
url = "https://api.callers.ai/campaigns/{campaignId}"
payload = {
"name": "Customer follow-up calls",
"type": "CALL",
"isIncoming": False,
"steps": [
{
"id": "greeting",
"type": "OTHER",
"template": "Hello {{name}}, how can I help?",
"meeting": None,
"description": None
}
]
}
headers = {
"Authorization": "<api-key>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {Authorization: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: 'Customer follow-up calls',
type: 'CALL',
isIncoming: false,
steps: [
{
id: 'greeting',
type: 'OTHER',
template: 'Hello {{name}}, how can I help?',
meeting: null,
description: null
}
]
})
};
fetch('https://api.callers.ai/campaigns/{campaignId}', 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://api.callers.ai/campaigns/{campaignId}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'name' => 'Customer follow-up calls',
'type' => 'CALL',
'isIncoming' => false,
'steps' => [
[
'id' => 'greeting',
'type' => 'OTHER',
'template' => 'Hello {{name}}, how can I help?',
'meeting' => null,
'description' => null
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: <api-key>",
"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://api.callers.ai/campaigns/{campaignId}"
payload := strings.NewReader("{\n \"name\": \"Customer follow-up calls\",\n \"type\": \"CALL\",\n \"isIncoming\": false,\n \"steps\": [\n {\n \"id\": \"greeting\",\n \"type\": \"OTHER\",\n \"template\": \"Hello {{name}}, how can I help?\",\n \"meeting\": null,\n \"description\": null\n }\n ]\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("Authorization", "<api-key>")
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.put("https://api.callers.ai/campaigns/{campaignId}")
.header("Authorization", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"Customer follow-up calls\",\n \"type\": \"CALL\",\n \"isIncoming\": false,\n \"steps\": [\n {\n \"id\": \"greeting\",\n \"type\": \"OTHER\",\n \"template\": \"Hello {{name}}, how can I help?\",\n \"meeting\": null,\n \"description\": null\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.callers.ai/campaigns/{campaignId}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Authorization"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"Customer follow-up calls\",\n \"type\": \"CALL\",\n \"isIncoming\": false,\n \"steps\": [\n {\n \"id\": \"greeting\",\n \"type\": \"OTHER\",\n \"template\": \"Hello {{name}}, how can I help?\",\n \"meeting\": null,\n \"description\": null\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"status": "success",
"data": {
"id": "<string>",
"name": "<string>",
"active": true,
"firstInteractionAt": "<string>",
"completedAt": "<string>",
"callParams": {
"phonesFrom": [
"<string>"
],
"timezone": "<string>",
"daysOfWeek": [
"<string>"
],
"language": "<string>",
"approvedCountries": [
"<string>"
]
},
"organizationId": "<string>",
"webhooks": [
"<string>"
],
"slackUrl": "<string>",
"isIncoming": true,
"variables": [
"<string>"
],
"pauseNewChats": true,
"emailParams": {
"outboundConnectionIds": [
"<string>"
],
"inboundConnectionIds": [
"<string>"
],
"emailSelectionStrategy": "ROTATE",
"followUpSteps": [
{
"delayValue": 123,
"delayUnit": "min",
"contentMode": "HUMAN_TEMPLATE",
"body": "<string>",
"prompt": "<string>"
}
],
"followUpRespectSchedule": true,
"followUpOnlyIfNoReply": true,
"fallbackEnabled": true,
"retryFollowUp": true,
"signature": "<string>",
"signatureName": "<string>",
"defaultSubject": "<string>",
"timezone": "<string>"
},
"incomingPhoneNumber": "<string>",
"campaignGroupId": "<string>",
"campaignGroupName": "<string>"
}
}{
"status": "error",
"message": "<string>",
"data": [
{}
]
}{
"status": "error",
"message": "<string>"
}{
"status": "error",
"message": "<string>"
}{
"status": "error",
"message": "<string>"
}Authorizations
Headers
Optional sub organization ID. Must belong to your main organization API key.
Path Parameters
ID of the campaign to replace
^[0-9a-fA-F]{24}$Body
Human-readable campaign name. Minimum 3 characters.
3Legacy flat script steps. Use this or nestedSteps; omitted scripts receive the standard starter step.
Show child attributes
Show child attributes
Hierarchical script nodes containing prompts, actions, transfers, forms, and meetings.
Show child attributes
Show child attributes
Directed graph edges connecting script and nested-script nodes.
Show child attributes
Show child attributes
Fallback behavior for silence, errors, retries, and unhandled input.
Show child attributes
Show child attributes
Interest classification criteria. Include a non-empty value when defining a custom criterion.
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Whether interactions are initiated by the customer. Defaults to false.
Typed script variables. Omit to receive direction-aware defaults.
Show child attributes
Show child attributes
1 < x < 20Call, speech, scheduling, retry, recording, voicemail, web-call, and model settings. Nested fields use the same defaults as the UI.
Show child attributes
Show child attributes
Chat channel, sender numbers, cadence, and drop-off configuration.
Show child attributes
Show child attributes
Email connections, sender behavior, follow-up cadence, content, and signature configuration.
Show child attributes
Show child attributes
Post-interaction summary questions. Each question requires a non-empty name; description and options are optional.
Show child attributes
Show child attributes
Callable HTTP or integration actions available during an interaction. Every function definition and every parameter property must include a non-empty description. External tools require apiData; ActivePieces tools require activePieceData.
Show child attributes
Show child attributes
Trigger definitions used by trigger and event-driven campaigns.
Show child attributes
Show child attributes
Actions run before an outbound call. ActivePieces actions require their activePieceAction configuration.
Show child attributes
Show child attributes
Knowledge bases available to the campaign. IDs must belong to the authenticated organization.
Optional campaign group ID from the authenticated organization.
ROTATE_NUMBERS, PREFER_LOCAL_NUMBERS, AUTO_OPTIMIZE Campaign channel: CALL, CHAT, EMAIL, or TRIGGER. Defaults to CALL.
CALL, CHAT, TRIGGER, EMAIL Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Convenience alias for callParams.voice. When supplied, this value takes precedence.
^[0-9a-fA-F]{24}$Convenience alias for callParams.phonesFrom. When supplied, this list takes precedence; an empty list clears assigned call numbers.
Show child attributes
Show child attributes