Wire response ≠ model context
The single most important point: the bytes on the wire are not what your model has to consume. AdCP responses are structured data. An MCP response arrives asstructuredContent — typed JSON that the client parses before any model sees it. An A2A response pairs a human-readable TextPart with an authoritative DataPart. In both cases, a well-built client stores the full response and projects or summarizes it before prompting the next model turn.
Ask the seller to curate — don’t pull the feed
Usebuying_mode: "brief" with a tight pagination.max_results to get curated recommendations:
buying_mode: "wholesale" unless you’re building a catalog mirror. Wholesale enumerates the seller’s entire product feed, paginated. It exists for storefronts and feed synchronization, not for discovery. If your agent is paginating through hundreds of wholesale results to find a few good ones, switch to brief mode and let the seller do the filtering.
Use buying_mode: "refine" when iterating on a previous brief response — adjusting budget, narrowing geography, or swapping out products. Refine operates on the seller’s existing curation rather than re-running discovery from scratch.
fields selector for lightweight discovery
When you only need a subset of product data, pass fields to restrict the response:
- Your agent is scanning multiple sellers and only needs IDs and prices for initial comparison
- You want to skip heavy fields like
product_card,product_card_detailed,placements, or signal metadata - You’re building a summary view before drilling into specific products
fields, the seller returns the full product object — including visual card definitions, placement specs, and any bundled signal metadata. For a first-pass discovery across multiple sellers, that’s more data than you need.
Pagination for cardinality control
Allget_products modes support cursor-based pagination:
| Parameter | Description |
|---|---|
pagination.max_results | Maximum products per page (1–100, default 50) |
pagination.cursor | Opaque cursor from the previous response |
| Field | Description |
|---|---|
pagination.has_more | Whether additional pages exist |
pagination.cursor | Cursor for the next page |
pagination.total_count | Total products in the result set (optional) |
max_results to the number of options your agent can actually reason about. Five curated products are more useful than fifty if the model is going to compare them anyway.
For wholesale mode, pagination walks the feed. Pass cursor from each response to get the next page. If you’re maintaining a mirror, check wholesale_feed_versioning to skip unchanged feeds entirely.
Truncation flags on delivery
get_media_buy_delivery returns breakdown arrays (by geo, by creative, by day, etc.) that can grow large. Each breakdown array has a sibling boolean flag — by_geo_truncated, by_creative_truncated, etc. — that tells you whether the returned rows are the complete set or just the top-N:
| Flag value | Meaning |
|---|---|
false | All rows are present |
true | Additional rows exist beyond what was returned |
true, the returned rows are sorted by the requested metric descending — you have the most significant breakdowns, and the tail is omitted. This is by design: delivery breakdowns are for optimization decisions, not archival reporting. If you need the full dataset, use the seller’s native reporting API.
Putting it together
A token-efficient AdCP integration follows this pattern:- Discover with
brief+fields+ tightmax_results. Get curated products with only the fields you need for initial comparison. - Refine with
refinemode. Iterate on the seller’s curation rather than re-querying. - Store raw responses client-side. Don’t feed full product objects into the model context. Extract what matters, summarize the rest.
- Read truncation flags before paginating delivery. If
by_geo_truncated: false, you already have everything — no need for follow-up calls. - Use wholesale only for feed sync. If your use case is catalog mirroring, wholesale + conditional versioning is the right tool. For everything else,
briefis cheaper.
get_products reference
Full request/response schema including
fields, buying_mode, and pagination.Delivery reporting
Breakdown arrays, truncation flags, and sort semantics.
How agents communicate
MCP vs A2A transport and how responses are structured.
Media products
Product structure,
product_card vs product_card_detailed, and rendering.