---
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
    - `suggestion_id` string, required
    - `campaign_name` string, required
    - `audience_count` integer, required

## Other responses

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

## Changes

- **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
- **2026-09-09** `a786fa3c27df` — 3 breaking, 5 warning, 1 info
  - the request property `audience_build_id` became required
  - request property `audience_build_id` list-of-types was narrowed by removing types `null` from media type `application/json`
  - the `audience_build_id` request property's minLength was increased from `0` to `1`
  - removed the request property `customer_ids`
  - …5 more
- **2026-09-02** `d96feef8e2ef` — 2 warning
  - removed the optional property `campaign/applied_filters` from the response with the `200` status
  - removed the optional property `campaign/batch_count` from the response with the `200` status

[Change 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/216c8523b7ae?raw)
