Core principle: semantic intent in briefs, exact constraints in overlays
Use campaign briefs for audience meaning, strategy, and seller-led discovery. Instead of configuring every platform-specific targeting parameter, buyers describe those preferences in plain language:targeting_overlay whenever a requirement has a structured representation and must survive booking and readback. This avoids transmitting the same fact as extra prose and avoids asking the seller to spend tokens inferring a value that code can read deterministically. In particular, numeric demographic predicates such as ages 25–40 and exact country constraints belong in the overlay; prose such as “millennial parents interested in sustainable products” remains in the brief.
An explicit hard requirement does not become optional merely because the buyer put it in prose. Sellers MUST apply unambiguous hard targeting stated only in the brief. When a seller’s structured interpretation of hard prose materially affects product eligibility, pricing, or forecasting, it MUST return that interpretation once at the discovery response’s targeting_resolution.brief_targeting; otherwise confirmation remains a best practice. This lets the buyer verify what will actually be applied without repeating the same interpretation on every product. Unchanged values already supplied in targeting_overlay are not repeated.
INVALID_REQUEST; they do not silently choose one interpretation or turn the conflict into an empty result.
When the buyer wants package-level control over specific selectable signals that the seller offers, use targeting_overlay.signal_targeting_groups on the package. Buy-time eligibility comes from the selected product’s signal targeting contract: signal_targeting_allowed, inline Product.signal_targeting_options when present, the seller’s get_signals feed for wholesale products that omit inline options, and signal_targeting_rules. Signals are named targetable dimensions, referenced with signal_ref: scope: "product" for product-local signal options, scope: "data_provider" with data_provider_domain for signals defined in a data provider’s published adagents.json signals[], or scope: "signal_source" with signal_source_url for source-native signals that are not published in adagents.json signals[]. signal_ref.scope is the buy-time resolution path, not provenance, and authoritative enrichment lives on the seller, data provider, or source signal definition. Do not overload audience_include or audience_exclude for this purpose; those fields are only for first-party audiences registered through sync_audiences.
Products can also expose included_signals for signals already bundled into or planned into the product. Those signals are descriptive product metadata, not package-level targeting controls, and buyers do not echo them in signal_targeting_groups.
Browser-family targeting
Usetargeting_overlay.browser and targeting_overlay.browser_exclude for portable browser-family constraints. The fields intentionally stop at families: browser versions, user-agent strings, backend segment IDs, and arbitrary ad-server key/value expressions are not part of the contract.
browser use OR semantics, and browser_exclude wins on overlap, so this example delivers on Chrome or Samsung Internet but not Safari. When browser is present, omitted families are not eligible. The canonical families are chrome, safari, firefox, edge, opera, samsung_internet, android_webview, other, and unknown.
other means the seller recognizes the browser family but it is not one of the explicitly named families. For example, a FreeWheel connector can map recognized values such as Amazon Silk, Android Browser, or Internet Explorer to other. unknown means the seller cannot classify the browser into a recognized family. Include either value explicitly when that traffic should be eligible; omitting it from an inclusion list excludes it. Samsung Internet remains distinct from Chrome even though both are Chromium-based. android_webview means the impression itself is reliably classified as rendering in Android WebView; a native-app placement or an in-app browser opened after a click is not automatically Android WebView.
Browser family describes the impression delivery and rendering environment, not the post-click landing-page browser. Sellers must not infer it solely from operating system, device, “Web” or “Mobile Web” inventory, or placement. Sellers advertising browser support map these portable values to their platform controls internally. A social or app-only product with only device, OS, or placement controls omits overlay_support.browser and overlay_support.browser_exclude rather than approximating browser support.
Browser and device constraints intersect. For example, browser: ["safari"] with device_platform: ["android"] may have no executable inventory. During discovery, the seller excludes an incompatible product or returns a configured product with a sparse, buyer-visible targeting_resolution.modifications alternative. At create or update, it rejects an exact combination it cannot enforce rather than silently broadening delivery.
Inclusion and exclusion are independent product capabilities. Use concrete values in targeting_overlay when pricing and forecasts must reflect them now, and use required_overlay_support.browser or required_overlay_support.browser_exclude when package values will be supplied later. Requirement true asks for any positive support; { "families": ["chrome", "firefox"] } requires both named families. A product advertises unrestricted support as true, or partial support as { "families": [...] }. Products such as CTV, audio, DOOH, or app inventory can omit browser support entirely.
Portable demographic targeting
Usetargeting_overlay.demographics when the buyer needs a demographic predicate to survive product discovery, purchase, seller compilation, and readback without being reinterpreted from prose. AdCP 3.2 standardizes age first:
min and max are inclusive integer ages in completed years. Either may be omitted for an open bound, but at least one is required. Before using an open bound, check the product’s supports_unbounded_min or supports_unbounded_max flag; a seller that declares false rejects that direction rather than substituting its supported-age limit. include_unknown is always required and has no default: people whose age is unavailable are not silently included in a numeric interval. Sellers also reject a range whose min is greater than its max.
This field is audience selection, not eligibility policy. Continue to use age_restriction for a legal minimum age and verification requirements such as alcohol or gambling controls.
When both fields are present, they compose as an intersection; neither overrides the other. demographics selects the intended audience, then age_restriction applies the eligibility and verification floor. Unknown-age delivery cannot satisfy a minimum-age restriction, so the combined shape requires include_unknown: false. Sellers also reject an empty intersection, such as demographic ages 18–20 with age_restriction.min: 21. Package readback preserves both controls independently rather than folding the legal restriction into the applied demographic predicate.
Product-scoped execution
The seller-wideget_adcp_capabilities.media_buy.execution.targeting.demographics.supported flag is only a discovery rollup. Exact support lives on each product because one seller can route products through different ad servers.
A product that accepts arbitrary bounds declares continuous_bounds:
18–24 ∪ 25–34 ∪ 35–44 broadens the request, while 25–34 narrows it. A direct create or update rejects that request. During get_products, however, the seller may return a request-scoped configured product whose sparse targeting_resolution.modifications replaces the requested interval with 25–34. Selecting that product accepts the disclosed alternative; the resulting package still stores only an equivalent executable predicate.
unknown_handling is one of:
selectable: bothinclude_unknown: trueandfalseare supported.always_excluded: onlyinclude_unknown: falseis supported.always_included: onlyinclude_unknown: trueis supported.
supported_bases declares how the product can determine age for an individual impression. Sellers publish only bases whose provenance they can preserve and audit; an opaque platform age bucket does not justify guessing a basis. When omitted, the product makes no basis-aware targeting commitment and rejects buyer requests that specify accepted_bases.
Acceptable age determination
Buyers place determination constraints directly on the requested age range:verified: an applicable age claim was established through an accepted age-assurance method.declared: the user supplied an age, date of birth, or threshold affirmation.inferred: the user’s age was predicted from behavior, attributes, or a model.
population_estimate is deliberately invalid in targeting. Knowing that 80% of a product audience is 25–34 cannot establish whether the current user is 25–34.
accepted_bases constrains provenance; it does not weaken the age predicate. The underlying claim must establish the entire requested interval. A declaration that a user is over 16 cannot establish ages 25–34, and a threshold-only World ID age_over_18 claim cannot establish the upper bound of 34. Sellers reject these requests rather than silently broadening them.
age_restriction remains an independent compliance floor and always wins. When verification_required is true, the effective basis is verified; its accepted_methods are intersected with accepted_verification_methods. An empty intersection is invalid. A World ID nullifier, unique_human claim, or Orb verification level alone never establishes age—the verified proof must contain an applicable age_over_N claim and pass the TMP verification, relying-party binding, freshness, and expiry checks.
Signal-backed execution
A product can declare thesignals execution mode when it resolves canonical age intent through catalogued signals. The signal’s authoritative definition must carry demographic_predicate; its name is never evidence of its bounds. Age-annotated signals also declare restricted_attributes: ["age"] so governance checks remain structural.
Governance interaction
Age is a registered restricted-attribute category because some campaign plans prohibit its use in regulated contexts. A directtargeting_overlay.demographics.age predicate and a signal carrying demographic_predicate.age are both age-based targeting for governance evaluation. They are blocked only when the applicable campaign plan lists age in restricted_attributes; the registry entry does not create a global prohibition on otherwise lawful demographic targeting.
Exact readback
Whenever demographic targeting was requested or applied, package state includestargeting_resolution.demographics. Demographics is one dimension inside the
generic targeting-resolution envelope; it preserves both predicates and the
execution mechanism:
targeting_overlay.demographics preserves the booked predicate and buyer determination constraints. The demographic resolution’s applied field contains the canonical predicate actually applied; equivalent is always true for stored packages, and buyers should still recompute predicate equality from requested and applied. applied_bases and applied_verification_methods record the effective configured eligibility paths after intersecting buyer constraints, product capability, and age compliance. They do not assert which path every individual impression used. A seller rejects any non-equivalent or unsupported compilation. The same core Package schema carries this readback in synchronous CreateMediaBuySuccess responses and terminal async completion artifacts; get_media_buys exposes the corresponding PackageStatus field. Updates use the normal full-overlay replacement semantics and refresh the resolution atomically.
Why Brief-Based Targeting?
Eliminates Targeting Conflicts
- Declared capability: The publisher’s product defines what can be executed; explicit overlays carry only the buyer controls that need exact wire semantics
- Defined composition: Supported overlays intersect with the product instead of competing through hidden precedence rules
- Pricing consistency: Targeting costs are transparent and included in media prices
Simplifies Implementation
- Natural language: Buyers describe needs in familiar terms
- Publisher expertise: Publishers know their inventory and audience capabilities best
- Reduced complexity: No need to learn platform-specific targeting syntax
Enables Accurate Pricing
- Inclusive pricing: All targeting costs are built into the product price
- No surprises: Buyers know the complete cost upfront
- Market-driven: Pricing reflects true market value of targeted inventory
Real-Time Decisioning with TMP
For targeting decisions that must happen at impression time, AdCP uses the Trusted Match Protocol (TMP). TMP is the real-time execution layer that evaluates pre-negotiated packages at serve time across any surface. TMP gives the buyer a real-time look at each eligible impression through two structurally separated operations — Context Match (content relevance) and Identity Match (user eligibility) — without exposing user identity and page context to the buyer simultaneously. Key capabilities:- Cross-publisher frequency capping: Manage user exposure across multiple publishers via the Identity Match path
- Dynamic audience targeting: Evaluate audience membership at impression time without sharing PII
- Brand suitability enforcement: Real-time content evaluation through the Context Match path
- First-party data activation: Use your customer data without exposing it to publishers
- Cross-publisher frequency caps
- Suppression lists (existing customers, past converters)
- Audience segments that can’t be expressed in a brief
- Real-time brand suitability beyond static rules
- Any impression-time decision across web, mobile, CTV, AI assistants, or retail media
How Publishers Include Targeting
Publishers incorporate targeting capabilities directly into their product definitions:Geographic Targeting
Products specify geographic coverage:Demographic Targeting
Audience characteristics are built into products:Contextual Targeting
Content alignment is inherent in product descriptions:Device & Platform Targeting
Technical specifications included in product format:Brief Examples for Common Targeting Needs
Geographic Targeting
Demographic Targeting
Contextual Targeting
Behavioral Targeting
Product Response Targeting Information
When publishers return products, they include targeting information buyers need:Filters, targeting, and coverage
get_products.filters selects product characteristics such as channel,
delivery type, creative format, currency, and reporting support. It is not a
second targeting language. The legacy targeting-like filter fields remain
schema-valid during migration but are deprecated.
get_products.targeting_overlay contains real delivery constraints. The
seller must account for their effective result in availability, price, and
forecast. Exact acceptance of the structured overlay does not require an echo;
if the seller offers a different executable constraint, it returns only the
changed paths in targeting_resolution.modifications. Hard targeting inferred
from prose must be confirmed separately in targeting_resolution.brief_targeting
when the structured interpretation materially affects eligibility, pricing, or
forecasting; otherwise confirmation remains a best practice.
required_overlay_support asks whether a product lets the buyer choose a
dimension later. For example, requesting geo_metros support asks for products
that can be narrowed by metro on packages; it does not ask the seller to return
one product per metro. Named places follow the same rule: known IDs belong in
targeting_overlay.geo_places, while a buyer that will choose them later asks
for required_overlay_support.geo_places. The product answers with binding
selectable permission in overlay_support; that permission is not a
value-specific availability guarantee.
Support guarantees selectability subject to disclosed limits, not inventory or
a forecast for every possible value. A forecast returned without concrete metro
values describes the product’s discovery/default scope. Rediscover with the
values in targeting_overlay for a metro-specific forecast. Fixed prices and
floors remain binding uniformly for supported selections; price guidance is
non-binding. If rates vary by value, the seller returns a configured product
after concrete rediscovery, splits rate tiers into products, or exposes only
non-binding guidance until concrete values are known. It never silently
reinterprets a selected pricing option at a new price.
Coverage is an implementation detail of the same targeting contract. A
constraint may be satisfied by the product’s inherent inventory scope or by a
selectable ad-server control. Buyers care about the effective result, not which
mechanism supplied it.
Properties, collections, and placements follow the same model as audience and
geographic targeting. Select a targetable placement with
targeting_overlay.placement_selection; use
creative_assignments[].placement_refs only to route creatives among the
placements already selected by package targeting.
No raw ad-server key/value targeting
External buyers MUST NOT send arbitrary ad-server keys, values, or expressions through a generic targeting map. A capability declaration would prove only that a seller recognizes a key; it would not make the key’s semantics, authorization boundary, privacy behavior, or cross-seller meaning mechanically verifiable. Sellers compile AdCP’s structured targeting, signal references, and configured products into their own ad-server controls internally. When a targeting concept is broadly useful, define a typed AdCP field and its resolution behavior. Use signals for seller-published targetable options and use property, collection, placement, and format selection for inventory. Do not useext to expose or accept a generic ad-server targeting control plane.
When to Use Targeting Overlays
Targeting overlays are the normal home for exact, auditable delivery constraints in discovery, create, and update. Use them whenever the requested value must survive seller planning and package readback.Geographic Restrictions
Use geo fields only for:- RCT testing: Randomized control trials requiring specific geographic splits
- Regulatory compliance: Legal requirements for geographic restrictions
- Product refinement: When a product spans multiple regions and you need to restrict to a subset
geo_countries: ISO 3166-1 alpha-2 country codes (e.g.,["US", "GB"])geo_regions: ISO 3166-2 subdivision codes (e.g.,["US-CA", "GB-SCT"])geo_metros: Structured metro areas with explicit system (e.g.,nielsen_dma,uk_itl2) — not all publishers support metro-level targetinggeo_postal_areas: Structured postal areas with explicit country and system (e.g.,US/zip,GB/outward,ZA/postal_code) — not all publishers support postal-level targetinggeo_places: Catalog-backed named places with explicit country, identifier system, place type, and stable IDs — use this for platform place entities such as cities or municipalities, not raw place names
geo_countries_exclude: Same format asgeo_countriesgeo_regions_exclude: Same format asgeo_regionsgeo_metros_exclude: Same format asgeo_metrosgeo_postal_areas_exclude: Same format asgeo_postal_areasgeo_places_exclude: Same format asgeo_places
Age Restrictions (Compliance)
Use for legal compliance requirements:- Alcohol advertising: Require verified 21+ in the US
- Gambling/Gaming: Require verified 18+ or 21+ depending on jurisdiction
- Cannabis: Require verified age per local regulations
age-verification-method.json, based on ISO/IEC 27566-1 age assurance standards):
facial_age_estimation- AI-based age estimation (Yoti, etc.)id_document- Government ID scandigital_id- Verified digital identity credentialscredit_card- Payment card age gateworld_id- Applicable verified World ID age-threshold proof or credential. Orb/personhood verification alone is insufficient.
get_adcp_capabilities.
Device Platform (Technical Compatibility)
Use for technical requirements:- App install campaigns: iOS-only app requires
device_platform: ["ios"] - CTV campaigns: Target specific TV operating systems
device_platform_exclude when the campaign may run across several
platforms except for a known incompatible platform. If the same value appears
in both lists, exclusion wins. Sellers that cannot enforce the exclusion MUST
reject it rather than silently broadening delivery.
Platform inclusion and exclusion are independently selectable product
capabilities. A buyer that plans to provide exclusions later requests
required_overlay_support.device_platform_exclude; a matching product returns
overlay_support.device_platform_exclude. Known exclusion values belong in
targeting_overlay during discovery so availability, pricing, and forecast use
the effective constraint.
Available platforms (defined in device-platform.json, based on Sec-CH-UA-Platform standard extended for CTV):
- Browser:
ios,android,windows,macos,linux,chromeos - CTV:
tvos,tizen,webos,fire_os,roku_os - Other:
unknown
Device type (form factor)
Use for performance optimization targeting by hardware category rather than OS:- Mobile campaigns: Target all mobile devices regardless of OS
- CTV campaigns: Target connected TVs across all platforms
- Exclude form factors: Skip CTV for app-install campaigns
device_type_exclude to exclude specific form factors:
device-type.json):
desktop,mobile,tablet,ctv,dooh,unknown
device_type targets form factors (mobile, desktop, CTV). device_platform targets operating systems (iOS, Android, tvOS). Use device_type for performance optimization; use device_platform for technical compatibility.
Language (Localization)
Use for localization requirements:- Creative is in a specific language
- Campaign targets specific language speakers
en, fr-CA, zh-Hant-TW). AdCP uses lower-case language and variants, title-case script, and upper-case region.
Matching: Sellers apply RFC 4647 §3.3.1 Basic Filtering in the direction buyer range → user language-preference tag. fr matches fr, fr-CA, and fr-FR; fr-CA matches fr-CA and more-specific descendants, but not fr or the sibling fr-FR. Multiple requested ranges use OR logic.
Discovery: The structured media_buy.execution.targeting.language.supported_languages capability lists exact selectable request values. A capability entry of fr does not authorize a request for fr-CA; the seller must list fr-CA when that narrower range is accepted. Sellers that cannot enforce a requested value reject the request rather than silently widening or dropping it. A legacy language: true, or a structured declaration with no list, indicates coarse support without an exhaustive preflight list.
Frequency Capping
Two frequency controls can be used independently or together: Cooldown between exposures —suppress prevents back-to-back delivery:
max_impressions + per + window limits total exposure:
per field uses the same entity types as reach_unit on reach optimization goals — use matching values when layering a hard cap on top of a reach campaign.
Example Geographic Overlay (RCT Testing)
For RCT testing, exclusion targeting is often simpler than inclusion. Instead of listing hundreds of DMAs to include, exclude the holdout markets from a national campaign. When inclusion and exclusion are combined, exclusion fields subtract from the included set (e.g., “US minus these 3 DMAs”):What NOT to Use Targeting Overlays For
Express these in briefs instead:- Demographic preferences (age, gender, income) - “Target millennials” or “high-income households” in brief text
- Device preferences - “Mobile users” or “CTV viewers” in brief text (use
device_platformoverlay only for technical compatibility) - Content categories - “Sports content” or “News sites” in brief text
- General audience preferences - “Auto intenders” or “Luxury shoppers” in brief text. If the buyer wants specific named signals applied to this package, use
signal_targeting_groups. - Daypart preferences - “Morning commute hours” or “prime time evening” in brief text
Why briefs work better for preferences:
- Natural language captures intent more clearly
- Publishers know their inventory and can target effectively
- Avoids channel-specific complexity (DOOH has no browsers)
- Simpler API with fewer edge cases
Available Targeting Overlay Parameters
Geographic targeting supports both inclusion (restrict to) and exclusion (exclude from) for all geo dimensions. Inclusion and exclusion fields can be combined — for example, include a country but exclude specific metros within it.Exclusion Semantics
Exclusion without inclusion. When an exclusion field is present without a corresponding inclusion field, the exclusion applies to the product’s full geographic coverage. For example, if a product covers the entire US and the buyer specifies onlygeo_metros_exclude, the excluded metros are removed from the product’s national footprint.
Cross-level resolution. Geographic levels form a hierarchy: country > region > metro > postal. Sellers SHOULD resolve hierarchical conflicts such that exclusion at a higher level takes precedence over inclusion at a more specific level. For example, geo_countries_exclude: ["US"] combined with geo_regions: ["US-CA"] SHOULD result in no US delivery — the country-level exclusion takes precedence.
Same-value overlap. Sellers SHOULD reject requests where the same value appears in both the inclusion and exclusion field at the same level (e.g., geo_countries: ["US"] with geo_countries_exclude: ["US"]) and return a descriptive error. ISO subdivision and named-place overlaps are stricter: the same identity in geo_regions / geo_regions_exclude or geo_places / geo_places_exclude MUST be rejected.
Capabilities. Inclusion and exclusion support are independent. Sellers declare subdivision inclusion through geo_regions and exclusion through geo_regions_exclude; support for one MUST NOT be inferred from the other. A legacy boolean in seller-wide capabilities is a coarse, informative rollup. Seller-wide structured values are individual routing claims within the response scope, not a promise that multiple values are jointly composable or available through the same execution route or account. Only Product overlay_support supplies the binding set of executable targeting permissions for that Product, and its legacy true form retains the targeting-overlay contract’s binding unrestricted-support meaning. A seller that cannot honor every protocol-valid value MUST return structured country/value Product support instead. If a seller does not support a requested direction, it MUST return a validation error rather than silently ignore the field.
geo_countries
- Description: Restrict delivery to specific countries
- Format: ISO 3166-1 alpha-2 country codes
- Examples:
["US", "CA"],["GB", "FR", "DE"] - Use cases: Regulatory compliance, country-specific campaigns
geo_countries_exclude
- Description: Exclude specific countries from delivery
- Format: ISO 3166-1 alpha-2 country codes
- Examples:
["RU", "CN"] - Use cases: Regulatory compliance, sanctions
geo_regions
- Description: Restrict delivery to canonical ISO 3166-2 subdivisions, including states, provinces, regions, departments, and overseas subdivisions
- Format: ISO 3166-2 subdivision codes
- Examples:
["US-CA", "CA-QC"],["FR-49", "FR-2A", "FR-971", "FR-ARA"] - Use cases: State-level compliance, regional testing
geo_regions_exclude
- Description: Exclude canonical ISO 3166-2 subdivisions from delivery
- Format: ISO 3166-2 subdivision codes
- Examples:
["US-CA"],["CA-QC"] - Use cases: Regulatory compliance (e.g., cannabis restrictions by province), RCT holdout regions, regions where product is unavailable
get_products.targeting_overlay.geo_regions and/or geo_regions_exclude, so every returned configured product, price, availability result, minimum, guarantee, and aggregate forecast reflects the effective subdivisions. No separate region resolver is required: configured discovery or refinement is the authoritative value-level preflight.
When region values will be chosen later, buyers request required_overlay_support.geo_regions and geo_regions_exclude independently. A structured requirement keys support by country. all_values: true requires every protocol-valid ISO subdivision active in the seller’s support snapshot when the declaration is issued; it does not automatically include values introduced by a later catalog revision. catalog_version and as_of identify that snapshot when supplied. values requests an exact finite candidate set. Returned Product overlay_support is binding selectable permission. Requirement matching uses country/value containment: support with all_values: true satisfies any requirement for that country; finite support satisfies only requested value subsets. Future support does not guarantee value-specific inventory or commercial terms, so buyers that need a value-specific forecast or guarantee refine with the exact overlay before commitment.
At create or update, unsupported dimensions, countries, or values outside Product overlay_support produce UNSUPPORTED_FEATURE, while malformed or unknown canonical identifiers inside a declared support envelope produce INVALID_REQUEST with an exact error.field. A supported create-time selection with no executable inventory produces PRODUCT_UNAVAILABLE. REQUOTE_REQUIRED remains update-only for an executable change outside the accepted price or guarantee envelope; buyers that know commercially distinct region values before commitment rediscover or refine with the exact overlay. Accepted package state echoes the complete effective ISO subdivision overlay. Updates are atomic.
geo_metros
- Description: Restrict delivery to specific metro areas
- Format: Array of objects, each with a
systemandvalues - Systems:
nielsen_dma(US),uk_itl1/uk_itl2(UK),eurostat_nuts2(EU),custom - Example:
[{ "system": "nielsen_dma", "values": ["501", "803"] }] - Use cases: Local campaigns, metro-level RCT testing
- Note: Seller must declare supported systems in
get_adcp_capabilities
geo_metros_exclude
- Description: Exclude specific metro areas from delivery
- Format: Array of objects, each with a
systemandvalues - Example:
[{ "system": "nielsen_dma", "values": ["602"] }] - Use cases: RCT holdout markets, competitive exclusion zones, markets where product is unavailable
- Note: Seller must declare supported systems in
get_adcp_capabilities
geo_postal_areas
- Description: Restrict delivery to specific postal areas
- Format: Array of objects, each with a
country,system, andvalues - Systems: country-local values such as
zip,zip_plus_four,outward,full,fsa,plz,code_postal,postcode,pin, andpostal_code - Example:
[{ "country": "US", "system": "zip", "values": ["10001", "10002"] }] - Use cases: Hyper-local campaigns, postal-level restrictions
- Note: Seller must declare supported systems in
get_adcp_capabilities. During the 3.x migration, deprecated country-fused systems such asus_zipremain accepted for compatibility and SDK backfill.
geo_postal_areas_exclude
- Description: Exclude specific postal areas from delivery
- Format: Array of objects, each with a
country,system, andvalues - Example:
[{ "country": "US", "system": "zip", "values": ["90210"] }] - Use cases: RCT holdout zip codes, restricted delivery areas
- Note: Seller must declare supported systems in
get_adcp_capabilities; the deprecated legacy form remains accepted during the 3.x migration.
geo_places
- Description: Restrict delivery to named administrative or local places represented by stable catalog identifiers
- Format: Array of objects with required
country,system,place_type, andvalues; optionalsystem_version,value_labels, andext - Systems: Registered namespaces are
geonames,google_ads, andmicrosoft_ads. Other catalogs use an owner-controlled absolute HTTPS URI, such ashttps://seller.example/geo/catalogs/places. MaxMindgeoname_idvalues use thegeonamesnamespace; MaxMind is a catalog source/version, not a separate identifier namespace. - Example:
[{ "country": "NL", "system": "geonames", "system_version": "2026-05", "place_type": "city", "values": ["2759794"], "value_labels": { "2759794": "Amsterdam, North Holland, Netherlands" } }] - Use cases: Target a platform’s named city, municipality, borough, neighborhood, post town, city region, or county entity without relying on ambiguous names
- Note:
valuesare the authoritative targeting keys. Everyvalue_labelskey MUST appear invalues; labels exist only for diagnostics and audit readability, and sellers MUST NOT resolve or apply targeting from them. Raw names such asAmsterdamare unresolved intent, not valid values.
geo_places, values and entries have union semantics: delivery may occur in any included place. geo_places_exclude subtracts matching places from the current candidate geography, including when no geo_places inclusion is present. Inclusion across different geographic dimensions is intersected. Sellers MUST reject the same (country, system, place_type, value) in both include and exclude lists, even when the include and exclude entries specify different catalog versions: version is not part of stable place identity. Sellers MAY reject cross-level combinations they cannot resolve safely rather than silently approximating them.
Before sending a place target, buyers inspect get_adcp_capabilities.media_buy.execution.targeting.geo_places. Support is declared as exact country/type pairs, not independent lists. Each system also declares catalog.current_version, exact supported_versions, and an adcp_geo_place_resolver_v1 endpoint. Buyers resolve raw names—or refresh an existing ID—using an HTTPS GET with exactly one of q or value from get-geo-place-resolution-request.json. The response echoes the normalized request and follows get-geo-place-resolution-response.json, carrying machine-readable country/subdivision/type context plus active, removal-planned, or deprecated identifiers and replacements. Ambiguous results require user or agent disambiguation before trafficking.
If system_version is omitted from a new target, the seller applies its declared current_version. Sellers MUST reject unsupported systems, country/type pairs, versions, deprecated identifiers, and unknown identifiers rather than silently dropping or reinterpreting them. If an identifier is stale, the seller returns a validation error and may surface resolver-provided replacements; it MUST NOT silently substitute a replacement. Sellers MUST echo persisted geo_places and geo_places_exclude in package targeting_overlay state with the exact applied system_version and values.
Accepted place targeting is pinned to the echoed system_version for the life of the package. Removing that version from supported_versions stops new targeting and target-changing updates from using it, but MUST NOT silently mutate, drop, or invalidate an existing package. An unrelated package update preserves the pinned place overlay. If a seller can no longer execute a pinned target, get_media_buys MUST still echo it and return a nonfatal errors[] entry with code: "PLACE_TARGET_UNAVAILABLE", recovery: "correctable", field pointing to the exact media_buys[N].packages[M].targeting_overlay.geo_places[_exclude][A].values[V] response path, and details containing media_buy_id, package_id, system, system_version, country, place_type, and value. The buyer can use resolver value lookup against the current catalog to find lifecycle status and proposed replacements, then submit an intentional target update.
Place forecast and delivery breakdown rows are intentionally not part of this release: geo_level: "place" remains invalid on reporting surfaces. Package-state echo provides configuration auditability, but not delivery-by-place verification. Place-level forecast, delivery, pacing, and reconciliation require a follow-up reporting RFC.
Known place IDs belong in get_products.targeting_overlay.geo_places, so every
returned product, price, and aggregate forecast reflects that effective
targeting even though a place-level breakdown is unavailable. If IDs will be
chosen on packages later, the buyer requests required_overlay_support.geo_places
(and independently geo_places_exclude) with the required system,
country/type pairs, and optional catalog versions. Returned Product
overlay_support is binding selectable permission, not a value-specific
inventory, price, or forecast guarantee. At create, the seller applies this
deterministic disposition matrix to the actual place overlay:
An accepted create confirms that the returned terms apply to the complete
effective targeting.
PLACE_TARGET_UNAVAILABLE is reserved for later
degradation of a previously accepted, persisted place target; it is not a
create-time substitute for any result above.
geo_places_exclude
- Description: Exclude catalog-backed named places
- Format: Same as
geo_places - Example:
[{ "country": "US", "system": "geonames", "place_type": "city", "values": ["5392171"], "value_labels": { "5392171": "San Jose, California, United States" } }] - Note: Seller must declare the system, exact country/type pair, and applied catalog version in
get_adcp_capabilitiesand echo the persisted exclusion on package state.
axe_include_segment
- Description: Segment ID for inclusion targeting (legacy AXE field)
- Format: String segment identifier
- Examples:
"seg_auto_intenders_q1","audience_lapsed_buyers_30d" - Use cases: Dynamic audience targeting, first-party data activation
- Note: This field is from the legacy AXE integration. New implementations should use TMP, where audience targeting is handled through the Identity Match path.
axe_exclude_segment
- Description: Segment ID for exclusion targeting (legacy AXE field)
- Format: String segment identifier
- Examples:
"seg_existing_customers","audience_past_converters" - Use cases: Customer suppression, frequency management
- Note: This field is from the legacy AXE integration. New implementations should use TMP, where suppression is handled through the Identity Match path.
audience_include
- Description: Restrict delivery to users who are members of these first-party CRM audiences. Only people on the uploaded list are eligible to see the ad.
- Format: Array of
audience_idstrings fromsync_audiences - Example:
["lapsed_subscribers", "high_value_prospects"] - Use cases: Retargeting known users, loyalty campaigns targeting existing members, CRM-based inclusion on closed platforms (LinkedIn, Meta, TikTok, Google Ads)
- Not for lookalike/expansion: To find new users similar to an audience, describe the intent in your campaign brief (“reach people like our existing customers”) — the seller handles expansion strategy
- Prerequisite: Audiences must be registered and
readyviasync_audiencesbefore use - Note: Seller must declare support in
get_adcp_capabilities
audience_exclude
- Description: Suppress delivery to users who are members of these first-party CRM audiences. Matched users are excluded regardless of other targeting.
- Format: Array of
audience_idstrings fromsync_audiences - Example:
["existing_customers", "recent_purchasers"] - Use cases: Customer suppression in acquisition campaigns, excluding recent converters, suppressing opted-out users
- Prerequisite: Audiences must be registered and
readyviasync_audiencesbefore use - Note: Seller must declare support in
get_adcp_capabilities
signal_targeting_groups
- Description: Basic Boolean grouping for seller-offered data signals. Use this for both simple include-only signal targeting and grouped include/exclude expressions such as
(A OR B) AND NOT (C OR D). - Discovery: Wholesale products can set
signal_targeting_allowed: trueand omit inlinesignal_targeting_options; buyers then useget_signalsas the selectable signal feed. Products return inlinesignal_targeting_optionswhen they need product-specific pricing, activation handles, defaults, grouping hints, or a relevant subset for a brief/refine response. - Format: Object with required top-level
operator: "all"and agroupsarray. The top-level operator is always present, even though v1 only supportsall. - Child groups: Each child group has
operator: "any"oroperator: "none"and asignalsarray of package signal targeting objects. Each signal carriessignal_ref,value_type, and the value fields, plus optional commercial and activation handles. - Legacy flat targeting:
targeting_overlay.signal_targetingremains schema-valid during the SignalRef migration window for older clients, but it is deprecated. New package-level signal selection usessignal_targeting_groupsso sellers can apply include/exclude groups, product rules, and per-signal pricing consistently. - Semantics:
anymeans the user must match at least one signal in that group.nonemeans the user must match none of the signals in that group. With top-levelall, every child group must pass. For simple include-only targeting, send one child group withoperator: "any". - Resolution model:
signal_targeting_rules.resolution_modeltells buyers how the seller applies selected signals to inventory.direct_targetingmeans selected signals behave like package targeting predicates.seller_plannedmeans selected signals are inputs to seller-managed planning against product-specific inventory, timing, availability, reach, or pacing constraints; buyers should not attempt to decompose the selected audience into lower-level inventory or schedule decisions. - Selection groups: When the product declares
signal_targeting_rules.selection_group_rules, each child group MUST contain signals from exactly oneselection_groupand one targeting mode, and buyers MUST send at most one child group for each(selection_group, targeting_mode)pair. Sellers MUST reject duplicate, mixed, or collapsed child groups that combine distinct selection-group rules into the sameanyornonegroup.selection_groupis a product-defined composability bucket, not a backend identity type: for example, a GAM-backed seller may expose both audience segments and key-values as ordinarysignal_refoptions, using oneselection_groupwhen they are freely OR-combinable and separateselection_groups when they must be trafficked as separate ANDed clauses. - Pricing: Include
pricing_option_idwhen the selected product’ssignal_targeting_optionsentry haspricing_options; omit only when the signal is bundled into the product price or has no incremental cost. Product-scoped pricing insignal_targeting_optionsis authoritative for that product. If the product option has no product-specific price, sellers MAY use the default pricing exposed inget_signals. - Signal reference: Use
signal_ref: { "scope": "product", "signal_id": "..." }for a product-local signal option. Usesignal_ref: { "scope": "data_provider", "data_provider_domain": "...", "signal_id": "..." }for a signal defined in a data provider’s published adagents.jsonsignals[].signal_refidentifies the signal definition;signal_agent_segment_ididentifies a resolved segment or execution handle when the product option exposes one. Echo an exposedsignal_agent_segment_idverbatim on the package entry, and prefer it over reconstructing identity from categorical values because providers can namespace handles to distinguish definitions such as real-time rain versus forecast high-precipitation. If the product option hasactivation_status: "requires_activation", it MUST includesignal_agent_segment_id; activate the signal first, then includeactivation_keyif the seller requires it. - Provider-published signals: For a provider-published signal,
signal_ref.data_provider_domainidentifies the upstream data provider andsignal_ref.signal_ididentifies the public signal definition. Buyers can verify the seller’s right to offer the signal by checking the provider’sadagents.jsonauthorized_agentsentry for the seller. - Product gating: Sellers SHOULD reject a signal entry when the product does not advertise that signal inline or through
get_signals,signal_targeting_allowedis false for package-level selection, the signal violates the product’ssignal_targeting_rules, the signal’sallowed_targeting_modesdoes not allow the requested child group operator, the signal is not active for the account, or the requested value is outside the signal definition.allowed_targeting_modes: ["include"]maps toanygroups;["exclude"]maps tononegroups. Binary package signal entries usevalue: true; use the parentnonegroup for exclusion, notvalue: false. Signal targeting limits are product-scoped, not declared in seller-wideget_adcp_capabilities, because products may be backed by different ad servers or platforms. Ifselection_modeisfixed, buyers SHOULD omit edits tosignal_targeting_groups; sellers apply the fixed/default selections and MUST echo them on the resulting package state. - Updates: Because
targeting_overlayis shared bycreate_media_buyandupdate_media_buy, sellers MAY reject mid-flight signal group changes withREQUOTE_REQUIREDwhen the selected signal, group expression, orpricing_option_idchanges the priced envelope. - Not for first-party audiences: Use
audience_include/audience_excludefor buyer-uploaded audiences fromsync_audiences.
signal_ref. Buyers should not need a separate identity system for “audience segment” versus “key-value”; the selected product’s signal_targeting_rules describe whether those options can be composed together. If a product exposes both a gam_audience_segments group and a gam_key_values group with targeting_mode: "include", the buyer composes two any child groups under the top-level all, not one collapsed mixed group.
For products where inventory and audience planning are inseparable, such as linear broadcast schedules, sellers use resolution_model: "seller_planned". Mandatory audience selection still lives in selection_mode: "required" or a required selection_group_rules entry; cross-product audience consistency comes from a shared scope: "data_provider" signal definition, even when the seller is also the data provider.
frequency_cap
- Description: Limit ad exposure frequency per entity. Two optional controls can be used independently or together.
- Cooldown control:
suppress— minimum duration between consecutive exposures to the same entity.suppress_minutes(number) is also accepted for backwards compatibility. - Impression cap:
max_impressions+per+window— total impression ceiling per entity per time window. All three fields are required together. - Use cases: User experience management, ad fatigue prevention, complementing reach optimization goals with a hard ceiling
- Examples:
{"suppress": {"interval": 60, "unit": "minutes"}},{"max_impressions": 5, "per": "households", "window": {"interval": 7, "unit": "days"}}
age_restriction
- Description: Require minimum age for compliance
- Format: Object with
min(required),verification_required, andaccepted_methods - Examples:
{"min": 21, "verification_required": true},{"min": 18, "verification_required": true, "accepted_methods": ["world_id"]} - Use cases: Alcohol (21+), gambling (18+), cannabis regulations
- Note: Platforms declare supported verification methods in
get_adcp_capabilities
device_platform
- Description: Restrict to specific operating system platforms
- Format: Array of platform identifiers from Sec-CH-UA-Platform standard
- Examples:
["ios"],["ios", "android"],["tvos", "fire_os"] - Use cases: App install campaigns (iOS-only app), CTV-specific campaigns
- Values:
ios,android,windows,macos,linux,chromeos,tvos,tizen,webos,fire_os,roku_os
device_platform_exclude
- Description: Exclude specific operating-system platforms from delivery
- Format: Array using the same identifiers as
device_platform - Examples:
["fire_os"],["tizen", "webos"] - Conflict rule: Exclusion wins when the same value appears in both platform fields
- Discovery: Require future package-level control with
required_overlay_support.device_platform_exclude; products disclose it throughoverlay_support.device_platform_exclude - Failure rule: A seller that cannot enforce the exclusion rejects the request instead of dropping it
device_type
- Description: Restrict to specific device form factors
- Format: Array of device type identifiers
- Examples:
["mobile"],["mobile", "tablet"],["ctv"] - Use cases: Mobile-only promotions, CTV campaigns targeting all TV platforms, excluding DOOH from certain campaigns
- Values:
desktop,mobile,tablet,ctv,dooh,unknown - Note: Seller must declare
device_type: trueinget_adcp_capabilitiestargeting
device_type_exclude
- Description: Exclude specific device form factors from delivery
- Format: Array of device type identifiers
- Examples:
["dooh"],["ctv", "dooh"] - Use cases: Exclude CTV for app-install campaigns, exclude DOOH for direct-response campaigns
- Note: Supported when seller declares
device_type: trueinget_adcp_capabilities
browser
- Description: Restrict impression delivery to canonical browser families
- Format: Non-empty array of
chrome,safari,firefox,edge,opera,samsung_internet,android_webview,other, orunknown - Examples:
["chrome"],["chrome", "firefox"],["safari", "unknown"] - Semantics: Values use OR; when present, omitted families are ineligible. The field describes the impression rendering environment, not a post-click browser.
- Discovery: Require any later-selectable family with
required_overlay_support.browser: true, or require a subset withrequired_overlay_support.browser.families. Products disclose unrestricted support astrueor partial support withoverlay_support.browser.families.
browser_exclude
- Description: Exclude canonical browser families from impression delivery
- Format: Non-empty array using the same values as
browser - Examples:
["unknown"],["safari", "android_webview"] - Conflict rule: Exclusion wins when the same family appears in both browser fields
- Discovery: Inclusion and exclusion support are independent;
required_overlay_support.browser_excludeandoverlay_support.browser_excludeuse the sametrueor{ "families": [...] }capability form. - Failure rule: A seller that cannot enforce the exclusion rejects the request instead of dropping it
language
- Description: Restrict to users with specific language preferences
- Format: Array of canonical BCP 47 language ranges
- Examples:
["en"],["fr-CA", "en"],["zh-Hant-TW", "ja", "ko"] - Matching: RFC 4647 Basic Filtering in the direction buyer range → user language-preference tag. A broad
frrange includesfr-CA; a narrowfr-CArange does not includefrorfr-FR. - Discovery: If the seller publishes
execution.targeting.language.supported_languages, each requested value must be an exact member of that list. Sellers reject unsupported values rather than widening or ignoring them. - Use cases: Localized creative, language-specific campaigns
keyword_targets
- Description: Target specific keywords for search and retail media platforms. Restricts delivery to queries matching the specified keywords.
- Format: Array of objects with
keyword,match_type(broad,phrase, orexact), and optionalbid_price - Identity: Each keyword is identified by the tuple
(keyword, match_type). The same keyword string with different match types are distinct targets. Duplicate pairs in a single request SHOULD be rejected by sellers. - Match types:
broad— matches related and synonym queriesphrase— matches queries containing the keyword phrase in orderexact— matches the keyword query only
- Per-keyword bid: The optional
bid_priceoverrides the package-levelbid_pricefor that keyword. Inherits themax_bidinterpretation from the pricing option: whenmax_bidis true, this is the keyword’s bid ceiling; when false, this is the exact bid. If omitted, the packagebid_priceapplies. - Use cases: Search campaigns, retail media sponsored products, keyword-based intent targeting
- Note: Seller must declare
execution.targeting.keyword_targetsinget_adcp_capabilitieswith thesupported_match_typesit accepts. Only use match types the seller declares — sellers must reject unsupported match types. Usekeyword_targets_addandkeyword_targets_removeinupdate_media_buyto add or update keywords incrementally after launch. Keyword-level delivery data (by_keywordin reporting) requiresreporting_capabilities.supports_keyword_breakdown: trueon the product — these are independent capabilities.by_keywordis keyword-grain (one row per keyword+match_type pair), not search-term-grain.
negative_keywords
- Description: Exclude specific keywords from delivery. Queries matching these keywords will not trigger the ad.
- Format: Array of objects with
keywordandmatch_type(broad,phrase, orexact) - Use cases: Prevent wasteful spend on irrelevant queries, exclude competitor brand terms
- Note: Seller must declare
execution.targeting.negative_keywordsinget_adcp_capabilitieswith thesupported_match_typesit accepts. Usenegative_keywords_addandnegative_keywords_removeinupdate_media_buyto add/remove negatives incrementally after launch.
store_catchments
- Description: Target users within store catchment areas from a synced store catalog
- Format: Array of objects, each referencing a store-type catalog synced via
sync_catalogs - Required fields:
catalog_id - Optional fields:
store_ids(narrow to specific stores),catchment_ids(narrow to specific zones like"walk"or"drive") - Use cases: Drive-to-store campaigns, local inventory ads, proximity targeting
store_ids is omitted, all stores in the catalog are targeted. When catchment_ids is omitted, all catchment zones are targeted. The seller must declare support for store catchment targeting in get_adcp_capabilities.
geo_proximity
- Description: Target users within travel time, distance, or a custom boundary around arbitrary geographic points
- Format: Array of objects, each with exactly one method:
travel_time+transport_mode,radius, orgeometry - Required fields:
lat+lng(for travel_time and radius methods), orgeometry(for pre-computed boundaries) - Optional fields:
label(human-readable name for the entry) - Use cases: Tourism campaigns (within 2hr drive of a city), event targeting (near a venue), airport catchment areas
- Semantics: Multiple entries use OR — a user within range of any listed point is eligible. Intersects with other geo targeting fields (e.g., combining with
geo_countriesrestricts proximity to those countries)
driving, walking, cycling, public_transport. The geometry method allows buyers who have already computed isochrones (via TravelTime, Mapbox, etc.) to pass the polygon directly — this also enables sellers without routing engines to participate.
For campaigns targeting 10+ locations, consider using store_catchments with a location catalog instead, which supports ongoing management and per-location reporting. geo_proximity does not have an exclusion variant — this is by design, as excluding “everyone near a point” is rarely a meaningful targeting constraint.
Sellers SHOULD enforce minimum area thresholds consistent with their privacy policies and applicable regulations. The seller must declare geo_proximity support in get_adcp_capabilities, specifying which methods (radius, travel_time, geometry) and transport modes are supported.
Validated examples:
Benefits for Different Stakeholders
For Buyers
- Simpler planning: Describe audience needs naturally
- Transparent pricing: All costs included upfront
- Reduced complexity: No targeting configuration required
- Better outcomes: Publisher expertise optimizes delivery
For Publishers
- Pricing control: Bundle targeting into product pricing
- Expertise utilization: Apply knowledge of inventory and audiences
- Simplified integration: Fewer technical targeting parameters
- Market positioning: Differentiate through targeting capabilities
For Platforms
- Reduced conflicts: Single targeting source eliminates layering issues
- Cleaner implementation: Less complex targeting logic required
- Better performance: Optimized for publisher inventory characteristics
Real-Time Targeting Signals
Orchestrators can provide real-time targeting signals to publishers for dynamic, high-cardinality targeting beyond what can be expressed in static overlays. These signals enable:- Brand safety - Real-time content filtering and adjacency controls
- Brand suitability - Contextual alignment with brand values
- Audience targeting - Dynamic audience segments updated in real-time
- Contextual targeting - Page-level or moment-level targeting decisions
Key Differences: Signals vs Overlays
- Signals are evaluated at impression time, not campaign setup
- Signals support higher cardinality (thousands of values vs. dozens)
- Signals can be updated continuously without modifying the media buy
- Signals enable sophisticated contextual targeting that briefs cannot express
When to Use Real-Time Signals
✅ Use Real-Time Signals For:- Brand safety filtering (block unsafe content)
- Brand suitability scoring (prefer suitable contexts)
- Dynamic audience targeting (real-time segment membership)
- Contextual targeting (page-level or moment-level decisions)
- High-cardinality targeting (thousands of values)
- Targeting that changes during campaign flight
Managing keywords after launch
Both keyword targets and negative keywords support incremental operations inupdate_media_buy, avoiding the need to replace the full targeting_overlay:
keyword_targets_add— upserts by(keyword, match_type)identity. Adds new keywords or updatesbid_priceon existing ones.keyword_targets_remove— removes matching(keyword, match_type)pairs.negative_keywords_add— appends negatives. Duplicates are no-ops.negative_keywords_remove— removes matching pairs. Missing entries are no-ops.
targeting_overlay.keyword_targets is present in the same request as keyword_targets_add or keyword_targets_remove (and likewise for negative keywords). The incremental operations and the full overlay replacement are mutually exclusive within a single update.
To remove all keyword targeting while preserving other overlay fields, send the full targeting_overlay without the keyword_targets field.
Implementation Requirements
Publishers MUST:
- Support Geographic Targeting: Handle geographic inclusion and exclusion parameters (
geo_countries,geo_countries_exclude,geo_regions,geo_regions_exclude,geo_metros,geo_metros_exclude,geo_postal_areas,geo_postal_areas_exclude,geo_places,geo_places_exclude) to the extent your platform supports them. Declare supported metro, postal, and place systems inget_adcp_capabilities - Interpret Briefs: Use briefs to determine appropriate audience and content targeting
- Validate Targeting: Reject media buys with targeting that cannot be supported
- Document Limitations: Clearly communicate any geographic targeting limitations in product descriptions
Buyers SHOULD:
- Use Briefs First: Express most targeting needs in natural language briefs
- Minimize Overlays: Only use technical targeting for geographic restrictions or RCT testing
- Trust Publishers: Let publishers apply their inventory knowledge to brief interpretation
- Validate Early: Check product capabilities before applying technical targeting
Best Practices
- Default to briefs - Start with natural language descriptions
- Write Clear Briefs: Be specific about audience and context requirements
- Trust Publisher Expertise: Publishers know their inventory capabilities best
- Use signals for dynamic targeting - Real-time signals handle complex, high-cardinality targeting better than overlays
- Minimize Technical Overlays: Use only for geographic restrictions or compliance
- Validate Audience Fit: Ensure product descriptions match campaign goals
- Inclusive pricing - Expect targeting costs to be built into product rates
Future Evolution
- Enhanced Brief Processing: More sophisticated natural language understanding
- Audience Discovery: Better tools for exploring available audiences
- Deeper Signal Integration: More sophisticated real-time targeting capabilities
- Performance Optimization: AI-driven audience refinement based on campaign results
Related Documentation
- Trusted Match Protocol (TMP) - Real-time execution layer for impression-time targeting, frequency capping, and brand suitability
- Signals Protocol - Real-time targeting signals for brand suitability and contextual targeting
- Product Discovery - How briefs lead to targeted product recommendations
- Example Briefs - Real examples of effective targeting briefs
- Policy Compliance - Automated compliance checking and enforcement