---
title: "Resume a campaign (idempotent; ?dryRun=true)"
method: POST
path: "/campaigns/{campaignId}/resume"
tags: ["Campaigns"]
---

# Resume a campaign (idempotent; ?dryRun=true)

`POST /campaigns/{campaignId}/resume`

## Request

- Base URL: `https://origami.chat/api/v2`
- URL: `https://origami.chat/api/v2/campaigns/{campaignId}/resume`
- Auth: HTTP bearer

Resumes the campaign from where its sequences left off (the same
`active` transition as launch; resume vs fresh-launch facts are
derived from prior state). Idempotent. `?dryRun=true` returns
`{ dryRun: true, campaignId, wouldResume }` with no writes; a real
resume returns the transition result carrying the `resume` facts.

## Query parameters

- `dryRun` boolean

## Headers

- `Idempotency-Key` string

## Response `200`

The transition result, or the dryRun report.

- union
  - CampaignTransition: Result of a deterministic lifecycle transition (`launch` / `send` / `pause` / `resume`). Carries the transition facts in exactly one of `launch` / `pause` / `resume` depending on which transition ran.
    - `object` 'campaign', required
    - `id` string, uuid, required
    - `status` 'draft' | 'active' | 'paused', required
    - `launched` integer, required: Drafts scheduled by this transition (0 unless launching/resuming).
    - `launch` object: Present on a launch/resume that scheduled work.
      - `scheduled` integer, required
      - `firstScheduledAt` string, date-time, nullable, required
      - `missingRecipientCount` integer, required
      - `duplicateActiveCancelledCount` integer, required
      - `duplicatePriorCancelledCount` integer, required
      - `blocked` object
        - `reason` string, required
        - `message` string, required
        - `missingChannels` string[], required
    - `pause` object: Present on a pause.
      - `stoppedSequences` integer, required
      - `haltedSteps` integer, required
      - `inFlightSending` integer, required
      - `alreadyPaused` boolean, required
    - `resume` object: Present on a resume.
      - `resumedSequences` integer, required
      - `noAccountSequences` integer, required
      - `missingChannels` string[], required
  - object
    - `dryRun` true, required
    - `campaignId` string, uuid, required
    - `wouldResume` boolean, required

## Other responses

- `404`: CAMPAIGN_NOT_FOUND.
- `409`: NO_SENDING_ACCOUNT: a required channel has no active sending account. Details carry `missingChannels` (array of channel names); connect the accounts, then retry. NO_MESSAGING: the campaign's people have no messages written and nothing will write them; write the messaging, then retry.

## Changes

- **2026-11-03** `8c6b16fe0a3b`: 1 info
  - added the non-success response with the status `409`

[Operation history](https://skmtc.dev/origami/apis/origami-agent-api/changes/campaigns/:campaignId/resume/post.md)

---

[API](https://skmtc.dev/origami/apis/origami-agent-api.md) - [All operations](https://skmtc.dev/origami/apis/origami-agent-api/llms.txt) - [OpenAPI document](https://skmtc.dev/origami/apis/origami-agent-api/revisions/8c6b16fe0a3b?raw)
