Skip to main content
POST
/
api
/
campaigns
/
{id}
/
resume
Resume a paused campaign
curl --request POST \
  --url https://app.puffle.ai/api/campaigns/{id}/resume \
  --header 'Authorization: Bearer <token>'
{
  "campaign": {
    "id": "8c2b2d4e-e29b-41d4-a716-446655440000",
    "user_id": "11111111-1111-1111-1111-111111111111",
    "type": "email",
    "name": "Q2 Enterprise Outreach",
    "status": "active",
    "daily_limit": 50,
    "stop_on_reply": true,
    "open_tracking": true,
    "signature": "Best,\n%first_name%",
    "skip_other_campaigns": null,
    "operating_hours": null,
    "stats": {
      "total": 120,
      "sent": 34,
      "replied": 4
    },
    "created_at": "2026-04-18T15:12:00Z",
    "updated_at": "2026-04-22T11:00:00Z",
    "sender_accounts": []
  }
}

Overview

Flips a paused campaign back to active and clears the stored pause_reason so the UI banner disappears. Only paused campaigns can be resumed — every other status returns 400. The request body is empty. The server then completes all pause waitpoint tokens with { resumed: true } so sleeping tasks wake and continue. Finally, it runs the check_and_complete_campaign RPC — if every remaining prospect already reached a terminal state while the campaign was paused, the campaign is auto-transitioned to completed and the response reflects that terminal state instead of active.

AI agent notes

Edge case: auto-complete. The response is not guaranteed to come back status: "active". If the campaign had no work left to do, it will land in completed. Always read campaign.status from the response before telling the user the campaign is running again.Idempotency. Not idempotent — calling again while already active returns 400 (Only paused campaigns can be resumed). Treat that as a safe success.Token completion is best-effort. If a waitpoint token was already completed or expired, the failure is logged and ignored — it does NOT surface as a 500. The downstream task will hit the pause check at the top of its loop and self-correct.Follow-up. Poll GET /api/campaigns/{id} to observe stats.sent climbing again. If status === "completed" instead, stop polling.

Authorizations

Authorization
string
header
required

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

Path Parameters

id
string<uuid>
required

Campaign UUID

Pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$

Response

Campaign resumed. Returns the updated campaign row — typically active, occasionally completed if nothing was left to do.

campaign
object
required

The campaign row after the status transition. status is now active (or completed if every remaining prospect had already reached a terminal state while paused).