
The gap in brand safety

- Property lists control where ads run — which apps, sites, and platforms. Jordan can say “not on this news app” and every seller enforces it.
- Content standards control what content is adjacent to an ad — per-impression evaluation against a natural language policy. They handle nuance like “exclude kids content except G/PG animation.”
Most buyers use one or two layers. A buyer who only needs to exclude specific programs uses a collection list alone. The three-layer model is a composition framework, not a requirement.
Resolving program identifiers

Building the collection list

How filters compose
Include filters are allowlists, exclude filters are blocklists. When both are present for the same dimension, include applies first, then exclude narrows further. Example:genres_include: ["drama", "comedy"] + genres_exclude: ["crime"] first includes only drama and comedy collections, then removes any also tagged as crime. A collection tagged ["drama", "crime"] is excluded — the exclude filter wins.
Sellers match against their inventory

adagents.json, so the match is automatic.
The seller returns the result with each product: for this product, 59 of the list’s 200 resolved entries matched its collection inventory and 141 did not. The product’s list_applications receipt identifies the list snapshot and evaluation time, while its price and forecast reflect the inventory remaining after those 59 matches were excluded. A different product can report different counts from the same list.
The list is cached for a week (collection metadata changes less frequently than property metadata). When the governance agent re-resolves the list — a new season changes a show’s content rating, or Jordan adds programs — sellers receive a webhook and refresh their cache.
Targeting integration
Collection lists are referenced in targeting overlays alongside property lists:
A media buy can reference both simultaneously — “run in these approved shows, but never in these specific programs even if they appear on the approved list.” The exclude list always wins on overlap.
Combining several collection lists (experimental)
Brand-wide and campaign-level lists have different owners and lifecycles, so a package can reference several of them with the plural fieldscollection_lists and collection_lists_exclude (experimental in AdCP 3.3, feature id media_buy.collection_lists):
A package MUST NOT set both
collection_list and collection_lists, or both collection_list_exclude and collection_lists_exclude; the singular fields are unchanged. In a request, set the old field to null when switching to the plural one. Exclude still wins on overlap. If a stored singular field is set, an update that sets the plural field for that direction MUST also null the singular one, otherwise the merged state is rejected with INVALID_REQUEST before any mutation.
A seller that does not list media_buy.collection_lists in experimental_features MUST reject these fields with UNSUPPORTED_FEATURE, and a buyer MUST NOT rely on exclusion being applied unless the seller lists it and the product declares matching overlay_support; an older seller may silently ignore unknown fields. List identity is (agent_url, list_id): JSON Schema uniqueItems compares whole objects, so it cannot catch refs that differ only in auth_token. A seller MUST reject a repeated identity within one array, whatever its auth_token, with INVALID_REQUEST before any mutation, and MUST NOT deduplicate, merge, or pick between the entries. Conformance tooling enforces this from x-adcp-validation.unique_by. A seller declares support per product in overlay_support.collection_lists / collection_lists_exclude as true or { "max_references": N }, and a buyer filters with required_overlay_support. Singular support does not imply plural support. A create or update with more references than max_references MUST be rejected with UNSUPPORTED_FEATURE, identifying the field, and MUST NOT be truncated. A seller that cannot resolve every list MUST NOT apply a subset.
Property and collection lists use the same product-response receipt. Matching is a seller claim about one returned product at one point in time, not a report written back to the governance agent.
Jordan’s three-layer configuration
By the time Jordan is done, Nova Motors’ CTV brand safety is expressed in three machine-readable artifacts:- Property list — excluded apps and approved CTV platforms
- Collection list — excluded programs by distribution identifier + TV-MA and news genre filters
- Content standards — the nuanced kids/animation policy that requires per-episode judgment
Relationship to property lists
Property lists and collection lists are sibling constructs — both are inventory lists managed by governance agents with the same lifecycle pattern (create, get, update, list, delete, webhook). They differ in what they address:Tasks
Collection list management
- create_collection_list: Create a new collection list on a governance agent
- get_collection_list: Retrieve resolved collections (with caching guidance)
- update_collection_list: Modify filters or base collections
- list_collection_lists: List collection lists for an account
- delete_collection_list: Remove a collection list