Skip to main content
POST
Search Products
Before calling this endpoint, make sure you’ve generated an API token and picked the correct domain. See Authentication & Base URLs. Send facets, filters, and other structured fields as real JSON here. The GET variant accepts the same fields but requires them JSON-encoded into the query string.

Headers

x-tenant-id
string
required

Identifies your organization. Ensures data isolation per tenant.

x-workspace-id
string
required

Identifies the workspace within your organization. Scopes resources to a specific workspace.

x-environment-id
string
required

Identifies the environment you are targeting. Scopes the call to a specific deployment environment.

Query Parameters

catalog_id
string<uuid>
required

The catalog to search. Every request is scoped to a single catalog.

q
string

The shopper's search term. Leave it out to browse instead of search — combine that with category_id or collection_id to list everything in a category or collection.

locale
string

Locale to run the search in, such as en-us. Determines which localized product content is matched and returned.

category_id
string

Restrict results to a single category, identified by its id in your commerce platform.

collection_id
string<uuid>

Restrict results to a single Experro collection, identified by its Experro collection id.

category_name
string

Restrict results to a single category by name rather than id. Use this when you have the category name but not its id.

Body

application/json
facets
object[]

Facet selections used to narrow the result set. One entry per faceted field. A field that is not a configured facet on the catalog is silently ignored, so check the facets returned in the response for the field names this catalog uses — a price facet may be calculated_price rather than price.

Example:
filters
object[]

Filter criteria applied to the result set. Multiple entries are combined with AND, so for several conditions just add several entries. Use a group inside an entry only when you need OR logic.

fields
string[]

Which product fields to return on each record. Requesting only the fields your page renders keeps responses small; omit it to get the default set.

selected_variant_fields
string[]

Which variant fields to return inside selected_variant on each record.

skip
integer

How many matching products to skip before the first one returned. Combine with limit to page through results.

limit
integer

How many products to return in this page of results.

sort_by
string

Name of the field to sort by, such as price. Leave it out to sort by relevance.

Example:

"price"

sort_order
enum<string>
default:desc

Which direction to sort in. Only meaningful together with sort_by.

  • asc — lowest to highest.
  • desc — highest to lowest. This is the default.

Case-insensitive; any other value falls back to descending.

Available options:
asc,
desc
include_count
boolean

Return the total number of matching products in meta.total_count. Leave it off if you only need the current page.

is_auto_spell_correction
boolean

Correct likely misspellings in q before searching, so a query such as shose still finds shoes.

is_auto_spell_correction_zero_results
boolean

Only apply spell correction when the original query returns nothing. Use this when you would rather show exact matches first and fall back to correction.

did_you_mean_limit
integer

How many "did you mean" alternatives to return in meta.did_you_mean.

session_id
string

Identifier for the shopper's current session. Groups their search activity for analytics and personalization.

user_id
string

Identifier for the shopper, used for personalization and recent-search history. This is the body field, separate from any x-user-id header.

currency
string

Currency to return prices in, such as USD.

currency_conversion_rate
number

Rate used to convert prices into currency when the catalog stores them in a different one.

location
string

Shopper location, used for location-aware results such as store-specific inventory or pricing.

price_group
string

Price group to resolve prices against, for customer-group or B2B pricing.

out_of_stock
enum<string>

What to do with products that are out of stock.

  • Include — included and ranked normally.
  • Exclude — removed from results entirely.
  • Burry — included but ranked lower.
Available options:
Include,
Exclude,
Burry
auto_redirect
boolean

Apply any configured query redirect that matches q. When one matches, the target is returned in meta.redirect_url so your storefront can redirect the shopper.

skip_facet_generation
boolean

Skip building facets for this request. Facets come back null and the response is faster — useful when you only need product records.

variation_map_group_by
object[]

Group variants of the same product together so you can render one card per color or size rather than one per variant.

variation_map_group_values
object[]

Which values to compute for each variation group, such as the first image or the lowest price. Results appear in variants_map on each record.

hero_variant_option_override
object

Force which variant option is shown as the product's hero image, overriding the normal selection logic.

Response

Success.

The product-search payload. Returned at the top level, with no envelope.

records
object[]

Ranked product records for the current page.

facets
object[] | null

Facets generated for the result set. Null when skip_facet_generation is true.

banners
object[] | null

Banners to render alongside the results. Null when none apply.

meta
object

Result metadata for the query.