DEV Community

Aleksander Sekowski
Aleksander Sekowski

Posted on

11 Curated Deal Mistakes That Clear as Open Auction and Kill Fill

IAB Tech Lab marked the Deals API at version 1.0 in February 2026, and trade coverage picked it up again in late October. The API finally names the curator, the origin seller, and the curation fee type. None of that rides on the live bid request. On the wire you still get imp.pmp.deals with a deal id, a floor, and maybe wseat. The audience filter, the inventory bundle, and the data fee you negotiated live upstream, or in a spreadsheet, or in the DSP deal UI. When that upstream layer slips, the auction can clear as open traffic while finance still books a curated CPM. Fill drops because you are bidding the wrong auction, and money leaks because you are paying for packaging that never reached the impression.

Here are eleven ways that happens in production.

  1. private_auction left at 0 on a deal-only buy. OpenRTB 2.6 defaults pmp.private_auction to 0, which means outside bidders may compete. A curated package sold as exclusive should carry private_auction: 1 so only listed deals qualify. If the SSP omits the flag, your deal bid can win, but so can anyone else on the open exchange at a lower price. You thought you bought a walled garden; the request says otherwise.

  2. Deal Sync metadata promises a segment the bid request cannot prove. The Deals API and Deal Sync objects can describe segments, inventory lists, and curator roles. The bid request has no field that says "this impression passed filter X." You validate the deal id in the DSP, not the filter graph. When the curator loosens targeting to recover volume, the first signal is often a win without the audience you sold to the client.

  3. dealid missing on the bid even though imp.pmp.deals listed your deal. The response must echo the deal id when you transact against an in-request deal. Without it, reporting attributes spend to open auction, pacing rules misfire, and loss analytics blame creative filters instead of deal mismatch. Loss reason 213 (not allowed in PMP deal) is real, but so is the quieter case: you win, and finance cannot tie the impression back to the curated line item.

  4. Multiple deals in the array when the buyer activated one. Some exchanges broadcast every PMP they could serve on an impression. Your seat bids deal A; the request also advertises deals B and C for other buyers. That is legal OpenRTB, but it confuses deal-level QA if you sample one id and assume the path is exclusive. You optimize against the wrong floor and wonder why margin disappeared.

  5. wseat or wadomain stripped between curator and exchange. Deal objects can restrict which buyer seats or advertiser domains may bid. Curators sometimes normalize requests for latency and drop optional arrays. Your bid goes in from an allowed seat, loses to a cheaper open bidder, and the seller swears the deal was "activated." The payload tells a different story.

  6. Impression-level bidfloor undercuts the per-deal floor you synced. Floors can live on imp.bidfloor and again on each pmp.deals[].bidfloor. A curated package often sets a higher deal floor to cover data and curation fees. If only the impression floor survives the hop, open auction bids above the low floor and below your economic deal floor steal wins you cannot serve profitably.

  7. Duration floors on video deals ignored after curation repackaging. OpenRTB 2.6 dated snapshots added durfloors and related video deal pricing. A curator bundles long-form CTV with a 30-second creative requirement. The repackaged request drops durfloors because the downstream exchange runs an older profile. Your bidder passes schema checks; the player rejects the creative length.

  8. Curator fee embedded in UI, invisible on the request. TripleLift’s October 2026 Uber audience packages and Multilocal’s FouAnalytics curated PMPs both describe bundled data plus inventory. Neither OpenRTB nor the winning bid exposes how much of the CPM is inventory versus data versus curation margin. When fill softens, buyers cannot tell whether to renegotiate the package or fix targeting.

  9. Supply-side targeting miscounted as "curation." OpenX’s 2026 reporting split audience and content targeting from inventory-only curation. Deals sold as curated bundles may be executed as supply-side targeting packages with different fee and auction rules. Your operational runbook says PMP; the SSP’s internal taxonomy says something else. Spend lands on the wrong report row.

  10. Deal id rotation without DSP sync. Curators rotate ids after package changes. The Deals API row updates; your DSP still bids last month’s id. The exchange treats the bid as non-deal or maps it to a generic PMP with weaker filters. Wins look fine in aggregate until you audit domain and app bundle mix.

  11. Protobuf JSON privateAuction: false on a gRPC hop. On gRPC bid streams the same flag serializes as boolean camelCase. A spec-JSON validator says private_auction: 1; a proto hop silently reads open auction if the field name or type drifts. Curated exclusivity dies in transport, not in the sales contract.

How you catch it

An LLM wiring AdCP, ARTF, or AAMP can emit an OpenRTB request that parses clean and still misrepresents the curated buy. The RPC or MCP task can return OK while private_auction, deal floors, and dealid are wrong for what finance sold.

RTBlint is the deterministic check on that object: imp.pmp.deals, per-deal floors, seat restrictions, and the bid response dealid. It is independent of IAB Tech Lab and of AgenticAdvertising.org; the spec does not require it, but someone has to diff the live request against the deal terms you think you bought.

Run rtblint validate on sampled bid requests from the curated line item, or npm install rtblint-core in CI on fixtures your SSP provides. For ARTF paths that mutate deals, validate the patched request before it hits the exchange, not only the agent’s success bit.

Where to go next

Top comments (0)