---
title: "Send or schedule campaign"
method: POST
path: "/campaigns/{id}/send"
tags: ["Campaigns"]
---

# Send or schedule campaign

`POST /campaigns/{id}/send`

Send a campaign immediately or schedule it for future delivery.

## Path parameters

- `id` string, uuid, required

## Request body

- object
  - `scheduledFor` string, date-time, nullable — Timestamp for when to send the campaign. Omit or set to null for immediate send. Any value `new Date()` can parse is accepted; an unparseable one returns `400`.

## Response `200`

Campaign scheduled or sending

- object
  - `success` boolean
  - `data` Campaign
    - `id` string
    - `name` string
    - `description` string, nullable
    - `subject` string
    - `body` string
    - `from` string, email
    - `fromName` string, nullable
    - `replyTo` string, email, nullable
    - `type` 'TRANSACTIONAL' | 'MARKETING' | 'HEADLESS' — Content type of the campaign email. Not to be confused with `audienceType`.
    - `status` 'DRAFT' | 'SCHEDULED' | 'SENDING' | 'SENT' | 'CANCELLED'
    - `audienceType` 'ALL' | 'SEGMENT' | 'FILTERED'
    - `audienceCondition` FilterCondition — A boolean tree over contact filters. `logic` combines the `groups`; the filters inside each group are always ANDed together.
      - `logic` 'AND' | 'OR', required
      - `groups` FilterGroup[], required
        - `filters` Filter[], required — Filters within a group are combined with AND.
          - `field` string, required — Contact field to test. Custom fields are addressed via the `data.` prefix (e.g. `data.plan`); standard fields are `email`, `subscribed`, `createdAt`. Event operators take an event name instead.
          - `operator` 'equals' | 'notEquals' | 'contains' | 'notContains' | 'greaterThan' | 'lessThan' | 'greaterThanOrEqual' | 'lessThanOrEqual' | 'exists' | 'notExists' | 'within' | 'olderThan' | 'triggered' | 'triggeredWithin' | 'triggeredOlderThan' | 'notTriggered' | 'notTriggeredWithin' | 'memberOfSegment' | 'notMemberOfSegment', required
          - `value` unknown
          - `unit` 'days' | 'hours' | 'minutes' — Time unit for window operators (`within`, `olderThan`, `triggeredWithin`, `triggeredOlderThan`, `notTriggeredWithin`).
        - `conditions` FilterCondition — recursive
    - `segmentId` string, nullable — Set when `audienceType` is `SEGMENT`.
    - `scheduledFor` string, date-time, nullable — When the campaign is scheduled to send. Null for immediate or unsent campaigns.
    - `totalRecipients` integer
    - `sentCount` integer
    - `deliveredCount` integer
    - `openedCount` integer
    - `clickedCount` integer
    - `bouncedCount` integer
    - `projectId` string
    - `sentAt` string, date-time, nullable
    - `createdAt` string, date-time
    - `updatedAt` string, date-time
  - `message` string — Human-readable confirmation, e.g. `Campaign is being sent`.

## Other responses

- `400` — Unparseable `scheduledFor`, or the campaign is not in a sendable state.
- `401` — Missing or invalid API key.
- `404` — The requested resource does not exist in this project.
- `422` — The campaign `id` in the path is not a valid UUID.

---

[API](https://skmtc.dev/useplunk/apis/plunk-api.md) · [All operations](https://skmtc.dev/useplunk/apis/plunk-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/useplunk/plunk-api/revisions/a13aa5345f8e/schema)
