Background
Every major ad server (GAM, Kevel, Xandr, Triton, FreeWheel) supports five targeting dimensions that AdCP TargetingOverlay does not yet expose. Adopters carry these as local extensions on their internal targeting class, which means spec-conformant buyer agents cannot use them — defeating the point of having them.
device_type/device_type_exclude already landed as the precedent. This RFC bundles five sibling dimensions into one proposal modeled on it.
Proposed additions to TargetingOverlay
| Field |
Shape |
Notes |
os / os_exclude |
list[str] |
OS name (iOS, Android, Windows, …). Distinct from existing device_platform. |
browser / browser_exclude |
list[str] |
Chrome, Safari, Firefox, … |
media_type / media_type_exclude |
list[str] |
Display, video, audio, native, DOOH. (Distinct from format-level constraints.) |
custom |
dict[str, list[str]] |
Free-form publisher-specific key-value targeting. Required for GAM customTargeting parity. |
key_value_pairs |
dict[str, str] |
Managed-only injection (similar in shape to AXE-style segment annotations). Spec already defines 'key_value' as an ActivationKey.type literal in signals — concept is recognized. |
Use case (real)
salesagent (Prebid AdCP reference implementation) carries all five locally. Filed as part of stale-annotation cleanup PR bokelley/salesagent#208 — the migration path is to use ext.salesagent.<field> until this lands, then move to spec.
Open questions
custom shape — flat dict vs. nested? The dict-of-list shape covers the common "key in (a, b, c)" predicate; richer expressions could go through a future signals path.
key_value_pairs access control — should it be marked managed-only on TargetingOverlay (e.g., overlay vs. server-only) or always-overlay?
- Naming — happy to align with whatever bikeshed shape lands.
Filing as RFC. Happy to iterate.
Background
Every major ad server (GAM, Kevel, Xandr, Triton, FreeWheel) supports five targeting dimensions that AdCP
TargetingOverlaydoes not yet expose. Adopters carry these as local extensions on their internal targeting class, which means spec-conformant buyer agents cannot use them — defeating the point of having them.device_type/device_type_excludealready landed as the precedent. This RFC bundles five sibling dimensions into one proposal modeled on it.Proposed additions to
TargetingOverlayos/os_excludelist[str]device_platform.browser/browser_excludelist[str]media_type/media_type_excludelist[str]customdict[str, list[str]]customTargetingparity.key_value_pairsdict[str, str]'key_value'as anActivationKey.typeliteral in signals — concept is recognized.Use case (real)
salesagent (Prebid AdCP reference implementation) carries all five locally. Filed as part of stale-annotation cleanup PR bokelley/salesagent#208 — the migration path is to use
ext.salesagent.<field>until this lands, then move to spec.Open questions
customshape — flat dict vs. nested? The dict-of-list shape covers the common "key in (a, b, c)" predicate; richer expressions could go through a future signals path.key_value_pairsaccess control — should it be marked managed-only onTargetingOverlay(e.g., overlay vs. server-only) or always-overlay?Filing as RFC. Happy to iterate.