CTV Ad Portfolio
The CTV Ad Portfolio is the IAB Tech Lab standard that names and signals six connected TV ad formats which had been running in market for years as bespoke, per-publisher integrations. Signaling guidance was finalised on 22 July 2026. None of the formats are new. What the standard adds is a way for a buyer to ask for one, a seller to describe one, and both to agree on what was delivered without a bilateral integration document.
Every format here monetises a moment that used to be worth nothing: the viewer hitting pause, the idle home screen, the lower third during play. That is the commercial case. Streamers cannot keep raising ad load, and these placements add inventory without adding interruption.
Quick reference
| Formats | Pause, Screensaver, Overlay, Squeezeback, In-Scene, Menu |
| Carried by | NonLinear VAST for five of six; Native API for Menu |
| Declare version | 4.2 or 4.3, not 4.4. IAB's own examples ship on 4.2 |
| Identified by | AdCOM plcmt echoed into <Extensions> |
The six formats
| Format | What the viewer sees | plcmt | Guide |
|---|---|---|---|
| Pause | An ad on the paused frame, full screen or beside the paused content. | 5 | Pause ads |
| Screensaver | An ad on the idle or dormant screen after playback stops. | 6 | Screensaver ads |
| Overlay | A banner or L-bar over playing content, usually lower third. | 7 | Nonlinear overlay |
| Squeezeback | Content shrinks into a smaller frame; the ad occupies the vacated area. | 8 | Squeezeback ads |
| In-Scene | An ad placed inside the content frame, blended into the scene. | 9 | In-scene ads |
| Menu / tile | A promoted tile in a browse or home surface. | Native, not plcmt | Native API |
Five of the six are NonLinear VAST. Menu ads go through the OpenRTB Native object and only touch VAST inside video.vasttag, so everything below applies to the other five.
Why NonLinear, and what changed in it
<NonLinearAds> had barely moved since VAST 2.0, where it existed to carry a static overlay image. It could not carry video, could not declare a duration, and had no clean way to attach an interactive layer. All three are requirements for the portfolio formats, so the VAST 4.4 draft grew the content model:
Five changes came out of that: a <MediaFiles> container and a <Duration> on <NonLinear>, <Icons> on <NonLinearAds>, SIMID relocated into the MediaFiles container, and typed QR elements in <CreativeExtension>. Element by element, with the draft's open questions, that is the VAST 4.4 reference and the 4.3 to 4.4 migration. Keep declaring version="4.2" or "4.3" while you do: the new content model is accepted on both, and IAB's own portfolio examples ship on 4.2.
How a buyer opts in
The guidance states a design goal that explains the rest of the signaling scheme: no one should be able to accidentally purchase a pause ad. Buyers opt in, and plcmt is the field they opt in on.
<Extensions>
<Extension type="plcmt" ext="adcom"><plcmt>5</plcmt></Extension>
</Extensions>The DSP echoes the bid request's format context back into the creative, because a VAST response outlives the bid object. An SSAI stitcher or a measurement vendor downstream of the auction never sees the bid, and plcmt in the response is how it learns what it is handling. Three more signals travel the same way, describing screen position, sound behaviour and how much the creative moves. Their values and per-format sets are in the 4.4 reference; the per-format guides above give the combination each format uses.
The signal combination each format uses
The four signals are not independent. A format fixes which values are coherent, and a combination outside that set is the mismatch a publisher will see when it compares the delivered experience against what it sold. Read down a column to build a tag, read across a row to spot a contradiction.
| Format | plcmt | playbackmethod | pos | Content state |
|---|---|---|---|---|
| Pause | 5 | 8 or 9 | 7 or 8 | Stopped by the viewer |
| Screensaver | 6 | 10 or 11 | 7 or 8 | Idle, playback ended |
| Overlay | 7 | 1 or 2 | 5, 9, 10, 14, 15 | Playing, ad on top |
| Squeezeback | 8 | 1 or 2 | 11, 12, 13, 16, 17 | Playing, frame shrunk |
| In-Scene | 9 | 1 or 2 | Composited, not positional | Playing, ad inside frame |
Two patterns fall out of that. Only pause and screensaver own the audio, which is why they are the only formats with dedicated playback methods; the other three reuse 1 and 2 because the content keeps its sound. And only pause and screensaver own the whole screen, which is why their pos values are a two-way fullscreen or partial choice while overlay and squeezeback need five values each to describe geometry.
The VAST 2.0 path
The same five formats also have a VAST 2.0 encoding, for players that never implemented the 4.x NonLinear model. There the creative travels inside an <Extension type="ctv_ad_portfolio"> container rather than in the NonLinear structure, and the container binds to a creative by id.
This matters more than it sounds: a validator built for one path reports nothing on the other, because to a 4.x-shaped parser the 2.0 payload is an opaque vendor extension. VASTlint ships dedicated rules for it, including VAST-2.0-ctv-portfolio-creative-id-required and VAST-2.0-ctv-portfolio-no-renderable-asset.
What breaks in practice
| Failure | Why it happens | Rule |
|---|---|---|
| Video NonLinear with no Duration | Duration is optional in the schema because static creative may not have one. A video MediaFile always does, and without it the ad renders while measurement sees nothing. | VAST-4.4-nonlinear-video-no-duration |
| Interactive-only creative | SIMID support on CTV devices is far from universal. A NonLinear with an interactive file and no renderable asset silently no-fills a large share of the install base. | VAST-4.4-nonlinear-no-renderable-asset |
| QR position in pixels | Icon positions accept integers or percentages. QR positions accept percentages only. Markup adapted from an icon block is invalid. | VAST-4.4-qrcode-position-percent |
| Signals that describe two formats at once | plcmt, pos and playbackmethod can each be valid and still disagree, for example a pause plcmt with squeezeback geometry. | VAST-4.4-adcom-pos-format-mismatch |
| Non-integer AdCOM payload | The signal elements carry enumeration values. A string, or a value outside the defined set, is malformed under any version. | VAST-4.4-adcom-signal-not-integer |
VASTlint ships 26 rules in a dedicated CTV Ad Portfolio category. Rules derived from the finalised signaling guidance carry normal weight, rules derived only from the draft schema stay at warning or info, and the only errors are constructs malformed under any version.
The bid request side
Everything above is the response. The request half lives in OpenRTB and AdCOM, where the new enumerations were added first and where a publisher declares which of these placements it has to sell. RTBlint covers that side in its CTV bid request reference.