POST /v3/campaign/clone → campaignClonesCreate
Overview
| Property | Value |
|---|---|
| REST endpoint | POST /v3/campaign/clone |
| GraphQL operation | campaignClonesCreate |
| Input type | CampaignCloneCreateInput |
| Output type | PayloadWithErrorsOfListOfCampaignCloneProgress (data: [CampaignCloneProgress!], userErrors: [UserError!]) |
Multi-step operations
REST returns a single ReferenceId for one clone job. GraphQL campaignClonesCreate supports batch cloning via campaignCloneData—map a single REST clone to one element with numberOfClones: 1. Track progress with campaignCloneProgress (see the campaign clone status read endpoint).
Input field mapping
Input type: CampaignCloneCreateInput
| REST field | GraphQL field | GraphQL type | Required | Notes |
|---|---|---|---|---|
CampaignId |
campaignCloneData[].campaignId |
String! | Required | REST single-clone maps to one CampaignCloneDataInput element |
CampaignName |
campaignCloneData[].cloneNames[] |
String! | Required | REST single name → cloneNames list; set numberOfClones: 1 |
TargetAdvertiserId |
campaignCloneData[].targetAdvertiserId |
String | Optional | N/A |
IsBuildInProgress |
N/A | N/A | Optional | No direct GraphQL input equivalent |
CampaignFlights |
campaignCloneData[].campaignFlights |
[CampaignCloneCampaignFlightInput!] | Optional | Nested flight overrides |
CampaignFlights.CampaignFlightId |
campaignCloneData[].campaignFlights[].campaignFlightId |
Long | Optional | Required when overriding an existing flight |
CampaignFlights.StartDateInclusiveUTC |
campaignCloneData[].campaignFlights[].startDateInclusive |
DateTime | Optional | N/A |
CampaignFlights.EndDateExclusiveUTC |
campaignCloneData[].campaignFlights[].endDateExclusive |
DateTime | Optional | N/A |
CampaignFlights.BudgetInAdvertiserCurrency |
campaignCloneData[].campaignFlights[].budgetInAdvertiserCurrency |
Decimal | Optional | N/A |
CampaignFlights.BudgetInImpressions |
campaignCloneData[].campaignFlights[].budgetInImpressions |
Long | Optional | N/A |
CampaignFlights.DailyTargetInAdvertiserCurrency |
campaignCloneData[].campaignFlights[].dailyTargetInAdvertiserCurrency |
Decimal | Optional | N/A |
CampaignFlights.DailyTargetInImpressions |
campaignCloneData[].campaignFlights[].dailyTargetInImpressions |
Long | Optional | N/A |
CampaignFlights.CampaignId |
N/A | N/A | Optional | Not currently available in GraphQL |
EnableAdGroupIds |
campaignCloneData[].selectedAdGroups[].enabled |
Boolean | Optional | For each ad group ID in the list, set enabled: true on the selectedAdGroups entry whose adGroupId matches. IDs must belong to the source campaign and appear in AdGroupIds when that list is provided. When omitted, no ad groups are enabled on clone. |
ImpressionsOnlyBudgetingCPM |
campaignCloneData[].impressionsOnlyBudgetingCPM |
Decimal | Optional | N/A |
Objective |
campaignCloneData[].objective |
CampaignObjective | Optional | N/A |
PrimaryGoal |
campaignCloneData[].primaryGoal |
CampaignCloneROIGoalInput | Optional | Nested ROI goal |
PrimaryGoal.MaximizeReach |
campaignCloneData[].primaryGoal.maximizeReach |
Boolean | Optional | N/A |
PrimaryGoal.MaximizeLtvIncrementalReach |
campaignCloneData[].primaryGoal.maximizeLtvIncrementalReach |
Boolean | Optional | N/A |
PrimaryGoal.CPCInAdvertiserCurrency |
campaignCloneData[].primaryGoal.cpcInAdvertiserCurrency |
Decimal | Optional | REST Money amount maps to Decimal |
PrimaryGoal.CTRInPercent |
campaignCloneData[].primaryGoal.ctrInPercent |
Decimal | Optional | N/A |
PrimaryGoal.NielsenOTPInPercent |
campaignCloneData[].primaryGoal.nielsenOTPInPercent |
Decimal | Optional | N/A |
PrimaryGoal.CPAInAdvertiserCurrency |
campaignCloneData[].primaryGoal.cpaInAdvertiserCurrency |
Decimal | Optional | REST Money amount maps to Decimal |
PrimaryGoal.MaximizeConversionRevenue |
N/A | N/A | Optional | Deprecated on REST |
PrimaryGoal.ReturnOnAdSpendPercent |
campaignCloneData[].primaryGoal.returnOnAdSpendPercent |
Decimal | Optional | N/A |
PrimaryGoal.VCRInPercent |
campaignCloneData[].primaryGoal.vcrInPercent |
Decimal | Optional | N/A |
PrimaryGoal.ViewabilityInPercent |
campaignCloneData[].primaryGoal.viewabilityInPercent |
Decimal | Optional | N/A |
PrimaryGoal.VCPMInAdvertiserCurrency |
campaignCloneData[].primaryGoal.vcpmInAdvertiserCurrency |
Decimal | Optional | REST Money amount maps to Decimal |
PrimaryGoal.CPCVInAdvertiserCurrency |
campaignCloneData[].primaryGoal.cpcvInAdvertiserCurrency |
Decimal | Optional | REST Money amount maps to Decimal |
PrimaryGoal.MiaozhenOTPInPercent |
campaignCloneData[].primaryGoal.miaozhenOTPInPercent |
Decimal | Optional | N/A |
PrimaryGoal.NewBuyerTargetValue |
campaignCloneData[].primaryGoal.newBuyerTargetValue |
Int | Optional | N/A |
SecondaryGoal |
campaignCloneData[].secondaryGoal |
CampaignCloneROIGoalInput | Optional | Same nested fields as PrimaryGoal |
TertiaryGoal |
campaignCloneData[].tertiaryGoal |
CampaignCloneROIGoalInput | Optional | Same nested fields as PrimaryGoal |
PrimaryChannel |
campaignCloneData[].channel |
CampaignChannel | Optional | REST PrimaryChannel → GraphQL channel |
AdGroupIds |
campaignCloneData[].selectedAdGroups[].adGroupId |
String! | Optional | N/A |
ShouldCloneAdGroupBudgets |
campaignCloneData[].shouldCloneAdGroupBudgets |
Boolean | Optional | N/A |
Version |
N/A | N/A | Optional | Not exposed in GraphQL clone mutation |
MarketplaceOptOut |
campaignCloneData[].defaultUseInventoryMarketPlace |
Boolean | Optional | Inverse semantics: REST MarketplaceOptOut: true (opt out of marketplace) maps to defaultUseInventoryMarketPlace: false; passing the same boolean value without inversion applies the opposite marketplace behavior |
Output field mapping
Output type: CampaignCloneProgress (returned as data on CampaignCloneCreatePayload)
| REST response field | GraphQL field | GraphQL type | Nullable | Notes |
|---|---|---|---|---|
ReferenceId |
id |
Long! | Not nullable | Track progress via campaignCloneProgress query |
Endpoint-specific nested types and enums
CampaignCloneAdGroupInput
Nested under campaignCloneData[].selectedAdGroups.
| GraphQL field | GraphQL type | Required | Notes |
|---|---|---|---|
adGroupId |
String! | Required | REST AdGroupIds[] or each ID in EnableAdGroupIds |
enabled |
Boolean | Optional | Set true for each ID listed in EnableAdGroupIds |
CampaignCloneROIGoalInput
Maps REST ROIGoal leaf fields (see PrimaryGoal.* rows above). GraphQL-only fields not present on REST ROIGoal: crossixAudienceQualityIndex, crossixCostPerTarget, iqviaAudienceQualityIndex, iqviaAudienceQualityIndexAndCostPerTarget.
CampaignCloneCampaignFlightInput
REST field (CampaignFlight) |
GraphQL field | GraphQL type |
|---|---|---|
| CampaignFlightId | campaignFlightId |
Long |
| StartDateInclusiveUTC | startDateInclusive |
DateTime |
| EndDateExclusiveUTC | endDateExclusive |
DateTime |
| BudgetInAdvertiserCurrency | budgetInAdvertiserCurrency |
Decimal |
| BudgetInImpressions | budgetInImpressions |
Long |
| DailyTargetInAdvertiserCurrency | dailyTargetInAdvertiserCurrency |
Decimal |
| DailyTargetInImpressions | dailyTargetInImpressions |
Long |
| CampaignId | N/A | N/A |
| N/A | budgetInOutcomes |
Long |
Code examples
REST example
POST /v3/campaign/clone HTTP/1.1
Content-Type: application/json
TTD-Auth: AUTH_TOKEN_PLACEHOLDER
{
"CampaignId": "camp123",
"CampaignName": "Clone of Summer Sale",
"TargetAdvertiserId": "adv456",
"IsBuildInProgress": true
}
GraphQL example
POST /graphql HTTP/1.1
Content-Type: application/json
TTD-Auth: AUTH_TOKEN_PLACEHOLDER
mutation {
campaignClonesCreate(
input: {
campaignCloneData: [
{
campaignId: "camp123"
cloneNames: ["Clone of Summer Sale"]
numberOfClones: 1
targetAdvertiserId: "adv456"
}
]
}
) {
data {
id
}
userErrors {
message
field
}
}
}