---
title: "Generate a campaign draft plan"
method: POST
path: "/api/campaigns/generate"
tags: ["Campaigns"]
---

# Generate a campaign draft plan

`POST /api/campaigns/generate`

## Request

- Base URL: `https://api.setluca.com`
- URL: `https://api.setluca.com/api/campaigns/generate`
- Auth: one of:
  - API key in cookie `luca.session_token`
  - API key in header `x-api-key`
  - HTTP bearer

Builds a campaign plan from a brief with fixed rules, without a model. Nothing is saved. Create the draft from the plan, review it, and publish it yourself.

**API key scopes:** `campaigns:write`. You also need an `Idempotency-Key` header.

## Headers

- `Luca-API-Version` '1'

## Request body

- CampaignGenerate
  - `mode` 'new' | 'guided_improvement' | 'improve_existing'
  - `prompt` string, required
  - `targetAudience` string
  - `goal` 'book_call' | 'qualify' | 'nurture' | 'recover' | 'reactivation' | 'event_webinar' | 'promo'
  - `primaryChannel` 'telegram' | 'instagram' | 'messenger' | 'whatsapp'
  - `fallbackChannels` string[]
  - `source` 'instagram_comments' | 'instagram_dm' | 'whatsapp' | 'csv_import' | 'webhook_crm' | 'broadcast'
  - `sampleMessages` string[]
  - `faqsAndObjections` string[]
  - `pricingAndPaymentFacts` string[]
  - `bookingConstraints` string[]
  - `complianceDisallowedClaims` string[]
  - `toneExamples` string[]
  - `existingGraph` object
    - `version` 1, required
    - `startNodeId` string, required
    - `nodes` object[], required
      - `id` string, required
      - `type` 'trigger' | 'condition' | 'action' | 'message' | 'booking' | 'wait_duration' | 'wait_until_time' | 'wait_for_event' | 'wait_for_reply' | 'wait_for_condition' | 'branch' | 'control' | 'stop' | 'handoff' | 'split' | 'exit_on', required
      - `label` string
      - `config` object
    - `edges` object[]
      - `id` string, required
      - `source` string, required
      - `target` string, required
      - `label` string
      - `condition` object
    - `knowledge` object
      - `offerDescription` string
      - `priceAndPaymentFacts` string[]
      - `programStructure` string[]
      - `bookingRules` string[]
      - `faqsAndObjections` string[]
      - `disallowedClaims` string[]
      - `resourceLinks` string[]
      - `exampleGoodReplies` string[]
      - `sourceNotes` string[]
    - `qualification` object
      - `requiredFields` string[]
      - `disqualifiers` string[]
      - `minimumScore` number
      - `requireExplicitConsentBeforeBooking` boolean
      - `bookingCtaLogic` string
      - `outcomes` string[]
    - `analyticsGoal` string
  - `guidance` string

## Response `200`

ok

- CampaignGenerateResponse
  - `name` string, required
  - `description` string, required
  - `graph` object, required
    - `version` 1, required
    - `startNodeId` string, required
    - `nodes` object[], required
      - `id` string, required
      - `type` 'trigger' | 'condition' | 'action' | 'message' | 'booking' | 'wait_duration' | 'wait_until_time' | 'wait_for_event' | 'wait_for_reply' | 'wait_for_condition' | 'branch' | 'control' | 'stop' | 'handoff' | 'split' | 'exit_on', required
      - `label` string
      - `config` object
    - `edges` object[]
      - `id` string, required
      - `source` string, required
      - `target` string, required
      - `label` string
      - `condition` object
    - `knowledge` object
      - `offerDescription` string
      - `priceAndPaymentFacts` string[]
      - `programStructure` string[]
      - `bookingRules` string[]
      - `faqsAndObjections` string[]
      - `disallowedClaims` string[]
      - `resourceLinks` string[]
      - `exampleGoodReplies` string[]
      - `sourceNotes` string[]
    - `qualification` object
      - `requiredFields` string[]
      - `disqualifiers` string[]
      - `minimumScore` number
      - `requireExplicitConsentBeforeBooking` boolean
      - `bookingCtaLogic` string
      - `outcomes` string[]
    - `analyticsGoal` string
  - `assumptions` string[], required
  - `alternativePlans` object[], required
    - `id` string, required
    - `name` string, required
    - `strategy` string, required
    - `tradeoffs` string[], required
    - `recommended` boolean, required
  - `recommendedQuestions` string[], required
  - `providerCapabilityAssumptions` string[], required
  - `readinessChecklist` object[], required
    - `id` string, required
    - `label` string, required
    - `status` 'ready' | 'needs_review' | 'blocked', required
    - `detail` string, required
  - `seedCases` object[], required
    - `id` string, required
    - `name` string, required
    - `eventType` 'instagram_comment' | 'instagram_dm' | 'whatsapp_reply' | 'booking_event' | 'crm_event' | 'webhook_event' | 'csv_import' | 'manual_enrollment', required
    - `sourceKind` 'fake_input' | 'seed_case' | 'replayed_enrollment', required
    - `lead` object, required
    - `eventPayload` object, required
    - `context` object, required
    - `expectedOutcome` string, required
  - `weakCopyFindings` object[], required
    - `nodeId` string, required
    - `severity` 'warning' | 'blocker', required
    - `issue` string, required
    - `suggestion` string, required
  - `publishGate` object, required
    - `simulatorPassRequired` boolean, required
    - `requiredSeedCaseCount` integer, required
    - `requiredPassingSeedCases` integer, required
    - `blocksPublishUntil` string[], required
    - `detail` string, required
  - `repairLog` string[], required
  - `safety` object, required
    - `action` 'allow' | 'review' | 'block', required
    - `blockers` string[], required
    - `reviewReasons` string[], required
    - `findings` object[], required
      - `code` string, required
      - `action` 'review' | 'block', required
      - `message` string, required
      - `source` string, required
      - `path` string
      - `nodeId` string
      - `confidence` number
      - `evidence` string

## Other responses

- `400`: validation failed
- `401`: unauthorized
- `429`: rate limited

---

[API](https://skmtc.dev/setluca/apis/luca-api.md) · [All operations](https://skmtc.dev/setluca/apis/luca-api/llms.txt) · [OpenAPI document](https://skmtc.dev/setluca/apis/luca-api/revisions/90a200e4100b?raw)
