On October 6, 2026, the IAB Tech Lab opened a public comment period aimed at simplifying programmatic plumbing. Curated private marketplace lines are a big part of that conversation: buyers pay for packaging, not just a deal id. On the wire, packaging still collapses to imp.pmp and a deals array. When operations treat that shape like a generic PMP row, the upstream filter disappears and fill still clears against the deal name on the IO. That is unbillable confusion at scale, not a UI typo.
Programmatic curation is sold as inventory plus data, assembled before the auction. OpenRTB never got a "curator" field in the bid request. IAB put terms, scope, and fee disclosure in the Deal Sync sidecar. The auction object remains an ordinary Deal entry. These ten mistakes are where curated buys silently downgrade to plain PMP traffic.
Treating Deal Sync copy as live targeting. The sidecar feed is reconciliation metadata. The spec is explicit that criteria pushed through Deal Sync are not guaranteed to match the next bid request. If QA only diffs the sync export, you can ship traffic that never carried the segment or site list the buyer signed.
Leaving
private_auctionunset on invite-only packages. In OpenRTB 2.x,imp.pmp.private_auctiondefaults to 0, which means open auction competition is allowed unless you set 1. Curators often sell "PMP-only" packages while the SSP still emits the default. Bidders who did not buy the package can win, and the curated filter never applied.Winning on a deal id that was not on the impression you billed. Reporting joins on
dealidin the bid response, but finance should trace back toimp.pmp.deals[].idon the request that actually ran. Multi-imp pods and duplicated deal ids across imps make it easy to attribute fill to a curated line that was not on the imp that cleared.Expecting curator fee disclosure inside the OpenRTB Deal object. Fee and origin fields live in Deal Sync's Curation object, not in
imp.pmp.deals. A bid request validator will never prove fee transparency; conflating the two objects sends buyers looking for fields that are not in the schema.Assuming
user.datasegments prove the curator filter ran. When a curator applies segments only as an upstream supply filter, those segments may never appear in the bid request at all. Seeing unrelatedDataobjects on the request is attribution by convention, not proof that the MFA exclusion list from the one-pager executed.Deploying floor changes from the sync file without diffing live
bidfloor. Deal floors in traffic are on the Deal object in the request. A mismatch between the sidecar export and liveimp.pmp.deals[].bidfloormeans you can underbid curated inventory or overbid open paths while dashboards still show the old package terms.Swapping white-label curator ids for publisher-direct ids without updating seat maps. The same inventory sometimes clears under different deal ids depending on which SSP node packaged it. Seat allow lists (
wseat) and advertiser block lists (wadomain) on the Deal object are per id. A seat cleared for one id may be illegal on the renamed curated id.Validating only the first impression in a pod. CTV and long-form video requests often carry multiple imps. Curated deals frequently attach to a mid-roll imp while preroll stays open market. Checking imp index zero alone misses the deal attachment the buyer actually purchased.
Patching deal floors or activations on the wrong JSON path. Agent and ARTF workflows mutate live objects under time pressure. A mutation aimed at
/imp/0/pmpwhen the curated deal sits on/imp/1/pmp/deals/0returns RPC success while the exchange still runs the uncurated object. Path precision matters more than envelope parse status.Trusting schain completeness on curated resale without matching deal terms. Curators resell across SSPs with different SupplyChain 1.1 habits. A valid-looking
source.schaindoes not replaceat, floor, and seat constraints on the Deal object. You can pass chain validation and still serve inventory outside the curated scope.
One field is worth memorizing: imp.pmp.private_auction omitted means open auction. That default has burned more curated packages than any single bad segment id, because the buyer still sees a deal id on the line item and assumes exclusivity.
How you catch it
An LLM implementing AdCP, ARTF, or AAMP can emit a bid request that parses and still drop the filter the buy described. The tool call can return OK while the exchange runs a different shape. rtblint (cargo install rtblint, npm install rtblint-core, MCP rtblint-mcp) is the deterministic check on the OpenRTB object: PMP containers, deal ids, floors, and the dated snapshot your partner actually enforces. It is independent of IAB Tech Lab and of AAO; the specs do not require it, but someone has to diff live requests against the deal terms you sold.
Ingest Deal Sync if you use it, then validate every production template against the same snapshot you pin in CI. The OpenRTB docs index and what rtblint checks list the deal and PMP rules that show up on curated lines first.
Where to go next
- What is curation in programmatic? for the Deal Sync versus bidstream split (companion to the October 2026 simplification comment).
-
IAB Tech Lab 2026 roadmap and OpenRTB for where the Curation object lives relative to
imp.pmp.deals. - OpenRTB version trains when curated traffic crosses SSPs on different 2.6 snapshots.
- Agentic buying and OpenRTB when negotiation closes above the auction but execution still materializes as deal ids.
- Guides index for PMP vocabulary and schain migration notes on multi-SSP curated packages.
Top comments (0)