---
title: "Duplicate an SMS campaign"
description: "Copy an SMS campaign into a new draft: template, segment, sender, topic, exclusions and fallbacks; never the send time or status. `POST /api/v1/sms/campaigns/{id}/duplicate`"
url: https://www.unitpost.com/docs/sms/post-sms-campaigns-id-duplicate
section: "SMS API reference"
updated: 2026-10-13
---
# Duplicate an SMS campaign

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

Copy an SMS campaign into a new `draft`: template, segment, sender, topic, exclusions and fallbacks; never the send time or status. A source that points at a deleted template or an archived segment is a `422`; readiness problems (unpublished template, sender not live) don't stop the copy, and [Validate an SMS campaign](https://www.unitpost.com/docs/sms/get-sms-campaigns-id-validate) reports them. Optional `name` for the copy; any other key is a `422`. Pass an `Idempotency-Key` so a retry returns the same copy. Requires the `campaigns:write` capability.

## Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `id` | path | string | yes | — |
| `Idempotency-Key` | header | string | no | Any unique string (1–256 characters, e.g. a UUID). Retrying with the same key and the same body within 24 hours returns the first result instead of sending again; the same key with a different body is `409 invalid_idempotent_request`, and one still in flight is `409 concurrent_idempotent_requests`. |

## Request body

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `name` | string | no | Name of the copy. Defaults to the source's name with " (copy)". |

## Response fields (201)

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `object` | string | yes | — |
| `id` | string | yes | — |
| `name` | string | yes | — |
| `status` | enum | yes | One of: `draft`, `scheduled`, `sending`, `paused`, `sent`, `canceled`, `failed`. |
| `type` | enum | yes | One of: `marketing`, `transactional`. |
| `template_id` | string | yes | — |
| `segment_id` | string | yes | — |
| `sender_id` | string \| null | yes | — |
| `topic_id` | string \| null | yes | — |
| `routing` | enum | yes | One of: `automatic`, `fixed`, `pool`. |
| `scheduled_at` | string \| null | yes | — |
| `hold` | object \| null | yes | — |
| `pause_reason` | object \| null | yes | — |
| `projected_recipients` | object \| null | yes | — |
| `recipient_count` | number | yes | — |
| `variable_fallbacks` | object | yes | — |
| `excluded_contact_ids` | string[] | yes | — |
| `started_at` | string \| null | yes | — |
| `completed_at` | string \| null | yes | — |
| `canceled_at` | string \| null | yes | — |
| `created_at` | string | yes | — |
| `updated_at` | string | yes | — |

## Responses

| Status | Description |
| --- | --- |
| 201 | The new SMS draft. |
| 400 | The body isn't JSON, or the `Idempotency-Key` header is not 1–256 characters. |
| 401 | Missing or invalid API key. |
| 403 | Insufficient scope, or SMS is not on this plan: create, send, resume and reschedule return `limit_reached` with `feature_not_in_plan` on `smsChannel` in `error.details[]`. |
| 404 | SMS campaign not found, or SMS is not enabled. |
| 409 | Idempotency conflict (same key, different body or campaign, or still in flight). |
| 422 | An unknown key, or the source points at a deleted template or an archived segment. |

## Example request

```bash
curl -X POST 'https://www.unitpost.com/api/v1/sms/campaigns/cmp_123/duplicate' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -H 'User-Agent: my-app/1.0' \
  -H 'Content-Type: application/json' \
  -d '{ }'
```

## Example response (201)

```json
{
  "object": "sms_campaign",
  "id": "id_123",
  "name": "Example",
  "status": "draft",
  "type": "marketing",
  "template_id": "template_123",
  "segment_id": "segment_123",
  "sender_id": "sender_123",
  "topic_id": "topic_123",
  "routing": "automatic",
  "scheduled_at": "2026-01-01T00:00:00.000Z",
  "hold": {
    "reason": "scheduled",
    "until": "string"
  },
  "pause_reason": {
    "code": "user",
    "message": "string",
    "paused_at": "2026-01-01T00:00:00.000Z"
  },
  "projected_recipients": {
    "total": 1,
    "reachable": 0,
    "skipped": 0
  },
  "recipient_count": 1,
  "variable_fallbacks": {},
  "excluded_contact_ids": [
    "string"
  ],
  "started_at": "2026-01-01T00:00:00.000Z",
  "completed_at": "2026-01-01T00:00:00.000Z",
  "canceled_at": "2026-01-01T00:00:00.000Z",
  "created_at": "2026-01-01T00:00:00.000Z",
  "updated_at": "2026-01-01T00:00:00.000Z"
}
```

## Links

- HTML reference (with Node.js, Python, Ruby, PHP, Laravel, Go, Java, Rust, .NET and CLI examples): https://www.unitpost.com/docs/sms/post-sms-campaigns-id-duplicate
- OpenAPI 3.1 (full schemas): https://www.unitpost.com/api/v1/openapi.json
