Skip to main content
Sam Adeyemi, a media buyer with close-cropped hair and rolled sleeves, sits at a desk surrounded by four incompatible platform dashboards Sam Adeyemi is a senior media buyer at Pinnacle Agency. His client just greenlit a USD 50,000 Q2 campaign for Acme Outdoor—premium video and display across sports and outdoor lifestyle publishers. Three sellers to evaluate. Creatives to match. A governance review before anything goes live. Last time he ran a campaign this size, it took two weeks, four dashboards, and a spreadsheet to compare plans that were never in the same format. This walkthrough follows the same campaign through the AdCP 3.2 proposal lifecycle.

First choose the buying path

Sam’s agent reads get_adcp_capabilities.media_buy.lifecycle_tools before planning. AdCP 3.2 exposes two distinct commercial paths: Wholesale mirrors use the published-offer path: list_products bootstraps and repairs the feed, while account-level product webhooks keep it current. They are not proposal conversations. See Product discovery and planning for both paths. StreamHaus advertises the proposal lifecycle, so Sam asks its sales agent—built by Priya Nair’s ad products team—to plan the campaign.

Step 1: Request proposals

Sam's campaign brief radiates to three seller agents, each evaluating the same structured requirements Sam keeps strategy and goals in the brief. Exact commercial filters and delivery constraints use structured criteria:
One brief. Three sellers. The same structured constraints, proposal shape, and task lifecycle everywhere.

Step 2: Compare and refine

Three seller agents present video, display, and audio plans while Sam compares them in one view Draft proposals return priced purchases, flight dates, forecasts, targeting resolution, and canonical creative format options. Sam can compare them without normalizing seller-specific spreadsheets. Sam wants guaranteed delivery and a lower CPM ceiling. He creates a successor draft with typed constraints:
Typed constraints are mechanically testable. Subjective commercial guidance stays in ask. Each transition creates a new proposal_id; the source snapshot never changes. Sam branches on each result’s outcome and verifies any partial result before continuing.

Step 3: Check creative requirements

Canonical video, display, and audio format requirements align with Sam's creative assets Every proposed product declares canonical format_options[]. Sam’s platform can therefore validate or produce assets before accepting commercial terms:
  • StreamHaus needs SSAI-compatible 30-second video.
  • OutdoorNet needs 300x250 and 728x90 images.
  • PodTrail needs 30-second audio plus a companion image.
Sam’s creative team already has the video and display assets. The platform flags the missing audio cut early, while the proposal is still negotiable. Creative bodies do not belong in buy_products or accept_proposal; they are supplied through the seller’s advertised creative workflow after commitment.

Step 4: Finalize and accept

Sam reviews a committed campaign plan before accepting its expiring inventory hold Once the terms are right, Sam finalizes the selected draft. Finalization creates a committed successor and an inventory hold:
Sam verifies the committed proposal’s terms_digest and expires_at, then accepts that exact snapshot:
The ID and digest bind acceptance to the reviewed terms. If the task enters submitted, working, or input-required, Sam follows the standard task lifecycle until the completion artifact returns the media_buy_id.

Step 5: Governance and creative supply

Jordan Ochoa's governance agent checks Sam's campaign budget, publisher, targeting, and creative provenance Pinnacle registers the campaign plan with sync_plans and checks the proposed acceptance against Jordan Ochoa’s governance policy. Budget, approved sellers, targeting rules, and creative provenance are evaluated before money moves. Seller-side governance can independently validate the committed action against the same plan context. After acceptance, Sam supplies the assets through sync_creatives and assigns them to the returned packages. The buy remains pending_creatives until every required format has coverage, then moves to pending_start or active.

Step 6: Match at serve time

When a user loads a StreamHaus surface, its Trusted Match router can evaluate which packages should activate. Context Match asks whether the content fits the package; Identity Match asks whether the user is eligible. The publisher joins the two responses locally, so Sam’s buyer agent does not receive identity and page context together. See Trusted Match Protocol for the privacy architecture and surface-specific flows.

Step 7: Monitor and control delivery

Sam reviews unified delivery charts from all three sellers in a single view Sam reads operational state and the current revision from get_media_buys, and uses billing-grade get_media_buy_delivery for reporting. If he needs to pause a package or adjust a budget inside the accepted commercial envelope, he uses control_media_buy with the latest revision:
If a requested change falls outside accepted terms, the seller returns REQUOTE_REQUIRED. Sam starts an amendment from accepted_proposal_id, then repeats revise → finalize → accept. Operational state and commercial agreement remain separate and auditable.

The full picture

Sam still gets one protocol and one operational view across sellers, but 3.2 makes the commercial intent explicit: published offers are purchased directly; seller-planned terms move through immutable proposals; live delivery is changed with revision-checked controls.

Continue