POST /v3/campaign → campaignCreate
Overview
| Property |
Value |
| REST endpoint |
POST /v3/campaign |
| GraphQL operation |
campaignCreate |
| Input type |
CampaignCreateInput |
| Output type |
PayloadWithErrorsOfCampaign (data: Campaign, userErrors: [UserError!]!) |
Multi-step operations
| REST-only behavior |
GraphQL target |
AssociatedBidLists on create |
campaignAssociateBidList after create |
IsBuildInProgress |
REST transport only |
Top-level Budget, StartDate, EndDate without CampaignFlights |
GraphQL requires flights on CampaignCreateInput; map REST dates/budgets into flights[] |
CampaignName |
name on CampaignCreateInput |
CustomLabels (assigned-label objects) |
customLabelNames (label name strings only) |
NewFrequencyConfigs |
frequencyConfigs (different input shape—see FrequencyConfigInput) |
AdditionalFeeCardOnCreate |
passThroughFeeCard |
Input field mapping
Input type: CampaignCreateInput
| REST field |
GraphQL field |
GraphQL type |
Required |
Notes |
AdvertiserId |
advertiserId |
String! |
Required |
RequiredOnCreate |
CampaignName |
name |
String! |
Required |
RequiredOnCreate |
Description |
description |
String |
Optional |
N/A |
PartnerCostPercentageFee |
N/A |
N/A |
Optional |
Not currently available in GraphQL |
PartnerCPMFee |
N/A |
N/A |
Optional |
Deprecated on REST |
PartnerCPCFee |
N/A |
N/A |
Optional |
Deprecated on REST |
CampaignConversionReportingColumns |
campaignConversionReportingColumns |
[CampaignConversionReportingColumnInput!] |
Optional |
Required on REST create; optional on GraphQL create but typically set |
Availability |
N/A |
N/A |
Optional |
Not currently available in GraphQL |
FrequencySettings |
N/A |
N/A |
Optional |
Use frequencyConfigs instead (different shape) |
PurchaseOrderNumber |
purchaseOrderNumber |
String |
Optional |
N/A |
CtvTargetingAndAttribution |
N/A |
N/A |
Optional |
Create-only |
TimeZone |
timeZone |
IANATimeZone |
Optional |
GraphQL uses IANA/Olson format |
Budget |
flights[].budgetInAdvertiserCurrency |
Decimal! |
Optional |
Campaign-level budget maps into flight budget when flights are provided |
BudgetInImpressions |
flights[].budgetInImpressions |
Long |
Optional |
Per-flight impressions budget |
ImpressionsOnlyBudgetingCpm |
impressionsOnlyBudgetingCpm |
Decimal |
Optional |
N/A |
DailyBudget |
flights[].dailyTargetInAdvertiserCurrency |
Decimal |
Optional |
Per-flight daily target |
DailyBudgetInImpressions |
flights[].dailyTargetInImpressions |
Long |
Optional |
Per-flight daily impressions target |
StartDate |
flights[].startDateInclusiveUTC |
DateTime! |
Optional |
Required on each flight when flights are used |
EndDate |
flights[].endDateExclusiveUTC |
DateTime |
Optional |
N/A |
PacingMode |
pacingMode |
CampaignPacingMode |
Optional |
N/A |
AutoAllocatorEnabled |
N/A |
N/A |
Optional |
Deprecated on REST |
AutoPrioritizationEnabled |
N/A |
N/A |
Optional |
Deprecated on REST |
MinimumAdGroupSpendInAdvertiserCurrency |
N/A |
N/A |
Optional |
Deprecated on REST |
CampaignFlights |
flights |
[FlightCreateInput!]! |
Required |
Required on GraphQL create (at least one flight) |
IsMediaOceanCampaign |
N/A |
N/A |
Optional |
Not currently available in GraphQL |
CustomLabels |
customLabelNames |
[String!] |
Optional |
GraphQL accepts label names only |
CustomCPAType |
customCPAType |
CustomCPAType |
Optional |
N/A |
CustomCPAType |
customCPATypeInput |
CustomCPATypeInput |
Optional |
GraphQL alternative enum input for the same REST field; supply one of customCPAType or customCPATypeInput |
CustomCPAClickWeight |
customCPAClickWeight |
Decimal |
Optional |
N/A |
CustomCPAViewthroughWeight |
customCPAViewthroughWeight |
Decimal |
Optional |
N/A |
CustomROASType |
customRoasType |
CustomROASType |
Optional |
N/A |
IsBuildInProgress |
N/A |
N/A |
Optional |
Create-only |
AssociatedBidLists |
N/A |
N/A |
Optional |
Use campaignAssociateBidList after create |
IncludeDefaultsFromAdvertiser |
includeDefaultsFromAdvertiser |
Boolean! |
Required |
Required on GraphQL create (defaults to false when omitted on REST) |
DefaultBidLists |
defaultBidLists |
[DefaultBidListInput!] |
Optional |
N/A |
AdditionalFeeCardOnCreate |
passThroughFeeCard |
CampaignCreatePassThroughFeeCardInput |
Optional |
N/A |
CampaignType |
campaignType |
CampaignType! |
Required |
Required on GraphQL create |
BallotMeasureProfile |
ballotMeasureProfile |
BallotMeasureProfileInput |
Optional |
N/A |
IsBallotMeasure |
isBallotMeasure |
Boolean |
Optional |
N/A |
Increments |
increments |
[String!] |
Optional |
Frequency counter IDs |
NewFrequencyConfigs |
frequencyConfigs |
[FrequencyConfigInput!] |
Optional |
Different input shape |
Objective |
N/A |
N/A |
Optional |
Deprecated on REST |
PrimaryGoal |
primaryGoal |
CampaignCreateROIGoalInput! |
Required |
Required on GraphQL create |
SecondaryGoal |
secondaryGoal |
CampaignCreateROIGoalInput |
Optional |
N/A |
TertiaryGoal |
tertiaryGoal |
CampaignCreateROIGoalInput |
Optional |
N/A |
PrimaryChannel |
primaryChannel |
CampaignChannelType! |
Required |
Required on GraphQL create |
RTBAttributes |
N/A |
N/A |
Optional |
Not currently available in GraphQL |
EnabledValueAddedProviders |
N/A |
N/A |
Optional |
Deprecated on REST |
EnabledValueAddedProviderIds |
enabledValueAddedProviderIds |
[ID!] |
Optional |
N/A |
Version |
N/A |
N/A |
Optional |
Read-only |
GraphQL-only input fields (no REST equivalent)
| GraphQL field |
GraphQL type |
Description |
campaignGroupId |
Long |
|
campaignIncrementalReachSetting |
IncrementalReachCampaignSettingInput |
|
campaignRetailBrandSettings |
KokaiCampaignRetailBrandSettingsInput |
|
iOContractId |
Long |
|
isManagedByTTD |
Boolean |
|
lastTouchAttributionMeasuredByTheTradeDesk |
Boolean |
|
outcomeGoalType |
OutcomeGoalTypeInput |
|
pharmaCampaignBrandProductSettings |
PharmaCampaignBrandProductSettingsInput |
|
tradingModeSettingsInput |
CampaignCreateTradingModeSettingsInput |
|
userBidFactorsAsMaxBidEnabled |
Boolean |
|
validateInputOnly |
Boolean |
Validate without executing |
callerSource |
String |
|
Output field mapping
Output type: Campaign (returned as data on PayloadWithErrorsOfCampaign)
| REST response field |
GraphQL field |
GraphQL type |
Nullable |
Notes |
AdvertiserId |
advertiser.id |
String! |
Not nullable |
N/A |
CampaignId |
id |
ID! |
Not nullable |
N/A |
CampaignName |
name |
String! |
Not nullable |
N/A |
Description |
description |
String |
Nullable |
N/A |
PartnerCostPercentageFee |
partnerCostPercentageFee |
Decimal! |
Not nullable |
N/A |
PartnerCPMFee |
N/A |
N/A |
N/A |
Deprecated on REST |
PartnerCPCFee |
N/A |
N/A |
N/A |
Deprecated on REST |
CampaignConversionReportingColumns |
conversionReportingColumns |
ConversionReportingColumnsConnection |
Nullable |
Use nodes { … } |
Availability |
isArchived |
Boolean! |
Not nullable |
REST Available → false; REST Archived → true |
CtvTargetingAndAttribution |
N/A |
N/A |
N/A |
Deprecated on REST |
CreatedAtUTC |
createdAtUtc |
DateTime! |
Not nullable |
N/A |
LastUpdatedAtUTC |
lastUpdatedAtUtc |
DateTime! |
Not nullable |
N/A |
FrequencySettings |
frequencySettings |
FrequencySettings! |
Not nullable |
N/A |
PurchaseOrderNumber |
purchaseOrderNumber |
String |
Nullable |
N/A |
TimeZone |
timeZone |
String! |
Not nullable |
N/A |
Budget |
budget.total |
Decimal! |
Not nullable |
REST Money amount → CampaignBudget.total |
BudgetInImpressions |
budget.totalInImpressions |
Decimal |
Nullable |
Alternative top-level budgetInImpressions also exists on Campaign. |
ImpressionsOnlyBudgetingCpm |
impressionsOnlyBudgetingCPM |
Decimal! |
Not nullable |
N/A |
DailyBudget |
N/A |
N/A |
N/A |
Nested under budget / flights on Campaign |
DailyBudgetInImpressions |
N/A |
N/A |
N/A |
Not a top-level Campaign field |
StartDate |
startDate |
DateTime! |
Not nullable |
N/A |
EndDate |
endDate |
DateTime |
Nullable |
N/A |
AutoAllocatorEnabled |
autoAllocatorEnabled |
Boolean! |
Not nullable |
N/A |
AutoPrioritizationEnabled |
autoPrioritizationEnabled |
Boolean! |
Not nullable |
N/A |
MinimumAdGroupSpendInAdvertiserCurrency |
minimumAdGroupSpendInAdvertiserCurrency |
Decimal! |
Not nullable |
N/A |
PacingMode |
pacingMode |
CampaignPacingMode! |
Not nullable |
N/A |
CampaignFlights |
flights |
FlightsConnection |
Nullable |
Use nodes { … } |
CustomLabels |
customLabels |
CustomLabelsConnection |
Nullable |
Use nodes { … } |
CustomCPAType |
customCPAType |
CustomCPAType! |
Not nullable |
N/A |
CustomCPAClickWeight |
customCPAClickWeight |
Decimal |
Nullable |
N/A |
CustomCPAViewthroughWeight |
customCPAViewthroughWeight |
Decimal |
Nullable |
N/A |
CustomROASType |
customROASType |
CustomROASType! |
Not nullable |
N/A |
IsBuildInProgress |
isBuildInProgress |
Boolean! |
Not nullable |
N/A |
IsMediaOceanCampaign |
isMediaOceanCampaign |
Boolean |
Nullable |
N/A |
AssociatedBidLists |
associatedBidLists |
AssociatedBidListsConnection |
Nullable |
Use nodes { … } |
DefaultBidLists |
defaultBidLists |
DefaultBidListsConnection |
Nullable |
BidListId → connection nodes[].id. |
CurrentAndFutureAdditionalFeeCards |
passThroughFeeCards |
PassThroughFeeCardsConnection |
Nullable |
Use nodes { … } |
AdditionalFeeCardOnCreate |
N/A |
N/A |
N/A |
Create input only; read via passThroughFeeCards |
CampaignType |
type |
CampaignType |
Nullable |
N/A |
BallotMeasureProfile |
N/A |
N/A |
N/A |
Write-only |
IsBallotMeasure |
isBallotMeasure |
Boolean |
Nullable |
N/A |
Increments |
increments |
[Increment] |
Nullable |
N/A |
NewFrequencyConfigs |
frequencyConfigs |
[FrequencyConfig!]! |
Not nullable |
Populated on create response when NewFrequencyConfigs were provided in the request; GetAPIModel leaves the field default on GET. |
Objective |
objective |
CampaignObjective! |
Not nullable |
N/A |
PrimaryGoal |
primaryGoal |
Goal! |
Not nullable |
N/A |
SecondaryGoal |
secondaryGoal |
Goal! |
Not nullable |
N/A |
TertiaryGoal |
tertiaryGoal |
Goal! |
Not nullable |
N/A |
PrimaryChannel |
channelType |
CampaignChannelType! |
Not nullable |
N/A |
RTBAttributes |
N/A |
N/A |
N/A |
Not currently available in GraphQL |
RTBAttributes.AudienceTargeting |
N/A |
N/A |
N/A |
Not currently available in GraphQL |
RTBAttributes.AudienceTargeting.TargetDemographicSettings |
N/A |
N/A |
N/A |
Not currently available in GraphQL |
EnabledValueAddedProviders |
enabledValueAddedProviders |
[ValueAddedProviderInfo!]! |
Not nullable |
N/A |
EnabledValueAddedProviderIds |
enabledValueAddedProviders[].id |
ID! |
Not nullable |
N/A |
Version |
version |
CampaignVersion |
Nullable |
N/A |
TradingModeDetails |
tradingModeDetails |
CampaignTradingModeDetails! |
Not nullable |
N/A |
Endpoint-specific nested types and enums
FlightCreateInput
Nested under CampaignCreateInput.flights.
| GraphQL field |
GraphQL type |
Required |
Notes |
startDateInclusiveUTC |
DateTime! |
Required |
REST CampaignFlights[].StartDateInclusiveUTC or top-level StartDate |
endDateExclusiveUTC |
DateTime |
Optional |
REST EndDateExclusiveUTC or top-level EndDate |
budgetInAdvertiserCurrency |
Decimal! |
Required |
REST flight BudgetInAdvertiserCurrency or top-level Budget.Amount |
budgetInImpressions |
Long |
Optional |
N/A |
dailyTargetInAdvertiserCurrency |
Decimal |
Optional |
REST DailyTargetInAdvertiserCurrency or top-level DailyBudget |
dailyTargetInImpressions |
Long |
Optional |
N/A |
budgetInOutcomes |
Long |
Optional |
GraphQL-only outcomes budgeting |
CampaignConversionReportingColumnInput
Nested under campaignConversionReportingColumns.
| GraphQL field |
GraphQL type |
Required |
Notes |
trackingTagId |
String! |
Required |
REST TrackingTagId |
reportingColumnId |
Int! |
Required |
REST ReportingColumnId |
includeInCustomCPA |
Boolean! |
Required |
REST IncludeInCustomCPA |
weight |
Decimal |
Optional |
REST Weight |
crossDeviceAttributionModelId |
String |
Optional |
N/A |
customROASConfig |
CustomROASConfigInput |
Optional |
Nested custom ROAS settings |
productListReportingType |
ProductListReportingTypeInput |
Optional |
N/A |
CustomROASConfigInput
Nested under CampaignConversionReportingColumnInput.customROASConfig.
| GraphQL field |
GraphQL type |
Required |
Notes |
includeInCustomROAS |
Boolean! |
Required |
N/A |
customROASWeight |
Decimal |
Optional |
N/A |
customROASClickWeight |
Decimal |
Optional |
N/A |
customROASViewthroughWeight |
Decimal |
Optional |
N/A |
CampaignCreateROIGoalInput
Nested under primaryGoal, secondaryGoal, tertiaryGoal. Set exactly one goal metric field.
| GraphQL field |
GraphQL type |
Required |
Notes |
maximizeReach |
Boolean |
Optional |
Reach goal; exactly one goal metric field per goal object (mutually exclusive) |
maximizeLtvIncrementalReach |
Boolean |
Optional |
Incremental reach goal; exactly one goal metric field per goal object (mutually exclusive) |
cpaInAdvertiserCurrency |
Decimal |
Optional |
CPA goal; exactly one goal metric field per goal object (mutually exclusive) |
cpcInAdvertiserCurrency |
Decimal |
Optional |
CPC goal; exactly one goal metric field per goal object (mutually exclusive) |
returnOnAdSpendPercent |
Decimal |
Optional |
ROAS goal; exactly one goal metric field per goal object (mutually exclusive) |
viewabilityInPercent |
Decimal |
Optional |
Viewability goal; exactly one goal metric field per goal object (mutually exclusive) |
vcrInPercent |
Decimal |
Optional |
Video completion rate goal; exactly one goal metric field per goal object (mutually exclusive) |
ctrInPercent |
Decimal |
Optional |
CTR goal; exactly one goal metric field per goal object (mutually exclusive) |
FrequencyConfigInput
Nested under frequencyConfigs (maps from REST NewFrequencyConfigs).
| GraphQL field |
GraphQL type |
Required |
Notes |
counterName |
String! |
Required |
REST CounterName |
resetIntervalInMinutes |
Int! |
Required |
REST ResetIntervalInMinutes |
frequencyCap |
Int |
Optional |
REST FrequencyCap |
frequencyGoal |
Int |
Optional |
REST FrequencyGoal |
DefaultBidListInput
Nested under defaultBidLists.
| GraphQL field |
GraphQL type |
Required |
Notes |
bidListId |
ID! |
Required |
REST BidListId |
CampaignCreatePassThroughFeeCardInput
Nested under passThroughFeeCard (maps from REST AdditionalFeeCardOnCreate).
| GraphQL field |
GraphQL type |
Required |
Notes |
passThroughFees |
[CampaignCreatePassThroughFeesInput!]! |
Required |
Fee line items |
startDateUtc |
DateTime |
Optional |
Effective start date |
BallotMeasureProfileInput
Nested under ballotMeasureProfile.
| GraphQL field |
GraphQL type |
Required |
Notes |
audienceDescription |
String |
Optional |
N/A |
electionState |
UsStateInput |
Optional |
N/A |
fileLocationInS3 |
String |
Optional |
Required for some states |
geoDescription |
String |
Optional |
N/A |
isAdvertiserIEC |
Boolean |
Optional |
N/A |
payingEntityAddress |
String |
Optional |
N/A |
payingEntityExecutiveName |
String |
Optional |
N/A |
payingEntityExecutiveTitle |
String |
Optional |
N/A |
payingEntityName |
String |
Optional |
N/A |
politicalDataId |
ID |
Optional |
N/A |
CampaignBudget
Nested under budget on the response Campaign.
| GraphQL field |
GraphQL type |
Nullable |
Notes |
total |
Decimal! |
Not nullable |
REST Budget amount |
totalInImpressions |
Decimal |
Nullable |
REST impressions budget cap |
version |
CampaignBudgetingVersion! |
Not nullable |
REST BudgetingVersion |
adGroupSpendPrioritizationType |
AdGroupSpendPrioritizationType! |
Not nullable |
N/A |
allocationMode |
CampaignBudgetAllocationMode! |
Not nullable |
N/A |
currentOrUpComing |
Decimal! |
Not nullable |
Current or next upcoming flight budget |
outcomeGoalType |
OutcomeGoalType |
Nullable |
N/A |
pacingMode |
CampaignPacingMode! |
Not nullable |
N/A |
spendMode |
CampaignBudgetSpendMode |
Nullable |
N/A |
spendStrategy |
KoaSpendStrategy |
Nullable |
N/A |
totalInOutcomes |
Long |
Nullable |
N/A |
usesImpressionBudgets |
Boolean! |
Not nullable |
N/A |
usesMaximumAllocationType |
Boolean! |
Not nullable |
N/A |
Increment
Elements of increments on the response Campaign (input increments accepts counter IDs as [String!]).
| GraphQL field |
GraphQL type |
Nullable |
Notes |
creationDateUtc |
DateTime! |
Not nullable |
N/A |
frequencyCounter |
FrequencyCounter |
Nullable |
Use frequencyCounter { id name } for counter ID |
BallotMeasureProfile
| REST field |
GraphQL field |
GraphQL type |
Nullable |
Notes |
PoliticalDataId |
N/A |
N/A |
N/A |
Write-only |
ElectionState |
N/A |
N/A |
N/A |
Write-only |
PayingEntityName |
N/A |
N/A |
N/A |
Write-only |
PayingEntityAddress |
N/A |
N/A |
N/A |
Write-only |
PayingEntityExecutiveName |
N/A |
N/A |
N/A |
Write-only |
PayingEntityExecutiveTitle |
N/A |
N/A |
N/A |
Write-only |
GeoDescription |
N/A |
N/A |
N/A |
Write-only |
AudienceDescription |
N/A |
N/A |
N/A |
Write-only |
IsAdvertiserIEC |
N/A |
N/A |
N/A |
Write-only |
FileLocationInS3 |
N/A |
N/A |
N/A |
Write-only |
TargetDemographicSettings
| REST field |
GraphQL field |
GraphQL type |
Nullable |
Notes |
AudienceTargeting |
N/A |
N/A |
N/A |
Not currently available in GraphQL |
TargetDemographicSettings |
N/A |
N/A |
N/A |
Not currently available in GraphQL |
TargetDemographicSettings.DataRateType |
N/A |
N/A |
N/A |
Not currently available in GraphQL |
TargetDemographicSettings.CountryCode |
N/A |
N/A |
N/A |
Not currently available in GraphQL |
TargetDemographicSettings.Gender |
N/A |
N/A |
N/A |
Not currently available in GraphQL |
TargetDemographicSettings.StartAge |
N/A |
N/A |
N/A |
Not currently available in GraphQL |
TargetDemographicSettings.EndAge |
N/A |
N/A |
N/A |
Not currently available in GraphQL |
Code examples
REST example
POST /v3/campaign HTTP/1.1
Content-Type: application/json
TTD-Auth: AUTH_TOKEN_PLACEHOLDER
{
"AdvertiserId": "adv123",
"CampaignName": "Summer Sale",
"CampaignConversionReportingColumns": [
{
"TrackingTagId": "tag1",
"ReportingColumnId": 1,
"IncludeInCustomCPA": true
}
],
"CampaignFlights": [
{
"StartDateInclusiveUTC": "2026-07-01T00:00:00Z",
"EndDateExclusiveUTC": "2026-09-01T00:00:00Z",
"BudgetInAdvertiserCurrency": 10000.00
}
],
"PrimaryChannel": "Display",
"PrimaryGoal": { "MaximizeReach": true }
}
GraphQL example
POST /graphql HTTP/1.1
Content-Type: application/json
TTD-Auth: AUTH_TOKEN_PLACEHOLDER
mutation CreateCampaign($input: CampaignCreateInput!) {
campaignCreate(input: $input) {
data {
id
name
advertiser { id }
channelType
flights(first: 5) {
nodes {
id
startDateInclusiveUTC
budgetInAdvertiserCurrency
}
}
conversionReportingColumns(first: 5) {
nodes {
reportingColumnId
trackingTag {
id
}
}
}
}
userErrors {
message
field
}
}
}
Variables:
{
"input": {
"advertiserId": "adv123",
"name": "Summer Sale",
"campaignType": "NONE",
"primaryChannel": "DISPLAY",
"includeDefaultsFromAdvertiser": false,
"primaryGoal": { "maximizeReach": true },
"campaignConversionReportingColumns": [
{
"trackingTagId": "tag1",
"reportingColumnId": 1,
"includeInCustomCPA": true
}
],
"flights": [
{
"startDateInclusiveUTC": "2026-07-01T00:00:00Z",
"endDateExclusiveUTC": "2026-09-01T00:00:00Z",
"budgetInAdvertiserCurrency": 10000.00
}
]
}
}
The REST example includes fields (partner fees, associated bid lists, build-in-progress) that are not all available on CampaignCreateInput. Use campaignAssociateBidList and other GraphQL mutations for capabilities not covered here.