Repository navigation
Description
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
skipchanges what a § 5.7completion_ratemeans. - 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'sinteractiveandverificationspec keys state per format whatapi[]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_modedropsclient_sideandssai, becauseplacement.ssaistates server-side insertion. - Our channel definitions change request (#90) makes Connected Device (6) a TV device type, so the OM SDK rule's
ctvcovers it.
Open questions for the working group
- 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.
- A
controlling_measurementoption can name acounted_bythat isn'tseller(our settlement change request (#95)). Should the OM SDK rule cover it, or stay limited tomeasurement_sourceonapp_mobileandctv? - Answered by @fgranata on this issue. Should
placementsit on the line item or on each app inproperties? On the line item: a multi-app line item whose apps differ in OM SDK support omits OMID 1.0 (7) or splits. - @unreconciled's
interactiveandverificationformat spec keys on format registry entries for audio, CTV, and DOOH (#5) can disagree withplacement.api[]. Which one governs, or should the spec carry only one of them? - Answered by @fgranata on this issue. AdCOM and OpenDirect 2.1 read an absent
rewardorinstlas0, but here it means either value. How should such a line item map to OpenDirect 2.1Placement.spec: onePlacementper value, or a new way to say "either"? OnePlacementper value. - Answered in our video and audio PR. No field says, in a way a validator can check, whether a
ctvline item sells video. The REQUIRED condition onplcmtdepends on it. Should the condition key on the format ids informats.available[](§ 5.4), or shouldplcmtbe RECOMMENDED onctv? Neither:plcmtis REQUIRED whenchannelisvideo, and its presence states that a line item is video. - A REQUIRED
plcmtcan'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 inplcmtsplits into one line item per value, as @fgranata does when apps disagree. Shouldplcmtstay one value, or becomeplcmt[], likeplaymethod[]?
Would this break an implementation already built to this draft?
Yes — breaking
Alternatives you considered and rejected
- A
placement_typeenum (#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. placementas 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
fgranata commentedon Oct 23, 2026
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
placementon 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/instlmeaning 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 declare7(OMID) and MRAID per placement from the request data we see;refresh.min_interval_swe 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.
KonstantinMirin commentedon Oct 23, 2026
Thank you, @fgranata. With your evidence, two open questions resolve as drafted:
placementsits on the line item. A multi-app line item omits the keys its apps don't share, because an absent key doesn't constrain.rewardorinstlmeans 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.
KonstantinMirin commentedon Oct 25, 2026
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
feedto our audio filing (#101), which defines it. Writing it as spec text added two rules that the issue didn't state:api[]when it supports every listed framework,playmethod[]when its playback method is one of the listed values, andrefreshwhen the slot renders each creative for at leastmin_interval_sseconds before it refreshes, or does not refresh. It matches any other key when its value is equal."playmethod[]andapi[], which take arrays of integers, andrefresh, an object whosemin_interval_sis a REQUIRED integer.plcmt,playmethod[], andapi[]take any code in their AdCOM list.We also corrected the supporting material to match this issue: on
ctv,plcmtis 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:
ctvline item sells video, yet the REQUIRED condition onplcmtdepends on it. Should the condition key on the format ids informats.available[](§ 5.4), which needs registry entries forctv/*(#5), or shouldplcmtbe RECOMMENDED onctv?plcmtcan'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 inplcmtsplits into one line item per value, as @fgranata does when apps disagree. Shouldplcmtstay one value, or becomeplcmt[], likeplaymethod[]?Analyzed and generated with the help of Claude, fully reviewed by me.