---
title: "Duplicate an ad set"
method: POST
path: "/v1/ads/ad-sets/{adSetId}/duplicate"
tags: ["Ad Campaigns"]
---

# Duplicate an ad set

`POST /v1/ads/ad-sets/{adSetId}/duplicate`

Duplicates an ad set, including its ads and creatives by default (`deepCopy: true`),
via Meta's native `POST /{adset-id}/copies`. The copy is created paused so callers can
review before launching. `campaignId` retargets the copy into another campaign; omitted
= the source's own campaign. The new hierarchy materializes asynchronously — sync
discovery is triggered automatically (`syncAfter: false` to skip).

## Path parameters

- `adSetId` string, required

## Headers

- `Idempotency-Key` string

## Request body

- object
  - `platform` 'facebook' | 'instagram', required
  - `campaignId` string — Destination platform campaign id (defaults to the source's campaign)
  - `deepCopy` boolean — Copy child ads + creatives
  - `statusOption` 'ACTIVE' | 'PAUSED' | 'INHERITED_FROM_SOURCE'
  - `startTime` string, date-time — Reschedule the copy's start time
  - `endTime` string, date-time
  - `renameStrategy` 'DEEP_RENAME' | 'ONLY_TOP_LEVEL_RENAME' | 'NO_RENAME'
  - `renamePrefix` string
  - `renameSuffix` string
  - `syncAfter` boolean

## Response `200`

Ad set duplicated

- object
  - `copiedAdSetId` string — Platform ID of the new ad set
  - `discovery` 'triggered' | 'skipped' | 'failed'
  - `raw` object — Meta's native copy response (includes ad_object_ids for child copies)

## Other responses

- `400` — Invalid input
- `401` — Unauthorized
- `404` — Source ad set not found
- `501` — Only supported on Meta (facebook/instagram)

---

[API](https://skmtc.net/zernio/apis/zernio-api.md) · [All operations](https://skmtc.net/zernio/apis/zernio-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/zernio/zernio-api/versions/51932b099b2f/schema)
