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`:

| Field | Type | Required | Mutability | Description |
| :--- | :--- | :--- | :--- | :--- |
| `placement` | Placement | REQUIRED when `channel` is `video` or `audio` | seller-set | What every impression of this line item is: rewarded, interstitial, video placement subtype, skippability, playback, API frameworks, refresh, server-side insertion and audio feed. See 5.2.2 |

Add § 5.2.2 after § 5.2.1, `environments`. The PRs also carry its opening
notes, which link AdCOM 1.0 and its code lists, each open to any code.

#### 5.2.2 placement

**`Placement`** keys:

| Key | Type | Required | Meaning | AdCOM 1.0, OpenRTB 2.6 |
| :--- | :--- | :--- | :--- | :--- |
| `reward` | IntegerFlag | OPTIONAL | The user receives a reward for viewing the ad | `Placement.reward`, `imp.rwdd` |
| `instl` | IntegerFlag | OPTIONAL | The ad is interstitial or full screen | `DisplayPlacement.instl`, `imp.instl` |
| `plcmt` | Integer | REQUIRED when `channel` is `video` | A value from List: Plcmt Subtypes - Video, such as Instream (1). Its presence states that the line item is video, so a `ctv` line item that sells video carries it | `VideoPlacement.ptype`, `video.plcmt` |
| `skip` | IntegerFlag | OPTIONAL | Video or audio. The placement lets the user skip the ad | `VideoPlacement.skip`, `AudioPlacement.skip`, `video.skip` |
| `skipafter` | Integer | OPTIONAL | When `skip` is `1`: seconds the ad plays before the placement enables skipping | `VideoPlacement.skipafter`, `AudioPlacement.skipafter`, `video.skipafter` |
| `playmethod[]` | Array[Integer] | OPTIONAL | Video or audio. Values from List: Playback Methods in use, such as Initiates without any specific user interaction with Sound On (1), Initiates without any specific user interaction Sound Off by Default (2), Initiates on Click with Sound On (3) and Continuous Playback (7) | `VideoPlacement.playmethod`, `AudioPlacement.playmethod`, `video.playbackmethod` |
| `api[]` | Array[Integer] | OPTIONAL | Values from List: API Frameworks that every impression supports, such as MRAID 3.0 (6), OMID 1.0 (7) and SIMID 1.1 (9) | `DisplayPlacement.api`, `VideoPlacement.api`, `AudioPlacement.api`, `banner.api`, `video.api`, `audio.api` |
| `refresh` | Refresh | OPTIONAL | How often the slot refreshes | OpenRTB 2.6 only: `imp.refresh.refsettings[].minint` |
| `feed` | Integer | REQUIRED when `channel` is `audio` | A value from List: Feed Types, such as Podcast (3) | `AudioPlacement.feed`, `audio.feed` |
| `ssai` | Integer | OPTIONAL | Whether server-side ad insertion is in use and what it does to asset and tracker retrieval, in the values of AdCOM 1.0 `Placement.ssai`, such as all server-side (3) | `Placement.ssai`, `imp.ssai` |

**`Refresh`** keys:

| Key | Type | Required | Meaning |
| :--- | :--- | :--- | :--- |
| `min_interval_s` | Integer | REQUIRED | Minimum seconds a creative renders before the slot refreshes |

- A key that is present holds for every impression of the line item. An
  absent key does not constrain it: a line item that omits `instl` can
  deliver to interstitial and non-interstitial impressions alike. AdCOM 1.0
  reads an absent `reward` or `instl` as `0`; here it means either value.
- The seller MUST NOT deliver the line item to an impression that does not
  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 OMID 1.0 (7), a line item whose
  `committed_metrics[]` includes `viewable_rate` and whose
  `environments.available[]` includes `app_mobile` or `ctv` SHOULD NOT
  offer a `measurement_source` option whose `measured_by` is not `seller`.

§ 2.1, add to the `LineItemSummary` paths: `placement.reward`,
`placement.instl`, `placement.plcmt`, `placement.skip` and `placement.feed`.

Why

An in-app line item can't 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.

In the public draft, 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 providers run through the Open Measurement SDK, signaled as OMID 1.0 (7) (OpenRTB advisory for OM SDK). The § 6.2 example lets a buyer select IAS or DoubleVerify. Without OM SDK, the selected provider can't measure a committed viewable_rate.
  • Creative. An MRAID creative doesn't render without MRAID; a SIMID creative loses its interactive layer.
  • Refresh. A banner that refreshes every 30 seconds is a different exposure (OpenRTB 2.6 RefSettings).

Our draft PR for this change request (#120) writes the base text. Our video and audio PR aligns it with our audio and channel filings.

Definitions: AdCOM 1.0 List: Plcmt Subtypes - Video, List: Playback Methods, List: API Frameworks, List: Feed Types.

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

Knock-on effects

  • #5: a third answer to @fgranata's either/or. App-open has no AdCOM value, so it stays a format id with instl: 1. @unreconciled's interactive and verification spec keys state per format what api[] states per placement; the two must agree.
  • #32: placement.api[] gives creative review a list to check MRAID and SIMID creatives against. Whether review does so is open in the supporting material.
  • § 5.9 serving_mode drops client_side and ssai, because placement.ssai states server-side insertion.
  • Our channel definitions change request (#90) makes Connected Device (6) a TV device type, so the OM SDK rule's ctv covers it.

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 providers still measure in-app with their own SDKs? It stays SHOULD.
  2. A controlling_measurement option can name a counted_by that isn't seller (our settlement change request (#95)). Should the OM SDK rule cover it, 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 or on each app in properties? On the line item: a multi-app line item whose apps differ in OM SDK support omits OMID 1.0 (7) or splits.
  4. @unreconciled's interactive and verification format spec keys on format registry entries for audio, CTV, and DOOH (#5) can disagree with placement.api[]. 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, but here it means either value. How should such a line item map to OpenDirect 2.1 Placement.spec: one Placement per value, or a new way to say "either"? One Placement per value.
  6. Answered in our video and audio PR. No field says, in a way a validator can check, whether a ctv line item sells video. The REQUIRED condition on plcmt depends on it. Should the condition key on the format ids in formats.available[] (§ 5.4), or should plcmt be RECOMMENDED on ctv? Neither: plcmt is REQUIRED when channel is video, and its presence states that a line item is video.
  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-11-03: Rewritten to match our video and audio PR. placement is REQUIRED for video and audio, and plcmt is REQUIRED when channel is video, which answers question 6. feed and ssai join the table, and questions 1, 3, and 5 state their answers.

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