Skip to content

[Change] § 5.2 — Say what each impression is: rewarded, interstitial, video placement, skippability, API frameworks, refresh #89

Open

Description

@KonstantinMirin

What kind of change?

Add a new field

Which section?

5.2 — Inventory composition

Current text

| `environments` | Object | selectable | `available[]` from `web_desktop` \| `web_mobile` \| `app_mobile` \| `ctv` \| `dooh` \| `audio_streaming` |

Proposed text

§ 5.2, add a row after `environments`:

| `placement` | Object | seller-set | What every impression of this line item is. Keys follow AdCOM 1.0 and OpenRTB 2.6. `plcmt` is REQUIRED for video ads (`channel` `video`, or `ctv` video). See the placement subsection |

#### placement

| Key | Required | Meaning | AdCOM 1.0, OpenRTB 2.6 |
| :--- | :--- | :--- | :--- |
| `reward` | OPTIONAL | `0` (no) \| `1` (yes). The user receives a reward for viewing the ad | `Placement.reward`, `imp.rwdd` |
| `instl` | OPTIONAL | `0` (no) \| `1` (yes). Interstitial or full screen | `DisplayPlacement.instl`, `imp.instl` |
| `plcmt` | REQUIRED for video ads (`channel` `video`, or `ctv` video); otherwise OPTIONAL | One value from List: Plcmt Subtypes - Video: 1 instream, 2 accompanying content, 3 interstitial, 4 no content (standalone), 5 pause, 6 screensaver, 7 overlay, 8 squeezeback, 9 in-scene | `VideoPlacement.ptype`, `video.plcmt` |
| `skip` | OPTIONAL | Video or audio. `0` (no) \| `1` (yes). The placement lets the user skip the ad | `VideoPlacement.skip`, `AudioPlacement.skip`, `video.skip` |
| `skipafter` | OPTIONAL | When `skip` is `1`: seconds the ad plays before the placement enables skipping | `VideoPlacement.skipafter`, `AudioPlacement.skipafter`, `video.skipafter` |
| `playmethod[]` | OPTIONAL | Video or audio. Values from List: Playback Methods in use, such as `1` (starts without user action, sound on), `2` (same, sound off by default), `3` (on click, sound on), `7` (continuous playback) | `VideoPlacement.playmethod`, `AudioPlacement.playmethod`, `video.playbackmethod` |
| `api[]` | OPTIONAL | Values from List: API Frameworks that every impression supports, such as `6` (MRAID 3.0), `7` (OMID 1.0), `9` (SIMID 1.1) | `DisplayPlacement.api`, `VideoPlacement.api`, `AudioPlacement.api`, `banner.api`, `video.api`, `audio.api` |
| `refresh` | OPTIONAL | `{ min_interval_s }`: minimum seconds a creative renders before the slot refreshes | OpenRTB 2.6 only: `imp.refresh.refsettings[].minint` |

Each key takes an integer, except `playmethod[]` and `api[]`, which take
arrays of integers, and `refresh`, an object whose `min_interval_s` is a
REQUIRED integer. `plcmt`, `playmethod[]`, and `api[]` take any code in
their AdCOM list.

A key that is present holds for every impression of the line item. An
absent key doesn't constrain it: a line item that omits `instl` may deliver
to banner and interstitial impressions alike. AdCOM 1.0 reads an absent
`reward` or `instl` as `0`; here it means either value. OpenRTB 2.6 `Audio`
has no `skip`, `skipafter`, or `playbackmethod`.

The seller MUST NOT deliver the line item to an impression that doesn't
match a key that is present. An impression matches `api[]` when it supports
every listed framework, `playmethod[]` when its playback method is one of
the listed values, and `refresh` when the slot renders each creative for at
least `min_interval_s` seconds before it refreshes, or does not refresh. It
matches any other key when its value is equal.

Unless `api[]` includes `7` (OMID 1.0), a line item whose
`committed_metrics[]` includes `viewable_rate` and whose
`environments.available[]` includes `app_mobile` or `ctv` SHOULD NOT offer
a `measurement_source` vendor other than the seller.

§ 2.1, add to the per-line-item summary, when present:
`placement.reward`, `placement.instl`, `placement.plcmt`, and
`placement.skip`.

Why

An in-app line item has no field to say whether its impressions are rewarded, interstitial, in-stream, or skippable, or whether third-party measurement and rich media can run. We ask for a placement object in AdCOM 1.0 Placement terms. Omitted keys stay open, so run-of-app lines can mix banners and interstitials.

Today, channel: video on app_mobile covers rewarded, interstitial, and out-stream video. A buyer commits to one, the seller delivers another, and both stay conformant.

  • Price. On #5, @fgranata notes that "rewarded and interstitial of the same duration clear at very different rates".
  • Viewer controls. Skippable ads complete less often, so skip changes what a § 5.7 completion_rate means.
  • Measurement. In apps, verification vendors run through the Open Measurement SDK, signaled as API framework 7 (OpenRTB advisory for OM SDK). The § 6.2 example lets a buyer select IAS or DoubleVerify. Without OM SDK, a committed viewable_rate may not settle.
  • Creative. An MRAID creative doesn't render without MRAID; a SIMID creative loses its interactive layer.
  • Refresh. A banner refreshing every 30 seconds is different exposure (OpenRTB 2.6 RefSettings).

Every key exists in OpenRTB 2.6 (Imp, Banner, Video), which PMP deals target. All but refresh exist in AdCOM Placement, which OpenDirect 2.1 AdUnit and Placement carry for direct and PG lines (§ 1.1).

Definitions: AdCOM 1.0 DisplayPlacement, VideoPlacement, AudioPlacement, List: Plcmt Subtypes - Video, List: Playback Methods, List: API Frameworks.

Details and examples: Placement in AdCOM terms: full rationale and examples

Knock-on effects

Open questions for the working group

  1. Answered by @fgranata on this issue. Should the OM SDK rule be MUST, or stay SHOULD because some verification vendors still measure in-app with their own SDKs?
  2. Should the OM SDK rule also cover a non-seller counter in controlling_measurement (our settlement change request), or stay limited to measurement_source on app_mobile and ctv?
  3. Answered by @fgranata on this issue. Should placement sit on the line item, so a multi-app line item whose apps differ in OM SDK support omits 7 or splits, or on each app in properties?
  4. When @unreconciled's interactive and verification format spec keys on format registry entries for audio, CTV, and DOOH (#5) and placement.api[] disagree, which one governs, or should the spec carry only one of them?
  5. Answered by @fgranata on this issue. AdCOM and OpenDirect 2.1 read an absent reward or instl as 0, so how should a line item that omits them, meaning either value, map to OpenDirect 2.1 Placement.spec: one Placement per value, or a new way to say "either"?
  6. No field says, in a way a validator can check, whether a ctv line item sells video, yet the REQUIRED condition on plcmt depends on it. Should the condition key on the format ids in formats.available[] (§ 5.4), which needs registry entries for ctv/* (#5), or should plcmt be RECOMMENDED on ctv?
  7. A REQUIRED plcmt can't be omitted, so the answer to question 3 (omit the keys that apps don't share) doesn't cover it. A video line item whose impressions differ in plcmt splits into one line item per value, as @fgranata does when apps disagree. Should plcmt stay one value, or become plcmt[], like playmethod[]?

Would this break an implementation already built to this draft?

Yes — breaking

Alternatives you considered and rejected

  • A placement_type enum (#5): duplicates AdCOM, and a rewarded interstitial is two values.
  • Placement in the format id (app/rewarded-video-30s, #5): ids multiply by duration and placement, and an id can't say OMID.
  • placement as selectable with deltas: an option carries only a price delta, but completion commitments differ too.

You are commenting as

Other — IAB Tech Lab member (Postindustria).

Before you submit

  • I have read CONTRIBUTING.md and agree my contribution may be published under this repository's licence.
  • This contains no confidential or commercially sensitive information.

Revised 2026-10-25: @fgranata's answers and our reply answer questions 1, 3, and 5 (SHOULD, on the line item, absent means either), and our device-type revision on #90 puts Connected Device (6) in ctv, so question 2 drops connected_device. The draft PR adds what a match is and the value types, leaves feed to #101 and the #32 review check open, and adds questions 6 and 7.

Analyzed and generated with the help of Claude, fully reviewed by me.

Activity

  1. added
    change-requestProposes specific normative wording
    normativeChanges what the spec requires
    breakingWould break an implementation already built to this draft
    on Oct 23, 2026
  2. fgranata commented on Oct 23, 2026

    @fgranata

    This answers the point I raised on #5, and the keys map onto what we hold per placement today: reward, interstitial, video placement subtype, skippability. Two numbers for why it matters: measured across our catalogue, the 25th-percentile clearing price spans $0.05 (native) to $8.35 (video) by placement type, and rewarded and interstitial of the same duration clear at very different rates. A line item that cannot say which of those it is cannot be priced or committed on.

    Q3 (line item vs. per app). On the line item, with a split when apps disagree. Our line items are one app × one placement type already, so placement on the line is exact for us; a multi-app package would omit the keys its apps do not share, which the "absent key does not constrain" rule handles.

    Q5 (absent reward / instl meaning either). We need "either" for run-of-app lines. Mapping to one downstream placement per value is what we would do; a new "either" marker is not needed.

    api[]. We can declare 7 (OMID) and MRAID per placement from the request data we see; refresh.min_interval_s we can declare for banners. Making the OM SDK rule a SHOULD is right for now, since some vendors still measure in-app with their own SDKs.

    Commenting as an in-app / CTV supply-side exchange.

  3. KonstantinMirin commented on Oct 23, 2026

    @KonstantinMirin
    Author

    Thank you, @fgranata. With your evidence, two open questions resolve as drafted:

    • Question 3: placement sits on the line item. A multi-app line item omits the keys its apps don't share, because an absent key doesn't constrain.
    • Question 5: an absent reward or instl means either, which covers run-of-app lines without a new marker.

    The OM SDK rule stays a SHOULD.

    Analyzed and generated with the help of Claude, fully reviewed by me.

  4. KonstantinMirin commented on Oct 25, 2026

    @KonstantinMirin
    Author

    Draft PR: § 2.1, § 5.2 — Placement: what each impression is. It applies this change request with @fgranata's answers to questions 3 and 5, and leaves feed to our audio filing (#101), which defines it. Writing it as spec text added two rules that the issue didn't state:

    • What a match is. The delivery rule needs one to be checkable: "An impression matches api[] when it supports every listed framework, playmethod[] when its playback method is one of the listed values, and refresh when the slot renders each creative for at least min_interval_s seconds before it refreshes, or does not refresh. It matches any other key when its value is equal."
    • Value types. Each key takes an integer, except playmethod[] and api[], which take arrays of integers, and refresh, an object whose min_interval_s is a REQUIRED integer. plcmt, playmethod[], and api[] take any code in their AdCOM list.

    We also corrected the supporting material to match this issue: on ctv, plcmt is REQUIRED for video and OPTIONAL otherwise. Question 1 below asks how to check that condition.

    The PR's list for the working group keeps the open questions from this issue and the supporting material, and adds two:

    1. No field says, in a way a validator can check, whether a ctv line item sells video, yet the REQUIRED condition on plcmt depends on it. Should the condition key on the format ids in formats.available[] (§ 5.4), which needs registry entries for ctv/* (#5), or should plcmt be RECOMMENDED on ctv?
    2. A REQUIRED plcmt can't be omitted, so the answer to question 3 (omit the keys that apps don't share) doesn't cover it. A video line item whose impressions differ in plcmt splits into one line item per value, as @fgranata does when apps disagree. Should plcmt stay one value, or become plcmt[], like playmethod[]?

    Analyzed and generated with the help of Claude, fully reviewed by me.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    breakingWould break an implementation already built to this draftchange-requestProposes specific normative wordingnormativeChanges what the spec requiressection:5.2-inventory

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions