DEV Community

Aleksander Sekowski
Aleksander Sekowski

Posted on

plcmt=5 in the VAST Tag Does Not Make a Linear MP4 a Pause Ad

A CTV buyer wins a pause placement. The bid request carried video.plcmt=5. The VAST response comes back schema-valid, passes the trafficker's eyeball check, and the campaign goes live.

The viewer hits pause. A thirty-second preroll starts in the content frame.

Nothing in the trafficking UI threw an error because nothing in the XML was malformed. The bug is a contract mismatch: the tag declared a pause buy and shipped an instream linear creative.

Two layers that do not auto-align

IAB's CTV Ad Portfolio finalised in July 2026 with a design goal the guidance states plainly: no one should accidentally purchase a pause ad. Buyers opt in through AdCOM's Plcmt Subtypes (Video) list. Values 5 through 9 map to Pause, Screensaver, Overlay, Squeezeback, and In-Scene.

Five of those six formats deliver through VAST <NonLinearAds>. Menu ads go through OpenRTB Native and never touch VAST NonLinear.

The plcmt integer travels in the bid request. Downstream of the auction, the VAST tag often outlives the bid object. SSAI stitchers and measurement vendors may never see the original OpenRTB payload. So the DSP echoes the format context back into the creative as AdCOM signals inside <Extension> elements.

On VAST 4.x that looks like one signal per extension:

<Extensions>
  <Extension type="plcmt" ext="adcom"><plcmt>5</plcmt></Extension>
  <Extension type="playbackmethod" ext="adcom"><playbackmethod>9</playbackmethod></Extension>
</Extensions>
Enter fullscreen mode Exit fullscreen mode

On VAST 2.0, the same five formats can ship through a single back-port container:

<Extension type="ctv_ad_portfolio">
  <CreativeId>creative-pause-001</CreativeId>
  <plcmt>5</plcmt>
  <playbackmethod>9</playbackmethod>
  <MediaFiles>
    <MediaFile delivery="progressive" type="image/jpeg" width="1920" height="1080">
      <![CDATA[https://cdn.example.com/pause.jpg]]>
    </MediaFile>
  </MediaFiles>
</Extension>
Enter fullscreen mode Exit fullscreen mode

That extension block is not decorative metadata. On 2.0 it is how the portfolio carries the media delivery model the base schema never had. On 4.x the <NonLinear> node itself can hold <MediaFiles>, but the AdCOM echo still has to match what actually renders.

Here is the failure I keep seeing: the extensions declare plcmt=5, and the only <Creative> in the ad is <Linear> with a preroll MP4.

<Creative id="creative-001">
  <Linear>
    <Duration>00:00:30</Duration>
    <MediaFiles>
      <MediaFile type="video/mp4" delivery="progressive">
        <![CDATA[https://cdn.example.com/preroll.mp4]]>
      </MediaFile>
    </MediaFiles>
  </Linear>
</Creative>
Enter fullscreen mode Exit fullscreen mode

Schema validators that only check element order and types will accept this. The plcmt value itself is legal anywhere from 1 to 9. Rule VAST-4.4-adcom-plcmt-value only fires when the integer is outside that range, not when it disagrees with the creative subtree.

The player does not read plcmt. It reads <Linear> versus <NonLinearAds>. A linear MP4 in a pause slot either plays as instream video over frozen content or gets dropped when the app expects a static overlay. Either way the buy and the delivery diverged silently.

What each field actually commits you to

plcmt answers which portfolio format was transacted. Value 5 is Pause. Value 7 is Overlay. Value 8 is Squeezeback. This is an OpenRTB / AdCOM contract surfaced in VAST so downstream hops can see it.

<NonLinearAds> answers how the player should render the asset: static image, timed video under NonLinear, SIMID interactive layer, squeezeback geometry. VAST 4.4 expanded NonLinear to accept <MediaFiles> the way Linear always has, which is why a pause ad can now be a fifteen-second MP4 instead of only a JPEG. The 4.3 to 4.4 migration notes walk that content-model change field by field.

playbackmethod adds pause-specific semantics on top of plcmt: value 8 is pause with sound on, 9 is pause with sound off. Overlay and squeezeback reuse the older instream playbackmethod values. Mixing pause plcmt with instream playbackmethod is another silent mismatch buyers filter on even when the XML validates.

attr (Creative Attributes 21, 22, 23) separates static, cinemagraph, and full-motion delivery. A publisher blocking full-motion pause inventory sets battr accordingly. Shipping attr=23 on a static JPEG pause creative mislabels motion expectations the other way.

On VAST 2.0 with multiple <Creative> elements, each <Extension type="ctv_ad_portfolio"> needs a <CreativeId> that matches a real creative id. Without it, the extension binds to whichever creative the platform picks. Rule VAST-2.0-ctv-portfolio-creative-id-required catches the two-creative, no-id case. Rule VAST-2.0-ctv-portfolio-mediafiles-required catches an extension that declares plcmt but carries no <MediaFiles> and no native NonLinear resource to render.

None of those rules replace the structural check: does this tag actually contain a NonLinear creative for a NonLinear buy?

How I catch it before the player does

I start with the live tag URL in the VAST tag tester. Paste the ad server's response URL or the XML itself. The tester fetches wrappers, shows which creative type loaded, surfaces tracking URLs, and previews the media file the player would pick. On a pause buy I expect NonLinear preview behavior, not a linear progress bar counting to thirty seconds.

If the tag is wrapped, I run the same URL through the VAST inspector. Portfolio tags often chain through a DSP wrapper before the InLine with the actual creative. The inspector walks each hop and shows where Linear handoff happens versus where the wrapper still carries only AdCOM extensions with no renderable NonLinear node.

After that I run vastlint check in CI on the resolved InLine. The AdCOM signal rules confirm integers are in range. The 2.0 portfolio rules confirm extension binding and media presence. I still grep the XML for <Linear> under a creative that should be portfolio inventory.

Where the spec splits 2.0 and 4.x

You do not need version="4.4" to use portfolio NonLinear content. IAB's own examples ship on version="4.2" with the expanded NonLinear model. The CTV Ad Portfolio overview maps each format to its OpenRTB object and VAST response shape.

Legacy stacks that only parse VAST 2.0 rely on the ctv_ad_portfolio extension path: AdCOM signals, MediaFiles, and Duration live inside <Extension type="ctv_ad_portfolio"> while the creative may still expose a minimal NonLinear StaticResource for players that ignore extensions.

The signaling versus validation split matters here: the July 2026 signaling guidance is final; vast_4.4.xsd is still draft. Value-level checks from the final guidance apply regardless of version declaration. Structural checks on the NonLinear content model apply on any 4.x document using those nodes. Read the VAST 4.4 draft index when you need the rule ids tied to each element.

The short version

plcmt=5 in an extension records that the buy was a pause placement. It does not convert a Linear preroll into a pause ad. The creative has to live under <NonLinearAds> (or the 2.0 extension has to carry renderable <MediaFiles> bound to the right <CreativeId>).

Validate the signal integers. Then validate the shape. The tester shows what renders; the inspector shows where the wrapper hid the InLine; the linter catches binding and range defects the player never reports.

I maintain vastlint independently of IAB Tech Lab. The rule ids above come from the published CTV Ad Portfolio guidance and the VAST 4.4 draft schema notes in the repo, not from a vendor QA checklist.

Top comments (0)