---
title: "List campaigns"
method: GET
path: "/campaigns"
tags: ["Campaigns"]
---

# List campaigns

`GET /campaigns`

Get a paginated list of email campaigns.

This endpoint uses **offset pagination** (`page` / `pageSize`), not the cursor pagination used by `GET /contacts`.

## Query parameters

- `page` integer
- `pageSize` integer
- `status` 'DRAFT' | 'SCHEDULED' | 'SENDING' | 'SENT' | 'CANCELLED'
- `search` string
- `sort` 'name' | 'createdAt' | 'updatedAt'
- `dir` 'asc' | 'desc'

## Response `200`

List of campaigns

- object
  - `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
  - `page` integer
  - `pageSize` integer
  - `total` integer — Total campaigns matching the filters, across all pages.
  - `totalPages` integer

## Other responses

- `400` — Invalid `status` value.
- `401` — Missing or invalid API key.

---

[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)
