---
title: "Send Campaign Route"
method: POST
path: "/api/v1/campaigns/{campaign_id}/send"
tags: ["campaigns"]
---

# Send Campaign Route

`POST /api/v1/campaigns/{campaign_id}/send`

Dispatch approved recipients (guarded: sendable status + ≥1 approved).

## Path parameters

- `campaign_id` string, uuid, required

## Response `200`

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

- `404` — Campaign not found
- `422` — Validation Error

## Changes

- **2026-09-03** `d65b8fefae34` — 2 info
  - added the optional property `detail/items/ctx` to the response with the `422` status
  - added the optional property `detail/items/input` to the response with the `422` status

[Change history](https://skmtc.dev/getanana/apis/cleon-api/changes/api/v1/campaigns/:campaign_id/send/post.md)

---

[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/fbb95eac3965/schema)
