---
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. The copy is created paused so callers can review before launching.
`campaignId` retargets the copy into another campaign; omitted = the source's own campaign.

Meta: ads and creatives are included by default (`deepCopy: true`) via Meta's native
`POST /{adset-id}/copies`; the new hierarchy materializes asynchronously and sync discovery
is triggered automatically (`syncAfter: false` to skip).

TikTok: the ad group is read and recreated under the campaign with its targeting, bidding,
budget and schedule (start reset to now); `deepCopy: true` recreates its ads too (default
false). `startTime`, `endTime` and `renameStrategy` are ignored and `statusOption` must be
PAUSED or absent. The copy appears on the next discovery sync.

## 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
- `403` — Returned with code `ads_allowance_exceeded` when the team has no payment method on file and has reached the 500 free live ads: add a card to resume.
- `404` — Source ad set not found
- `501` — Only supported on Meta (facebook/instagram)

## Changes

- **2026-09-02** `017dff7e4324` — 1 info
  - added the non-success response with the status `403`

[Change history](https://skmtc.dev/zernio/apis/zernio-api/changes/v1/ads/ad-sets/:adSetId/duplicate/post.md)

---

[API](https://skmtc.dev/zernio/apis/zernio-api.md) · [All operations](https://skmtc.dev/zernio/apis/zernio-api/llms.txt) · [OpenAPI document](https://skmtc.dev/zernio/apis/zernio-api/revisions/106013ac73b8?raw)
