Skip to main content
PUT /api/v2/buyer/campaigns/:campaignId For managed campaigns, the mediaBuys[] array lets you update, cancel, or delete individual media buys and their packages in a single call. Tracked connected-account projections are read-only; their only accepted compatibility update is a refresh request that reads from the seller.

Request

Parameters

Always confirm optimization_goals with the buyer before changing them — silent goal changes break optimization continuity.
Retrieve package IDs with Get campaign products, optionally filtered by mediaBuyId. When the buyer names a package by its period or its dates (“the Week 6 package”, “the display package ending 2026-08-11”), use Get media buy packages instead: it is scoped to one media buy and returns each package’s pacingPeriod and flight window, which is what resolves a description to exactly one id. Package IDs are opaque, so do not derive one by parsing the trailing number on another. Do not submit a real update to test whether an ID is valid: the API validates package ownership before dispatch and returns VALIDATION_ERROR for unknown IDs.

Refresh a tracked connected-account campaign

The compatibility refresh request is:
This request prioritizes a fresh account read and reconciles the projection. It does not change the connected seller account. Any other update shape for a tracked campaign is rejected.

Reducing campaign budgets

Lower an executed campaign’s spend through this campaign update endpoint. Do not archive and rebuild a media buy just to reduce its budget. Every budget is gross (fee-inclusive), so the comparison is direct: live media buys can never allocate more than budget.total. Lowering budget.total below what live media buys have already allocated is rejected with INSUFFICIENT_MEDIA_BUDGET — the error names the new total and the committed allocation so you know what to shrink or cancel first. Lowering into headroom (new total at or above the current allocation) succeeds on its own. To reduce the campaign and its live media buys together, put both changes in one request: the new budget.total plus explicit mediaBuys[].packages[].budget reductions. The request is validated against the projected post-update allocation and applied atomically — if a package reduction cannot be applied, the campaign-level budget.total is not lowered.
Lower into headroom — budget change alone
Reduce campaign budget and live packages in one call

Updating a package’s flight dates

Change an individual package’s flight start or end date without canceling and recreating it — useful when one package needs a narrower or extended window than the rest of the media buy. startTime/endTime must fall within the media buy’s own date range.
Extend one package's flight end date
Only the packages you name are changed — sibling packages on the same media buy keep their existing flight windows. When a package has no stored flight dates and its seller has not returned valid_actions or available_actions for the buy, the request is rejected as unsupported rather than forwarded speculatively. Wait for seller capabilities or confirm package date support with the seller first.

Response

When the request includes pacingPeriods, the response also carries a pacingCascadeResult block at the top level alongside campaign, summarizing the per-media-buy outcome of pushing appended periods to live media buys. See the Pacing periods guide for that shape, append-only rules, and unsupported-agent fallback. When one or more media buy updates require seller approval (e.g. a seller-managed storefront), the server returns 202 Accepted with a proposals array instead of the campaign object:

Errors

  • 400 VALIDATION_ERROR — a creative_ids entry is not linked to the campaign or does not match a format the media buy’s products accept (the field is not silently filtered); or creative_ids was supplied with cancel/delete.
  • 422 CAPABILITY_NOT_SUPPORTED — a package flight-date update cannot be safely sent because the package has no stored dates and the seller has not declared available actions.
  • 403 FEATURE_NOT_ENABLED — connected-account mirroring is not enabled for this customer.
  • 409 INSUFFICIENT_MEDIA_BUDGET — the requested budget.total is below the projected live media buy allocation, even after applying the package budget reductions included in the same request. The error names the new total and the committed allocation.
  • 409 PRICING_NOT_CONFIGURED — the budget change involves media buys whose fee terms cannot be determined, so the projected allocation cannot be computed. details.unpricedBuyIds names the buys; resolve pricing for them first.
  • 404 NOT_FOUND — campaign or referenced mediaBuyId not found.
See Errors for the full error contract.

Get campaign

Read the current resource first

Get media buy status

Poll live ADCP status

Pacing periods

Append-only pacing cascade

Campaign overview

Fields, lifecycle, and concepts