---
title: "Unschedule a campaign"
description: "Move a scheduled campaign (or one paused before it started sending) back to draft, same id, so you can edit it. `POST /api/v1/email/campaigns/{id}/unschedule`"
url: https://www.unitpost.com/docs/email/post-email-campaigns-id-unschedule
section: "Email API reference"
updated: 2026-10-13
---
# Unschedule a campaign

`POST /api/v1/email/campaigns/{id}/unschedule`

Move a `scheduled` campaign (or one `paused` before it started sending) back to `draft`, same id, so you can edit it. Content, audience and overrides are kept; the saved send time is cleared, so the next [Send a campaign](https://www.unitpost.com/docs/email/post-email-campaigns-id-send) needs an explicit `scheduled_at` (`409` `send_time_required` without one). A campaign that started sending can't be unscheduled: cancel it and [duplicate](https://www.unitpost.com/docs/email/post-email-campaigns-id-duplicate) it (the copy goes to the whole segment again, including people the first run reached, unless you set `excluded_contact_ids`). No body; any key is a `422`. Requires the `campaigns:send` capability.

## Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `id` | path | string | yes | — |

## Response fields (200)

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `object` | string | yes | — |
| `id` | string | yes | — |
| `name` | string | yes | — |
| `template_id` | string | yes | — |
| `segment_id` | string | yes | — |
| `topic_id` | string \| null | yes | — |
| `from` | string | yes | — |
| `subject` | string \| null | yes | — |
| `preview_text` | string \| null | yes | — |
| `open_tracking` | boolean \| null | yes | — |
| `click_tracking` | boolean \| null | yes | — |
| `status` | enum | yes | One of: `draft`, `scheduled`, `sending`, `paused`, `sent`, `canceled`, `failed`. |
| `scheduled_at` | string \| null | yes | — |
| `variable_fallbacks` | object | yes | — |
| `excluded_contact_ids` | string[] | yes | — |
| `total_recipients` | number | yes | Recipients the engine admitted when the campaign started sending. 0 while it is `draft` or `scheduled`: read `projected_recipients`, or `sendable` from validate. |
| `projected_recipients` | object \| null | no | The audience counted when the campaign was sent or scheduled: `total` segment members, `reachable` who will get it, `skipped` (unsubscribed, suppressed, excluded). Null for a draft that was never sent: read validate. Read-only. |
| `sent_count` | number | yes | — |
| `failed_count` | number | yes | — |
| `pause_reason` | object \| null | yes | — |
| `created_at` | string | yes | — |
| `updated_at` | string | yes | — |

## Responses

| Status | Description |
| --- | --- |
| 200 | The campaign, now a draft. |
| 401 | Missing or invalid API key. |
| 404 | Campaign not found. |
| 409 | The campaign isn't waiting to send (a draft, sending, or finished). |
| 422 | A body with keys (this operation takes none). |

## Example request

```bash
curl -X POST 'https://www.unitpost.com/api/v1/email/campaigns/cmp_123/unschedule' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -H 'User-Agent: my-app/1.0'
```

## Example response (200)

```json
{
  "object": "campaign",
  "id": "id_123",
  "name": "Example",
  "template_id": "template_123",
  "segment_id": "segment_123",
  "topic_id": "topic_123",
  "from": "you@yourdomain.com",
  "subject": "Welcome to Acme",
  "preview_text": "string",
  "open_tracking": false,
  "click_tracking": false,
  "status": "draft",
  "scheduled_at": "2026-01-01T00:00:00.000Z",
  "variable_fallbacks": {},
  "excluded_contact_ids": [
    "string"
  ],
  "total_recipients": 1,
  "projected_recipients": {
    "total": 1,
    "reachable": 0,
    "skipped": 0
  },
  "sent_count": 1,
  "failed_count": 1,
  "pause_reason": {
    "code": "user",
    "message": "string",
    "metric": "hard_bounce_rate",
    "value": 0,
    "threshold": 0,
    "sample": {
      "events": 0,
      "of": 0
    },
    "window": {
      "since": "string"
    },
    "decided_by": "floor",
    "resume": "self_serve",
    "paused_at": "2026-01-01T00:00:00.000Z"
  },
  "created_at": "2026-01-01T00:00:00.000Z",
  "updated_at": "2026-01-01T00:00:00.000Z"
}
```

## Links

- HTML reference (with Node.js, Python, Ruby, PHP, Laravel, Go, Java, Rust, .NET and CLI examples): https://www.unitpost.com/docs/email/post-email-campaigns-id-unschedule
- OpenAPI 3.1 (full schemas): https://www.unitpost.com/api/v1/openapi.json
