Backend
plcmt=5 With playbackmethod=1 Validates. Those Two Integers Name Different Formats.
Aleksander Sekowski DEV Community
2 views
A trafficking template copies last quarter's instream tag, changes one field to pause inventory, and ships. The VAST response validates. The buyer's filter reads plcmt=5 and playbackmethod=1 in the same <Extension> block and treats the impression as a generic instream spot with sound on, not a pause placement with its own playback semantics.
Nothing throws a player error because both values are integers inside AdCOM's allowed ranges. The failure is semantic: two signals that were supposed to describe one CTV Ad Portfolio format now describe two different ones.
plcmt and playbackmethod answer different questions
IAB's CTV Ad Portfolio (finalized July 2026) adds five transactable video formats beyond classic instream: Pause, Screensaver, Overlay, Squeezeback, and In-Scene. OpenRTB carries the buy on video.plcmt values 5 through 9. Downstream of the auction, DSPs echo those signals back into VAST as AdCOM extensions so SSAI paths and measurement vendors that never saw the bid request can still read what was sold.
On VAST 4.x the pattern is one signal per extension:
<Extensions>
<Extension type="plcmt" ext="adcom"><plcmt>5</plcmt></Extension>
<Extension type="playbackmethod" ext="adcom"><playbackmethod>9</playbackmethod></Extension>
</Extensions>
On VAST 2.0 the same five formats can ship inside a single back-port container (type="ctv_ad_portfolio") with plcmt, playbackmethod, MediaFiles, and Duration in one block. The signaling table is the same; only the XML shape differs.
plcmt names the format row: 5 is Pause, 6 is Screensaver, 7 is Overlay, 8 is Squeezeback, 9 is In-Scene.
playbackmethod is older AdCOM vocabulary. For legacy instream it still means things like autoplay with sound on (1) or click-to-play (2). The portfolio guidance assigns new playbackmethod values to Pause and Screensaver because those rows needed sound-on and sound-off variants that did not exist in the pre-portfolio table:
plcmt
Format
playbackmethod (firm mapping)
5
Pause
8 (sound on), 9 (sound off)
6
Screensaver
10 (sound on), 11 (sound off)
7–9
Overlay, Squeezeback, In-Scene
typically 1 or 2 (generic instream methods)
The table is asymmetric on purpose. Pause and Screensaver own dedicated playbackmethod codes. Overlay, Squeezeback, and In-Scene reuse the generic instream pair because the guidance only says they "typically" use 1 or 2; there is no exclusive code to contradict.
That is where the silent bug lives. A template that sets plcmt=5 but leaves playbackmethod=1 from an old preroll line item passes every schema check. Both integers are legal. Together they claim Pause and autoplay instream with sound on, which is not what the format-to-signal reference table describes.
The inverse hurts too: plcmt=6 (Screensaver) with playbackmethod=9 (Pause, sound off) is equally valid XML and equally wrong for buyers who treat the pair as a contract.
Why buyers care even when the creative plays
Portfolio filters do not stop at "did NonLinear render." Measurement and billing pipelines increasingly read the AdCOM extensions as the ground truth for format mix reporting. A pause buy that still declares instream playbackmethod pollutes format-level dashboards, triggers the wrong viewability rules, and can fail deal-line QA that checks signal consistency rather than MP4 presence.
This is separate from the Linear versus NonLinear creative shape problem. You can ship a correct NonLinear pause asset and still mislabel playbackmethod. The Sep 1 class of bug (linear MP4 under pause plcmt) kills playback. This class keeps playback and poisons attribution.
Rule VAST-4.4-adcom-playbackmethod-format-mismatch encodes the firm rows only: Pause methods 8 and 9 must sit under plcmt=5, Screensaver methods 10 and 11 under plcmt=6, and a Pause or Screensaver plcmt must not carry a playbackmethod owned by the other format. Generic 1 or 2 under Overlay is not flagged because the spec does not make that exclusive.
Catch it on the live tag before the campaign leaves QA
Start with the VAST tag tester. Paste the live ad tag URL or the XML. It fetches the response, previews the creative, and surfaces tracking URLs. For portfolio inventory you want to confirm NonLinear delivery and read the AdCOM extensions in context, not just confirm an MP4 bit rate.
If the tag is a wrapper chain, open the VAST inspector next. Portfolio signals sometimes appear only on the inner InLine after two hops; QA on the outer wrapper misses the playbackmethod copy error entirely.
For IAB sample creatives and SIMID-style portfolio overlays, the IAB-style VAST tester (an independent fork, not an IAB Tech Lab product) adds host transport logging and studio preview that a paste-only check skips.
CLI after that, if you gate releases in CI:
$ vastlint check pause-tag.xml
warning VAST-4.4-adcom-playbackmethod-format-mismatch
AdCOM playbackmethod and plcmt name different formats:
8 and 9 are Pause, 10 and 11 are Screensaver, and Overlay,
Squeezeback and In-Scene use 1 or 2.
The finding points at the playbackmethod node because that is the field that lied about format ownership.
Where the contract is written down
The format mismatch rule reference walks the Pause and Screensaver rows with citations to the portfolio format-to-signal table. Pair it with the playbackmethod value rule for out-of-range integers (portfolio extended AdCOM to methods 8 through 11; legacy validators that only know 1 through 7 miss the new codes entirely) and the plcmt value rule for the 1 through 9 placement subtype range.
The CTV Ad Portfolio overview ties the six formats to OpenRTB and VAST paths. If your stack still emits VAST 2.0, read how the VAST 2.0 extension container packs signals and media in one block; the plcmt and playbackmethod pairing rules apply there too, not only on 4.x <Extension ext="adcom"> children.
The short version
Do not copy instream playbackmethod=1 onto a pause tag just because the integer validates. Pause owns 8 and 9. Screensaver owns 10 and 11. When plcmt and playbackmethod disagree on format ownership, the XML is still well formed and the buy is mislabeled. Read both signals on the live tag, walk wrapper chains in the inspector, and treat the pair as one contract, not two independent dropdowns.
Read original: https://dev.to/aleksuix/plcmt5-with-playbackmethod1-validates-those-two-integers-name-different-formats-2748
← Previous
What I learned building speech tech for a language with zero datasets
Next →
From Custom Code to Mature Library: Why I Replaced My SSRF Protection with requests-hardened
Related
Open-PR: một AI agent review PR nói chuyện như đồng nghiệp, không như một con bot
Backend
0
DEV Community
Was TinyStories the Domain or the Vocabulary?
Backend
0
DEV Community
Building an investing knowledge graph, part 6: if you're merging data from more than one source, you'll hit this
Backend
0
DEV Community
The Hard Truth About Data Engineering Interviews Nobody Tells You
Backend
0
DEV Community
Comments0
No comments yet — be the first