Skip to main content
POST /api/v2/buyer/campaigns For discovery and performance, creates a campaign in DRAFT status for the given advertiser. Flight dates and budget are required. Products, creatives, and audiences attach afterward. The legacy routingType field is not a campaign input; it is derived per media buy as temporary billing compatibility metadata from BillingParty. It is never a storefront or execution type and is independent of campaign mode, BYOA, and protocol connectivity. Execute the campaign later to turn it into live media buys. Buyer-owned labels are applied through V3 MCP save_campaign, not this REST create. See Dimensions and labels.

REST request

Every campaign budget is GROSS: budget.total is the all-in amount the buyer pays, with Apostra 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

Safe retries

Send an idempotencyKey when the client may retry after a timeout or lost response. The key is scoped to the authenticated customer and remains bound to the first campaign created for that advertiser. A replay returns that campaign instead of creating another one, even if the retried body contains different values. Generate a new key for a new campaign. Reusing a key for another advertiser returns 409 CONFLICT.

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.
  • 409 CONFLICT — idempotencyKey was already used for another advertiser.
  • 404 NOT_FOUND — advertiserId 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 eligible storefront inventory

Execute campaign

Launch into media buys