Background
The Submitted variants of create_media_buy_response, update_media_buy_response, and sync_creatives_response already include an optional errors[] array documented as:
Optional advisory errors accompanying the submitted envelope. Use only for non-blocking warnings (e.g., throttled_severity advisories, governance observations). Terminal failures belong in the error branch, not here.
The corresponding synchronous Success variants (CreateMediaBuyResponse1, UpdateMediaBuyResponse1, etc.) have no equivalent. Sellers running pre-flight checks on accepted-but-suboptimal buys have nowhere spec-compliant to surface advisory warnings.
Real-world use case
Two examples from salesagent (Prebid AdCP reference implementation):
-
Inventory overbook detection. A create_media_buy whose implied impression goal exceeds GAM's availability forecast is technically valid (GAM accepts it via ApproveAndOverbookOrders), but delivery will under-perform. The seller has the forecast result at request time and wants to tell the buyer "your goal of 80,000 impressions exceeds our forecast of 11,428 — your line item will land in INVENTORY_RELEASED." This is exactly the "non-blocking warning" semantic the Submitted variant's errors[] exists for, but the seller is on the synchronous Success path here, not Submitted.
-
Pricing rate above floor. A buyer's bid is accepted but is materially above the publisher's typical clearing rate. The seller wants to flag "you may be overpaying" without rejecting the buy.
Today's workarounds
Sellers either:
- (a) Reject buys that should succeed (loses revenue, bad buyer experience);
- (b) Hide warnings server-side in logs (useless to the buyer);
- (c) Put warnings in
ext (acceptable per spec but not cross-implementation discoverable; every buyer has to know your ext keys).
Option (c) is what salesagent will ship for the overbook case in the short term, with a comment pointing at this RFC.
Proposed addition
Add an optional warnings: list[Error] to the synchronous Success variants of:
create_media_buy_response
update_media_buy_response
sync_creatives_response
Same advisory-only semantics as the Submitted variant's errors[]. The Error shape is reused — code carries a registry value, message carries a human-readable explanation, details carries structured diagnostics.
{
"warnings": {
"type": "array",
"items": { "$ref": "#/definitions/Error" },
"description": "Optional advisory warnings accompanying a successful response. Non-blocking — the operation succeeded but the seller is surfacing context the buyer may want to act on. Terminal failures still belong in the error response variant, not here."
}
}
Suggested initial code registry
A non-exhaustive set worth standardising so buyers can build cross-seller logic against them:
| Code |
Surface |
Meaning |
inventory_overbook_minor |
create_media_buy success |
Seller's forecast indicates goal exceeds available inventory |
pricing_rate_above_floor |
create_media_buy / update_media_buy success |
Buyer's rate is materially above seller's clearing rate |
creative_format_atypical |
sync_creatives success |
Asset accepted but doesn't match the format's typical shape |
flight_dates_outside_pacing_window |
update_media_buy success |
New flight bounds make the existing budget pace unreasonably |
Each entry would be defined separately (description, recommended details keys, examples). The registry can grow over time the same way error codes do.
Why not just errors[] on Success too?
Two reasons not to overload errors[]:
- The success path semantically isn't an error condition. Putting advisory information under a key called
errors reads wrong to anyone scanning the response.
- The Submitted variant's
errors[] is already documented as doing double duty (advisory ∪ terminal-but-deferred). Adding a third meaning on the Success path further muddies it.
A separate warnings key keeps the semantics clean: errors fail, warnings inform.
Compatibility
Optional field, default null, fully backward-compatible. Implementations that don't emit warnings are unaffected. Buyers that don't read the field are unaffected. Existing schemas already use extra='allow' (or equivalent JSON Schema additionalProperties: true) on these response types, so the wire shape doesn't break.
Relationship to ext
The ext extension mechanism is the right answer for seller-specific advisory data with no cross-implementation contract. warnings would carry the standardised advisory channel — registry-coded, semantics defined by the spec, discoverable across sellers. Both have a place; this RFC is about giving the standardised channel a home on the success path, where today only ext exists.
Salesagent context
Salesagent will ship the overbook detection feature in the next few days using ext.warnings as the temporary surface. If/when this RFC lands and propagates through adcp-client-python, swapping to first-class warnings[] is a one-line change. Happy to contribute a draft schema PR if useful — let me know.
Background
The Submitted variants of
create_media_buy_response,update_media_buy_response, andsync_creatives_responsealready include an optionalerrors[]array documented as:The corresponding synchronous Success variants (
CreateMediaBuyResponse1,UpdateMediaBuyResponse1, etc.) have no equivalent. Sellers running pre-flight checks on accepted-but-suboptimal buys have nowhere spec-compliant to surface advisory warnings.Real-world use case
Two examples from salesagent (Prebid AdCP reference implementation):
Inventory overbook detection. A
create_media_buywhose implied impression goal exceeds GAM's availability forecast is technically valid (GAM accepts it viaApproveAndOverbookOrders), but delivery will under-perform. The seller has the forecast result at request time and wants to tell the buyer "your goal of 80,000 impressions exceeds our forecast of 11,428 — your line item will land inINVENTORY_RELEASED." This is exactly the "non-blocking warning" semantic the Submitted variant'serrors[]exists for, but the seller is on the synchronous Success path here, not Submitted.Pricing rate above floor. A buyer's bid is accepted but is materially above the publisher's typical clearing rate. The seller wants to flag "you may be overpaying" without rejecting the buy.
Today's workarounds
Sellers either:
ext(acceptable per spec but not cross-implementation discoverable; every buyer has to know yourextkeys).Option (c) is what salesagent will ship for the overbook case in the short term, with a comment pointing at this RFC.
Proposed addition
Add an optional
warnings: list[Error]to the synchronous Success variants of:create_media_buy_responseupdate_media_buy_responsesync_creatives_responseSame advisory-only semantics as the Submitted variant's
errors[]. TheErrorshape is reused —codecarries a registry value,messagecarries a human-readable explanation,detailscarries structured diagnostics.{ "warnings": { "type": "array", "items": { "$ref": "#/definitions/Error" }, "description": "Optional advisory warnings accompanying a successful response. Non-blocking — the operation succeeded but the seller is surfacing context the buyer may want to act on. Terminal failures still belong in the error response variant, not here." } }Suggested initial code registry
A non-exhaustive set worth standardising so buyers can build cross-seller logic against them:
inventory_overbook_minorcreate_media_buysuccesspricing_rate_above_floorcreate_media_buy/update_media_buysuccesscreative_format_atypicalsync_creativessuccessflight_dates_outside_pacing_windowupdate_media_buysuccessEach entry would be defined separately (description, recommended
detailskeys, examples). The registry can grow over time the same way error codes do.Why not just
errors[]on Success too?Two reasons not to overload
errors[]:errorsreads wrong to anyone scanning the response.errors[]is already documented as doing double duty (advisory ∪ terminal-but-deferred). Adding a third meaning on the Success path further muddies it.A separate
warningskey keeps the semantics clean: errors fail, warnings inform.Compatibility
Optional field, default
null, fully backward-compatible. Implementations that don't emit warnings are unaffected. Buyers that don't read the field are unaffected. Existing schemas already useextra='allow'(or equivalent JSON SchemaadditionalProperties: true) on these response types, so the wire shape doesn't break.Relationship to
extThe
extextension mechanism is the right answer for seller-specific advisory data with no cross-implementation contract.warningswould carry the standardised advisory channel — registry-coded, semantics defined by the spec, discoverable across sellers. Both have a place; this RFC is about giving the standardised channel a home on the success path, where today onlyextexists.Salesagent context
Salesagent will ship the overbook detection feature in the next few days using
ext.warningsas the temporary surface. If/when this RFC lands and propagates throughadcp-client-python, swapping to first-classwarnings[]is a one-line change. Happy to contribute a draft schema PR if useful — let me know.