From 49ad2e29af93db6e0fefd91db53bbda0b30281b1 Mon Sep 17 00:00:00 2001 From: "Constantine.mirin" Date: Sat, 24 Oct 2026 23:23:06 -0400 Subject: [PATCH 1/2] Define channel and environments in AdCOM terms --- examples/line-item-audio.yaml | 3 +- spec/CHANGELOG.md | 7 +++++ spec/openproposal-3.0.md | 56 +++++++++++++++++++++++++++++++---- 3 files changed, 60 insertions(+), 6 deletions(-) diff --git a/examples/line-item-audio.yaml b/examples/line-item-audio.yaml index 4ca2f21..cae02f2 100644 --- a/examples/line-item-audio.yaml +++ b/examples/line-item-audio.yaml @@ -2,7 +2,8 @@ line_item_id: "streaming-audio" status: published channel: audio -environments: { available: ["audio_streaming"], included: ["audio_streaming"] } +environments: { available: ["web_mobile", "app_mobile"], + included: ["web_mobile", "app_mobile"] } formats: { available: ["audio/host-read-30s", "audio/produced-30s"], included: ["audio/produced-30s"], pricing: { "audio/host-read-30s": { delta_cpm: 9.00 } } } diff --git a/spec/CHANGELOG.md b/spec/CHANGELOG.md index 1dfacef..c15b084 100644 --- a/spec/CHANGELOG.md +++ b/spec/CHANGELOG.md @@ -5,6 +5,13 @@ issue that caused it, so the comment record and the spec history line up. ## [Unreleased] +- § 2.1, § 5.1, § 5.2 — `channel` and `environments` are defined in AdCOM 1.0 + terms. Each impression has one `channel`, the first match in § 5.1.1, and + each environment is a set of distribution channels and device types. + `audio_streaming` is removed, and the Summary Representation carries + `environments.available[]` + ([#90](https://github.com/IABTechLab/OpenProposal/issues/90)). + ## [3.0-draft-1] — 2026-09-22 Initial draft published for public comment. Ported from the working-group diff --git a/spec/openproposal-3.0.md b/spec/openproposal-3.0.md index 6940958..5cf875e 100644 --- a/spec/openproposal-3.0.md +++ b/spec/openproposal-3.0.md @@ -76,9 +76,9 @@ Every line item has two representations. sellers' shelves. A catalog response MAY return it. It MUST contain, per line item: -`line_item_id` · `channel` · `content_detail` · property names · -`formats.included[]` · `pricing.cost_method` · `pricing.gross_rate` · -`min_spend` · `addressable_scale` · `committed_metrics[]` · +`line_item_id` · `channel` · `environments.available[]` · `content_detail` · +property names · `formats.included[]` · `pricing.cost_method` · +`pricing.gross_rate` · `min_spend` · `addressable_scale` · `committed_metrics[]` · `transaction_mechanism` plus, from the parent proposal: `proposal_id` · `seller_name` · `description` · @@ -216,7 +216,37 @@ channel. | :--- | :--- | :--- | :--- | | `line_item_id` | String | immutable | Identity within the proposal | | `status` | Enum | derived | `draft` \| `published` \| `under_review` \| `agreed` \| `withdrawn` \| `sold_out` \| `expired`. Independent of the proposal's status, so one line item may sell out while the rest of the shelf stays live | -| `channel` | Enum | immutable | `display` \| `video` \| `audio` \| `ctv` \| `dooh` \| `native`. The discriminator for how the rest of the line item is read | +| `channel` | Enum | immutable | `display` \| `video` \| `audio` \| `ctv` \| `dooh` \| `native`, each defined in 5.1.1. The discriminator for how the rest of the line item is read | + +#### 5.1.1 channel + +An impression's channel is the first row of this table that the impression +matches. Conditions are stated in +[AdCOM 1.0](https://github.com/InteractiveAdvertisingBureau/AdCOM/blob/26c59ba1b235cd8d938c9877409e506f1b8d3f0c/AdCOM%20v1.0%20FINAL.md) +terms: the +[distribution channel](https://github.com/InteractiveAdvertisingBureau/AdCOM/blob/26c59ba1b235cd8d938c9877409e506f1b8d3f0c/AdCOM%20v1.0%20FINAL.md#abstract_distributionchannel), +the ad's media +([`Placement`](https://github.com/InteractiveAdvertisingBureau/AdCOM/blob/26c59ba1b235cd8d938c9877409e506f1b8d3f0c/AdCOM%20v1.0%20FINAL.md#object_placement) +subtypes), and the +[device type](https://github.com/InteractiveAdvertisingBureau/AdCOM/blob/26c59ba1b235cd8d938c9877409e506f1b8d3f0c/AdCOM%20v1.0%20FINAL.md#list_devicetypes). + +| `channel` | Condition | +| :--- | :--- | +| `dooh` | Distribution channel `Dooh` | +| `audio` | Audio ad (`AudioPlacement`) | +| `ctv` | Device type Connected TV (3), Connected Device (6) or Set Top Box (7) | +| `native` | Native ad (`DisplayPlacement.nativefmt`), including native ads with video assets | +| `video` | Video ad (`VideoPlacement`) | +| `display` | Any other display ad (`DisplayPlacement`) | + +Device types are values of AdCOM 1.0 List: Device Types, each written as its +name followed by its code. + +- A line item MUST serve only impressions of its `channel`. Placement type, + such as interstitial or rewarded, does not change the channel. +- A consumer MUST skip a line item whose `channel` it does not recognise, and + MUST NOT reject the proposal because of it. +- Linear TV, including addressable linear, has no `channel` value in 3.0. ### 5.2 Inventory composition @@ -224,7 +254,23 @@ channel. | :--- | :--- | :--- | :--- | | `properties` | Object | selectable | `available[]` of `{ id, name, domains, supported_formats }`, `included[]`, `pricing`, `max_select` | | `content_detail` | Object | seller-set | Shows, series, sections, network verticals | -| `environments` | Object | selectable | `available[]` from `web_desktop` \| `web_mobile` \| `app_mobile` \| `ctv` \| `dooh` \| `audio_streaming` | +| `environments` | Object | selectable | `available[]` from `web_desktop` \| `web_mobile` \| `app_mobile` \| `ctv` \| `dooh`, each defined in 5.2.1 | + +#### 5.2.1 environments + +Each environment value is a set of distribution channels and device types, in +AdCOM 1.0 terms. Device types are as in 5.1.1. + +| Value | Distribution channel | Device types | +| :--- | :--- | :--- | +| `web_desktop` | `Site` | Personal Computer (2) | +| `web_mobile` | `Site` | Mobile/Tablet - General (1), Phone (4), Tablet (5) | +| `app_mobile` | `App` | Mobile/Tablet - General (1), Phone (4), Tablet (5) | +| `ctv` | `Site` or `App` | Connected TV (3), Connected Device (6), Set Top Box (7) | +| `dooh` | `Dooh` | Any | + +Each `environments.available[]` value MUST match an impression that the line +item's `channel` admits (5.1.1). ### 5.3 Audience reach From 0125d5549c4cc1790bd3ab847e8d5826b66de82d Mon Sep 17 00:00:00 2001 From: "Constantine.mirin" Date: Sun, 25 Oct 2026 00:20:18 -0400 Subject: [PATCH 2/2] Clarify channel and environment matching rules Read the media condition from the ad served when an impression accepts several media, name the seller as the party that serves, place linear TV outside the table, and state environments as (distribution channel, device type) pairs. Insert environments.available[] into the summary list without rewrapping it, shorten the changelog entry and drop audio_streaming from OQ-7 in docs/open-questions.md. Refs #90 --- docs/open-questions.md | 4 ++-- spec/CHANGELOG.md | 9 ++++----- spec/openproposal-3.0.md | 30 +++++++++++++++++++----------- 3 files changed, 25 insertions(+), 18 deletions(-) diff --git a/docs/open-questions.md b/docs/open-questions.md index d8d32ba..2adbdf2 100644 --- a/docs/open-questions.md +++ b/docs/open-questions.md @@ -96,8 +96,8 @@ property). **Issue:** [#8](https://github.com/IABTechLab/OpenProposal/issues/8) · **Spec:** § 5.2 -The enum — `web_desktop`, `web_mobile`, `app_mobile`, `ctv`, `dooh`, -`audio_streaming` — is proposed, not derived from implementation experience. +The enum — `web_desktop`, `web_mobile`, `app_mobile`, `ctv`, `dooh`, each +defined in § 5.2.1 — is proposed, not derived from implementation experience. **What would settle it:** sellers mapping their real inventory onto the enum and reporting what does not fit. diff --git a/spec/CHANGELOG.md b/spec/CHANGELOG.md index c15b084..8fb94fa 100644 --- a/spec/CHANGELOG.md +++ b/spec/CHANGELOG.md @@ -5,11 +5,10 @@ issue that caused it, so the comment record and the spec history line up. ## [Unreleased] -- § 2.1, § 5.1, § 5.2 — `channel` and `environments` are defined in AdCOM 1.0 - terms. Each impression has one `channel`, the first match in § 5.1.1, and - each environment is a set of distribution channels and device types. - `audio_streaming` is removed, and the Summary Representation carries - `environments.available[]` +- § 2.1, § 5.1, § 5.2 — `channel` and `environments` defined in AdCOM 1.0 + terms, with a first-match channel table, a skip rule for unknown channels + and a channel and environment consistency rule. `audio_streaming` removed; + the summary carries `environments.available[]` ([#90](https://github.com/IABTechLab/OpenProposal/issues/90)). ## [3.0-draft-1] — 2026-09-22 diff --git a/spec/openproposal-3.0.md b/spec/openproposal-3.0.md index 5cf875e..987d945 100644 --- a/spec/openproposal-3.0.md +++ b/spec/openproposal-3.0.md @@ -76,9 +76,10 @@ Every line item has two representations. sellers' shelves. A catalog response MAY return it. It MUST contain, per line item: -`line_item_id` · `channel` · `environments.available[]` · `content_detail` · -property names · `formats.included[]` · `pricing.cost_method` · -`pricing.gross_rate` · `min_spend` · `addressable_scale` · `committed_metrics[]` · +`line_item_id` · `channel` · `environments.available[]` · +`content_detail` · property names · +`formats.included[]` · `pricing.cost_method` · `pricing.gross_rate` · +`min_spend` · `addressable_scale` · `committed_metrics[]` · `transaction_mechanism` plus, from the parent proposal: `proposal_id` · `seller_name` · `description` · @@ -227,8 +228,10 @@ terms: the [distribution channel](https://github.com/InteractiveAdvertisingBureau/AdCOM/blob/26c59ba1b235cd8d938c9877409e506f1b8d3f0c/AdCOM%20v1.0%20FINAL.md#abstract_distributionchannel), the ad's media ([`Placement`](https://github.com/InteractiveAdvertisingBureau/AdCOM/blob/26c59ba1b235cd8d938c9877409e506f1b8d3f0c/AdCOM%20v1.0%20FINAL.md#object_placement) -subtypes), and the +subtypes) and the [device type](https://github.com/InteractiveAdvertisingBureau/AdCOM/blob/26c59ba1b235cd8d938c9877409e506f1b8d3f0c/AdCOM%20v1.0%20FINAL.md#list_devicetypes). +Where an impression accepts more than one medium, its media is that of the ad +served. | `channel` | Condition | | :--- | :--- | @@ -242,11 +245,14 @@ subtypes), and the Device types are values of AdCOM 1.0 List: Device Types, each written as its name followed by its code. -- A line item MUST serve only impressions of its `channel`. Placement type, - such as interstitial or rewarded, does not change the channel. +- The seller MUST serve a line item only on impressions of its `channel`. + Placement type, such as interstitial or rewarded + ([OpenRTB 2.6](https://github.com/InteractiveAdvertisingBureau/openrtb2.x/blob/1debba8001f40eb14597102dec3205afddf811d4/2.6.md#objectimp) + `video.plcmt`, `imp.instl` and `imp.rwdd`), does not change the channel. - A consumer MUST skip a line item whose `channel` it does not recognise, and MUST NOT reject the proposal because of it. -- Linear TV, including addressable linear, has no `channel` value in 3.0. +- Impressions in linear TV, including addressable linear, are outside this + table: they have no `channel` value in 3.0. ### 5.2 Inventory composition @@ -258,8 +264,10 @@ name followed by its code. #### 5.2.1 environments -Each environment value is a set of distribution channels and device types, in -AdCOM 1.0 terms. Device types are as in 5.1.1. +Each environment value is the set of (distribution channel, device type) pairs +formed from its row, in AdCOM 1.0 terms. An impression matches the value when +both its distribution channel and its device type are in the row. Device types +are as in 5.1.1. | Value | Distribution channel | Device types | | :--- | :--- | :--- | @@ -269,8 +277,8 @@ AdCOM 1.0 terms. Device types are as in 5.1.1. | `ctv` | `Site` or `App` | Connected TV (3), Connected Device (6), Set Top Box (7) | | `dooh` | `Dooh` | Any | -Each `environments.available[]` value MUST match an impression that the line -item's `channel` admits (5.1.1). +Each `environments.available[]` value MUST match at least one impression to +which 5.1.1 gives the line item's `channel`. ### 5.3 Audience reach