Skip to main content
POST /api/v2/buyer/campaigns For discovery and performance, creates a campaign in DRAFT status for the given advertiser. You set flight dates and budget up front; products, creatives, and audiences attach afterward. The legacy routingType field is not a campaign input; it is derived per media buy as compatibility metadata for the current execution path and is independent of campaign mode, BYOA, protocol connectivity, and settlement. Execute the campaign later to turn it into live media buys. Every campaign budget is GROSS: budget.total is the all-in amount the buyer pays, with the Interchange fee inside it. Every budget downstream is gross too — media buy and package budgets allocate against budget.total directly, and the media/fee split is derived per media buy at the fee terms locked when that buy is created (readable via its budget_breakdown — see Budgets and fees). There is no fee-model input at creation — the campaign object has no feeType field.

Request

Parameters

Response

The campaign is created in status: "DRAFT". campaign.campaignId is the stable identifier you pass to every sibling operation. Routing is decided per media buy at execution time — a campaign has no routing type of its own. When the request included a discoveryId, the response also carries productGroups, budgetContext, and summary from the discovery session.

Errors

  • 400 VALIDATION_ERROR — missing required field, malformed flightDates, or non-positive budget.total.
  • 404 NOT_FOUNDadvertiserId does not exist or is not visible to the authenticated account.
See Errors for the full error contract.

Campaign tasks

All campaign operations

Campaign overview

Fields, lifecycle, and concepts

Auto-select products

Populate a campaign from decisioned inventory

Execute campaign

Launch into media buys