Skip to main content

CTV Experience Profiles

The IAB Tech Lab CTV Ad Portfolio defines seven ad experiences for connected-TV home screens and players: Linear, Menu, Pause, Screensaver, Overlay, Squeezeback, and In-Scene. Linear CTV video needs no new modeling — it’s ordinary video_vast or video_hosted with no experience declared. This page covers the other six, which AdCP 3.2 expresses through a shared ctv_ad_experience vocabulary layered on existing canonical formats. No ctv_* canonical kinds exist; a format option declares eligibility for at most one experience, and sellers offering several experiences publish sibling format options. This is a creative-supply contract, not a restatement of IAB’s OpenRTB signaling table. The signaling annex below documents that bridge separately, because what a seller signals on the wire (OpenRTB plcmt, Native plcmttype) and what a buyer ships as a creative manifest are different concerns. See Canonical formats for the full canonical-format model this page builds on, and Connected TV for the delivery-model (SSAI/CSAI) guide this page complements.

The six experiences

One format option declares at most one value from this list.

Experience-to-canonical matrix

Validation rejects any ctv_ad_experience value on a canonical format that isn’t listed below — each of the five listed canonicals enforces its own row via x-adcp-validation.verifier_constraints.ctv_experience_matrix schema conditionals; the reference validator’s ctv_experience_matrix check covers unlisted canonicals (e.g. html5) through the semantic layer. The matrix is deliberately plural where the market is: two sellers can both legitimately claim pause, one shipping an image and the other a VAST tag. Linear CTV video declares no ctv_ad_experience at all — it’s plain video_vast or video_hosted.

Buy-time commitment and runtime eligibility

ctv_ad_experience describes where one format option is eligible to render. It does not by itself promise that every impression in the product will use that experience. The ordinary product and package format-selection contract determines when the choice becomes binding:
  • Buyer-selected or guaranteed inventory — the package commits a specific format option. The accepted package’s formats_to_provide contains that option, so selecting a pause option is a firm buy-time commitment to pause inventory.
  • Runtime-resolved inventory — the product publishes one sibling format option per eligible experience. The accepted package’s formats_to_provide identifies the option set for which the seller requires creative coverage; the buyer supplies compatible creatives for those options, and the player chooses among the covered options per impression from viewer state. formats_pending exposes any required option that still lacks creative coverage.
A runtime selector MUST use only a creative validated for the option it chooses. It cannot reinterpret one option’s creative under a different ctv_ad_experience, silently drop an uncovered required option, or treat a product-level union as permission to violate placement-level format narrowing. If the buyer wants to cover fewer options than the seller requires, that is a package refinement before commitment, not an implicit runtime fallback. Cells with multiple permitted canonicals use the same model: the seller publishes one sibling format option per canonical it accepts, and normal option selection resolves the contract. There is no fallback_canonical field. For squeezeback and in_scene, choose sponsored_placement when the seller resolves a catalog reference at serve time; choose video_vast when the seller receives a finished asset, even if that asset was produced earlier from catalog data.

Constraint profiles

Beyond the matrix, each experience carries its own conditional constraints, enforced where noted on the canonical’s schema:
  • overlay, squeezeback — minimum duration of 10 seconds (duration_ms_exact or the floor of duration_ms_range must be at least 10000).
  • in_scene — minimum 3-second brand-exposure duration, and no interactivity: vpaid_enabled must be false (or absent). The all-profile SIMID prohibition below also applies.
  • pause — no duration floor. The unit ends on a viewer or device action (resume, timeout), not a fixed clock.
  • Every video_vast CTV profile forbids SIMID. VAST 4.1+ carries SIMID through <InteractiveCreativeFile apiFramework="SIMID"> under Linear <MediaFiles>; NonLinearAds has no such element. Because all five video-backed CTV profiles require creative_type: "nonlinear", simid_supported must be false or absent. Viewer activation on these surfaces uses activation_methods; NonLinearAds may still use their own HTMLResource plus apiFramework interactivity where the specific profile permits it.
  • VPAID support is capability-specific on the interactive profiles. Allowing vpaid_enabled: true on pause, overlay, screensaver, and squeezeback is intentional: it lets a seller explicitly advertise a NonLinear apiFramework integration when its CTV player actually implements one. It is not a claim that VPAID is common or recommended on CTV; sellers without that runtime support omit the flag or set it to false. in_scene remains categorically non-interactive and therefore forbids it.

creative_type and the linear_required migration

video_vast format options gained an explicit creative_type enum (linear | nonlinear | either) that supersedes the older boolean linear_required. Any option declaring ctv_ad_experience MUST set creative_type: "nonlinear" — all five non-menu experiences are NonLinearAds. When both fields are present, creative_type wins. For options that predate this field:
  • linear_required: true with no creative_type is read as creative_type: "linear".
  • linear_required: false with no creative_type is read as creative_type: "either" — the absence of a linear requirement means either creative class satisfies the option, not that the option somehow became nonlinear-only.
New format options should set creative_type directly and drop linear_required. native_in_feed is the only canonical whose CTV profile lives on an otherwise web/app-native canonical, because IAB signals Menu as OpenRTB Native and the largest platforms (Fire TV, Samsung, Google TV) render menu heroes as video-capable tiles. Three parameters carry the profile, valid only alongside ctv_ad_experience: "menu": A menu hero remains native_in_feed rather than video_hosted or video_vast because the platform assembles the full tile (background image, logo, copy, and the focus-triggered video) as one asset bundle — the video rides inside that bundle rather than being the unit itself. focus_behavior: autoplay_muted or autoplay_sound only makes sense when the format option’s effective slots include the video asset group. This pairing is documented as a verifier constraint (focus_video_pairing) but is not enforced by a JSON Schema conditional today — see Validating CTV manifests for why, and the note on schema-vs-semantic enforcement in the compliance vectors.

Motion level and activation vocabularies

Two shared vocabularies carry the interaction layer across every CTV-capable canonical. motion_level — one of static, limited_motion, full_motion, mapping 1:1 to the ratified AdCOM creative attributes 21–23. Sellers constrain the accepted level on a format option; buyers declare the level their creative carries. image always narrows motion_level to static or limited_motionfull_motion maps to Full-Motion Video (AdCOM attr 23), which has no meaning on a static-image canonical regardless of whether a CTV experience is declared. activation_methods — the array of viewer activation mechanisms a format option offers, drawn from qr_code, deep_link, push_notification, email, tune_in, text_message. Formats offering copy-bearing activations declare normative character-limited copy slots via slots_override: push_notificationactivation_message; text_messageactivation_text_message; emailactivation_email_subject + activation_email_body. Absent a dedicated slot, the activation resolves through the manifest’s landing_page_url. Activations are engagement events, never impressions. A viewer scanning a QR code, following a deep link, or responding to a push notification generates an engagement event on top of the one rendered ad impression — it does not create a second impression. See Measurement.

Validating CTV manifests

ctv_ad_experience, menu_placement, focus_behavior, creative_type, motion_level, and activation_methods are all properties of a seller’s format option — they describe what a product offers, not fields a buyer sets on a creative manifest. A buyer never writes ctv_ad_experience: "pause" into a manifest; instead, the buyer selects a product or format option that already declares pause, and ships assets that satisfy it. This means validate_input checks two different things depending on the target:
  • targets: [{ kind: "canonical", id: "video_vast" }] validates manifest structure only — asset types, VAST delivery shape, and any asset-level hints such as duration_ms on the vast_tag asset. It cannot evaluate ctv_ad_experience, because the manifest doesn’t carry it.
  • targets: [{ kind: "product", id: "..." }] validates the manifest against that product’s specific format-option declaration, including its experience and duration constraints. A vast_tag asset whose duration_ms hint is below an overlay product’s 10-second floor returns validated_fail with a duration_ms_range-style violation citing the product’s declared floor.
Whether a given format option’s ctv_ad_experience pairing is legal at all is evaluated when the format option itself is authored, before any buyer manifest exists to check. The enforcement is two-layer: JSON Schema conditionals (in the canonical’s allOf) reject categorically invalid pairings — an unlisted experience value, menu on video_vast, missing creative_type: "nonlinear", simid_supported: true on any video_vast CTV profile, or vpaid_enabled: true on in_scene; the semantic validator mirrors those rules for defense in depth and enforces everything else — duration floors (overlay/squeezeback ≥ 10 s, in_scene ≥ 3 s), the matrix row for unlisted canonicals such as html5, and the focus_video_pairing slot check. Missing copy slots for push_notification, text_message, or email remain non-blocking: validate_input returns validated_pass with a ctv_activation_copy_slots entry in warnings[]. Rules appear in one place only: numeric duration constants live exclusively in the semantic validator, not duplicated into schema conditionals. See Canonical formats — validate_input for the general validate_input contract.

OpenRTB and AdCOM signaling annex

IAB’s own signaling model maps five of the six experiences to OpenRTB Video with VAST NonLinearAds, and Menu to OpenRTB Native. AdCP preserves this mapping as a documentation bridge for AdCP↔OpenRTB adapters; it is not the creative-supply contract described above. Adapters bridging AdCP to OpenRTB round-trip pos, attr, and plcmt through VAST <Extensions> so the experience, motion class, and placement survive a VAST-wrapped delivery path even though VAST itself has no native fields for them.

VAST versioning

vast_version supports VAST 2.0 through 4.3. VAST 4.3 ships no XSD of its own — IAB’s vast_4.2.xsd remains the authoritative schema for 4.3 documents, so a validator MUST NOT reject a tag declaring version="4.3" for want of a 4.3-specific schema. VAST 4.4 is deliberately absent from the enum: vast_4.4.xsd is still annotated “DRAFT for working group discussion,” not a published specification, and AdCP adds it only once IAB publishes a final schema. The non-interactive NonLinearAds pattern every non-menu experience relies on remains valid under 4.2 serialization — sellers don’t need 4.3 or a future 4.4 to express overlay, squeezeback, in_scene, pause, or screensaver creative. This does not make SIMID serializable under NonLinearAds; SIMID’s <InteractiveCreativeFile> remains Linear-only.

Measurement

Each experience opportunity renders exactly one impression. Remote-control selection, QR-code scans, and every value in activation_methods are engagement events layered on top of that one impression — they are never counted as additional impressions.

See also

  • Canonical formats — the full canonical-format model, validate_input contract, and ProductFormatDeclaration shape
  • Connected TV — SSAI/CSAI delivery models and companion-ad guidance
  • Sponsored Placement adapter contracts — per-adopter catalog-driven runtime contracts for the menu, squeezeback, and in_scene rows that route to sponsored_placement
  • validate_input — manifest preflight against canonicals and products