curl --request POST \
--url https://api.peachdeskai.com/api/v1/campaign/create \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"workflow_id": 123,
"source_type": "<string>",
"source_id": "<string>",
"telephony_configuration_id": 123,
"retry_config": {
"enabled": true,
"max_retries": 2,
"retry_delay_seconds": 120,
"retry_on_busy": true,
"retry_on_no_answer": true,
"retry_on_voicemail": true
},
"max_concurrency": 50,
"schedule_config": {
"slots": [
{
"day_of_week": 3,
"start_time": "<string>",
"end_time": "<string>"
}
],
"enabled": true,
"timezone": "UTC"
},
"circuit_breaker": {
"enabled": true,
"failure_threshold": 0.5,
"window_seconds": 120,
"min_calls_in_window": 5
},
"acknowledge_warnings": false
}
'import requests
url = "https://api.peachdeskai.com/api/v1/campaign/create"
payload = {
"name": "<string>",
"workflow_id": 123,
"source_type": "<string>",
"source_id": "<string>",
"telephony_configuration_id": 123,
"retry_config": {
"enabled": True,
"max_retries": 2,
"retry_delay_seconds": 120,
"retry_on_busy": True,
"retry_on_no_answer": True,
"retry_on_voicemail": True
},
"max_concurrency": 50,
"schedule_config": {
"slots": [
{
"day_of_week": 3,
"start_time": "<string>",
"end_time": "<string>"
}
],
"enabled": True,
"timezone": "UTC"
},
"circuit_breaker": {
"enabled": True,
"failure_threshold": 0.5,
"window_seconds": 120,
"min_calls_in_window": 5
},
"acknowledge_warnings": False
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
workflow_id: 123,
source_type: '<string>',
source_id: '<string>',
telephony_configuration_id: 123,
retry_config: {
enabled: true,
max_retries: 2,
retry_delay_seconds: 120,
retry_on_busy: true,
retry_on_no_answer: true,
retry_on_voicemail: true
},
max_concurrency: 50,
schedule_config: {
slots: [{day_of_week: 3, start_time: '<string>', end_time: '<string>'}],
enabled: true,
timezone: 'UTC'
},
circuit_breaker: {
enabled: true,
failure_threshold: 0.5,
window_seconds: 120,
min_calls_in_window: 5
},
acknowledge_warnings: false
})
};
fetch('https://api.peachdeskai.com/api/v1/campaign/create', 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.peachdeskai.com/api/v1/campaign/create",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'name' => '<string>',
'workflow_id' => 123,
'source_type' => '<string>',
'source_id' => '<string>',
'telephony_configuration_id' => 123,
'retry_config' => [
'enabled' => true,
'max_retries' => 2,
'retry_delay_seconds' => 120,
'retry_on_busy' => true,
'retry_on_no_answer' => true,
'retry_on_voicemail' => true
],
'max_concurrency' => 50,
'schedule_config' => [
'slots' => [
[
'day_of_week' => 3,
'start_time' => '<string>',
'end_time' => '<string>'
]
],
'enabled' => true,
'timezone' => 'UTC'
],
'circuit_breaker' => [
'enabled' => true,
'failure_threshold' => 0.5,
'window_seconds' => 120,
'min_calls_in_window' => 5
],
'acknowledge_warnings' => false
]),
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://api.peachdeskai.com/api/v1/campaign/create"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"workflow_id\": 123,\n \"source_type\": \"<string>\",\n \"source_id\": \"<string>\",\n \"telephony_configuration_id\": 123,\n \"retry_config\": {\n \"enabled\": true,\n \"max_retries\": 2,\n \"retry_delay_seconds\": 120,\n \"retry_on_busy\": true,\n \"retry_on_no_answer\": true,\n \"retry_on_voicemail\": true\n },\n \"max_concurrency\": 50,\n \"schedule_config\": {\n \"slots\": [\n {\n \"day_of_week\": 3,\n \"start_time\": \"<string>\",\n \"end_time\": \"<string>\"\n }\n ],\n \"enabled\": true,\n \"timezone\": \"UTC\"\n },\n \"circuit_breaker\": {\n \"enabled\": true,\n \"failure_threshold\": 0.5,\n \"window_seconds\": 120,\n \"min_calls_in_window\": 5\n },\n \"acknowledge_warnings\": false\n}")
req, _ := http.NewRequest("POST", 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.post("https://api.peachdeskai.com/api/v1/campaign/create")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"workflow_id\": 123,\n \"source_type\": \"<string>\",\n \"source_id\": \"<string>\",\n \"telephony_configuration_id\": 123,\n \"retry_config\": {\n \"enabled\": true,\n \"max_retries\": 2,\n \"retry_delay_seconds\": 120,\n \"retry_on_busy\": true,\n \"retry_on_no_answer\": true,\n \"retry_on_voicemail\": true\n },\n \"max_concurrency\": 50,\n \"schedule_config\": {\n \"slots\": [\n {\n \"day_of_week\": 3,\n \"start_time\": \"<string>\",\n \"end_time\": \"<string>\"\n }\n ],\n \"enabled\": true,\n \"timezone\": \"UTC\"\n },\n \"circuit_breaker\": {\n \"enabled\": true,\n \"failure_threshold\": 0.5,\n \"window_seconds\": 120,\n \"min_calls_in_window\": 5\n },\n \"acknowledge_warnings\": false\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.peachdeskai.com/api/v1/campaign/create")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"workflow_id\": 123,\n \"source_type\": \"<string>\",\n \"source_id\": \"<string>\",\n \"telephony_configuration_id\": 123,\n \"retry_config\": {\n \"enabled\": true,\n \"max_retries\": 2,\n \"retry_delay_seconds\": 120,\n \"retry_on_busy\": true,\n \"retry_on_no_answer\": true,\n \"retry_on_voicemail\": true\n },\n \"max_concurrency\": 50,\n \"schedule_config\": {\n \"slots\": [\n {\n \"day_of_week\": 3,\n \"start_time\": \"<string>\",\n \"end_time\": \"<string>\"\n }\n ],\n \"enabled\": true,\n \"timezone\": \"UTC\"\n },\n \"circuit_breaker\": {\n \"enabled\": true,\n \"failure_threshold\": 0.5,\n \"window_seconds\": 120,\n \"min_calls_in_window\": 5\n },\n \"acknowledge_warnings\": false\n}"
response = http.request(request)
puts response.read_body{
"id": 123,
"name": "<string>",
"workflow_id": 123,
"workflow_name": "<string>",
"state": "<string>",
"source_type": "<string>",
"source_id": "<string>",
"total_rows": 123,
"processed_rows": 123,
"failed_rows": 123,
"created_at": "2023-11-07T05:31:56Z",
"started_at": "2023-11-07T05:31:56Z",
"completed_at": "2023-11-07T05:31:56Z",
"retry_config": {
"enabled": true,
"max_retries": 123,
"retry_delay_seconds": 123,
"retry_on_busy": true,
"retry_on_no_answer": true,
"retry_on_voicemail": true
},
"max_concurrency": 123,
"schedule_config": {
"enabled": true,
"timezone": "<string>",
"slots": [
{
"day_of_week": 123,
"start_time": "<string>",
"end_time": "<string>"
}
]
},
"circuit_breaker": {
"enabled": false,
"failure_threshold": 0.5,
"window_seconds": 120,
"min_calls_in_window": 5
},
"executed_count": 0,
"total_queued_count": 0,
"parent_campaign_id": 123,
"redialed_campaign_id": 123,
"telephony_configuration_id": 123,
"telephony_configuration_name": "<string>",
"logs": [
{
"ts": "<string>",
"level": "<string>",
"event": "<string>",
"message": "<string>",
"details": {}
}
],
"failure": {
"code": "<string>",
"title": "<string>",
"message": "<string>",
"remediation": "<string>",
"occurred_at": "2023-11-07T05:31:56Z",
"reference": "<string>"
},
"source_rejections": {
"rows_read": 123,
"accepted": 123,
"rejected": 123,
"rejections_by_reason": {}
}
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}Create Campaign
Create a new outbound calling campaign
curl --request POST \
--url https://api.peachdeskai.com/api/v1/campaign/create \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"workflow_id": 123,
"source_type": "<string>",
"source_id": "<string>",
"telephony_configuration_id": 123,
"retry_config": {
"enabled": true,
"max_retries": 2,
"retry_delay_seconds": 120,
"retry_on_busy": true,
"retry_on_no_answer": true,
"retry_on_voicemail": true
},
"max_concurrency": 50,
"schedule_config": {
"slots": [
{
"day_of_week": 3,
"start_time": "<string>",
"end_time": "<string>"
}
],
"enabled": true,
"timezone": "UTC"
},
"circuit_breaker": {
"enabled": true,
"failure_threshold": 0.5,
"window_seconds": 120,
"min_calls_in_window": 5
},
"acknowledge_warnings": false
}
'import requests
url = "https://api.peachdeskai.com/api/v1/campaign/create"
payload = {
"name": "<string>",
"workflow_id": 123,
"source_type": "<string>",
"source_id": "<string>",
"telephony_configuration_id": 123,
"retry_config": {
"enabled": True,
"max_retries": 2,
"retry_delay_seconds": 120,
"retry_on_busy": True,
"retry_on_no_answer": True,
"retry_on_voicemail": True
},
"max_concurrency": 50,
"schedule_config": {
"slots": [
{
"day_of_week": 3,
"start_time": "<string>",
"end_time": "<string>"
}
],
"enabled": True,
"timezone": "UTC"
},
"circuit_breaker": {
"enabled": True,
"failure_threshold": 0.5,
"window_seconds": 120,
"min_calls_in_window": 5
},
"acknowledge_warnings": False
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
workflow_id: 123,
source_type: '<string>',
source_id: '<string>',
telephony_configuration_id: 123,
retry_config: {
enabled: true,
max_retries: 2,
retry_delay_seconds: 120,
retry_on_busy: true,
retry_on_no_answer: true,
retry_on_voicemail: true
},
max_concurrency: 50,
schedule_config: {
slots: [{day_of_week: 3, start_time: '<string>', end_time: '<string>'}],
enabled: true,
timezone: 'UTC'
},
circuit_breaker: {
enabled: true,
failure_threshold: 0.5,
window_seconds: 120,
min_calls_in_window: 5
},
acknowledge_warnings: false
})
};
fetch('https://api.peachdeskai.com/api/v1/campaign/create', 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.peachdeskai.com/api/v1/campaign/create",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'name' => '<string>',
'workflow_id' => 123,
'source_type' => '<string>',
'source_id' => '<string>',
'telephony_configuration_id' => 123,
'retry_config' => [
'enabled' => true,
'max_retries' => 2,
'retry_delay_seconds' => 120,
'retry_on_busy' => true,
'retry_on_no_answer' => true,
'retry_on_voicemail' => true
],
'max_concurrency' => 50,
'schedule_config' => [
'slots' => [
[
'day_of_week' => 3,
'start_time' => '<string>',
'end_time' => '<string>'
]
],
'enabled' => true,
'timezone' => 'UTC'
],
'circuit_breaker' => [
'enabled' => true,
'failure_threshold' => 0.5,
'window_seconds' => 120,
'min_calls_in_window' => 5
],
'acknowledge_warnings' => false
]),
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://api.peachdeskai.com/api/v1/campaign/create"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"workflow_id\": 123,\n \"source_type\": \"<string>\",\n \"source_id\": \"<string>\",\n \"telephony_configuration_id\": 123,\n \"retry_config\": {\n \"enabled\": true,\n \"max_retries\": 2,\n \"retry_delay_seconds\": 120,\n \"retry_on_busy\": true,\n \"retry_on_no_answer\": true,\n \"retry_on_voicemail\": true\n },\n \"max_concurrency\": 50,\n \"schedule_config\": {\n \"slots\": [\n {\n \"day_of_week\": 3,\n \"start_time\": \"<string>\",\n \"end_time\": \"<string>\"\n }\n ],\n \"enabled\": true,\n \"timezone\": \"UTC\"\n },\n \"circuit_breaker\": {\n \"enabled\": true,\n \"failure_threshold\": 0.5,\n \"window_seconds\": 120,\n \"min_calls_in_window\": 5\n },\n \"acknowledge_warnings\": false\n}")
req, _ := http.NewRequest("POST", 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.post("https://api.peachdeskai.com/api/v1/campaign/create")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"workflow_id\": 123,\n \"source_type\": \"<string>\",\n \"source_id\": \"<string>\",\n \"telephony_configuration_id\": 123,\n \"retry_config\": {\n \"enabled\": true,\n \"max_retries\": 2,\n \"retry_delay_seconds\": 120,\n \"retry_on_busy\": true,\n \"retry_on_no_answer\": true,\n \"retry_on_voicemail\": true\n },\n \"max_concurrency\": 50,\n \"schedule_config\": {\n \"slots\": [\n {\n \"day_of_week\": 3,\n \"start_time\": \"<string>\",\n \"end_time\": \"<string>\"\n }\n ],\n \"enabled\": true,\n \"timezone\": \"UTC\"\n },\n \"circuit_breaker\": {\n \"enabled\": true,\n \"failure_threshold\": 0.5,\n \"window_seconds\": 120,\n \"min_calls_in_window\": 5\n },\n \"acknowledge_warnings\": false\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.peachdeskai.com/api/v1/campaign/create")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"workflow_id\": 123,\n \"source_type\": \"<string>\",\n \"source_id\": \"<string>\",\n \"telephony_configuration_id\": 123,\n \"retry_config\": {\n \"enabled\": true,\n \"max_retries\": 2,\n \"retry_delay_seconds\": 120,\n \"retry_on_busy\": true,\n \"retry_on_no_answer\": true,\n \"retry_on_voicemail\": true\n },\n \"max_concurrency\": 50,\n \"schedule_config\": {\n \"slots\": [\n {\n \"day_of_week\": 3,\n \"start_time\": \"<string>\",\n \"end_time\": \"<string>\"\n }\n ],\n \"enabled\": true,\n \"timezone\": \"UTC\"\n },\n \"circuit_breaker\": {\n \"enabled\": true,\n \"failure_threshold\": 0.5,\n \"window_seconds\": 120,\n \"min_calls_in_window\": 5\n },\n \"acknowledge_warnings\": false\n}"
response = http.request(request)
puts response.read_body{
"id": 123,
"name": "<string>",
"workflow_id": 123,
"workflow_name": "<string>",
"state": "<string>",
"source_type": "<string>",
"source_id": "<string>",
"total_rows": 123,
"processed_rows": 123,
"failed_rows": 123,
"created_at": "2023-11-07T05:31:56Z",
"started_at": "2023-11-07T05:31:56Z",
"completed_at": "2023-11-07T05:31:56Z",
"retry_config": {
"enabled": true,
"max_retries": 123,
"retry_delay_seconds": 123,
"retry_on_busy": true,
"retry_on_no_answer": true,
"retry_on_voicemail": true
},
"max_concurrency": 123,
"schedule_config": {
"enabled": true,
"timezone": "<string>",
"slots": [
{
"day_of_week": 123,
"start_time": "<string>",
"end_time": "<string>"
}
]
},
"circuit_breaker": {
"enabled": false,
"failure_threshold": 0.5,
"window_seconds": 120,
"min_calls_in_window": 5
},
"executed_count": 0,
"total_queued_count": 0,
"parent_campaign_id": 123,
"redialed_campaign_id": 123,
"telephony_configuration_id": 123,
"telephony_configuration_name": "<string>",
"logs": [
{
"ts": "<string>",
"level": "<string>",
"event": "<string>",
"message": "<string>",
"details": {}
}
],
"failure": {
"code": "<string>",
"title": "<string>",
"message": "<string>",
"remediation": "<string>",
"occurred_at": "2023-11-07T05:31:56Z",
"reference": "<string>"
},
"source_rejections": {
"rows_read": 123,
"accepted": 123,
"rejected": 123,
"rejections_by_reason": {}
}
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}source_url.
Set telephony_configuration_id to pin the campaign to a specific telephony configuration. If omitted, Peachdesk falls back to the organizationтАЩs default outbound configuration тАФ supplying an id that doesnтАЩt exist in your organization returns 400 telephony_configuration_not_found.
The time_slots field controls when Peachdesk is allowed to place calls. If omitted, calls can be placed at any time. The timezone field applies to all time slot windows.
{
"time_slots": [
{ "day": "monday", "start": "09:00", "end": "17:00" },
{ "day": "tuesday", "start": "09:00", "end": "17:00" }
]
}
draft status. Call Start to begin dialing.Authorizations
Interactive user session: the login JWT, sent as Authorization: Bearer <token>.
Body
1 - 255^csv$Show child attributes
Show child attributes
1 <= x <= 100Show child attributes
Show child attributes
Show child attributes
Show child attributes
Response
Successful Response
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
The customer-facing shape returned by the API and stored in the log.
Show child attributes
Show child attributes
What a campaign's contact source dropped at ingest.
Present only when something was actually rejected - a campaign that lost
nothing carries None here, so the UI renders no surface rather than an
empty one reading zero.
Field names match the sequence import response (api/routes/sequences.py)
so one UI component can render both surfaces. rejections_by_reason is
keyed by RejectionReason.
Counts only, deliberately. No offending cell value is carried or stored -
see rejection_summary for the ruling and why the sequence side's
approval to store it does not extend to this surface.
Show child attributes
Show child attributes

