The Product Model
product_id(string, required)name(string, required)description(string, required)publisher_properties(list[PublisherPropertySelector], required): Publisher properties covered by this product. See Property Targeting.channels(list[string], optional): Advertising channels this product is sold as (e.g.,["retail_media"],["display", "olv"]). Sellers SHOULD declarechannelson 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.format_ids(list[FormatID], required): Structured format ID references. See Creative Formats.placements(list[Placement], optional): Specific ad placements within this product. When provided, buyers can target individual placements when assigning creatives. See Placements.shows(list[CollectionSelector], optional): Shows covered by this product, grouped by publisher. Each entry haspublisher_domainandcollection_idsreferencing shows in the publisher’sadagents.json. See Collections and installments.episodes(list[Episode], optional): Specific episodes available within this product. See Collections and installments.delivery_type(string, required): Either"guaranteed"or"non_guaranteed".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.pricing_options(list[PricingOption], required): Array of available pricing models for this product. See Pricing Models.delivery_measurement(object, optional): Who measures ad delivery — the ad server and viewability vendor used to count impressions (e.g., “Google Ad Manager with IAS viewability”). When absent, buyers should apply their own measurement defaults. See Delivery Measurement.outcome_measurement(OutcomeMeasurement, optional): Business outcome measurement included with the product — incremental sales lift, brand lift studies, etc. Common for retail media products.creative_policy(CreativePolicy, optional): Creative requirements and restrictions.is_custom(bool, optional):trueif the product was generated for a specific brief.expires_at(datetime, optional): Ifis_custom, the time the product is no longer valid.property_targeting_allowed(bool, optional, default: false): Whether buyers can filter this product to a subset of itspublisher_properties. Whenfalse(default), the product is “all or nothing” - buyers must accept all properties or the product is excluded fromproperty_listfiltering results. See Property Targeting.collection_targeting_allowed(bool, optional, default: false): Whether buyers can target a subset of this product’sshows. Whenfalse(default), the product is a bundle — buyers get all listed shows. Whentrue, buyers can select specific shows in the media buy.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.catalog_match(object, optional): When the buyer provides acatalogonget_products, indicates which catalog items are eligible for this product. Containsmatched_gtins(cross-retailer GTIN matches),matched_ids(generic item ID matches),matched_count, andsubmitted_count.metric_optimization(object, optional): Metric optimization capabilities for this product. Presence indicates the product supportsoptimization_goalswithkind: "metric". See Metric optimization.max_optimization_goals(integer, optional): Maximum number ofoptimization_goalsthis product accepts on a package. When absent, no limit is declared. Most social platforms accept only 1.conversion_tracking(object, optional): Conversion event tracking capabilities. Presence indicates the product supportsoptimization_goalswithkind: "event". See Conversion tracking.product_card(object, optional): Visual card definition for displaying this product in user interfaces. See Product Cards.
Metric optimization
Products that supportoptimization_goals with kind: "metric" declare their capabilities in metric_optimization. No event source or conversion tracking setup is required for metric goals — the seller tracks these metrics natively.
| Field | Type | Required | Description |
|---|---|---|---|
supported_metrics | string[] | Yes | Metric kinds this product can optimize for. Buyers should only request metric goals for kinds listed here. |
supported_view_durations | number[] | No | Video view duration thresholds (in seconds) supported for completed_views goals. When absent, the seller uses their platform default. |
supported_targets | string[] | No | Target kinds available: cost_per, threshold_rate. Values match target.kind on the optimization goal. Only listed kinds are accepted. When omitted, buyers can set target-less metric goals (maximize volume) but cannot set specific targets. |
Conversion tracking
Products that supportoptimization_goals with kind: "event" declare their capabilities in conversion_tracking. Seller-level capabilities (supported event types, UID types, attribution windows) are declared in get_adcp_capabilities.
| Field | Type | Required | Description |
|---|---|---|---|
action_sources | string[] | No | Action sources relevant to this product (e.g., a retail media product might have in_store and website). |
supported_targets | string[] | No | Target kinds available for event goals: cost_per, per_ad_spend, maximize_value. Values match target.kind on the optimization goal. Only listed kinds are accepted. When omitted, buyers can still set target-less event goals. |
platform_managed | boolean | No | Whether the seller provides always-on measurement (e.g., retailer purchase attribution). When true, sync_event_sources returns seller-managed event sources. |
Pricing Models
Publishers declare which pricing models they support for each product. Buyers select from the available options when creating a media buy. This approach supports:- Multiple pricing models per product - Publishers can offer the same inventory via different pricing structures
- Multi-currency support - Publishers declare supported currencies; buyers must use a supported currency
- Flexible pricing - Support for CPM, CPCV, CPP (GRP-based), CPA, and more
Supported Pricing Models
- CPM (Cost Per Mille) - Cost per 1,000 impressions (traditional display)
- CPC (Cost Per Click) - Cost per click on the ad
- CPCV (Cost Per Completed View) - Cost per 100% video/audio completion
- CPV (Cost Per View) - Cost per view at publisher-defined threshold
- CPA (Cost Per Acquisition) - Cost per conversion event (purchase, lead, signup, etc.)
- CPP (Cost Per Point) - Cost per Gross Rating Point (TV/audio)
- Flat Rate - Fixed cost regardless of delivery volume
- Time - Cost per time unit (day, week, month) that scales with campaign duration
PricingOption Structure
Each pricing option includes:fixed_price), use floor_price for minimum bid constraints and optional price_guidance for percentile hints. Bid-based auction models (cpm, vcpm, cpc, cpcv, cpv) may also include max_bid as a boolean signal that bid_price switches from exact honored price to buyer ceiling mode:
Delivery Measurement
Products SHOULD declare their measurement provider when available:"Google Ad Manager with IAS viewability""Nielsen DAR for P18-49 demographic measurement""Geopath DOOH traffic counts updated monthly""Comscore vCE for video completion tracking""Self-reported impressions from proprietary ad server"
Outcome Measurement Object
For products that include outcome measurement (common in retail media):CreativePolicy Object
Defines creative requirements and restrictions:Placements
Products can optionally declare specific ad placements within their inventory. When placements are provided:- Buyers purchase the entire product - Packages always target the whole product, not individual placements
- Placement targeting happens at creative assignment - Different creatives can be assigned to different placements
- Omitting placement targeting - Creatives without placement_ids run on all placements in the package
- Reuse registered IDs when available - If the publisher declares canonical
placementsinadagents.json, product placements SHOULD reuse thoseplacement_idvalues - Preserve registry semantics - When a product reuses a registered
placement_id, it is referring to that same placement. The product may narrowformat_idsor add operational detail, but it should not change the placement’s meaning incompatibly - Tags stay useful at product level - Product placements can carry
tagsfor grouping and should align with registry tags when the placement comes from the publisher registry
Placement Object Structure
Example: Product with Placements
Collections and installments
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 declareshows and episodes so buyers can target specific shows or episodes when purchasing inventory.
See Collections and installments for the full model, examples, and targeting details.
Exclusivity
Theexclusivity field indicates whether a product offers exclusive access to its inventory. Defaults to "none" when absent.
| Value | Meaning |
|---|---|
none | Multiple advertisers can buy this product simultaneously |
category | One advertiser per industry category (e.g., one auto brand per collection sponsorship) |
exclusive | Sole sponsorship — only one advertiser can buy this product |
When to use each level
none: Programmatic inventory, run-of-network, open auction products. Multiple advertisers sharing the same inventory is expected.category: Podcast or CTV sponsorships where competitive separation matters. One auto brand per collection, one fintech brand per installment — but multiple non-competing advertisers can buy simultaneously.exclusive: Sole sponsorship of a single collection or event. The advertiser is the only brand associated with the content.
exclusivity on guaranteed products with shows. The implicit default of "none" is ambiguous for collection-level inventory — buyers cannot tell whether the publisher intends shared inventory or simply omitted the field.
Content sponsorship pattern
A product combiningdelivery_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 collection sponsorships, and event-based takeovers.
Property Targeting
Theproperty_targeting_allowed flag indicates whether buyers can filter a product to a subset of its publisher_properties when using property list filtering via get_products.
Behavior
-
property_targeting_allowed: false(default): The product is “all or nothing.” If the buyer’sproperty_listdoesn’t include all of the product’s properties, the product is excluded from results entirely. -
property_targeting_allowed: true: Buyers can filter the product to properties matching theirproperty_list. The product is included in results if there is any intersection between its properties and the buyer’s list.
Use Cases
| Use Case | property_targeting_allowed | Why |
|---|---|---|
| Run of Network | false | Buyers must accept the entire network |
| Premium Bundles | false | Sports + News bundle sold together |
| Flexible Inventory | true | Buyers can target specific sites within a category |
Examples
All-or-nothing product (property_targeting_allowed: false):
get_products with a property_list containing only site_a and site_b, this product is excluded because the buyer’s list doesn’t include all properties (site_c is missing).
Flexible product (property_targeting_allowed: true):
get_products with a property_list containing only tech and sports, this product is included because there is an intersection. The buyer can then purchase this product and target only the matching properties via targeting_overlay.property_list in the package.
Custom & Principal-Specific Products
A server can offer a general catalog, but it can also return:- Principal-Specific Products: Products reserved for or negotiated with specific clients
- Custom Products: Dynamically generated products with
is_custom: trueand anexpires_attimestamp
Product Examples
Standard CTV Product (Multiple Pricing Options)
Auction-Based Display Product
Retail Media Product with Measurement
Product Cards
Product cards provide visual representations of products for display in user interfaces. Publishers can optionally include card definitions that reference card formats and provide the assets needed to render attractive visual cards.Card Types
Publishers should provide at least the standard card, and optionally a detailed card: Standard Card (product_card):
- Compact 300x400px card for product grids and lists
- Supports 2x density images for retina displays
- Quick visual identification of products
product_card_detailed, optional):
- Responsive layout with text description alongside hero carousel
- Markdown specifications section below
- Full product documentation similar to media kits
Structure
Rendering Cards
Cards can be rendered in two ways:- Via
preview_creative: Pass the card format and manifest to generate a rendered card - Pre-rendered: Publishers can pre-generate cards and serve them directly
Standard Card Formats
The AdCP reference creative agent defines two standard card formats:product_card_standard(300x400px) - Compact card for product browsingproduct_card_detailed(responsive) - Rich card with carousel and full specs
When to Include Product Cards
Product cards are optional but recommended for:- Products with strong visual identity (e.g., specific shows, events, publications)
- Premium products where visual presentation enhances perceived value
- Complex products where visual highlights help explain capabilities
- Products targeting specific audiences that benefit from visual representation
Client Rendering Guidelines
When displaying products in UIs, clients should follow this fallback order:- If
product_cardexists → Render card viapreview_creativeor display pre-rendered image - If neither exists → Render text-only representation (product name + description)
- If card rendering fails → Gracefully fall back to text-only representation
Proposals
Publishers can return proposals alongside products - structured media plans with budget allocations that buyers can execute directly.What Are Proposals?
A proposal is a recommended buying strategy that groups products with suggested budget allocations. Proposals encode publisher expertise - the kind of media planning guidance that traditionally required human sales reps. Key characteristics:- Actionable: Buyers execute proposals directly via
create_media_buywith aproposal_id - Budget-agnostic: Allocations use percentages, allowing the same proposal to scale to any budget
- Forecast-equipped: Proposals and allocations can include delivery forecasts to help buyers evaluate expected performance before purchase
Proposal Structure
tags field enables grouping allocations by dimension:
- By channel: desktop (50%) + mobile (20%) + in-app (30%) = 100%
- By language: German (40%) + French (60%) = 100%
Iterating on Proposals
Proposals can be refined usingbuying_mode: "refine" with the refine array. Reference proposals by ID — the seller returns an updated proposal with revised allocations, forecasts, and pricing:
get_products refinement for the full workflow and examples.
Executing a Proposal
To execute a proposal, provide theproposal_id and total_budget in create_media_buy:
ch_desktop_de: 20% × $50,000 = $10,000ch_desktop_fr: 30% × $50,000 = $15,000- etc.
When Publishers Return Proposals
Publishers include proposals when:- The brief requests specific allocation strategies (channel splits, language splits, etc.)
- The publisher can provide strategic guidance based on campaign goals
- Multiple products work better together than individually
wholesale mode (the buyer is directing targeting and allocation themselves) or when the brief doesn’t suggest a multi-product strategy.
Proposals are optional — publishers may return only products if allocation guidance isn’t applicable. In refine mode, sellers MAY return proposals alongside refined products even when the buyer did not include proposal entries. Proposals are a seller suggestion — allocation and campaign optimization are primarily orchestrator (buyer-side agent) responsibilities.
Delivery Forecasts
Publishers can attach delivery forecasts to proposals and individual allocations to help buyers evaluate expected performance before committing budget. Each forecast contains apoints array of one or more ForecastPoints. For spend curves, each point pairs a budget level with metric ranges (low/mid/high) — multiple points at ascending budgets show how delivery scales with spend. For availability forecasts, points omit budget and express total available inventory for the requested targeting and dates.
Metric keys come from two vocabularies:
- Delivery/engagement:
forecastable-metricenum values (impressions, reach, clicks, spend, views, completed_views, grps, etc.) - Outcomes:
event-typeenum values (purchase, lead, app_install, add_to_cart, subscribe, etc.)
estimate— rough approximation based on historical averages or heuristicsmodeled— derived from predictive models or historical dataguaranteed— contractually committed delivery levels backed by reserved inventory
mid for a point estimate, low and high for a range, or all three. At minimum, either mid or both low and high must be present.
Forecast Range Units
Theforecast_range_unit field tells consumers how to interpret the points array — what axis the curve represents:
spend(default) — points at ascending budget levels. Standard budget curve.availability— each point represents total available inventory for the requested targeting and dates. Budget is omitted; usemetrics.spendto express estimated cost. Typical for guaranteed and direct-sold inventory.reach_freq— points at ascending reach/frequency targets. Used in broadcast planning where the publisher shows how cost scales with frequency goals.weekly/daily— metrics are per-period values. Budget refers to total campaign spend. A frequency of 3.2 withweeklymeans 3.2 exposures per week.clicks/conversions— points at ascending outcome targets. Used in goal-based planning (e.g., “tell me your conversion goal, I’ll tell you the budget”).package— each point represents a distinct inventory package (e.g., Good/Better/Best tiers). Points are separate products with different inventory compositions, not levels on a spend curve. Used by broadcast TV, audio, and DOOH sellers.
weekly, daily) change how metrics are interpreted. Without a range unit (or with spend), a frequency of 3.2 means 3.2 total campaign exposures. With weekly, it means 3.2 exposures per week.
Forecasts can appear at two levels:
- Proposal-level: aggregate forecast for the entire media plan
- Allocation-level: per-product forecast for individual line items
reach_unit (individuals, households, devices, accounts, cookies) so buyers can compare reach across publishers. GRP-based forecasts (linear TV, radio) use demographic_system and demographic to specify the target demo, following the same pattern as CPP pricing.
When a forecast is based on third-party measurement, the measurement_source field declares which provider’s data was used to produce the numbers. This is distinct from demographic_system, which specifies demographic notation — measurement_source identifies whose data produced the forecast numbers. A forecast can use Nielsen demographic codes (demographic_system: "nielsen") while the impression numbers come from VideoAmp (measurement_source: "videoamp").
Sellers whose forecasts are based on third-party measurement use measured_impressions to express delivery as counted by the measurement_source provider. This is distinct from impressions, which represents ad-server or first-party estimated delivery. The two metrics are independent of the guarantee — measured_impressions can appear on both guaranteed and non-guaranteed forecasts:
- Guaranteed broadcast:
method: "guaranteed"+measured_impressions+measurement_source: "nielsen"— the seller contractually commits to Nielsen-measured delivery - Non-guaranteed CTV:
method: "modeled"+measured_impressions+measurement_source: "videoamp"— VideoAmp-measured estimate, no contractual commitment - Programmatic display:
method: "modeled"+impressions— ad-server counts, no third-party currency needed
measured_impressions and impressions in the same point when the buyer needs both the third-party-measured figure and the ad-server estimate.
Podcast sellers use downloads as their primary delivery currency per IAB Podcast Measurement guidelines, in place of or alongside impressions.
Budget Curve
Multiple forecast points at ascending budget levels show how metrics scale with spend, helping buyers find the optimal investment level:Availability Forecast
For guaranteed and direct-sold inventory, the forecast is an availability check — how much inventory exists on this placement with this targeting in this flight window. Budget is omitted because available inventory doesn’t depend on how much the buyer wants to spend. The seller can includemetrics.spend to express the estimated cost of the available inventory:
CTV with GRP Demographics
TV and audio forecasts usedemographic_system and demographic to specify the target demo, and measurement_source to declare whose audience data the forecast is modeled against:
measurement_source: "nielsen" tells the buyer agent that the GRP and impression numbers are modeled against Nielsen data. The reach_unit: "households" tells buyers this CTV publisher counts reach by household, not individual. A display publisher reporting reach_unit: "devices" is measuring something different — buyers should not directly compare the two reach numbers.
Note that measurement_source and demographic_system can differ. A CTV publisher might use Nielsen’s demographic notation (demographic_system: "nielsen", demographic: "P18-49") while the underlying audience data comes from VideoAmp (measurement_source: "videoamp"). The demographic system specifies the notation; the measurement source specifies whose numbers produced the forecast.
Retail Media with Outcome Forecasts
Retail media publishers can forecast both delivery metrics and conversion outcomes. Outcome metric keys useevent-type values:
impressions and clicks are forecastable-metric values while purchase and add_to_cart are event-type values. Both use ForecastRange (low/mid/high) and coexist in the same metrics map.
Allocation-Level Forecasts
When a proposal includes per-allocation forecasts, buyers can evaluate each product independently:Broadcast Audio Spot Plan
Broadcast and audio publishers can return spot-plan proposals withdaypart_targets on each allocation and weekly frequency projections via forecast_range_unit: "weekly". This pattern lets the publisher solve the optimization problem — the buyer specifies frequency goals, and the publisher returns the plan that achieves them:
forecast_range_unit: "weekly" on each forecast tells the buyer that all metrics are per-week values — frequency of 3.2 means 3.2 exposures per week, not 3.2 over the entire campaign. Budget ($75K) is total campaign spend.
The daypart_targets on each allocation specify the publisher’s recommended time windows. These are the same structure used in targeting for hard daypart constraints — here the publisher is prescribing the spot plan rather than the buyer constraining it.
Note that allocation-level reach doesn’t sum to the proposal level (180K + 120K + 80K > 280K) because of audience overlap across dayparts — the same listener may hear morning drive and afternoon drive spots. The proposal-level forecast accounts for this overlap.
Broadcast TV Package Forecast
Broadcast TV sellers offer distinct inventory packages rather than impressions at variable spend levels. Theforecast_range_unit: "package" tells the buyer that each point is a separate package, not a position on a spend curve. Each point includes a label so the buyer agent can identify and reference individual packages. A broadcaster might offer a daytime rotator, a prime-access + daytime bundle, and a full prime package:
label field lets buyer agents reference packages by name when negotiating or requesting specific options. The measurement_source: "nielsen" tells the buyer agent that the impression and GRP numbers are modeled against Nielsen data, not the broadcaster’s own measurement. The measured_impressions metric expresses delivery as counted by Nielsen — paired with method: "modeled", these are Nielsen-measured estimates. To make them contractual commitments, the seller would use method: "guaranteed" instead.
If packages share the same inventory pool and differ only in volume or mix, use package forecast points on one product. If they represent fundamentally different inventory (different shows, properties, or dayparts with no overlap), create separate products with their own forecasts.
Sellers expressing the same inventory in multiple measurement currencies (e.g., both Nielsen and VideoAmp) should provide separate DeliveryForecast objects, one per measurement_source.
Integration with Discovery
Products are discovered through the Product Discovery process, which uses natural language to match campaign briefs with available inventory. Once products are identified, they can be purchased viacreate_media_buy.
See Also
- Product Discovery - How to discover products using natural language
- Media Buys - How to purchase products
- Targeting - Detailed targeting options
- Creative Formats - Understanding format specifications and discovery