---
title: "Create Campaign"
method: POST
path: "/api/v1/campaigns"
tags: ["campaigns"]
---

# Create Campaign

`POST /api/v1/campaigns`

## Request body

- CampaignCreate
  - `name` string, required
  - `source_list_id` string, uuid, nullable
  - `enrollment_type` 'list_snapshot' | 'trigger' — How recipients enter a campaign. ``list_snapshot`` freezes the audience from a ``ContactList`` at creation. ``trigger`` enrolls live off interaction events (evaluator lands in a later PR); modeled now so trigger campaigns need no rework.
  - `approval_mode` 'autonomous' | 'review' — Whether drafts send autonomously or wait for human review.
  - `goal` string, nullable
  - `template_key` string, nullable
  - `offer` string, nullable
  - `promo_code` string, nullable
  - `stay_window_start` string, date, nullable
  - `stay_window_end` string, date, nullable
  - `cta_label` string, nullable
  - `email_background_color` string, nullable
  - `email_accent_color` string, nullable
  - `email_logo_url` string, nullable
  - `sender_identity_id` string, uuid, nullable

## Response `201`

Successful Response

- CampaignRead — A campaign summary row (carries the denormalized metric counters).
  - `id` string, uuid, required
  - `tenant_id` string, uuid, required
  - `name` string, required
  - `status` 'draft' | 'generating' | 'review' | 'scheduled' | 'sending' | 'sent' | 'paused' | 'failed', required — Lifecycle of a campaign (see ``state_machine.LEGAL_TRANSITIONS``).
  - `enrollment_type` 'list_snapshot' | 'trigger', required — How recipients enter a campaign. ``list_snapshot`` freezes the audience from a ``ContactList`` at creation. ``trigger`` enrolls live off interaction events (evaluator lands in a later PR); modeled now so trigger campaigns need no rework.
  - `approval_mode` 'autonomous' | 'review', required — Whether drafts send autonomously or wait for human review.
  - `source_list_id` string, uuid, nullable
  - `goal` string, nullable
  - `template_key` string, nullable
  - `offer` string, nullable
  - `promo_code` string, nullable
  - `stay_window_start` string, date, nullable
  - `stay_window_end` string, date, nullable
  - `cta_label` string, nullable
  - `email_background_color` string, nullable
  - `email_accent_color` string, nullable
  - `email_logo_url` string, nullable
  - `sender_identity_id` string, uuid, nullable
  - `created_by_user_id` string, uuid, nullable
  - `audience_count` integer, required
  - `drafted_count` integer, required
  - `approved_count` integer, required
  - `sent_count` integer, required
  - `delivered_count` integer, required
  - `opened_count` integer, required
  - `clicked_count` integer, required
  - `replied_count` integer, required
  - `positive_count` integer, required
  - `bounced_count` integer, required
  - `converted_count` integer, required
  - `revenue_cents` integer, required
  - `scheduled_at` string, date-time, nullable
  - `sending_started_at` string, date-time, nullable
  - `sent_at` string, date-time, nullable
  - `archived_at` string, date-time, nullable
  - `created_at` string, date-time, required
  - `updated_at` string, date-time, required

## Other responses

- `422` — Validation Error

---

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