DEV Community

Aleksander Sekowski
Aleksander Sekowski

Posted on

mincpmpersec Without poddur Validates as JSON. OpenRTB Prices Dynamic Pods.

A CTV pre-roll template ships "mincpmpersec": 5.0 on every video imp. There is no poddur, no maxseq, no sibling imp with a matching podid. The request parses. The exchange forwards it. A buyer's pod optimizer reads five dollars per second and bids as if the slot were part of a dynamic pod.

It is one linear ad in a fixed break. OpenRTB 2.6 defines mincpmpersec as a price floor for the dynamic portion of a video ad pod, relative to the duration of bids an advertiser may submit. Without poddur or maxseq, that float is pod vocabulary on inventory that never declared a pod.

IAB's Redefining Media Types (RMT) standard plans to classify impressions from fields that already exist on the bid request, including ad format via plcmt, linearity, and mtype. Pod economics use a parallel cluster: poddur, maxseq, mincpmpersec, slotinpod. When a trafficking snippet copies the per-second floor from a pod template onto every linear imp, format classifiers and pod bidders inherit conflicting stories from the same JSON object.

What mincpmpersec actually binds to

OpenRTB added pod bidding fields in 2.6. The ones that matter for this bug:

Field Role
poddur Total seconds advertisers may fill in a dynamic pod (or the dynamic half of a hybrid pod)
maxseq Maximum number of ads served into a dynamic pod
mincpmpersec Minimum CPM per second for the dynamic portion, relative to bid duration
slotinpod Guaranteed slot position when the seller can commit to it

minduration and maxduration bound individual creatives. poddur bounds the whole break. mincpmpersec is not a generic CPM-per-second knob for linear video; the spec text ties it to dynamic pod filling.

A valid dynamic pod shape includes context, for example:

"video": {
  "mimes": ["video/mp4"],
  "protocols": [2, 3, 5, 6],
  "poddur": 120,
  "maxseq": 4,
  "mincpmpersec": 5.0
}
Enter fullscreen mode Exit fullscreen mode

The broken shape I see in the wild drops the pod container and keeps the floor:

"video": {
  "mimes": ["video/mp4"],
  "protocols": [2, 3, 5, 6],
  "minduration": 15,
  "maxduration": 30,
  "mincpmpersec": 5.0
}
Enter fullscreen mode Exit fullscreen mode

Schema validation often passes because mincpmpersec is an optional float on Video. Nothing in JSON Schema requires poddur when mincpmpersec is present.

How you catch it

I maintain RTBlint, an open source OpenRTB linter. Semantic checks run after schema validation. The pod warning is explicit:

$ rtblint validate --type request @bid.json
  warning openrtb.video.pod.mincpmpersec_without_pod_context
          mincpmpersec is meant for the dynamic portion of a video ad pod; it is present
          without poddur or maxseq, which normally accompany a dynamic pod.
          imp[0].video.mincpmpersec
Enter fullscreen mode Exit fullscreen mode

Rule id: openrtb.video.pod.mincpmpersec_without_pod_context. It is a warning, not a hard error, because a single imp can represent an entire dynamic pod with no sibling imps to correlate (OpenRTB allows that shape when poddur or maxseq is present). The failure mode here is the opposite: pod pricing language without any pod duration or sequence cap.

Paste the imp into the OpenRTB docs hub and compare against the dated snapshot you actually validate (2.6-202606 versus 2.6-202303 changes pod-adjacent fields over time). Version drift on pod objects is easy to miss when only the top-level openrtb version string moves.

For live and event inventory, the same request often carries rqddurs arrays for dead-air control. The live event ad insertion walkthrough documents the mutual exclusivity between rqddurs and minduration/maxduration, plus this orphan mincpmpersec pattern, because rehearsal traffic copies pod defaults from on-demand templates.

Why RMT cares

RMT's operational layer wants binary answers from fields sellers already populate inconsistently. Ad format is mapped to plcmt, linearity, and mtype. That mapping assumes the video object describes one impression honestly.

An orphan mincpmpersec does not flip plcmt, but it does tell downstream systems the impression participates in dynamic pod pricing. Buyers that rank opportunities by effective CPM per second will compute a floor that the seller never intended for a single-slot linear break. Reporting that joins bid requests to delivery logs will bucket the imp with podded CTV paths.

Fix the template, not the bid: either add poddur or maxseq when the break is genuinely dynamic, or remove mincpmpersec and use bidfloor / durfloors for linear floors. If you are migrating snapshots, read which OpenRTB dated train you are on before you diff pod fields against an old integration guide.

Where to go next

  • What RTBlint checks separates schema errors from semantic pod and privacy rules.
  • Delisted CTV apps and blocklist gaps is a reminder that CTV bid requests carry app identity fields that must agree with trust lists; pod mislabeling and bundle mismatches often show up in the same trafficking export.

Run pod-shaped imps through validation in CI before you enable a new ad-server build. The HTTP 200 from your exchange partner does not mean the Video object tells one story.

Top comments (0)