Skip to main content
POST
Duplicate a campaign

Request contract

  • Method and path: POST /apis/v1/ads/campaigns/{campaignId}/duplicate
  • Availability: enabled
  • Request URL template: https://api.aisa.one/apis/v1/ads/campaigns/{campaignId}/duplicate
  • campaignId: path; required
  • connectionId: query; required
  • X-Aisa-Confirm: header; optional
  • Idempotency-Key: header; optional
  • Runtime facts: fe60122939c67dc98a3a6ac6b97bd5c326b526105150c8959304dd2160d4dd09
Complete OpenAPI definition Effective request and pricing declaration (including authentication and referenced schemas):

Cost and request rules

A request reference price is not currently available; use a request quote where supported. Account-specific pricing and final settlement may differ. Published reference values are not an account-specific quote or a settled charge. For endpoints supporting X-AISA-Cost-Mode: quote, obtain a free quote for your exact request before execution; reconcile the settled cost with response metadata and Usage Logs. USD amounts use 1,000,000 integer micro-USD per dollar.

Authorizations

Authorization
string
header
required

Bearer authentication header of the form Bearer <token>, where <token> is your auth token.

Headers

X-Aisa-Confirm
enum<string>

Required with the value "spend" when the request can spend money or change spend. Without it the request is refused with 409 confirmation_required, which describes what would happen; nothing is sent to the ad platform.

Available options:
spend
Idempotency-Key
string

Passed to the ad platform integration: a retry with the same key returns the first result instead of acting twice. AIsa never retries a write for you.

Required string length: 1 - 191

Path Parameters

campaignId
string
required

Source platform campaign ID

Query Parameters

connectionId
string
required

The ads connection (adc_...) the request runs on: one of yours, from GET /apis/v1/ads/connections. On a request with a JSON body it may be sent as a top-level body member instead.

Pattern: ^adc_[0-9A-Za-z]+$

Body

application/json
connectionId
string

The ads connection (adc_...), when not sent as the connectionId query parameter.

Pattern: ^adc_[0-9A-Za-z]+$
deepCopy
boolean
default:true

Copy child ad sets + ads + creatives + targeting

endTime
string<date-time>

Reschedule the copied hierarchy's end, read like startTime; a date-only end runs to 23:59:59 local. Defaults to the source's end.

platform
enum<string>

Filled from the connection when omitted.

Available options:
facebook,
instagram,
tiktok,
linkedin,
meta
renamePrefix
string

Text prepended to each renamed object's name.

renameStrategy
enum<string>

Meta's native rename_strategy values: DEEP_RENAME: renames the copied campaign and every copied child (ad sets, ads) with renamePrefix / renameSuffix.

Available options:
DEEP_RENAME,
ONLY_TOP_LEVEL_RENAME,
NO_RENAME
renameSuffix
string

Text appended to each renamed object's name. On LinkedIn an omitted suffix defaults to (Copy).

startTime
string<date-time>

Reschedule the copied hierarchy's start (ISO 8601). TikTok defaults to a start a few minutes after the copy.

statusOption
enum<string>
default:PAUSED

ACTIVE = launch the clone immediately (spends the moment LinkedIn approves it). PAUSED = clone stays DRAFT, safe default. INHERITED_FROM_SOURCE = mirror each entity's source status per-entity.

Available options:
ACTIVE,
PAUSED,
INHERITED_FROM_SOURCE
syncAfter
boolean
default:true

Trigger ads discovery on the owning account after the copy succeeds

Response

Campaign duplicated

adIdMap
object

Meta only: source ad ID to copied ad ID, across every copied ad set. Empty when deepCopy is false.

adSetIdMap
object

Meta only: source ad set ID to copied ad set ID. Empty when deepCopy is false.

copiedCampaignId
string

Platform ID of the new campaign

discovery
enum<string>
Available options:
triggered,
skipped,
failed
raw
object

Platform-native response from the copy (TikTok and LinkedIn). Absent on Meta, which returns adSetIdMap and adIdMap instead.