Use this file to discover all available pages before exploring further.
Modify an existing media buy using PATCH semantics. Supports campaign-level and package-level updates.Response Time: Instant to days (status: completed, working < 120s, or submitted for manual review)
update_media_buy operates on any media_buy_id returned by get_media_buys, not just buys created via create_media_buy. Sales agents MUST NOT refuse updates on the basis that a buy was originally created outside AdCP (direct ad-server entry, legacy APIs, manual trafficking). Creation surface is not a supported axis of authorization; account ownership is.When a specific action is unsupported for a given buy for business reasons (contractual obligations, platform constraints, policy), the seller MUST omit only that action from valid_actions (and the corresponding entry from available_actions[]) on the buy rather than silently rejecting the corresponding update. Creation surface is not a business reason. Sellers MUST NOT return INVALID_STATE on an otherwise-valid update against a non-AdCP-created buy, and MUST NOT return a buy with systematically empty valid_actions simply because it was booked outside AdCP — that pattern is indistinguishable from hiding the buy and violates the Account Ownership vs. Creation Surface rule.
Buyers express intent through actions; the seller declares the actions available on each buy via the structured available_actions[] field (authoritative) and the flat valid_actions[] field (legacy, deprecated in 4.0). When both fields are present, consumers MUST prefer available_actions[] — it carries the resolved mode, optional sla, and optional terms_ref that the flat string array cannot represent. When a buyer issues an update_media_buy request, the seller maps the request’s fields to one or more actions and rejects with ACTION_NOT_ALLOWED (carrying attempted_action, reason, and currently_available_actions in error.details) if any mapped action is not in the buy’s resolved available_actions[].The mapping is normative — sellers and SDKs MUST use this table to translate between request fields and action identifiers so the surface is consistent across implementations.
Action
update_media_buy fields
Notes
pause
paused: true
resume
paused: false
cancel
canceled: true, cancellation_reason
Irreversible
extend_flight
end_time, packages[].end_time (later than current)
End-time push only
shorten_flight
end_time, packages[].end_time (earlier than current)
The direction-of-change actions (extend_flight / shorten_flight, increase_budget / decrease_budget / reallocate_budget) share their update_fields paths; the action is determined by comparing the requested value against the buy’s current state, not by which field is set. Server-side dispatch enforcement MUST diff request-vs-current to pick the right action and reject with ACTION_NOT_ALLOWED if the resolved action is not in the buy’s available_actions[].| update_targeting | packages[].targeting_overlay, packages[].keyword_targets_add, packages[].keyword_targets_remove, packages[].negative_keywords_add, packages[].negative_keywords_remove | |
| update_pacing | packages[].pacing | |
| update_frequency_caps | packages[].targeting_overlay.frequency_cap | Renegotiated mid-flight more often than other targeting. Field is singular frequency_cap (single rule), not plural. |
| replace_creative | packages[].creatives[] swap (assignments unchanged) | Distinct AM workflow from changing assignment set |
| update_creative_assignments | packages[].creative_assignments | Which creatives go where |
| remove_creative | Creative omitted from packages[].creatives[] and/or packages[].creative_assignments on a replacement payload | Both arrays use replacement semantics, so removal is expressed by sending the desired post-state with the creative absent (no explicit delete primitive in 3.x). Time-sensitive; sellers SHOULD support self_serve removal even when add/swap require approval |
| add_packages | new_packages[] | |
| remove_packages | packages[].canceled: true | |The coarse legacy actions (update_budget, update_dates, update_packages, sync_creatives) cover the finer-grained vocabulary in a single value for sellers still emitting the 3.0 enum surface. Sellers SHOULD migrate to the finer set; the legacy values are removed in 4.0.
Each entry in available_actions[] carries a singular mode (resolved against the buy’s current state). On the product-level allowed_actions[] template the field is modes[] (plural) because a product can offer multiple conditional modes (e.g. self_serve within tolerances, escalating to requires_approval outside).
Mode
Meaning
self_serve
Seller honors the request synchronously
conditional_self_serve
Auto-approves within tolerances, escalates outside them (programmatic guaranteed pattern)
requires_proposal
Routes through create_proposal / finalize_proposal; buyer SDK expects a proposal task back
requires_approval
Human-in-the-loop, async, no proposal artifact; buyer SDK polls or awaits webhook
Account that owns this media buy. Pass { "account_id": "..." } or { "brand": {...}, "operator": "..." }. Required for governance checks and account resolution.
media_buy_id
string
Yes
Seller’s media buy identifier to update
revision
integer
No
Expected current revision for optimistic concurrency. Seller rejects with CONFLICT on mismatch. Obtain from get_media_buys or the most recent response.
start_time
string
No
Updated campaign start time
end_time
string
No
Updated campaign end time
paused
boolean
No
Pause/resume entire media buy (true = paused, false = active)
canceled
boolean
No
Cancel the entire media buy (irreversible). Must be true when present. Seller may reject with NOT_CANCELLABLE.
cancellation_reason
string
No
Reason for cancellation
packages
PackageUpdate[]
No
Package-level updates (see below)
reporting_webhook
object
No
Update reporting webhook configuration (see below)
idempotency_key
string
No
Unique key for safe retries. If an update with the same key has already been processed, the seller returns the original response. MUST be unique per (seller, request) pair. Min 16 chars.
Override who receives the invoice for this buy. The seller MUST validate authorization and include in check_governance when governance agents are configured.
new_packages
PackageRequest[]
No
New packages to add to this media buy. Same shape as create_media_buy packages. Only supported by sellers that advertise add_packages in valid_actions.
Configure automated delivery reporting for this media buy:
Parameter
Type
Required
Description
url
string
Yes
Webhook endpoint URL
authentication
object
Yes
Auth config with schemes and credentials
reporting_frequency
string
Yes
hourly, daily, or monthly
requested_metrics
string[]
No
Specific metrics to include (defaults to all)
token
string
No
Client token for validation (min 16 chars)
Note: reporting_webhook configures ongoing campaign reporting. push_notification_config is for async operation notifications (e.g., “notify me when this update completes”).
Pause/resume specific package (true = paused, false = active)
canceled
boolean
Cancel this package (irreversible). Must be true when present. Seller may reject with NOT_CANCELLABLE.
cancellation_reason
string
Reason for canceling this package
budget
number
Updated budget allocation
impressions
number
Updated impression goal for this package
start_time
string
Updated flight start date/time in ISO 8601 format. Must fall within the media buy’s date range.
end_time
string
Updated flight end date/time in ISO 8601 format. Must fall within the media buy’s date range.
pacing
string
Updated pacing strategy
bid_price
number
Updated bid price (auction products only). This is the exact bid/price to honor unless the selected pricing option has max_bid: true, in which case it is treated as the buyer’s maximum willingness to pay (ceiling).
optimization_goals
OptimizationGoal[]
Replace all optimization goals for this package. Uses replacement semantics — omit to leave goals unchanged.
targeting_overlay
TargetingOverlay
Updated targeting restrictions
catalogs
Catalog[]
Replace the catalogs this package promotes. Uses replacement semantics — omit to leave unchanged.
keyword_targets_add
KeywordTarget[]
Keyword targets to add or upsert by (keyword, match_type) identity. On create, these are set as keyword_targets inside targeting_overlay.
keyword_targets_remove
KeywordTarget[]
Keyword targets to remove by (keyword, match_type) identity.
negative_keywords_add
NegativeKeyword[]
Negative keywords to append to this package. On create, these are set as negative_keywords inside targeting_overlay.
negative_keywords_remove
NegativeKeyword[]
Negative keywords to remove from this package.
creative_assignments
CreativeAssignment[]
Replace assigned creatives with optional weights and placement targeting
creatives
CreativeAsset[]
Upload and assign new creatives inline (must not exist in library)
package_id is required to identify the package to update.
Media buy lifecycle status after the update (present when status changes, e.g., cancellation). Canonical 3.1 field. See Migration › media_buy_status.
status
Deprecated in 3.1, removed in 3.2 (#4906). Use media_buy_status instead. Top-level status collides with the envelope task-status on flat-serialized MCP wire.
revision
Revision number after this update. Use in subsequent requests for optimistic concurrency.
implementation_date
ISO 8601 timestamp when changes take effect (null if pending approval)
invoice_recipient
Updated invoice recipient, echoed from request when provided. Confirms the seller accepted the billing override. Bank details are omitted (write-only).
valid_actions
Flat-vocabulary actions the buyer can perform after this update. Saves a round-trip to get_media_buys. Deprecated in favor of available_actions[] and removed in 4.0.
available_actions
Structured per-buy resolution of actions available after this update, each entry with action, resolved mode, optional sla, optional terms_ref. Authoritative — buyer SDKs SHOULD prefer this over valid_actions when both are present.
affected_packages
Array of full Package objects showing complete state after update
Note: Responses use discriminated unions - you get either success fields OR errors, never both. Always check for errors before accessing success fields.
The body-level media_buy_status is the canonical 3.1 field for the buy’s lifecycle state. The legacy top-level status: MediaBuyStatus form (e.g., "status": "canceled") is deprecated and removed in 3.2 (#4906) — it collided with the envelope task-status at the same root key. See Migration › media_buy_status for the migration.NOT_CANCELLABLE error response:
INVALID_STATE error response (e.g., trying to update a completed media buy):
{ "errors": [{ "code": "INVALID_STATE", "message": "Media buy mb_12345 is in terminal state 'completed' and cannot be modified", "suggestion": "Check current status via get_media_buys and adjust request" }]}
REQUOTE_REQUIRED error response (update changes the parameter envelope the quote was priced against):
{ "errors": [{ "code": "REQUOTE_REQUIRED", "message": "Doubling budget and extending end_time into Q4 changes the pricing basis of proposal prop_abc123", "details": { "proposal_id": "prop_abc123", "envelope_field": ["packages[0].budget", "end_time"] }, "suggestion": "Call get_products with buying_mode='refine' against proposal_id prop_abc123 to obtain a fresh quote, then resubmit this update against the new proposal_id" }]}
Catalog reference (replace the catalog a catalog-driven package promotes)
Creative assignments (before the package’s creative_deadline)
❌ Cannot update (schema-enforced via not constraint on package-update.json):
Package ID
Product ID
Pricing option ID
Format IDs (creatives must match existing formats)
⚠️ Append-only on update:
committed_metrics — sellers accept new entries (mid-flight metric additions, each with its own committed_at timestamp) but MUST reject attempts to modify or remove existing entries with validation_error (code IMMUTABLE_FIELD). Runtime enforcement; the append-only semantics aren’t expressible in the schema’s not clause.
Operation not allowed in current state (e.g., updating completed/canceled media buy)
Check campaign status via get_media_buys
NOT_CANCELLABLE
Media buy or package cannot be canceled
Check seller’s cancellation policy or contact seller
CREATIVE_REJECTED
Creative failed content policy review
Revise the creative per the seller’s advertising policies
CREATIVE_DEADLINE_EXCEEDED
Creative change submitted past the package’s creative_deadline
Check package creative_deadline before submitting creative changes
CREATIVE_ID_EXISTS
Creative ID already exists in library
Use a different creative_id, assign existing creatives via creative_assignments, or update via sync_creatives
BUDGET_EXCEEDED
Operation would exceed allocated budget
Reduce the amount or increase media buy total budget
CONFLICT
Revision mismatch — another update was applied since you last read
Re-read via get_media_buys and retry with current revision
REQUOTE_REQUIRED
Requested change (budget, dates, volume, targeting) falls outside the envelope the original quote was priced against
Call get_products with buying_mode: "refine" against the existing proposal_id to obtain a fresh quote, then resubmit the update against the new proposal_id. Seller’s error.details.envelope_field names which fields breached.
VALIDATION_ERROR
Request format or business rule violation
Check error field and message for specifics
Example error response:
{ "errors": [{ "code": "UNSUPPORTED_FEATURE", "message": "Cannot change product_id for existing package", "field": "packages[0].product_id", "suggestion": "Create a new package with the desired product instead" }]}
1. Use Precise Updates
Update only what needs to change - don’t resend unchanged values.2. Budget Increases
Small incremental increases are more likely to be auto-approved than large jumps.3. Pause Before Major Changes
Pause campaigns before making significant targeting or creative changes to avoid delivery issues.4. Test with Small Changes
Test update workflows with minor changes before critical campaign modifications.5. Monitor Status
Always check response status and implementation_date for approval requirements.6. Validate Package State
Check affected_packages in response to confirm changes were applied correctly.
Updates are atomic - either all changes apply or none do
Both media buys and packages can be referenced by publisher IDs
Pending states (working, submitted) are normal, not errors
Orchestrators MUST handle pending states as part of normal workflow
implementation_date indicates when changes take effect (null if pending approval)
Inline creatives: The creatives array creates NEW creatives only. To update existing creatives, use sync_creatives. To assign existing library creatives, use creative_assignments in the Package Update object.
Campaign Governance — Modification PhaseWhen a buyer’s account has governance agents configured, sellers MUST call check_governance with media_buy_id, planned_delivery, and phase: "modification" before confirming an update. The governance agent validates change magnitude, budget reallocation, and new parameters against the campaign plan.See the seller integration guide for the full execution check workflow and code example.