DEV Community

Aleksander Sekowski
Aleksander Sekowski

Posted on

OpenRTB Video Still Sends placement: 1. Buyers Filter on plcmt Now.

A publisher ships a video bid request with "placement": 1. Every legacy integration reads that as In-Stream. The DSP's traffic filter reads plcmt, finds nothing, and drops the imp. Or worse: it finds "plcmt": 1 copied from the old integer while the player is muted autoplay in an article, and the buyer pays instream CPM for inventory that fails the instream definition.

The JSON is well formed. The integer is in range. The failure is semantic, and it sits on a field rename the spec treated as a straight swap.

Two fields, two AdCOM lists

OpenRTB 2.6-202303 deprecated imp.video.placement in favor of imp.video.plcmt. Both are integers on the Video object. They are not the same enumeration.

placement draws from AdCOM Placement Subtypes - Video, a five-value list the spec now marks deprecated:

Value Name
1 In-Stream
2 In-Banner
3 In-Article
4 In-Feed
5 Interstitial/Slider/Floating

plcmt draws from Plcmt Subtypes - Video, a four-value list at the time of deprecation (expanded later for CTV portfolio formats):

Value Name
1 Instream
2 Accompanying Content
3 Interstitial
4 No Content/Standalone

The names look similar. The definitions are not interchangeable. Under the old list, In-Stream meant pre-roll, mid-roll, or post-roll against streaming content, full stop. Under the new list, Instream (plcmt=1) additionally requires sound-on by default at player start, or explicit user intent to watch, with the video as the focus of the visit. Muted autoplay players embedded in editorial pages were often sold as placement=1. Under the updated IAB Digital Video Guidelines they are Accompanying Content (plcmt=2) or No Content/Standalone (plcmt=4), depending on context.

There is no lookup table from old value to new value. The IAB implementation guide's own migration examples pair placement=1 with plcmt=1 for true sound-on instream, and placement=3 In-Article with plcmt=4 No Content/Standalone. You classify each placement against the new definitions; you do not copy the integer.

The full value tables and migration steps are on the placement vs plcmt guide.

What breaks in production

Only placement, no plcmt. The field still parses on 2.6. Buyers who moved their filters to the successor field see an undeclared placement type. Some default to the cheapest tier. Some no-bid. Neither outcome shows up as a schema error.

Same integer on both fields. "placement": 1, "plcmt": 1 on a muted outstream unit tells legacy DSPs the slot is In-Stream and tells updated buyers it meets the instream audio and intent test. One of those readers is wrong. The mislabeling flows into pricing, creative eligibility, and reporting buckets that no longer line up with MRC-aligned definitions.

Treating plcmt as optional. The spec does not mark it required. In practice, video buyers increasingly filter on it because it separates true instream from accompanying and standalone video. Omitting it on CTV and premium web supply costs bids even when placement is present.

Confusing plcmt with neighbors. linearity declares whether the expected VAST response is linear or non-linear. pos is above or below the fold. plcmt answers where the ad plays relative to content the viewer requested. A pause ad on CTV is plcmt=5 in the extended AdCOM list, not a different placement value. The video.plcmt field reference walks the nine current values and how they differ from linearity and pos.

How you catch it

Paste the request into a validator that knows the OpenRTB version you claim to speak. I maintain RTBlint, an open source OpenRTB linter. Against 2.6 it flags the deprecated field at the exact JSON path:

$ rtblint validate request.json
FAILED (OpenRTB 2.6-202606 bid request): 1 error(s), 0 warning(s).
- [warning] imp[0].video.placement: imp.video.placement is deprecated in
  OpenRTB 2.6-202303; use imp.video.plcmt instead.
  (openrtb.field.deprecated) · spec 3.2.7
Enter fullscreen mode Exit fullscreen mode

That is a warning, not a hard fail, because the field still parses and older buyers still read it. The point is to surface the migration before a traffic-shaping model learns your path sends deprecated signals.

An out-of-range plcmt value is an error:

- [error] imp[0].video.plcmt: plcmt 99 is not a documented Plcmt Subtypes -
  Video value for this version. (openrtb.field.enum) · spec 3.2.7
Enter fullscreen mode Exit fullscreen mode

Run the same check in CI with rtblint validate request.json. The bid request object reference lists every Video field with version notes if you are auditing by hand first.

Where to go next

Start with the placement vs plcmt guide if you are reclassifying live inventory: audit each player for sound-on default and user intent, set plcmt from the new list, keep placement on its legacy value until partners confirm they read the successor, then drop placement.

For CTV pods and live streams, read how plcmt interacts with pod bidding on the OpenRTB CTV page. Full-episode and live streams are typically plcmt=1; portfolio formats (pause, overlay, squeezeback) use values 5 through 9 from the AdCOM 1.0-202607 extension.

All 2.6 enum lists, including both the deprecated placement list and the current plcmt list, live on the OpenRTB enums reference.

RTBlint is independent of IAB Tech Lab. The rule ids above cite the published OpenRTB and AdCOM text because that is where the requirements live, not because this is an official tool.

Top comments (0)