You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
feat: show selectors on products with creator-as-registry (#1550)
* feat: move shows from response-level to product-level selectors
Shows on products are now `shows: ShowSelector[]` where each selector
references shows declared in an external adagents.json by domain and
show ID. This enables show creators (e.g., MrBeast) to serve as
canonical registries — any seller can reference their shows, giving
buyers stable identity across sellers and platforms.
Breaking changes:
- Product field `show_ids` (string[]) replaced by `shows` (ShowSelector[])
- Top-level `shows` array removed from get_products response
- Buyers resolve show objects from adagents.json instead of the response
New fields:
- `show_targeting_allowed` on products (default false = bundle)
- `enforced_policies` added to fields projection enum
Also fixes ISO duration parsing bug in training agent episode generation.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* chore: add empty changeset for CI
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
| CTV series sponsorship |`shows`, `exclusivity`, `delivery_type: "guaranteed"`|
177
+
| Live event |`shows` (cadence: event), `episodes` (flexible_end, tentative), `exclusivity`|
178
178
| Retail media |`catalog_types`, `catalog_match`, metric optimization |
179
179
180
180
For content-centric inventory, see [Shows and episodes](/docs/media-buy/product-discovery/shows-and-episodes). For exclusivity and sponsorship patterns, see [Media products](/docs/media-buy/product-discovery/media-products#exclusivity).
Copy file name to clipboardExpand all lines: docs/media-buy/product-discovery/index.mdx
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -60,7 +60,7 @@ Products describe sellable inventory along three independent dimensions:
60
60
-**Shows and episodes** — WHAT CONTENT the ad runs in or around (a series, podcast, or live event)
61
61
-**Placements** — WHAT POSITION the ad appears in (pre-roll, mid-roll, host read)
62
62
63
-
Each product also includes audience targeting, creative format requirements, pricing, and delivery characteristics. When products reference shows, the `get_products` response includes a top-level `shows` array with full show metadata (talent, genre, content ratings, distribution identifiers).
63
+
Each product also includes audience targeting, creative format requirements, pricing, and delivery characteristics. When products reference shows, buyers resolve full show metadata (talent, genre, content ratings, distribution identifiers) from the show creator's or publisher's `adagents.json`.
64
64
65
65
Understand the complete product structure in [Media Products](/docs/media-buy/product-discovery/media-products). For show-centric inventory like podcasts, CTV series, and live events, see [Shows and Episodes](/docs/media-buy/product-discovery/shows-and-episodes).
Copy file name to clipboardExpand all lines: docs/media-buy/product-discovery/media-products.mdx
+7-6Lines changed: 7 additions & 6 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -21,7 +21,7 @@ Products declare which pricing models they support. Buyers select a specific pri
21
21
-`channels` (list[string], optional): Advertising channels this product is sold as (e.g., `["retail_media"]`, `["display", "olv"]`). Sellers SHOULD declare `channels` on products that span non-obvious channels, particularly retail media, CTV/OLV, and multi-channel bundles. Product channels SHOULD be a subset of the union of their properties' `supported_channels`. See [Media Channel Taxonomy](/docs/reference/media-channel-taxonomy).
22
22
-`format_ids` (list[FormatID], required): Structured format ID references. See [Creative Formats](/docs/creative/formats).
23
23
-`placements` (list[Placement], optional): Specific ad placements within this product. When provided, buyers can target individual placements when assigning creatives. See [Placements](#placements).
24
-
-`show_ids` (list[string], optional): Show IDs available within this product. When provided, buyers can target specific shows. See [Shows and episodes](/docs/media-buy/product-discovery/shows-and-episodes).
24
+
-`shows` (list[ShowSelector], optional): Shows covered by this product, grouped by publisher. Each entry has `publisher_domain` and `show_ids` referencing shows in the publisher's `adagents.json`. See [Shows and episodes](/docs/media-buy/product-discovery/shows-and-episodes).
25
25
-`episodes` (list[Episode], optional): Specific episodes available within this product. See [Shows and episodes](/docs/media-buy/product-discovery/shows-and-episodes).
26
26
-`delivery_type` (string, required): Either `"guaranteed"` or `"non_guaranteed"`.
27
27
-`exclusivity` (string, optional): Whether this product offers exclusive access. `"none"` (default when absent) — multiple advertisers can buy simultaneously. `"category"` — one advertiser per industry category. `"exclusive"` — sole sponsorship. Most relevant for guaranteed products tied to specific shows or placements.
@@ -32,6 +32,7 @@ Products declare which pricing models they support. Buyers select a specific pri
32
32
-`is_custom` (bool, optional): `true` if the product was generated for a specific brief.
33
33
-`expires_at` (datetime, optional): If `is_custom`, the time the product is no longer valid.
34
34
-`property_targeting_allowed` (bool, optional, default: false): Whether buyers can filter this product to a subset of its `publisher_properties`. When `false` (default), the product is "all or nothing" - buyers must accept all properties or the product is excluded from `property_list` filtering results. See [Property Targeting](#property-targeting).
35
+
-`show_targeting_allowed` (bool, optional, default: false): Whether buyers can target a subset of this product's `shows`. When `false` (default), the product is a bundle — buyers get all listed shows. When `true`, buyers can select specific shows in the media buy.
35
36
-`catalog_types` (list[string], optional): Catalog types this product supports for catalog-driven campaigns. A sponsored product listing declares `["product"]`, a job board declares `["job", "offering"]`. Buyers match synced catalogs to products via this field. See [Catalogs](/docs/creative/catalogs).
36
37
-`catalog_match` (object, optional): When the buyer provides a `catalog` on `get_products`, indicates which catalog items are eligible for this product. Contains `matched_gtins` (cross-retailer GTIN matches), `matched_ids` (generic item ID matches), `matched_count`, and `submitted_count`.
37
38
-`metric_optimization` (object, optional): Metric optimization capabilities for this product. Presence indicates the product supports `optimization_goals` with `kind: "metric"`. See [Metric optimization](#metric-optimization).
@@ -252,7 +253,7 @@ See [Creative Assignment and Placement Targeting](/docs/media-buy/media-buys/ind
252
253
253
254
### Shows and episodes
254
255
255
-
Shows are a third product dimension alongside formats and placements. While placements describe *where* an ad appears and formats describe *what* the ad looks like, shows describe the *content context* — the programming a viewer is watching. Products can declare `show_ids` and `episodes` so buyers can target specific shows or episodes when purchasing inventory.
256
+
Shows are a third product dimension alongside formats and placements. While placements describe *where* an ad appears and formats describe *what* the ad looks like, shows describe the *content context* — the programming a viewer is watching. Products can declare `shows` and `episodes` so buyers can target specific shows or episodes when purchasing inventory.
256
257
257
258
See [Shows and episodes](/docs/media-buy/product-discovery/shows-and-episodes) for the full model, examples, and targeting details.
258
259
@@ -274,11 +275,11 @@ Exclusivity is most relevant for guaranteed products tied to specific shows or p
274
275
-**`category`**: Podcast or CTV sponsorships where competitive separation matters. One auto brand per show, one fintech brand per episode — but multiple non-competing advertisers can buy simultaneously.
275
276
-**`exclusive`**: Sole sponsorship of a single show or event. The advertiser is the only brand associated with the content.
276
277
277
-
Publishers SHOULD include `exclusivity` on guaranteed products with `show_ids`. The implicit default of `"none"` is ambiguous for show-level inventory — buyers cannot tell whether the publisher intends shared inventory or simply omitted the field.
278
+
Publishers SHOULD include `exclusivity` on guaranteed products with `shows`. The implicit default of `"none"` is ambiguous for show-level inventory — buyers cannot tell whether the publisher intends shared inventory or simply omitted the field.
278
279
279
280
#### Content sponsorship pattern
280
281
281
-
A product combining `delivery_type: "guaranteed"`, `exclusivity: "exclusive"`, and `show_ids` represents a content sponsorship — the advertiser becomes the sole sponsor of specific content. This is the standard pattern for podcast title sponsorships, CTV show sponsorships, and event-based takeovers.
282
+
A product combining `delivery_type: "guaranteed"`, `exclusivity: "exclusive"`, and `shows` represents a content sponsorship — the advertiser becomes the sole sponsor of specific content. This is the standard pattern for podcast title sponsorships, CTV show sponsorships, and event-based takeovers.
282
283
283
284
```json
284
285
{
@@ -292,7 +293,7 @@ A product combining `delivery_type: "guaranteed"`, `exclusivity: "exclusive"`, a
0 commit comments