Skip to main content
POST
Search for products across merchant catalogs using keyword-based queries. Use filters to narrow results by domain, price, availability, and variant attributes.

Authentication

This endpoint supports two authentication methods:
For client-side applications (browser, mobile). See Browser Session Authentication.

Request Body

string
required
Search keyword(s). Required for all search requests.
object
Optional filters to narrow search results.
number
default:"20"
Number of results per page. Maximum: 100

Response

array
Array of product objects matching the search criteria. Returns empty array [] when no results found (HTTP 200).
number
Number of results returned in this page
number
Time taken to execute the search query in milliseconds
string
Full URL to fetch the next page of results. Use this URL directly with your authorization header. null when there are no more results.

Error Responses

No results is not an error: When no products match your search criteria, the API returns HTTP 200 with an empty products array. This is standard REST behavior—404 is reserved for “resource not found” (e.g., invalid endpoints), not “no results found”.

Usage Notes

Domain authorization: Search results are limited to merchant domains associated with your account. Requests for unauthorized domains will return empty results. Contact your account manager to request access to additional merchants.
Domain filtering: Use the filters.domains array to search specific merchants:
  • Single merchant: "domains": ["benchmademodern.com"]
  • Multiple merchants: "domains": ["merchant1.com", "merchant2.com", "merchant3.com"]
  • All merchants: omit the domains field entirely
Variant filtering: Use the filters.variants array to filter by product attributes like color, size, or material. Each variant filter specifies an option name and an array of allowed values. Use the Options endpoint to discover available options and values.
Filter matching: Variant filters use exact string matching. The values must match exactly as stored in the product data (e.g., "Blue" will not match "blue" or "Navy").
Pricing: All prices are integers in USD cents (not dollars). "min_price": 100000 filters for 1,000.00+,andpricerange.min:249999means1,000.00+, and `price_range.min: 249999` means 2,499.99 USD. To display: (price / 100).toFixed(2).
Data Types: price_range.min, price_range.max are always integers in cents (e.g., 249999 for $2,499.99). has_available_variants is always a boolean (true or false). These are never returned as strings.
Why cents? Integer cents avoid floating-point precision issues (e.g., 0.1 + 0.2 !== 0.3 in JavaScript). This is the industry standard used by Stripe, PayPal, and other payment APIs.

Example: Search Implementation