get_products
Discover available advertising products based on campaign requirements, using natural language briefs or structured filters. Authentication: Optional (returns limited results without credentials - see Authentication) Response Time: ~60 seconds (inference/RAG with back-end systems) Pricing Information: Products include pricing options that buyers select when creating media buys. See Pricing Models for complete details on CPM, CPCV, CPP, and other pricing models. Format Discovery: Products return format references (IDs only). Uselist_creative_formats to get full format specifications. See Creative Lifecycle for the complete workflow.
Request Schema: https://adcontextprotocol.org/schemas/v1/media-buy/get-products-request.json
Response Schema: https://adcontextprotocol.org/schemas/v1/media-buy/get-products-response.json
Authentication Behavior
- Without credentials: Returns limited catalog (run-of-network products), no pricing information, no custom offerings
- With credentials: Returns complete catalog, pricing details (CPM), custom products, and full targeting options
Request Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
brief | string | No | Natural language description of campaign requirements |
brand_manifest | BrandManifest | string | No | Brand information manifest providing brand context, assets, and product catalog. Can be provided inline as an object or as a URL reference to a hosted manifest. Sales agents can decide whether brand context is necessary for product recommendations. |
filters | Filters | No | Structured filters for product discovery (see Filters Object below) |
Filters Object
| Parameter | Type | Required | Description |
|---|---|---|---|
delivery_type | string | No | Filter by delivery type: "guaranteed" or "non_guaranteed" |
is_fixed_price | boolean | No | Filter for fixed price vs auction products |
format_types | string[] | No | Filter by format types (e.g., ["video", "display"]) |
format_ids | FormatID[] | No | Filter by specific structured format ID objects |
standard_formats_only | boolean | No | Only return products accepting IAB standard formats |
min_exposures | integer | No | Minimum exposures/impressions needed for measurement validity |
Response (Message)
The response includes a human-readable message that:- Summarizes products found (e.g., “Found 3 premium video products matching your requirements”)
- Explains why products match the brief
- Requests clarification if needed
- Explains policy restrictions if applicable
- MCP: Returned as a
messagefield in the JSON response - A2A: Returned as a text part in the artifact
Response (Payload)
Products include EITHERproperties (for specific property lists) OR property_tags (for large networks), but never both.
Option A: Direct Properties
Option B: Property Tags (for Large Networks)
Field Descriptions
- product_id: Unique identifier for the product
- name: Human-readable product name
- description: Detailed description of the product and its inventory
- pricing_options: Array of available pricing models for this product. Each option has a unique
pricing_option_idthat buyers reference increate_media_buy. See Pricing Models for complete documentation of supported pricing models (CPM, CPCV, CPP, CPC, vCPM, flat_rate). - properties: Array of specific advertising properties covered by this product (see Property Schema)
- property_type: Type of advertising property (“website”, “mobile_app”, “ctv_app”, “dooh”, “podcast”, “radio”, “streaming_audio”)
- name: Human-readable property name
- identifiers: Array of identifiers for this property
- type: Type of identifier (e.g., “domain”, “bundle_id”, “roku_store_id”, “podcast_guid”)
- value: The identifier value. For domain type:
"example.com"matches www.example.com and m.example.com only;"subdomain.example.com"matches that specific subdomain;"*.example.com"matches all subdomains
- tags: Optional array of tags for categorization (e.g., network membership, content categories)
- publisher_domain: Domain where adagents.json should be checked for authorization validation
- property_tags: Array of tags referencing groups of properties (alternative to
propertiesarray)- Use
list_authorized_propertiesto resolve tags to actual property objects - Recommended for products with large property sets (e.g., radio networks with 1000+ stations)
- Use
- format_ids: Array of supported creative format ID objects (structured with
agent_urlandidfields) - uselist_creative_formatsto get full format details - delivery_type: Either
"guaranteed"or"non_guaranteed" - is_fixed_price: Whether this product has fixed pricing (true) or uses auction (false)
- cpm: Cost per thousand impressions (for guaranteed/fixed price products)
- currency: ISO 4217 currency code (e.g., “USD”, “EUR”, “GBP”)
- min_spend: Minimum budget requirement
- estimated_exposures: Estimated exposures/impressions for guaranteed products (optional)
- floor_cpm: Minimum CPM for non-guaranteed products - bids below this are rejected (optional)
- recommended_cpm: Recommended CPM to achieve min_exposures target for non-guaranteed products (optional)
- measurement: Included measurement capabilities (optional)
- type: Type of measurement (e.g., “incremental_sales_lift”, “brand_lift”, “foot_traffic”)
- attribution: Attribution methodology (e.g., “deterministic_purchase”, “probabilistic”)
- window: Attribution window (e.g., “30_days”, “7_days”)
- reporting: Reporting frequency and format (e.g., “weekly_dashboard”, “real_time_api”)
- reporting_capabilities: Automated reporting capabilities (optional)
- available_reporting_frequencies: Supported frequencies for webhook-based reporting (e.g., [“hourly”, “daily”, “monthly”])
- expected_delay_minutes: Expected delay in minutes before reporting data is available (e.g., 240 for 4 hours, 300 for 5 hours)
- timezone: Timezone for reporting periods - critical for daily/monthly alignment (e.g., “UTC”, “America/New_York”, “Europe/London”)
- supports_webhooks: Whether webhook-based reporting notifications are available
- available_metrics: Metrics available in reporting - impressions and spend always implicitly included (e.g., [“impressions”, “spend”, “clicks”, “video_completions”, “conversions”])
- creative_policy: Creative requirements and restrictions (optional)
- co_branding: Co-branding requirement (“required”, “optional”, “none”)
- landing_page: Landing page requirements (“any”, “retailer_site_only”, “must_include_retailer”)
- templates_available: Whether creative templates are provided
- is_custom: Whether this is a custom product
- brief_relevance: Explanation of why this product matches the brief (only included when brief is provided)
Property Tag Resolution
When products useproperty_tags instead of full properties arrays, buyer agents must resolve the tags to actual property objects using list_authorized_properties.
Resolution Process
- Call list_authorized_properties: Get all properties from the sales agent (cache this response)
- Filter by tags: Find properties where the
tagsarray includes the referenced tags - Use for validation: Use the resolved properties for authorization validation
Example
Product with tags:Buyer Agent Validation
IMPORTANT: Buyer agents MUST validate sales agent authorization before purchasing inventory to prevent unauthorized reselling.Validation Requirements
- Get Properties: For each product, get property objects either:
- Directly from the
propertiesarray, OR - By resolving
property_tagsvialist_authorized_properties
- Directly from the
- Check Publisher Domains: For each property, fetch
/.well-known/adagents.jsonfrompublisher_domain - Validate Domain Identifiers: For website properties, also check each domain identifier
- Validate Agent: Confirm the sales agent URL appears in
authorized_agents - Scope Matching: Compare
authorized_fordescription with product details - Reject Unauthorized: Decline products from unauthorized agents
Example Validation
Product Response:Domain Matching Examples
Base Domain Matching
newssite.com, www.newssite.com, m.newssite.com
Specific Subdomain Matching
sports.newssite.com only
Wildcard Subdomain Matching
sports.newssite.com, finance.newssite.com, etc.) but not the base domain
Combined Authorization Strategy
- Fetch
yahoo.com/.well-known/adagents.json(frompublisher_domain) - Also validate domain identifiers: check
yahoo.comandfinance.yahoo.com - Verify sales agent is authorized in adagents.json
- Validate scope matches product description
Domain Matching Examples
When validating authorization, domain matching follows specific rules for identifier values:Base Domain Matching
www.nytimes.com, m.nytimes.comDoes NOT Match:
cooking.nytimes.com, games.nytimes.com
Specific Subdomain Matching
cooking.nytimes.com onlyDoes NOT Match:
www.nytimes.com, games.nytimes.com
Wildcard Subdomain Matching
cooking.nytimes.com, games.nytimes.com, travel.nytimes.comDoes NOT Match:
www.nytimes.com, nytimes.com, subdomain.cooking.nytimes.com
Protocol-Specific Examples
The AdCP payload is identical across protocols. Only the request/response wrapper differs.MCP Request
MCP Response
A2A Request
A2A supports both natural language and explicit skill invocation:Natural Language Invocation
Explicit Skill Invocation
A2A Response
A2A returns results as artifacts with text and data parts:Key Differences
- MCP: Direct tool call with arguments, returns flat JSON response
- A2A: Message-based invocation (natural language or explicit skill with parameters), returns artifacts with text and data parts
- Payload: The
parametersfield in A2A explicit invocation contains the exact same structure as MCP’sarguments
Minimum Exposures for Measurement
When buyers specifymin_exposures in the request, products are filtered to only include those that can deliver the required volume for measurement validity.
Guaranteed vs Non-Guaranteed Products
Guaranteed products provide fixed pricing and predictable delivery:cpm: Fixed cost per thousand impressionsestimated_exposures: Total exposures you can expect with your budget
floor_cpm: Minimum bid that will be acceptedrecommended_cpm: Suggested bid to win enough inventory to meet min_exposures target
Example: Requesting Minimum Exposures
Request:Scenarios
Request with Natural Language Brief
Request for Run-of-Network (No Brief)
Request with Structured Filters
Retail Media Request
Response - Run-of-Network (No Recommendations)
Message: “Found 5 run-of-network products for maximum reach. These are our broadest inventory pools optimized for scale.” Payload:Response - Products Found with Brief
Message: “I found 3 premium sports-focused products that match your requirements. Connected TV Prime Time offers the best reach at $45 CPM with guaranteed delivery. All options support standard video formats and have availability for your Nike campaign.” Payload:Response - Retail Media Products
Message: “I found 3 products leveraging our pet shopper data. The syndicated Pet Category audience offers the best value at 10K minimum. For more precision, our Custom Competitive Conquesting audience targets shoppers buying competing brands at 50K minimum. All products include incremental sales measurement and automated daily reporting.” Payload:Response - Clarification Needed
Message: “I’d be happy to help find the right sports inventory for your Nike campaign. To provide the best recommendations, could you share:\n\n• What’s your campaign budget?\n• When do you want the campaign to run?\n• Which geographic markets are you targeting?\n• What are your success metrics (awareness, conversions, etc.)?” Payload:Policy Compliance Responses
When the promoted offering is subject to policy restrictions, the response will indicate the compliance status:Blocked Advertiser Category
Message: “I’m unable to offer products for this campaign. Our publisher policy prohibits alcohol advertising without age verification capabilities, and we don’t currently support age-gated inventory. You may want to explore other publishers who specialize in age-restricted content.” Payload:Restricted Category (Manual Approval Required)
Message: “Cryptocurrency advertising requires manual approval on our platform. While I can’t show available products yet, our sales team can work with you to review your campaign and potentially unlock inventory. Please reach out to sales@publisher.com to start the approval process.” Payload:Usage Notes
- The
brieffield is optional - omit it to signal a run-of-network request - No brief = Run-of-network: Publisher returns broad reach products, not the entire catalog
- Format filtering ensures advertisers only see inventory that matches their creative capabilities
- If no brief is provided, returns run-of-network products (high-volume, broad reach inventory)
- The
brief_relevancefield is only included when a brief parameter is provided - Products represent available advertising inventory with specific targeting, format, and pricing characteristics
- The
messagefield provides a human-readable summary of the response - Publishers may request clarification when briefs are incomplete
Brief Requirements
For comprehensive guidance on brief structure and expectations, see the Brief Expectations documentation. Key points:- Optional: The
brieffield - include for recommendations, omit for run-of-network - Run-of-Network: Omit brief to get broad reach products (not entire catalog)
- Recommendations: Include brief when you want publisher help selecting products
- Clarification: Publishers may request additional information when brief is provided but incomplete Two valid approaches:
- No brief + filters = Run-of-network products (broad reach inventory)
- Brief + objectives = Targeted recommendations based on campaign goals
Discovery Workflow
Two-Step Format Discovery:get_products returns format references (IDs only), requiring list_creative_formats to get full specifications.
1. Format Discovery
Start by understanding available formats:2. Product Discovery with Format Filtering
Use format knowledge to filter products:3. Product Review
The system returns matching products with all details needed for decision-making:- Product specifications
- Pricing information
- Available targeting
- Format references (use
list_creative_formatsfor full creative requirements)
4. Custom Product Generation
For unique requirements, systems can implement custom product generation, returning products withis_custom: true.
Implementation Guide
Step 1: Implement Product Catalog
Create a product catalog that represents your available inventory:Step 2: Implement Natural Language Processing
Theget_products tool needs to interpret briefs and filter products:
Step 3: Run-of-Network Filtering
When no brief is provided, filter for broad reach products:Step 4: AI-Powered Filtering and Message Generation
Implement the AI logic to match briefs to products and generate helpful messages:Step 4: Brief Processing
Implement the AI logic to match briefs to products:Best Practices
1. Brief Interpretation
- Extract Key Elements: Parse briefs for targeting, budget, timing, and objectives
- Handle Ambiguity: Ask for clarification or provide multiple options
- Learn from History: Use past campaigns to improve matching
2. Product Matching
- Multi-Factor Scoring: Consider format, targeting, budget, and timing
- Explain Matches: Provide clear reasons why products were recommended via
brief_relevance - Fallback Options: Always provide alternatives if perfect matches aren’t found
3. Performance Optimization
- Cache Results: Cache brief interpretations for similar queries
- Batch Processing: Process multiple briefs efficiently
- Feedback Loop: Use performance data to improve recommendations
Principal-Specific Products
Implement principal-specific product visibility:Error Handling
Common error scenarios and handling:Testing Discovery
Test your discovery implementation thoroughly:Integration with Media Buy Flow
Discovery is just the first step. Ensure smooth transitions to the next phases:- Discovery →
get_productsfinds relevant inventory - Purchase →
create_media_buyexecutes the campaign - Creative →
sync_creativesuploads assets - Monitor → Track delivery and optimize