Skip to main content
The Platform API currently has two active versions. Build new integrations against the /v3 endpoints — /v3 is the successor to /v2. /v2 is expected to be deprecated within roughly 6 months and /v3 within roughly 9 months, with a v4 API expected in Q4. These are expectations, not committed dates — confirm timelines with your Depict contact before planning a migration deadline.
Search on the Platform API consists of these endpoints:
/v3/search/related returns the same response shape as /v3/recommend/products, not a search response. Its displays carry recommendation_id (not search_result_id) for tracking.

Limits and behavior

  • Every response is a single JSON body. No search endpoint streams; there is no SSE or chunked delivery.
  • Two pagination styles exist — cursor-based and page-based. They are mutually exclusive: mixing fields from both in one request returns 400.
  • Cursor-based limit: 1–250. Page-based hits_per_page: 1–200 and required whenever page is sent.
  • merchant, market and locale are required on every request. Enumerate valid values via /v3/markets and /v3/locales.
  • Unknown request fields are silently ignored — a misspelled field name is dropped, not rejected.
  • Available filters and sorts are per-merchant configuration. Do not hardcode them: read them off the filters and sorts arrays in each response.
  • GET /v2/search/content (dedicated content search) has no v3 equivalent. Content results are available only as content_search_links inside /v3/search/results responses.
  • Suggestions responses carry a one-hour cache header; limit for suggestions is 1–10, default 3.
  • Response fields with null values are omitted from the JSON (exclude_none serialization).

Search results

POST /v3/search/results with a JSON body: Example request:

Response

Pagination

Rules for how the two styles interact:
  • The styles are mutually exclusive. A request that mixes fields from both returns 400 with {"error": "Cannot mix cursor-based and page-based pagination."}.
  • page without hits_per_page returns 400.
  • An undecodable cursor returns 400 with {"error": "Invalid pagination cursor."}.
  • The response mirrors the style used: page-based requests always echo page (defaulting to 1) and omit cursor; cursor-based requests omit page.

Filters

Each response’s filters array describes the available filters. To apply a filter, send its field, op and selected data in the next request. The schema requires field and op. It permits omitted or null data, but that does not select a value. An empty selection does not constrain results. A filter object: The filter type is in meta.type:

Range filters

data is [min, max]. meta carries the selectable bounds min and max, plus optional unit and currency for rendering.

Value filters

data is the list of selected values. meta.values lists the selectable values, meta.counts the result count per value, and meta.names optional display names.

Hierarchical filters

data is a list of paths, where each path is the list of node titles from the root to a selected node. If a parent is selected, all of its children must also be included as selected. Example: a category tree where the user selected Shirts and Jeans:
  1. Clothes
    1. Shirts
      1. Cotton Shirts
      2. Linen Shirts
    2. Pants
      1. Jeans
      2. Shorts
Selecting Shirts (a parent) implies both of its children, so the corresponding data is:
Invalid filter, market or locale combinations return 422 with {"error": "Invalid request parameters. Please check your filters, market, and locale."}.

Sorting

Each response’s sorts array lists the available sorting methods for your catalog; the default is relevance. To sort, send one of them back as sort: {"field": "...", "order": "asc" | "desc"}. The meta object on each sort (title, selectable orders, display names) is for rendering and does not need to be sent back.

Query suggestions

GET /v3/search/suggestions with query-string parameters: The response is {"suggestions_request_id": "...", "suggestions": [...]} where each suggestion is one of two shapes:
On v2 the suggested-query field was named title and listing suggestions were category suggestions. On v3 the field is query and suggestions reference listings.
Suggestions responses carry a one-hour cache header. If the suggestions index for the requested locale has not been built yet, the endpoint returns 404 with an {"error": ...} body.

Content results

There is no dedicated content-search endpoint on v3 — GET /v2/search/content has no successor. Content results arrive as the content_search_links array on /v3/search/results responses. Each element:

Errors

Handled unexpected search errors include an Error ID. Give that ID to Depict support. Other failures can have a different body. Check the HTTP status before you read response fields. Apply a request timeout in your storefront. Keep the page usable if the request fails. Depict does not specify a storefront timeout or a rate-limit policy on this page.

Product card data

displays contains merchant-specific product objects. Confirm your display mapping with Depict before you assign types to these objects. If your mapping uses variant_displays and variant_index, select the card variant with display.variant_displays[display.variant_index]. The display transformer guide shows this structure and the usual card fields:
  • product_id identifies the selected variant for product page and add-to-cart tracking.
  • title supplies the card title.
  • image_urls is an array of image URLs. Some mappings use one image_url instead.
  • sale_price and original_price supply the resolved prices.
  • page_url can come from your display transformer. It is not guaranteed in the raw response.
  • If your mapping supplies in_stock, use it for the card’s availability state.
Preserve search_result_id on the outer display for card tracking. Use the returned prices for the requested market and locale. Keep the API’s product order. If a returned variant is unavailable, disable its add-to-cart control. Do not infer availability from the image or price. Provide an image placeholder when no usable image is present.