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

# Create Campaign

`POST /campaigns`

Noso creates AND launches — there is no draft state. Anyone else's Create &
launch is a launch request: saved to Recommended, announced on Slack, launched by hand.

## Request body

- CreateCampaignRequest — A campaign is always created from a completed audience build — either a described audience the agent resolved, or a pasted customer list.
  - `name` string, required
  - `audience_build_id` string, required
  - `sender_name` string, nullable
  - `goal` string, nullable
  - `agent_instructions` string, nullable
  - `audience_limit` integer, nullable
  - `redirect_phone_number` string, nullable
  - `first_message_template` string, nullable
  - `continuous_enrollment` boolean
  - `booking` CampaignBookingSelection — The operator's final answer to "what does a yes book?" for one campaign.
    - `office_handles_booking` boolean
    - `job_type_id` integer, nullable
    - `business_unit_id` integer, nullable
    - `team_ids` integer[]
    - `visit_label` string
  - `message_preview` string, nullable

## Response `200`

Successful Response

- union
  - CreateCampaignResponse
    - `campaign` CampaignSummary, required
      - `id` string, required
      - `name` string, required
      - `status` string, required
      - `goal_met_label` string
      - `goal_met_outcome` string
      - `first_message_template` string, nullable
      - `unique_customers` integer, required
      - `unique_locations` integer, required
      - `total_events` integer, required
      - `created_at` string, required
      - `updated_at` string, nullable
      - `owner_name` string
      - `total_sent` integer
      - `total_replied` integer
      - `total_goal_met` integer
      - `total_refused` integer
      - `total_no_response` integer
      - `action_required_count` integer
      - `pending_count` integer
      - `progress` integer
    - `total_customers` integer, required
    - `total_events` integer, required
  - ApproveCampaignSuggestionResponse — A manager's approve is a Slack notice; Noso's approve launches, and says so.
    - `suggestion_id` string, required
    - `campaign_name` string, required
    - `audience_count` integer, required
    - `launched` boolean
    - `campaign_id` string, nullable
    - `total_customers` integer
    - `queued_count` integer

## Other responses

- `404` — Not found
- `422` — Validation Error

## Changes

- **2026-09-23** `d1993647e543` — 4 info
  - added the optional property `anyOf[subschema #2: ApproveCampaignSuggestionResponse]/campaign_id` to the response with the `200` status
  - added the optional property `anyOf[subschema #2: ApproveCampaignSuggestionResponse]/launched` to the response with the `200` status
  - added the optional property `anyOf[subschema #2: ApproveCampaignSuggestionResponse]/queued_count` to the response with the `200` status
  - added the optional property `anyOf[subschema #2: ApproveCampaignSuggestionResponse]/total_customers` to the response with the `200` status
- **2026-09-18** `40ae92592bd0` — 4 breaking, 1 warning, 3 info
  - the response's body type changed from `object` to no type for status `200`
  - removed the required property `campaign` from the response with the `200` status
  - removed the required property `total_customers` from the response with the `200` status
  - removed the required property `total_events` from the response with the `200` status
  - …4 more
- **2026-09-16** `c14a8fc770d0` — 1 info
  - added the new optional request property `booking`
- **2026-09-12** `a89ec63b4428` — 5 warning
  - removed the request property `business_unit_id`
  - removed the request property `max_rounds`
  - removed the request property `round_interval_days`
  - removed the optional property `campaign/campaign_topic` from the response with the `200` status
  - …1 more
- …earlier changes not shown

[Full history](https://skmtc.dev/noso/apis/crucible-backend-api/changes/campaigns/post.md)

---

[API](https://skmtc.dev/noso/apis/crucible-backend-api.md) · [All operations](https://skmtc.dev/noso/apis/crucible-backend-api/llms.txt) · [OpenAPI document](https://skmtc.dev/noso/apis/crucible-backend-api/revisions/d1993647e543?raw)
