PUT /api/v2/buyer/campaigns/:campaignId
Accepts partial updates to a campaign. The mediaBuys[] array lets you update, cancel, or delete individual media buys and their packages in a single call.
Request
Parameters
| Field | Type | Required | Notes |
|---|---|---|---|
name | string | No | Rename the campaign (max 255) |
budget | object | No | { total, currency, dailyCap?, pacing? } |
pacingPeriods | object | No | Append periods; returns a pacingCascadeResult in the response |
frequencyCaps | array | No | Replaces all existing non-archived caps |
mediaBuys[] | array | No | Per-media-buy actions (see below) |
mediaBuys[].action | enum | Yes (per entry) | update (default — modify), cancel (cancel running), delete (archive) |
mediaBuys[].mediaBuyId | string | Yes (per entry) | Target media buy |
mediaBuys[].packages | array | No | Per-package budget, pacing, bid overrides |
mediaBuys[].packageIds | array | No | Scope a cancel to specific packages only |
mediaBuys[].creative_ids | array | No | Override auto-sync. [] clears all creatives. Only valid with action: "update" |
mediaBuys[].optimization_goals | array | No | Event- or metric-based goals applied to every package |
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. Whenbudget.total is reduced below the current live package allocation,
Scope3 automatically generates proportional mediaBuys[].packages[].budget
reductions for live packages so the post-update package allocation fits inside
the new media budget.
Explicit package budgets always win. If the request includes
mediaBuys[].packages[].budget for a package, Scope3 uses that amount and
proportionally scales only the remaining eligible packages.
The update is atomic for generated package reductions: if Scope3 cannot apply
one of the generated seller budget updates, the campaign-level budget.total
is not lowered.
Reduce campaign and live package budgets
Reduce campaign budget with explicit package overrides
Response
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— acreative_idsentry is not linked to the campaign or does not match a format the media buy’s products accept (the field is not silently filtered); orcreative_idswas supplied withcancel/delete.400 INSUFFICIENT_MEDIA_BUDGET— the requested campaign media budget is still below projected live allocations after applying explicit and generated package budget reductions.404 NOT_FOUND— campaign or referencedmediaBuyIdnot found.
Related
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