---
title: "Set up, pause, or resume campaign outreach. Paused follow-ups expire 14 days after scheduled send_at; pause returns held"
method: POST
path: "/api/v1/campaigns/{campaign_id}/outreach/resume"
tags: ["campaigns"]
---

# Set up, pause, or resume campaign outreach. Paused follow-ups expire 14 days after scheduled send_at; pause returns held

`POST /api/v1/campaigns/{campaign_id}/outreach/resume`

## Request

- Base URL: `https://crispy.sh`
- URL: `https://crispy.sh/api/v1/campaigns/{campaign_id}/outreach/resume`
- Auth: HTTP bearer

## Path parameters

- `campaign_id` string, required

## Request body

- object
  - `list_id` string: List ID containing contacts to invite (for action='setup')
  - `daily_invites` number: Campaign's requested invitations per day, 1-50. Enabled acquisition campaigns on the same sender account use a shared pool whose daily ceiling is the highest daily_invites among them (for action='setup')
  - `invite_message` string: Invite note template with {first_name} etc., max 300 chars (for action='setup')
  - `enabled` boolean: For action='pause'/'resume': true to resume, false to pause. For action='setup': default false (configure-only). Pass true with launch_receipt to enable and skip the explicit resume step. Pre-2026-06-02 setup auto-enabled; that behavior is now opt-in via this flag (N16/N18 fix).
  - `launch_receipt` string: Required to turn a paused campaign on (action='resume', or action='setup' with enabled:true). The launch_receipt from preview_campaign_launch; single-use, refused if the config changed after the preview.
  - `steps` object[]: Ordered action steps for this campaign. Steps before the invite are warmup actions (type: 'view_profile'|'like_post'|'endorse_skill', delay_seconds optional). Steps after the invite are follow-up messages (type: 'message'|'voice_note'|'image'|'video'|'webhook', delay_hours required). IMPORTANT: text DM follow-ups use type='message' (not 'text'). The invite fires automatically between warmup and follow-up steps. Omit to preserve existing steps. Pass [] to clear all steps.

## Response `200`

Success

## Other responses

- `401`: Missing or expired API key
- `403`: Insufficient key scope or permission denied
- `429`: Rate limit exceeded

---

[API](https://skmtc.dev/crispy/apis/crispy-rest-api.md) · [All operations](https://skmtc.dev/crispy/apis/crispy-rest-api/llms.txt) · [OpenAPI document](https://skmtc.dev/crispy/apis/crispy-rest-api/revisions/6bed0974d9ce?raw)
