Skip to main content
Discover available advertising products based on campaign requirements using natural language briefs or structured filters. Authentication: Optional (returns limited results without credentials) Response Time: ~60 seconds (AI inference with back-end systems) Request Schema: /schemas/3.0.19/media-buy/get-products-request.json Response Schema: /schemas/3.0.19/media-buy/get-products-response.json

Quick Start

Discover products with a natural language brief:

Using Structured Filters

You can also use structured filters instead of (or in addition to) a brief. In brief mode, filters act as hard constraints on top of the publisher’s curation — the brief describes intent, filters enforce requirements:

Request Parameters

Property GovernanceThe property_list filter references a property list created via create_property_list on a property governance agent. Property lists define which publisher properties meet compliance requirements — COPPA-certified sites, sustainability-scored inventory, brand-safe publishers, etc.To use property list filtering:
  1. Call get_adcp_capabilities on a property governance agent to discover available property_features
  2. Create a property list via create_property_list with your feature requirements
  3. Pass the resulting property_list_id to get_products to filter inventory
The seller must declare features.property_list_filtering: true in get_adcp_capabilities to support this filter. See the Property Governance overview for the full workflow.

Filters Object

Budget Range Object

*At least one of min or max must be specified.

Refine array

The refine array is a list of change requests. Each entry declares a scope and what the buyer is asking for. At least one entry is required. The seller considers all entries together when composing the response, and replies to each via refinement_applied. Each entry is a discriminated union on scope:

scope: “request”

scope: “product”

scope: “proposal”

refinement_applied (response)

When the seller receives a refine array, the response includes refinement_applied — an array matched by position. Each entry reports whether the ask was fulfilled:

Catalog discovery

Pass a catalog to find advertising products that can promote your catalog items. The seller matches your catalog items against its inventory and returns products where matches exist. Supports all catalog types — a product catalog finds sponsored product slots, a job catalog finds job ad products, a flight catalog finds dynamic travel ads. The catalog field uses the same Catalog object used throughout AdCP. You can reference a synced catalog by catalog_id, provide inline items, or use selectors to filter: Products in the response include catalog_types (what catalog types they support) and catalog_match (which items matched).

Response

Returns an array of products and optionally proposals.

Products Array

Proposals Array (Optional)

Publishers may return proposals alongside products - structured media plans with budget allocations. See Proposals for details.

Pagination

For large product catalogs, use cursor-based pagination: Pagination is optional. When omitted, the server returns all results (or a server-chosen default page). When the response includes pagination.has_more: true, pass pagination.cursor in the next request to get the next page.

Response Metadata

incomplete array

When the seller cannot complete all work within the time_budget (or due to its own internal limits), the response includes incomplete — an array declaring what is missing. Buyers can use estimated_wait to decide whether to retry with a larger budget. See schema for complete field list: get-products-response.json

Common Scenarios

Time-budgeted discovery

Declare a time budget when you need fast results and can accept partial data. The seller returns what it can within the budget and declares what is incomplete:
A response with incomplete data — products are returned but some scopes are missing:
test=false

Standard Catalog Discovery

Multi-Format Discovery

Budget and Date Filtering

Property Tag Resolution

Guaranteed Delivery Products

Standard Formats Only

Catalog-driven discovery

Use catalog with a brand to discover advertising products that can promote your catalog items. The seller matches your items against its inventory and returns products where matches exist:
You can also use GTIN matching, reference a synced catalog, or discover products for other catalog types:

Property List Filtering

AdCP 3.0 - Property list filtering requires governance agent support.
Filter products to only those available on properties in your approved list:
Note: If property_list_applied is absent or false, the sales agent did not filter products. This can happen if:
  • The agent doesn’t support property governance features
  • The agent couldn’t access the property list
  • The property list had no effect on the available inventory

Property Targeting Behavior

Products have a property_targeting_allowed flag that affects filtering:
  • property_targeting_allowed: false (default): Product is “all or nothing” - excluded unless your list contains all of its properties
  • property_targeting_allowed: true: Product is included if there’s any intersection between its properties and your list
This allows publishers to offer run-of-network products that can’t be cherry-picked alongside flexible inventory that buyers can filter. See Property Targeting for more details and Property Governance for more on property lists.

Refinement

After initial discovery, use buying_mode: "refine" to iterate on specific products and proposals. The refine array is a list of change requests — each entry declares a scope and what the buyer is asking for. The seller returns updated products with revised pricing and configurations, plus refinement_applied acknowledging each ask. See the Refinement guide for the full walkthrough: scope types, action semantics, seller responses, and common patterns. The parameter shape is defined in the Refine array section above. Minimal example:
test=false
Key rules to know before sending:
  • refine is only valid in refine mode. Requests that include this field in brief or wholesale mode are rejected with INVALID_REQUEST.
  • Filters are absolute, not deltas. Always send the full filter set you want applied.
  • Proposals are ephemeral. Proposals typically include an expires_at timestamp. After expiration, the seller returns PROPOSAL_EXPIRED.
  • Product IDs are stable catalog identifiers. Custom products (is_custom: true) may have an expires_at timestamp, after which refinement returns PRODUCT_NOT_FOUND.

Error Handling

Authentication Comparison

See the difference between authenticated and unauthenticated access:
Key Differences:
  • Product Count: Authenticated access returns more products, including private/custom offerings
  • Pricing Information: Only authenticated requests receive detailed pricing options (CPM, CPCV, etc.)
  • Targeting Details: Custom targeting capabilities may be restricted to authenticated users
  • Rate Limits: Unauthenticated requests have lower rate limits

Authentication Behavior

  • Without credentials: Returns limited catalog (standard catalog products), no pricing, no custom offerings
  • With credentials: Returns complete catalog with pricing and custom products
See Authentication Guide for details.

Asynchronous Operations

Most product searches complete immediately, but some scenarios require asynchronous processing. When this happens, you’ll receive a status other than completed and can track progress through webhooks or polling.

When Search Runs Asynchronously

Product search may require async processing in these situations:
  • Complex searches: Searching across multiple inventory sources or custom curation
  • Needs clarification: Your brief is vague and the system needs more information
  • Custom products: Bespoke product packages that require human review

Async Status Flow

Immediate Completion (Most Common)

Needs Clarification

When the brief is unclear, the system asks for more details:
Continue the conversation with the same context_id:

Complex Search (With Webhook)

For searches requiring deep inventory analysis, configure a webhook:

Status Overview

Note: For the complete status list see Task Lifecycle. Most searches complete immediately. Async processing is only needed for complex scenarios or when the system needs your input.

Next Steps

After discovering products:
  1. Review Options: Compare products, pricing, and targeting capabilities
  2. Create Media Buy: Use create_media_buy to execute campaign
  3. Prepare Creatives: Use list_creative_formats to see format requirements
  4. Upload Assets: Use sync_creatives to provide creative assets

Learn More