buy_products is the buyer-composed purchase path. It creates a MediaBuy from canonical product selections returned by list_products, accepting the published commercial terms as-is.
Creative objects and assignments are deliberately absent. Use the creative lifecycle after the MediaBuy has been created. If the buyer needs different commercial terms, request or refine a proposal instead.
Per-purchase flight dates, measurement_terms, and performance_standards may be omitted to inherit the published offer. The accepted snapshot resolves and preserves those terms. If this purchase ends a tracked planning cycle, opportunity closes it with accepted_with_seller.
Request schema: /schemas/3.0.23/media-buy/buy-products-request.json
accepted_proposal snapshot. Its typed commercial_terms preserve the exact feed and pricing versions, product and format selections, catalogs, budgets, targeting, flight, billing, and reporting commitments; terms_digest binds that envelope for governance and audit. The separate purchase_bindings[] maps each zero-based purchase position to its seller-assigned package_id, which SDKs use for later creative assignment without placing execution IDs inside the immutable digest. The seller creates this snapshot even though the buyer did not negotiate first, giving every MediaBuy the same commercial history for later refine_proposals.
A completed purchase MAY include warnings[] for non-blocking observations at commitment, such as a material inventory shortfall forecast. Each warning identifies its package through the returned media_buy_id and purchase_bindings[].package_id; a continuing condition is also readable as an indicator through get_media_buys. The seller may instead return input-required before commitment. Warnings never appear on failed or submitted arms.
The accepted snapshot records the published terms the buyer purchased. It does not imply that every direct product is non-guaranteed: discovery mode, buyer composition, and delivery guarantee are independent dimensions.