Create a media buy from selected packages or execute a proposal. Handles validation, approval if needed, and campaign creation. Supports two modes:Documentation Index
Fetch the complete documentation index at: https://docs.adcontextprotocol.org/llms.txt
Use this file to discover all available pages before exploring further.
- Manual Mode: Provide
packagesarray with explicit line item configurations - Proposal Mode: Provide
proposal_idandtotal_budgetto execute a proposal fromget_products
completed, working < 120s, or submitted for hours/days)
Request Schema: /schemas/v3/media-buy/create-media-buy-request.json
Response Schema: /schemas/v3/media-buy/create-media-buy-response.json
Quick Start
Create a simple media buy with two packages:Request Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
account | account-ref | Yes | Account reference. Pass { "account_id": "..." } or { "brand": {...}, "operator": "..." } if the seller supports implicit resolution. Required for billing and policy evaluation. |
proposal_id | string | No* | ID of a proposal from get_products to execute. Alternative to providing packages. |
total_budget | TotalBudget | No* | Total budget when executing a proposal. Publisher applies allocation percentages. |
packages | Package[] | No* | Array of package configurations (see below). Required when not using proposal_id. |
brand | BrandRef | Yes | Brand reference — resolved to full identity at execution time. See brand.json |
start_time | string | Yes | "asap" or ISO 8601 date-time |
end_time | string | Yes | ISO 8601 date-time (UTC unless timezone specified) |
invoice_recipient | BusinessEntity | No | Override the account’s default billing entity for this buy. The seller MUST validate the recipient is authorized and include it in check_governance when governance agents are configured. |
po_number | string | No | Purchase order number |
idempotency_key | string | No | Unique key for safe retries. If a request with the same key and account has already been processed, the seller returns the existing media buy. MUST be unique per (seller, request) pair. Min 16 chars. |
context | object | No | Opaque correlation data echoed unchanged in the response. Use for internal tracking, trace IDs, or other caller-specific identifiers. |
reporting_webhook | ReportingWebhook | No | Automated reporting delivery configuration |
packages OR (proposal_id + total_budget) must be provided.
TotalBudget Object
| Parameter | Type | Required | Description |
|---|---|---|---|
amount | number | Yes | Total budget amount |
currency | string | Yes | ISO 4217 currency code |
Package Object
| Parameter | Type | Required | Description |
|---|---|---|---|
product_id | string | Yes | Product ID from get_products. Sellers MUST echo this value on every response package object that represents this requested package. |
pricing_option_id | string | Yes | Pricing option ID from product’s pricing_options array |
format_ids | FormatID[] | No | Legacy named-format selector. Format IDs that will be used — must be supported by product. When omitted (and no 3.1+ format-option selector or direct canonical selector is present), defaults to all formats supported by the product. Format-option-aware buyer SDKs targeting a heterogeneous seller population SHOULD dual-emit this alongside format_option_refs so legacy-format-only sellers receive an explicit format set rather than defaulting to all-formats. |
format_option_refs | FormatOptionRef[] | No | 3.1+ format-option selector. Structured references to entries in the package’s target product format_options[]: {scope: "publisher", publisher_domain, format_option_id} for publisher-catalog-backed options, or {scope: "product", format_option_id} for product-local options (see canonical formats). When present, format_option_refs wins over both format_ids and direct format_kind/params. Sellers MUST reject with UNSUPPORTED_FEATURE (field path packages[i].format_option_refs[j]) when an entry doesn’t match a format_options[] entry, when the product is legacy-format-only, or when the product’s format_options[] entries don’t publish selectable format_option_id values. |
format_kind | CanonicalFormatKind | No | 3.1+ direct canonical selector. Names the canonical format shape this package targets when the buyer is authoring by canonical kind rather than by format_option_refs[] or format_ids[]. Pair with params when the product declaration requires dimensions, duration, sizes, codecs, or other canonical parameters. If format_ids[] is also present and format_option_refs[] is absent, sellers validate format_ids[]; format_kind is only an informational echo of the same normalized shape. |
params | object | No | Parameters for the direct canonical selector in format_kind. Follows the selected canonical’s parameter vocabulary. Requires format_kind; params alone is schema-invalid. A broad selector such as {format_kind: "image"} does not satisfy a product whose format_options[] fixes params.width and params.height; sellers reject under-specified direct selectors with UNSUPPORTED_FEATURE or an equivalent format-selector error. |
budget | number | Yes | Budget in currency specified by pricing option |
impressions | number | No | Impression goal for this package |
paused | boolean | No | Create package in paused state (default: false) |
pacing | string | No | "even" (default), "asap", or "front_loaded" |
bid_price | number | No | Bid price for auction pricing. 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[] | No | Optimization targets for this package. Each goal is either kind: "event" (conversion events with event_sources array, optional cost_per, per_ad_spend, or maximize_value target) or kind: "metric" (seller-native metric with optional cost_per or threshold_rate target). Event goals require conversion_tracking.supported_targets on the product; metric goals require metric_optimization.supported_metrics. |
targeting_overlay | TargetingOverlay | No | Additional targeting criteria (see Targeting) |
start_time | string | No | ISO 8601 date-time for this package’s flight start. When omitted, inherits the media buy’s start_time. Must fall within the media buy’s date range. Does not support "asap". |
end_time | string | No | ISO 8601 date-time for this package’s flight end. When omitted, inherits the media buy’s end_time. Must fall within the media buy’s date range. |
creative_assignments | CreativeAssignment[] | No | Assign existing library creatives with optional weights and placement targeting |
creatives | CreativeAsset[] | No | Upload new creative assets and assign (creative_id must not already exist in library) |
context | object | No | Opaque correlation data echoed unchanged in the package response, webhooks, and read surfaces. Use to map seller-assigned package_id back to your internal line items, campaign structure, or tracking state. Buyers targeting mixed seller populations SHOULD include a per-package correlation value here, commonly context.buyer_ref, for legacy sellers that do not echo product_id. |
measurement_terms | MeasurementTerms | No | Buyer’s proposed billing measurement and makegood terms. Overrides product defaults. Seller accepts (echoed on confirmed package), rejects with TERMS_REJECTED, or adjusts. When omitted, product’s measurement_terms apply. |
performance_standards | PerformanceStandard[] | No | Buyer’s proposed performance standards (viewability, IVT, completion rate, brand safety, attention score). Overrides product defaults. Seller accepts, rejects with TERMS_REJECTED, or adjusts. When omitted, product’s performance_standards apply. |
committed_metrics | object[] | No | Buyer’s proposed reporting contract — metrics the buyer wants the seller to commit to populating in delivery reports. Same negotiation pattern as measurement_terms/performance_standards: each entry tags scope: "standard" (with metric_id from the closed enum) or scope: "vendor" (with vendor BrandRef + vendor’s metric_id). Request-side entries do NOT carry committed_at — that timestamp is stamped by the seller on accept. Seller accepts (echoes on response with committed_at), rejects with TERMS_REJECTED, or normalizes (echoes a different but compatible list). When omitted, the seller decides what to commit based on the product’s available_metrics plus any required_metrics filter the buyer passed at discovery. |
Response
Success Response
| Field | Description |
|---|---|
media_buy_id | Seller’s unique identifier |
confirmed_at | ISO 8601 timestamp when the seller committed to the media buy. Stable after it is set. May be null in deferred/manual approval flows until seller commitment occurs. |
creative_deadline | ISO 8601 timestamp for creative upload deadline |
revision | Initial media-buy revision. Use this value as the revision token on the next update_media_buy call intended to change state. |
packages | Array of created packages with complete state. Packages may include per-package creative_deadline when different from the media buy deadline, and SHOULD echo every format selector field supplied on create (format_option_refs, format_ids, and/or format_kind/params) so read surfaces are lossless even when one selector wins precedence. |
confirmed_at is seller commitment time, not a delivery-status timestamp. Do not update it when a buy later pauses, resumes, starts delivery, completes, or reports performance. A committed synchronous create stamps it immediately. Use the submitted response branch when no media_buy_id is being returned to the buyer. Sellers MAY instead return synchronous success with media_buy_id, packages, and confirmed_at: null for a provisional buy; such buys MUST be retrievable via get_media_buys and MUST transition by setting confirmed_at exactly once on commitment. A provisional buy with confirmed_at: null MUST NOT be active and MUST NOT include packages[].committed_metrics.
Reporting contract on confirmed packages
Each package in the response MAY carrycommitted_metrics — the binding reporting contract the seller has agreed to populate in delivery reports for this package. The field is a unified array carrying both standard metrics (from the closed available-metric.json enum) and vendor-defined metrics (anchored on a BrandRef), with each entry tagged by an explicit scope discriminator and timestamped via committed_at:
When confirmed_at is null, sellers MUST omit packages[].committed_metrics. The first response that sets confirmed_at MAY include the initial committed-metrics set, and each such entry’s committed_at MUST equal confirmed_at.
-
Day-1 entries share
committed_at = confirmed_at. The seller stamps the day-1 set on thecreate_media_buyresponse based on what they’re prepared to deliver from the product’sreporting_capabilities. -
Mid-flight additions are appended via
update_media_buy— append-only with their owncommitted_attimestamps. This lets a seller honestly say “Adelaide attention is now part of the contract from day 30 onward” without having to cancel and reissue the buy. -
Existing entries are immutable. Sellers MUST reject
update_media_buyrequests that attempt to modify or remove existing entries with avalidation_error(suggested code:IMMUTABLE_FIELD). New entries can be appended. -
Qualifiers on standard metrics. Some metrics have multiple incompatible measurement paths and need disambiguation:
viewability_standard— whenmetric_idis one ofviewable_impressions,viewable_rate,measurable_impressionsand the seller commits to a specific viewability standard (MRC and GroupM are materially different thresholds — see theviewability-standardenum), the entry MUST carryqualifier.viewability_standard. Symmetric onmissing_metrics: a buyer expecting MRC viewability flags a GroupM-only delivery report as missing the MRC commitment.completion_source— whenmetric_idiscompletion_rateand the seller commits to a specific source (the player/ad server’s own completion event vs. a third-party measurement vendor anchored onperformance_standard.vendor), the entry MUST carryqualifier.completion_source(seller_attestedorvendor_attested). The two paths can yield materially different rates, particularly in SSAI environments. Symmetric onmissing_metrics.attribution_methodology— whenmetric_idis an outcome metric (conversions,conversion_value,roas,cost_per_acquisition,incremental_sales_lift,brand_lift,foot_traffic,conversion_lift,brand_search_lift,units_sold,new_to_brand_rate,new_to_brand_units,leads) and the seller commits to a specific attribution methodology, the entry SHOULD carryqualifier.attribution_methodology(deterministic_purchasefor retail-media closed-loop;probabilistic,panel_based, ormodeledfor other paths). Two outcome rows under different methodologies are not interchangeable; symmetric onmissing_metrics.attribution_window— whenmetric_idis an outcome metric and the seller commits to a specific lookback window, the entry SHOULD carryqualifier.attribution_windowas a structured duration ({ interval: 14, unit: "days" }). Two outcome rows over different windows are reported as separate rows so buyers don’t accidentally aggregate across periods.
additionalProperties: false); new keys ship explicitly in subsequent minors. -
Reconciliation:
missing_metricsonget_media_buy_deliveryfilterscommitted_metricsto entries wherecommitted_at < reporting_period.end, then flags any that aren’t populated in the report. A metric committed mid-flight is only audited from its commitment timestamp forward. Qualifiers are matched verbatim — a committed{viewable_rate, mrc}is not satisfied by a deliveredviewable_ratecarryingviewability.standard: groupm. -
Optional in v1. Sellers without per-package snapshot infrastructure can adopt incrementally. Absence is conformant but carries a known audit gap: without the snapshot,
missing_metricsreconciles against the product’s liveavailable_metricsat report time, which may not reflect what was committed at create time. Sellers that omitcommitted_metricsaccept this risk; buyers SHOULD treat absence as “no audit-grade contract” rather than “clean delivery.” Expected to become required at the next major.
Error Response
| Field | Description |
|---|---|
errors | Array of error objects explaining failure |
Submitted Response
Returned when the buy cannot be confirmed synchronously — e.g., guaranteed buys awaiting IO signing, governance review queued, or batched processing. The completion artifact (delivered viatasks/get or push-notification webhook) carries media_buy_id and packages.
| Field | Description |
|---|---|
status | Literal "submitted" — discriminates this shape from the sync success branch, which uses media_buy_status for lifecycle state. During the 3.1 migration window, sellers MAY also emit deprecated top-level MediaBuyStatus values on synchronous success for back-compat. |
task_id | Handle the buyer polls with tasks/get or receives on webhook callbacks. |
message | Optional human-readable explanation (e.g., “Awaiting IO signature from sales team”). |
errors | Optional advisory warnings (non-blocking). Terminal failures belong in the Error Response. |
status first: "submitted" → async envelope, otherwise check errors before accessing success fields.
When to return Submitted vs synchronous Success (normative)
The choice betweensubmitted and synchronous success is per-call, driven by per-product attributes and the seller’s policy on each specific create — not a uniform per-seller rule. A sales-guaranteed seller may legitimately return synchronous success on some create_media_buy calls and submitted on others within the same session; conformant SDK skills MUST NOT instruct agents to return submitted for every create_media_buy regardless of input. Sellers that uniformly return submitted fail the non-IO-approval paths in the sales-guaranteed compliance storyboard.
Sellers MUST return submitted when:
- The request references one or more products with
delivery_type: "guaranteed"and the seller declares therequires_io_approvalcapability — the human-approval handshake cannot complete inside the response. The completion artifact is delivered viatasks/getor webhook once IO signing finishes. - The request triggers a seller-side governance review that cannot complete synchronously (e.g., manual brand-safety review for a regulated vertical).
- The request enters a batched-processing queue the seller cannot drain inside the response timeout.
- All referenced products have
delivery_type: "non_guaranteed". The buy is created and acknowledged in-line;media_buy_idandpackagesare issued immediately. This applies regardless of the seller’s specialism — a sales-guaranteed seller serving a non-guaranteed product returns synchronous success. - The request references guaranteed products and the seller does NOT declare
requires_io_approval(rare; typically retail-SKU or quoted-rate guaranteed flows where the seller has pre-cleared approval). - The buy enters a known non-terminal state immediately observable to the buyer (
pending_creatives/pending_start/active).
create_buy_submitted scenario seeds a guaranteed product with requires_io_approval; four shared scenarios (measurement_terms_rejected, pending_creatives_to_start, inventory_list_targeting, invalid_transitions) seed non-guaranteed products and expect synchronous media_buy_id returns. Sellers that return submitted on the synchronous-expected scenarios fail compliance — see sales-guaranteed specialism for the fixture pattern (non-guaranteed products listed first so open-brief get_products calls resolve to a synchronous-create path).
This rule resolves the skill ↔ storyboard contradiction tracked at #3822: an SDK skill that instructs agents to “return a task envelope for every create_media_buy” is non-conformant; the correct skill instructs agents to dispatch on per-product delivery_type and the seller’s requires_io_approval capability.
Common Scenarios
Campaign with Targeting
Add geographic restrictions and frequency capping:Campaign with Conversion Optimization
Set a per_ad_spend target for conversion-optimized delivery. The product must declare support inconversion_tracking.supported_targets, and you must have an event source configured via sync_event_sources:
Catalog-driven packages
A catalog-driven package allocates a single budget envelope to an entire catalog of items. Instead of creating separate packages per item, the platform optimizes delivery across all catalog items based on performance. This is the AdCP equivalent of catalog-based campaign types such as Google Performance Max or Meta Dynamic Product Ads. Include thecatalogs field in a package to make it catalog-driven. Each catalog should have a distinct type (e.g., one product catalog, one store catalog). The referenced catalogs must already be synced via sync_catalogs.
Job campaign with synced job catalog:
test=false
test=false
get_media_buy_delivery which returns by_catalog_item breakdowns. Creative variants for catalog-driven packages represent individual catalog items rendered as ads.
Package with explicit signal targeting:
Use targeting_overlay.signal_targeting_groups when the buyer wants seller-offered signals applied to a specific package. The selected product must set signal_targeting_allowed: true and make the signal eligible through inline signal_targeting_options when present, through get_signals for wholesale products that omit inline options, and through signal_targeting_rules. The grouped expression shape is always used: top-level operator: "all" with child groups using operator: "any" for include groups and operator: "none" for exclusion groups. For simple include-only targeting, send one any group. For binary signals, send value: true in both include and exclusion groups; exclusion is expressed by the parent none group, not by value: false. Signals are referenced with signal_ref: use scope: "product" for a product-local signal option, scope: "data_provider" with data_provider_domain for a signal defined in a data provider’s published adagents.json signals[], or scope: "signal_source" with signal_source_url for a source-native signal. This is distinct from audience_include / audience_exclude, which only reference first-party audiences registered through sync_audiences. Send signal_agent_segment_id only when the selected product option or get_signals result exposed it as a separate execution handle required by the seller.
test=false
test=false
Campaign with Inline Creatives
Upload creatives at the same time as creating the campaign:Campaign with Reporting Webhook
Receive automated reporting notifications:Executing a Proposal
Execute a proposal fromget_products without manually constructing packages:
- The publisher converts allocation percentages to actual budgets using
total_budget - Packages are created automatically based on the proposal’s allocations
- All other fields (brand, start_time, end_time, etc.) work the same as manual mode
Context for Correlation
Thecontext field is an opaque object that sellers echo unchanged in responses and webhooks. Use it to map seller-assigned IDs back to your internal systems without needing to maintain a separate lookup table.
Context works at two levels:
- Media buy level — echoed in the
create_media_buyresponse - Package level — echoed in each package’s response, webhooks, and read surfaces, useful for mapping
package_idback to your internal line items. For explicit package requests, sellers MUST also echoproduct_id.
context.buyer_ref as a legacy-safe fallback for older sellers that may not echo product_id.
Mapping to internal campaign and line item IDs:
test=false
test=false
Error Handling
Common errors and resolutions:| Error Code | Description | Resolution |
|---|---|---|
PRODUCT_NOT_FOUND | Invalid product_id | Verify product exists via get_products |
UNSUPPORTED_FEATURE | Format not supported by the product — covers legacy named-format selectors (format_ids[] not in the product’s accepted formats), 3.1+ format-option selectors (format_option_refs[] entries that do not resolve against the product’s format_options[], legacy-format-only products with no format_options[], or product format_options[] entries that do not publish selectable format_option_id values), and direct canonical selectors (format_kind/params outside or under-specifying the product declaration) | Check the product’s format_ids and/or format_options[] from get_products — re-author against a supported format, add the required canonical parameters, or pick a format_option_ref from the product’s published format_options[] |
BUDGET_TOO_LOW | Budget below product minimum | Increase budget or choose different product |
TARGETING_TOO_NARROW | Targeting yields zero inventory | Broaden geographic or audience criteria |
POLICY_VIOLATION | Brand/product violates policy | Review publisher’s content policies |
INVALID_PRICING_OPTION | pricing_option_id not found | Use ID from product’s pricing_options |
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 |
Key Concepts
Format Specification
Each package SHOULD specify the formats it will use, viaformat_ids[] (legacy named-format path — structured {agent_url, id} references), format_option_refs[] (3.1+ format-option path — references into the product’s format_options[]), or a direct canonical selector (format_kind plus optional params). Omitting all format selectors defaults to all formats supported by the product. Specifying lets the system:
- Publish placeholder creatives in ad servers
- Pin exactly what creative assets are needed
- Validate that the product supports the requested formats
- Track which assets are missing
format_option_refs[] wins when present; otherwise format_ids[] wins when present; otherwise direct format_kind/params is used; otherwise the package defaults to all product formats. Use format_option_refs[] when the buyer’s codebase reads Product.format_options[] and the product publishes selectable format_option_id values; use format_ids[] when integrating with legacy-format-only sellers or libraries. Use direct format_kind only when the buyer has enough canonical parameters to satisfy the target product declaration without a product-local reference. Dual-emission of format_option_refs[] and format_ids[] is allowed and recommended for buyer SDKs targeting a mixed seller population — see the format_ids row above.
3.1+ format-option example (buyer authoring against a publisher-scoped Product.format_options[] entry):
test=false
Brand reference
Thebrand field identifies the advertiser for policy compliance and business purposes.
Pricing & Currency
Each package specifies itspricing_option_id, which determines:
- Currency (USD, EUR, etc.)
- Pricing model (CPM, CPCV, CPP, etc.)
- Rate and whether it’s fixed or auction-based
Targeting Overlays
Use sparingly - most targeting should be in your brief and handled through product selection. Use overlays only for:- Geographic restrictions (RCT testing, regulatory compliance)
- Frequency capping
- AXE segment inclusion/exclusion (legacy — new integrations use TMP)
Format Workflow
Why Format Specification Matters
When creating a media buy, format specification enables:- Placeholder Creation - Publisher creates placeholders in ad server with correct specs
- Validation - System validates products support requested formats
- Clear Expectations - Both parties know exactly what’s needed
- Progress Tracking - Track which assets are missing vs. required
- Technical Setup - Ad server configured before creatives arrive
Complete Workflow
Format Validation
Publishers MUST validate:- All formats are supported by the product
- Format specifications match
list_creative_formatsoutput - Creative requirements can be fulfilled within timeline
Flight date validation
When a package specifiesstart_time or end_time, sellers SHOULD validate that:
- Both dates fall within the media buy’s date range
start_timeis beforeend_time
INVALID_REQUEST error:
Asynchronous Operations
This task can complete instantly or take days depending on complexity and approval requirements. The response includes astatus field that tells you what happened and what to do next.
| Status | Meaning | Your Action |
|---|---|---|
completed | Done immediately | Process the result |
working | Processing (~2 min) | Poll frequently or wait for webhook |
submitted | Long-running (hours/days) | Use webhooks or poll infrequently |
input-required | Needs your input | Read message, respond with info |
failed | Error occurred | Handle the error |
- MCP
- A2A
Immediate Success (completed)
The task completed synchronously. No async handling needed.Request:test=false
status is the envelope task-status (TaskStatus) — completed on synchronous success. The body-level media_buy_status carries the buy’s lifecycle state (pending_creatives, pending_start, or active). A 3.0-style response would have collided these two enums at the same root key; in 3.1 they are distinct fields. Sellers MAY continue to emit a deprecated top-level status: MediaBuyStatus during the 3.1 deprecation window for back-compat with 3.0 buyers, but 3.1 buyers MUST prefer media_buy_status. See Media-buy status field (3.1 migration) below.Long-Running (submitted)
The task is queued for manual approval. Configure a webhook to receive updates.Request with webhook:test=false
Error (failed)
Response:Usage Notes
- Total budget is distributed across packages based on individual
budgetvalues - Creative assets must be uploaded before deadline for campaign activation
- Impression-time targeting (audience, frequency, suitability) is handled by TMP
- Pending states (
working,submitted) are normal, not errors - Orchestrators MUST handle pending states as part of normal workflow
- Inline creatives: The
creativesarray creates NEW creatives only. To update existing creatives, usesync_creatives. To assign existing library creatives, usecreative_assignmentsinstead. - Inline creative lifecycle: Inline creatives enter the library with the same lifecycle as
sync_creativesuploads. If thecreate_media_buytask resolves aspending_manualand the buy never activates, or if the buy is rejected or canceled, only the package assignments are released — the creatives remain in the library and can be reused bycreative_idon a latercreate_media_buycall. Creative review is independent of the buy outcome; sellers MUST NOT skip review solely because the buy did not activate. Retention of unassigned creatives is seller-defined in 3.0. See Inline creatives on the package.
Content Standards
When a media buy includes content standards (via thegovernance.content_standards field on get_products responses or the media buy request), the buyer is requesting brand suitability enforcement during delivery.
Content standards are created by calling
create_content_standards on a verification agent (e.g., IAS, DoubleVerify). Standards MUST be calibrated with each seller before use in production to ensure the seller’s local evaluation model aligns with the verification agent’s interpretation. See the Content Standards overview for the full setup workflow: create → calibrate → activate → validate.Policy Compliance
Brand and products are validated during creation. Policy violations return errors:- Brand/products align with selected packages
- Creatives match declared brand/products
- Campaign complies with all advertising policies
Next Steps
After creating a media buy:- Upload Creatives: Use
sync_creativesbefore deadline - Monitor Status: Use
get_media_buy_delivery - Optimize: Use
provide_performance_feedback - Update: Use
update_media_buyto modify campaign
Media-buy status field (3.1 migration)
3.1 splits two enums that 3.0 collided at the same root key — envelopestatus (TaskStatus) at the top of every response, and body media_buy_status (MediaBuyStatus, new in 3.1) carrying the buy’s lifecycle state alongside. The legacy top-level status: MediaBuyStatus form is deprecated: true in 3.1 and removed in 3.2 (#4906); nested status on get_media_buys, get_media_buy_delivery, and core/media-buy.json follow in 4.0 (#4905).
3.1 buyers MUST prefer media_buy_status when present. 3.1 compliance storyboards assert path: "media_buy_status" — a 3.1 seller emitting only the legacy status is schema-valid but fails certification; the storyboard is the binding conformance check.
Full migration: Migration › media_buy_status.
Learn More
- Media Buy Lifecycle - Complete campaign workflow
- get_products - Discover inventory
- Targeting - Targeting strategies
- Pricing Models - Currency and pricing