---
title: "Start Audience Build"
method: POST
path: "/campaigns/audience-builds"
tags: ["campaigns"]
---

# Start Audience Build

`POST /campaigns/audience-builds`

Queue a natural-language audience build; audience_build_worker claims it.

## Request body

- StartAudienceBuildRequest
  - `description` string
  - `intake_id` string, nullable
  - `objective` string, nullable
  - `suggested_goal_met_label` string, nullable
  - `audience_limit` integer, nullable
  - `upload_id` string, nullable

## Response `200`

Successful Response

- StartAudienceBuildResponse
  - `build` CampaignAudienceBuild, required
    - `id` string, required
    - `status` string, required
    - `progress` integer
    - `step` string
    - `activity` string[]
    - `description` string, required
    - `interpreted_plan` object
    - `error_message` string, nullable
    - `candidate_count` integer
    - `suggested_count` integer
    - `selected_count` integer
    - `audience_limit` integer, nullable
    - `objective` CampaignObjective — The WHY of a campaign: the stated goal and how a win will be verified.
      - `id` string, required
      - `text` string, required
      - `source` string, required
      - `mode` string
      - `outcome_key` string, nullable
      - `label` string
      - `conversation_test` string
      - `reasoning` string
      - `resolved_at` string, nullable
    - `suggestions` AudienceSuggestion[]
      - `id` string, required
      - `st_customer_id` string, nullable
      - `member_key` string
      - `customer_name` string, required
      - `phones` string[]
      - `emails` string[]
      - `location_addresses` string[]
      - `customer_tags` object[]
      - `location_tags` object[]
      - `membership_type_names` string[]
      - `service_names` string[]
      - `explanation` string
      - `reasons` string[]
      - `confidence` number
      - `included` boolean
      - `rank` integer
      - `score` integer, nullable
      - `score_factors` string[]
      - `recent_campaign_contacts` RecentCampaignContact[]
        - `campaign_id` string, required
        - `campaign_name` string, required
        - `contacted_at` string, required
        - `status` string
      - `active_followup_overlap` boolean
      - `active_followup_count` integer
      - `active_followup_statuses` string[]
    - `accepted_campaign_id` string, nullable
    - `from_upload` boolean
    - `created_at` string, required
    - `updated_at` string, nullable

## Other responses

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

## Changes

- **2026-09-19** `216c8523b7ae` — 2 info
  - added the optional property `build/suggestions/items/score` to the response with the `200` status
  - added the optional property `build/suggestions/items/score_factors` to the response with the `200` status
- **2026-09-18** `40ae92592bd0` — 1 warning, 1 info
  - removed the request property `campaign_user_id`
  - added the optional property `build/from_upload` to the response with the `200` status
- **2026-09-16** `46c87bbc4486` — 1 info
  - added the optional property `build/accepted_campaign_id` to the response with the `200` status
- **2026-09-14** `0d7ad1d56e7d` — 1 warning
  - removed the request property `customer_ids`
- **2026-09-12** `a89ec63b4428` — 1 warning, 3 info
  - removed the request property `topic`
  - added the new optional request property `intake_id`
  - the `objective/anyOf[subschema #1]/` request property's maxLength was increased from `300` to `500`
  - added the optional property `build/objective` to the response with the `200` status

[Full history](https://skmtc.dev/noso/apis/crucible-backend-api/changes/campaigns/audience-builds/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/f2cac64213a3?raw)
