Product Discovery
Q: Does get_products require specific parameters like budget, dates, and objectives?
A: Currently, get_products only has three parameters: brief (natural language string), brand, and filters (structured filters). Campaign details like budget, dates, and objectives should be included in the natural language brief.
Future: Structured parameters for budget, dates, objectives, and targeting are being considered to reduce conversational back-and-forth. Track the roadmap for updates.
Current Workaround: Include these details in your brief:
Q: How do I request specific audience targeting in get_products?
A: All targeting requests currently go in the natural language brief. There’s no structured targeting filter yet.
Example:
Q: What does “no brief = standard catalog” mean? We don’t have a standard catalog.
A: When buyers omit thebrief field, they’re requesting your standard catalog - baseline products available to all advertisers without custom recommendations.
If you don’t offer a standard catalog, return an error:
Q: Should buyers call list_creative_formats before or after get_products?
A: After get_products. The recommended flow is:
- Call
get_productswith your campaign brief/filters - Review the products returned (they include
format_idsarrays) - Call
list_creative_formatsfor the specific format IDs you need details on - Verify creative requirements match your capabilities
- Call
create_media_buyfor selected products
Policy Compliance
Q: How do publishers know if there’s an ad policy issue (alcohol, adult content, etc.)?
A: Publishers extract advertiser identity from thebrand field:
- Extract advertiser info from the brand’s
brand.json(resolved viabrand.domain) - Check what’s being promoted from the
brieftext - Apply policy rules based on your publisher policies
- Return appropriate response:
- Allowed: Return products normally
- Blocked: Return empty products array with policy explanation
- Restricted: Indicate manual approval needed
Q: Is the advertiser’s name always shared?
A: Yes, thebrand field is required in both get_products and create_media_buy. It provides the advertiser identity needed for:
- Policy compliance checks
- Business relationship management (KYC)
- Billing and reporting
brand.json (resolved from the domain) provides category and other identity data for automated policy filtering.
Schema and Fields
Q: Why is the filters parameter called an “object”?
A: Because it’s a nested JSON object with multiple optional fields:
Q: Why is it called format_ids instead of ad_units?
A: AdCP uses protocol-agnostic terminology:
format_ids: Structured references to creative format specifications (e.g.,{agent_url: "...", id: "video_30s_hosted"})- Ad units: Platform-specific terminology (like “300x250 banner”)
_ids suffix indicates these are references—use list_creative_formats to get full format objects.
Q: How do I specify what’s being promoted?
A: There are two mechanisms depending on the context:- Advertiser identity →
brand.domain(required onget_productsandcreate_media_buy, resolves via/.well-known/brand.json) - What’s being promoted → Described in the
brieffield for product discovery, or provided via acatalogon creatives
test=false
Brief Processing
Q: What if buyers provide incomplete briefs?
A: Publishers should request clarification when critical information is missing:Q: Should we always ask for clarification or just return products?
A: It depends on your publisher strategy:- High-touch approach: Request clarification for incomplete briefs, engage conversationally
- Self-service approach: Return best-guess products based on available information
Workflow and Integration
Q: When should brand be required vs optional?
A: According to the current spec:
- Required in both
get_productsANDcreate_media_buy
Q: Can buyers cache product responses?
A: Products represent inventory availability which changes over time. Recommendations:- Brief-based discovery: Don’t cache—products are contextually matched to the brief
- Standard catalog: Can cache for short periods (5-15 minutes) if your catalog is stable
- Product details: Cache
product_idmappings but revalidate availability before purchase
Q: How do we handle large product catalogs (1000+ products)?
A: Useproperty_tags instead of full properties arrays:
get_adcp_capabilities, which returns the publisher domains and primary channels the agent represents. This keeps responses lightweight while maintaining full validation capability.
Testing and Validation
Q: How do we test policy compliance?
A: Create test cases with known restricted categories:Q: What should we test in integration testing?
A: Key scenarios to cover:- No brief + filters → Standard catalog
- Brief provided → AI-matched products with
brief_relevance - Blocked advertiser → Policy error
- Incomplete brief → Clarification request
- No products match → Helpful alternative suggestions
- Format filtering → Only matching formats returned
Common Pitfalls
Q: Why aren’t my format filters working?
A: Check that you’re using structuredformat_ids, not strings:
Wrong:
Q: Why do my products not include brief_relevance?
A: brief_relevance is only included when a brief parameter is provided. Standard catalog requests (no brief) don’t include this field since products aren’t contextually matched.
Q: Should I validate authorization in get_products?
A: Yes! Buyer agents must validate sales agent authorization before purchasing:
- Get properties from products (or resolve
property_tags) - Fetch
/.well-known/adagents.jsonfrom eachpublisher_domain - Verify the sales agent URL appears in
authorized_agents - Reject products from unauthorized agents
Terminology
Q: What’s the difference between “product” and “package”?
A:- Product: A sellable unit of inventory from the publisher (returned by
get_products) - Package: A buyer’s selection from available products, sent in
create_media_buy
Q: What’s the difference between “delivery” and “distribution”?
A:- Delivery type:
"guaranteed"vs"non_guaranteed"(whether impressions are guaranteed) - Distribution: How creatives are distributed to ad servers (covered by creative agents, not media buying)
Q: What’s “TMP” / “Trusted Match Protocol”?
A: The Trusted Match Protocol (TMP) is AdCP’s real-time execution layer. It determines which pre-negotiated packages activate at impression time using two structurally separated operations: Context Match (content relevance, no user identity) and Identity Match (user eligibility, no page context). The publisher joins both responses locally. TMP enables cross-publisher frequency capping, brand suitability, and audience targeting across web, mobile, CTV, AI assistants, and retail media. You may also see references to AXE (Agentic eXecution Engine) — that was TMP’s predecessor. Existing AXE integrations still work, but new implementations should use TMP. See AXE documentation for legacy reference.Need More Help?
If your question isn’t answered here:- Check the Task Reference for detailed API documentation
- Review Brief Expectations for discovery guidance
- See Media Products for product model details
- Open a GitHub issue for specification clarifications