Update Outbound
curl --request PATCH \
--url https://app.puffle.ai/api/campaigns/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"operating_hours": {},
"operatingHours": {},
"daily_limit": 250,
"dailyLimit": 250,
"skip_other_campaigns": true,
"stop_on_reply": true,
"open_tracking": true,
"signature": "<string>",
"sender_account_ids": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"sequence_nodes": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"position": 4503599627370495,
"subject": "<string>",
"body": "<string>",
"signature": "<string>",
"include_message": true,
"is_reply": true,
"delay_days": 4503599627370495,
"delay_hours": 4503599627370495,
"delay_minutes": 4503599627370495
}
],
"account_limits": [
{
"account_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"daily_limit": 15
}
]
}
'import requests
url = "https://app.puffle.ai/api/campaigns/{id}"
payload = {
"name": "<string>",
"operating_hours": {},
"operatingHours": {},
"daily_limit": 250,
"dailyLimit": 250,
"skip_other_campaigns": True,
"stop_on_reply": True,
"open_tracking": True,
"signature": "<string>",
"sender_account_ids": ["3c90c3cc-0d44-4b50-8888-8dd25736052a"],
"sequence_nodes": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"position": 4503599627370495,
"subject": "<string>",
"body": "<string>",
"signature": "<string>",
"include_message": True,
"is_reply": True,
"delay_days": 4503599627370495,
"delay_hours": 4503599627370495,
"delay_minutes": 4503599627370495
}
],
"account_limits": [
{
"account_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"daily_limit": 15
}
]
}
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>',
operating_hours: {},
operatingHours: {},
daily_limit: 250,
dailyLimit: 250,
skip_other_campaigns: true,
stop_on_reply: true,
open_tracking: true,
signature: '<string>',
sender_account_ids: ['3c90c3cc-0d44-4b50-8888-8dd25736052a'],
sequence_nodes: [
{
id: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
position: 4503599627370495,
subject: '<string>',
body: JSON.stringify('<string>'),
signature: '<string>',
include_message: true,
is_reply: true,
delay_days: 4503599627370495,
delay_hours: 4503599627370495,
delay_minutes: 4503599627370495
}
],
account_limits: [{account_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a', daily_limit: 15}]
})
};
fetch('https://app.puffle.ai/api/campaigns/{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.puffle.ai/api/campaigns/{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>',
'operating_hours' => [
],
'operatingHours' => [
],
'daily_limit' => 250,
'dailyLimit' => 250,
'skip_other_campaigns' => true,
'stop_on_reply' => true,
'open_tracking' => true,
'signature' => '<string>',
'sender_account_ids' => [
'3c90c3cc-0d44-4b50-8888-8dd25736052a'
],
'sequence_nodes' => [
[
'id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'position' => 4503599627370495,
'subject' => '<string>',
'body' => '<string>',
'signature' => '<string>',
'include_message' => true,
'is_reply' => true,
'delay_days' => 4503599627370495,
'delay_hours' => 4503599627370495,
'delay_minutes' => 4503599627370495
]
],
'account_limits' => [
[
'account_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'daily_limit' => 15
]
]
]),
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.puffle.ai/api/campaigns/{id}"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"operating_hours\": {},\n \"operatingHours\": {},\n \"daily_limit\": 250,\n \"dailyLimit\": 250,\n \"skip_other_campaigns\": true,\n \"stop_on_reply\": true,\n \"open_tracking\": true,\n \"signature\": \"<string>\",\n \"sender_account_ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"sequence_nodes\": [\n {\n \"id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"position\": 4503599627370495,\n \"subject\": \"<string>\",\n \"body\": \"<string>\",\n \"signature\": \"<string>\",\n \"include_message\": true,\n \"is_reply\": true,\n \"delay_days\": 4503599627370495,\n \"delay_hours\": 4503599627370495,\n \"delay_minutes\": 4503599627370495\n }\n ],\n \"account_limits\": [\n {\n \"account_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"daily_limit\": 15\n }\n ]\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.puffle.ai/api/campaigns/{id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"operating_hours\": {},\n \"operatingHours\": {},\n \"daily_limit\": 250,\n \"dailyLimit\": 250,\n \"skip_other_campaigns\": true,\n \"stop_on_reply\": true,\n \"open_tracking\": true,\n \"signature\": \"<string>\",\n \"sender_account_ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"sequence_nodes\": [\n {\n \"id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"position\": 4503599627370495,\n \"subject\": \"<string>\",\n \"body\": \"<string>\",\n \"signature\": \"<string>\",\n \"include_message\": true,\n \"is_reply\": true,\n \"delay_days\": 4503599627370495,\n \"delay_hours\": 4503599627370495,\n \"delay_minutes\": 4503599627370495\n }\n ],\n \"account_limits\": [\n {\n \"account_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"daily_limit\": 15\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.puffle.ai/api/campaigns/{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 \"operating_hours\": {},\n \"operatingHours\": {},\n \"daily_limit\": 250,\n \"dailyLimit\": 250,\n \"skip_other_campaigns\": true,\n \"stop_on_reply\": true,\n \"open_tracking\": true,\n \"signature\": \"<string>\",\n \"sender_account_ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"sequence_nodes\": [\n {\n \"id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"position\": 4503599627370495,\n \"subject\": \"<string>\",\n \"body\": \"<string>\",\n \"signature\": \"<string>\",\n \"include_message\": true,\n \"is_reply\": true,\n \"delay_days\": 4503599627370495,\n \"delay_hours\": 4503599627370495,\n \"delay_minutes\": 4503599627370495\n }\n ],\n \"account_limits\": [\n {\n \"account_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"daily_limit\": 15\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"campaign": {
"id": "<string>",
"user_id": "<string>",
"name": "<string>",
"daily_limit": 4503599627370495,
"stop_on_reply": true,
"open_tracking": true,
"signature": "<string>",
"skip_other_campaigns": true,
"operating_hours": {},
"stats": {
"total": 4503599627370495,
"sent": 4503599627370495,
"replied": 4503599627370495,
"bounced": 4503599627370495,
"completed": 4503599627370495,
"timed_out": 4503599627370495,
"connection_sent": 4503599627370495,
"connected": 4503599627370495,
"message_sent": 4503599627370495
},
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"sender_accounts": [
{
"id": "<string>",
"email_address": "<string>",
"provider_account_id": "<string>",
"display_name": "<string>",
"status": "<string>",
"first_name": "<string>",
"last_name": "<string>",
"daily_limit": 4503599627370495,
"is_default_sender": true,
"weekly_connection_limit": 4503599627370495,
"weekly_message_limit": 4503599627370495,
"is_premium": true
}
]
},
"sequence_nodes": [
{
"id": "<string>",
"campaign_id": "<string>",
"position": 4503599627370495,
"subject": "<string>",
"body": "<string>",
"signature": "<string>",
"include_message": true,
"is_reply": true,
"delay_days": 4503599627370495,
"delay_hours": 4503599627370495,
"delay_minutes": 4503599627370495,
"ai_node": {}
}
]
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}Outbound
Update Outbound
Patch campaign fields and optionally upsert the full sequence. Field-level rules depend on campaign status.
PATCH
/
api
/
campaigns
/
{id}
Update Outbound
curl --request PATCH \
--url https://app.puffle.ai/api/campaigns/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"operating_hours": {},
"operatingHours": {},
"daily_limit": 250,
"dailyLimit": 250,
"skip_other_campaigns": true,
"stop_on_reply": true,
"open_tracking": true,
"signature": "<string>",
"sender_account_ids": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"sequence_nodes": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"position": 4503599627370495,
"subject": "<string>",
"body": "<string>",
"signature": "<string>",
"include_message": true,
"is_reply": true,
"delay_days": 4503599627370495,
"delay_hours": 4503599627370495,
"delay_minutes": 4503599627370495
}
],
"account_limits": [
{
"account_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"daily_limit": 15
}
]
}
'import requests
url = "https://app.puffle.ai/api/campaigns/{id}"
payload = {
"name": "<string>",
"operating_hours": {},
"operatingHours": {},
"daily_limit": 250,
"dailyLimit": 250,
"skip_other_campaigns": True,
"stop_on_reply": True,
"open_tracking": True,
"signature": "<string>",
"sender_account_ids": ["3c90c3cc-0d44-4b50-8888-8dd25736052a"],
"sequence_nodes": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"position": 4503599627370495,
"subject": "<string>",
"body": "<string>",
"signature": "<string>",
"include_message": True,
"is_reply": True,
"delay_days": 4503599627370495,
"delay_hours": 4503599627370495,
"delay_minutes": 4503599627370495
}
],
"account_limits": [
{
"account_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"daily_limit": 15
}
]
}
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>',
operating_hours: {},
operatingHours: {},
daily_limit: 250,
dailyLimit: 250,
skip_other_campaigns: true,
stop_on_reply: true,
open_tracking: true,
signature: '<string>',
sender_account_ids: ['3c90c3cc-0d44-4b50-8888-8dd25736052a'],
sequence_nodes: [
{
id: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
position: 4503599627370495,
subject: '<string>',
body: JSON.stringify('<string>'),
signature: '<string>',
include_message: true,
is_reply: true,
delay_days: 4503599627370495,
delay_hours: 4503599627370495,
delay_minutes: 4503599627370495
}
],
account_limits: [{account_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a', daily_limit: 15}]
})
};
fetch('https://app.puffle.ai/api/campaigns/{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.puffle.ai/api/campaigns/{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>',
'operating_hours' => [
],
'operatingHours' => [
],
'daily_limit' => 250,
'dailyLimit' => 250,
'skip_other_campaigns' => true,
'stop_on_reply' => true,
'open_tracking' => true,
'signature' => '<string>',
'sender_account_ids' => [
'3c90c3cc-0d44-4b50-8888-8dd25736052a'
],
'sequence_nodes' => [
[
'id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'position' => 4503599627370495,
'subject' => '<string>',
'body' => '<string>',
'signature' => '<string>',
'include_message' => true,
'is_reply' => true,
'delay_days' => 4503599627370495,
'delay_hours' => 4503599627370495,
'delay_minutes' => 4503599627370495
]
],
'account_limits' => [
[
'account_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'daily_limit' => 15
]
]
]),
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.puffle.ai/api/campaigns/{id}"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"operating_hours\": {},\n \"operatingHours\": {},\n \"daily_limit\": 250,\n \"dailyLimit\": 250,\n \"skip_other_campaigns\": true,\n \"stop_on_reply\": true,\n \"open_tracking\": true,\n \"signature\": \"<string>\",\n \"sender_account_ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"sequence_nodes\": [\n {\n \"id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"position\": 4503599627370495,\n \"subject\": \"<string>\",\n \"body\": \"<string>\",\n \"signature\": \"<string>\",\n \"include_message\": true,\n \"is_reply\": true,\n \"delay_days\": 4503599627370495,\n \"delay_hours\": 4503599627370495,\n \"delay_minutes\": 4503599627370495\n }\n ],\n \"account_limits\": [\n {\n \"account_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"daily_limit\": 15\n }\n ]\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.puffle.ai/api/campaigns/{id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"operating_hours\": {},\n \"operatingHours\": {},\n \"daily_limit\": 250,\n \"dailyLimit\": 250,\n \"skip_other_campaigns\": true,\n \"stop_on_reply\": true,\n \"open_tracking\": true,\n \"signature\": \"<string>\",\n \"sender_account_ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"sequence_nodes\": [\n {\n \"id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"position\": 4503599627370495,\n \"subject\": \"<string>\",\n \"body\": \"<string>\",\n \"signature\": \"<string>\",\n \"include_message\": true,\n \"is_reply\": true,\n \"delay_days\": 4503599627370495,\n \"delay_hours\": 4503599627370495,\n \"delay_minutes\": 4503599627370495\n }\n ],\n \"account_limits\": [\n {\n \"account_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"daily_limit\": 15\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.puffle.ai/api/campaigns/{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 \"operating_hours\": {},\n \"operatingHours\": {},\n \"daily_limit\": 250,\n \"dailyLimit\": 250,\n \"skip_other_campaigns\": true,\n \"stop_on_reply\": true,\n \"open_tracking\": true,\n \"signature\": \"<string>\",\n \"sender_account_ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"sequence_nodes\": [\n {\n \"id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"position\": 4503599627370495,\n \"subject\": \"<string>\",\n \"body\": \"<string>\",\n \"signature\": \"<string>\",\n \"include_message\": true,\n \"is_reply\": true,\n \"delay_days\": 4503599627370495,\n \"delay_hours\": 4503599627370495,\n \"delay_minutes\": 4503599627370495\n }\n ],\n \"account_limits\": [\n {\n \"account_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"daily_limit\": 15\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"campaign": {
"id": "<string>",
"user_id": "<string>",
"name": "<string>",
"daily_limit": 4503599627370495,
"stop_on_reply": true,
"open_tracking": true,
"signature": "<string>",
"skip_other_campaigns": true,
"operating_hours": {},
"stats": {
"total": 4503599627370495,
"sent": 4503599627370495,
"replied": 4503599627370495,
"bounced": 4503599627370495,
"completed": 4503599627370495,
"timed_out": 4503599627370495,
"connection_sent": 4503599627370495,
"connected": 4503599627370495,
"message_sent": 4503599627370495
},
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"sender_accounts": [
{
"id": "<string>",
"email_address": "<string>",
"provider_account_id": "<string>",
"display_name": "<string>",
"status": "<string>",
"first_name": "<string>",
"last_name": "<string>",
"daily_limit": 4503599627370495,
"is_default_sender": true,
"weekly_connection_limit": 4503599627370495,
"weekly_message_limit": 4503599627370495,
"is_premium": true
}
]
},
"sequence_nodes": [
{
"id": "<string>",
"campaign_id": "<string>",
"position": 4503599627370495,
"subject": "<string>",
"body": "<string>",
"signature": "<string>",
"include_message": true,
"is_reply": true,
"delay_days": 4503599627370495,
"delay_hours": 4503599627370495,
"delay_minutes": 4503599627370495,
"ai_node": {}
}
]
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}CLI:
puffle campaign update --id <id>
puffle campaign update --id <id> --name <name> --operating-hours <operating-hours> --operating-hours <operating-hours> --daily-limit <daily-limit> --daily-limit <daily-limit> --skip-other-campaigns --stop-on-reply --open-tracking --signature <signature> --sender-account-ids <sender-account-ids> --sequence-nodes <sequence-nodes> --account-limits <account-limits>
Overview
A partial update — only fields present in the body are applied. Most draft-only fields (type-specific settings, sequence, sender set) are silently ignored on active/paused/completed campaigns. A few fields work on any status:name, operating_hours, and (email) daily_limit.
Allowed fields by status
| Field | Draft | Active | Paused |
|---|---|---|---|
name | ✅ | ✅ | ✅ |
operating_hours | ✅ | ✅ (wakes sleeping leads) | ✅ |
daily_limit (email) | ✅ | ✅ | ✅ |
account_limits (email) | ✅ | ✅ | ✅ |
skip_other_campaigns (LinkedIn) | ✅ | ignored | ignored |
stop_on_reply / open_tracking / signature (email) | ✅ | ignored | ignored |
sender_account_ids | ✅ | ignored | ignored |
sequence_nodes | ✅ | ignored | ignored |
AI agent notes
Sequence upsert semantics. When
sequence_nodes is provided (draft only), the server replaces the entire sequence. Positions are normalized to match array order — don’t try to set your own position values. Include every node you want to keep, including end.Operating-hours tweak on active campaigns. Changing operating_hours while status === "active" triggers an immediate wake-up of any leads currently sleeping on old-schedule waitpoints. They re-check the fresh schedule and resume or re-sleep as appropriate. Safe to call, but expect a burst of send activity within ~30 s of the update.Delay validation. Delay nodes must total ≥ 1 minute and ≤ 30 days across delay_days + delay_hours + delay_minutes. The server validates before any writes, so invalid delays fail cleanly with 400 and no partial state.Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Path Parameters
Campaign UUID
Body
application/json
Minimum string length:
1Show child attributes
Show child attributes
Show child attributes
Show child attributes
Required range:
1 <= x <= 500Required range:
1 <= x <= 500Show child attributes
Show child attributes
Maximum array length:
50Show child attributes
Show child attributes
Was this page helpful?
⌘I