Skip to main content
PATCH
/
api
/
campaigns
/
{id}
Update Campaign
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": {},
  "daily_limit": 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
    }
  ]
}
'
{
  "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,
        "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": {}
    }
  ]
}
CLI:
puffle campaign update --id <id>
puffle campaign update --id <id> --name <name> --operating-hours <operating-hours> --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

FieldDraftActivePaused
name
operating_hours✅ (wakes sleeping leads)
daily_limit (email)
account_limits (email)
skip_other_campaigns (LinkedIn)ignoredignored
stop_on_reply / open_tracking / signature (email)ignoredignored
sender_account_idsignoredignored
sequence_nodesignoredignored

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

Authorization
string
header
required

Bearer authentication header of the form Bearer <token>, where <token> is your auth token.

Path Parameters

id
string
required

Campaign UUID

Body

application/json
name
string
Minimum string length: 1
operating_hours
object
daily_limit
integer
Required range: 1 <= x <= 500
skip_other_campaigns
boolean
stop_on_reply
boolean
open_tracking
boolean
signature
string
sender_account_ids
string<uuid>[]
sequence_nodes
object[]
account_limits
object[]
Maximum array length: 50
{key}
any

Response

Campaign updated. Returns the full campaign and sequence.

campaign
object
required

Canonical campaign entity.

sequence_nodes
object[]
required