Appearance
Duplicate a campaign
Duplicates a campaign, including its ad sets, ads, creatives, and targeting by default (deepCopy: true). The copy is created paused so callers can review before launching.
Per-platform implementation:
- Meta uses the native
POST /{campaign-id}/copiesendpoint. - TikTok has no native copy primitive; Zernio walks the source graph (
/v2/campaign/get/,/v2/adgroup/get/,/v2/ad/get/) and recreates each entity via the corresponding/create/endpoints, carrying over budget / targeting / bid_type / bid_price / deep_bid_type / creative fields. Spark Ad linkage (tiktok_item_id) is preserved.
The new hierarchy is asynchronous to materialize in our DB — we trigger sync discovery automatically. Set syncAfter: false to skip and poll /v1/ads/tree on your own cadence.
Other platforms return 501 Not Implemented.
POST /v1/ads/campaigns/{campaignId}/duplicate
Duplicates a campaign, including its ad sets, ads, creatives, and targeting by default (deepCopy: true). The copy is created paused so callers can review before launching.
Per-platform implementation:
- Meta uses the native
POST /{campaign-id}/copiesendpoint. - TikTok has no native copy primitive; Zernio walks the source graph (
/v2/campaign/get/,/v2/adgroup/get/,/v2/ad/get/) and recreates each entity via the corresponding/create/endpoints, carrying over budget / targeting / bid_type / bid_price / deep_bid_type / creative fields. Spark Ad linkage (tiktok_item_id) is preserved.
The new hierarchy is asynchronous to materialize in our DB — we trigger sync discovery automatically. Set syncAfter: false to skip and poll /v1/ads/tree on your own cadence.
Other platforms return 501 Not Implemented.
Parameters
campaignId(path, string) required — Source platform campaign ID
Request body
Content-Type: application/json
platform(string) required (enum: facebook, instagram, tiktok)deepCopy(boolean) — Copy child ad sets + ads + creatives + targetingstatusOption(string) (enum: ACTIVE, PAUSED, INHERITED_FROM_SOURCE)startTime(string) — Reschedule the copied hierarchy's start timeendTime(string)renameStrategy(string) (enum: DEEP_RENAME, ONLY_TOP_LEVEL_RENAME, NO_RENAME)renamePrefix(string)renameSuffix(string)syncAfter(boolean) — Trigger ads discovery on the owning account after the copy succeeds
Responses
200 — Campaign duplicated
copiedCampaignId(string) — Platform ID of the new campaigndiscovery(string) (enum: triggered, skipped, failed)raw(object) — Platform-native response from the copy endpoint (Meta includes ad_object_ids for child copies)
400 — Invalid input
401
404 — Source campaign not found
501 — Operation not supported on this platform