curl --request POST \
--url https://api.peachdeskai.com/api/v1/campaign/{campaign_id}/redial \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"retry_on_voicemail": true,
"retry_on_no_answer": true,
"retry_on_busy": true,
"retry_config": {
"enabled": true,
"max_retries": 2,
"retry_delay_seconds": 120,
"retry_on_busy": true,
"retry_on_no_answer": true,
"retry_on_voicemail": true
}
}
'import requests
url = "https://api.peachdeskai.com/api/v1/campaign/{campaign_id}/redial"
payload = {
"name": "<string>",
"retry_on_voicemail": True,
"retry_on_no_answer": True,
"retry_on_busy": True,
"retry_config": {
"enabled": True,
"max_retries": 2,
"retry_delay_seconds": 120,
"retry_on_busy": True,
"retry_on_no_answer": True,
"retry_on_voicemail": True
}
}
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>',
retry_on_voicemail: true,
retry_on_no_answer: true,
retry_on_busy: true,
retry_config: {
enabled: true,
max_retries: 2,
retry_delay_seconds: 120,
retry_on_busy: true,
retry_on_no_answer: true,
retry_on_voicemail: true
}
})
};
fetch('https://api.peachdeskai.com/api/v1/campaign/{campaign_id}/redial', 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/{campaign_id}/redial",
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>',
'retry_on_voicemail' => true,
'retry_on_no_answer' => true,
'retry_on_busy' => true,
'retry_config' => [
'enabled' => true,
'max_retries' => 2,
'retry_delay_seconds' => 120,
'retry_on_busy' => true,
'retry_on_no_answer' => true,
'retry_on_voicemail' => true
]
]),
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/{campaign_id}/redial"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"retry_on_voicemail\": true,\n \"retry_on_no_answer\": true,\n \"retry_on_busy\": true,\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}")
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/{campaign_id}/redial")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"retry_on_voicemail\": true,\n \"retry_on_no_answer\": true,\n \"retry_on_busy\": true,\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}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.peachdeskai.com/api/v1/campaign/{campaign_id}/redial")
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 \"retry_on_voicemail\": true,\n \"retry_on_no_answer\": true,\n \"retry_on_busy\": true,\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}"
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": {}
}
]
}Redial Campaign
Create a new campaign that re-dials unique subscribers from a completed campaign whose latest call resulted in voicemail, no-answer, or busy.
The new campaign is created in тАШcreatedтАЩ state with queued_runs pre-seeded from the parentтАЩs original initial contexts. A campaign can be redialed at most once.
curl --request POST \
--url https://api.peachdeskai.com/api/v1/campaign/{campaign_id}/redial \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"retry_on_voicemail": true,
"retry_on_no_answer": true,
"retry_on_busy": true,
"retry_config": {
"enabled": true,
"max_retries": 2,
"retry_delay_seconds": 120,
"retry_on_busy": true,
"retry_on_no_answer": true,
"retry_on_voicemail": true
}
}
'import requests
url = "https://api.peachdeskai.com/api/v1/campaign/{campaign_id}/redial"
payload = {
"name": "<string>",
"retry_on_voicemail": True,
"retry_on_no_answer": True,
"retry_on_busy": True,
"retry_config": {
"enabled": True,
"max_retries": 2,
"retry_delay_seconds": 120,
"retry_on_busy": True,
"retry_on_no_answer": True,
"retry_on_voicemail": True
}
}
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>',
retry_on_voicemail: true,
retry_on_no_answer: true,
retry_on_busy: true,
retry_config: {
enabled: true,
max_retries: 2,
retry_delay_seconds: 120,
retry_on_busy: true,
retry_on_no_answer: true,
retry_on_voicemail: true
}
})
};
fetch('https://api.peachdeskai.com/api/v1/campaign/{campaign_id}/redial', 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/{campaign_id}/redial",
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>',
'retry_on_voicemail' => true,
'retry_on_no_answer' => true,
'retry_on_busy' => true,
'retry_config' => [
'enabled' => true,
'max_retries' => 2,
'retry_delay_seconds' => 120,
'retry_on_busy' => true,
'retry_on_no_answer' => true,
'retry_on_voicemail' => true
]
]),
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/{campaign_id}/redial"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"retry_on_voicemail\": true,\n \"retry_on_no_answer\": true,\n \"retry_on_busy\": true,\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}")
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/{campaign_id}/redial")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"retry_on_voicemail\": true,\n \"retry_on_no_answer\": true,\n \"retry_on_busy\": true,\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}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.peachdeskai.com/api/v1/campaign/{campaign_id}/redial")
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 \"retry_on_voicemail\": true,\n \"retry_on_no_answer\": true,\n \"retry_on_busy\": true,\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}"
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": {}
}
]
}Authorizations
Interactive user session: the login JWT, sent as Authorization: Bearer <token>.
Path Parameters
Body
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

