---
title: "Duplicate a campaign into a fresh draft"
method: POST
path: "/api/campaigns/{id}/duplicate"
tags: ["Campaigns"]
---

# Duplicate a campaign into a fresh draft

`POST /api/campaigns/{id}/duplicate`

## Request

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

Copies the campaign into a fresh unpublished draft and leaves the original alone. A trialing coach at the trial campaign cap gets 402.

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

## Path parameters

- `id` string, uuid, required

## Headers

- `Luca-API-Version` '1'

## Response `200`

ok

- CampaignDetail
  - `id` string, uuid, required
  - `name` string, required
  - `description` string, nullable, required
  - `status` 'draft' | 'published' | 'paused' | 'archived', required
  - `latestVersionNumber` integer, nullable, required
  - `createdAt` string, required
  - `updatedAt` string, required
  - `pausedForAccountHealth` boolean, required
  - `draft` object, 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
    - `updatedAt` string, required
  - `publishedVersion` object, nullable, required
    - `id` string, uuid, required
    - `versionNumber` integer, 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
    - `publishedAt` string, required

## Other responses

- `401`: unauthorized
- `402`: payment required
- `404`: not found
- `409`: conflict
- `429`: rate limited
- `500`: internal error
- `503`: service unavailable

---

[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)
