POST /api/v2/buyer/discovery/discover-products
Fans a brief out to every reachable sales agent and returns grouped products, summary stats, budget context, and any seller proposals. If you omit discoveryId, a new session is created and its ID is returned. Pass an existing discoveryId to re-run or refine in place. This first call does the heavy work (LLM enrichment + agent fan-out); use Browse products to page the cached result cheaply.
Request
Parameters
| Field | Type | Required | Notes |
|---|---|---|---|
advertiserId | integer | Yes | Resolves the brand reference used to score agent results |
discoveryId | string | No | Reuse an existing session. Required when sending refine |
campaignId | string | No | Seed brief, flight dates, and budget from a campaign; inline values override |
proposalCode | string | No | Storefront-issued code (e.g. PRP-XK4A29). Short-circuits discovery and returns the seller’s saved snapshot; other filters are ignored |
brief | string | No | Natural-language search context (max 5000 chars) |
budget | number | No | Total budget in account currency; drives budget context and proposals |
channels | string[] | No | display, olv, ctv, social, or video (alias for olv). Default ["display","olv","ctv","social"] |
countries | string[] | No | ISO 3166-1 alpha-2 codes. Defaults to brand agent countries |
flightDates | object | No | { startDate, endDate }, ISO 8601 datetimes; filters by agent availability |
publisherDomain | string | No | Filter to a single publisher domain |
pricingModel | enum | No | cpm, vcpm, cpc, cpcv, cpv, cpp, or flat_rate |
storefrontIds | integer[] | No | Restrict to specific storefronts (max 50). OR-combined with storefrontNames |
storefrontNames | string[] | No | Restrict by case-insensitive name substring (max 50) |
groupLimit | integer | No | Max product groups per page (max 10). Default 10 |
productsPerGroup | integer | No | Max products per group (max 15). Default 10 |
groupOffset / productOffset | integer | No | Pagination cursors. Default 0 |
debug | boolean | No | Include per-agent ADCP debug logs for failed agents |
refine | array | No | Refinement directives (1–100). Requires discoveryId |
Response
discoveryId — every subsequent operation references it. When you send refine, the seller’s per-instruction reply comes back under refinementApplied matched by position, each with status of applied, partial, or unable.
Errors
400 VALIDATION_ERROR— missingadvertiserId,refinesent withoutdiscoveryId, or malformedflightDates.404 NOT_FOUND—advertiserIdorcampaignIdnot visible to the authenticated customer.
Related
Discovery overview
Sessions, refinement, proposals, and storefronts
Browse products
Page the cached result without a re-run
Add products
Build a selection from discovered products
Apply proposal
Accept a seller’s full allocation