Skip to content
Menu
All API groups

Search

Suggest, search, recommend. Public key.

4 endpoints.

GET/v1/suggest

Suggestions while typing (never billed)

Needs a key or a dashboard session

Parameters

NameInTypeRequiredDescription
qquerystringyesmax length 128
langquerystringno`auto` or a tenant locale. · default "auto" · pattern ^(auto|[a-z]{2})$
limitqueryintegernodefault 8 · min 1 · max 20
productsqueryintegernoHow many product previews to include. · default 4 · min 0 · max 10
sessionquerystring | nullnomax length 64

Responses

GET/v1/search

Search (GET form)

Needs a key or a dashboard session

Filters use `filter[<name>]=v1,v2` and `filter[<name>][gte|lte]=n`. Response has the `X-SeekGist-Usage` header. Billed when page=1.

Parameters

NameInTypeRequiredDescription
qquerystringnomax length 256
langquerystringno`auto` or a tenant locale. · default "auto" · pattern ^(auto|[a-z]{2})$
pagequeryintegernodefault 1 · min 1 · max 1000
per_pagequeryintegernodefault 20 · min 1 · max 100
sortquery"relevance" | "price_asc" | "price_desc" | "newest" | "popular"nodefault "relevance"
facetsquerystring | nullnoComma-separated facet names.
aiquery"auto" | "on" | "off"nodefault "auto"
sessionquerystring | nullnomax length 64
devicequery"desktop" | "mobile" | "tablet" | "unknown"nodefault "unknown"

Responses

POST/v1/search

Search (JSON body, complex filters)

Needs a key or a dashboard session

Request body application/json SearchRequest

NameTypeRequiredDescription
qstringnomax length 256
langstringno`auto` or a tenant locale.default "auto" · pattern ^(auto|[a-z]{2})$
pageintegernodefault 1 · min 1 · max 1000
per_pageintegernodefault 20 · min 1 · max 100
filtersmap<string, string[] | RangeFilter | string | boolean>noe.g. {"brand": ["Lenovo"], "price": {"lte": 600}, "in_stock": true}
sort"relevance" | "price_asc" | "price_desc" | "newest" | "popular"nodefault "relevance"
facetsstring[]noFacet names to return, e.g. brand, category, price.
ai"auto" | "on" | "off"noauto = plan + tenant setting decide, and the AI runs only when it helps (price or use-case requests, long or unknown words, zero results); on = the AI on every query (plan and budget still apply); off = never call the AI.default "auto"
sessionstring | nullnoOpaque shopper session id (no PII).max length 64
device"desktop" | "mobile" | "tablet" | "unknown"nodefault "unknown"
debugbooleannoSecret key or dashboard only: include the pipeline trace.default false
config_overrideRankingConfig | nullnoDashboard session only (ignored for API keys): try a ranking/synonym setup without saving it.

Responses

GET/v1/recommend

Recommendations

Needs a key or a dashboard session

Parameters

NameInTypeRequiredDescription
typequery"similar" | "also_viewed" | "trending" | "recently_viewed"yes
product_idquerystring | nullnomax length 128
category_idquerystring | nullnomax length 128
sessionquerystring | nullnomax length 64
limitqueryintegernodefault 10 · min 1 · max 50

Responses

Data shapes on this page

SuggestResponse

Suggestions while typing. NEVER billed, never calls the AI.

NameTypeRequiredDescription
querystringyes
suggestionsSuggestion[]yes
productsProductCard[]no
categoriesFacetBucket[]no
took_msnumberyes

Suggestion

Recent searches are NOT returned here: the widget keeps them in the shopper's browser only (localStorage, no server copy, no PII). See docs/adr/0012 and packages/widget/README.md.

NameTypeRequiredDescription
textstringyes
highlightedstring | nullno
kind"query" | "category" | "brand"nodefault "query"
targetstring | nullnoCategory or brand id/url for kind=category|brand.

ProductCard

Display fields. Connectors that render their own cards use only `id`.

NameTypeRequiredDescription
idstringyes
namemap<string, string>yes
urlstring | nullno
image_urlstring | nullno
pricestringyes
sale_pricestring | nullno
currencystringyes
in_stockbooleanyes
brandstring | nullno
categorymap<string, string> | nullno

FacetBucket

NameTypeRequiredDescription
valuestringyes
labelmap<string, string> | nullno
countintegeryes

SearchResponse

NameTypeRequiredDescription
search_idstringyesSend it back with click/event calls to attribute them.
queryParsedQueryyes
idsstring[]yesProduct ids in rank order (what connectors use).
hitsSearchHit[]yes
totalintegeryes
pageintegeryes
per_pageintegeryes
facetsFacet[]no
did_you_meanstring | nullno
redirectRedirect | nullno
bannersBanner[]no
zero_result_helpZeroResultHelp | nullno
experimentExperimentAssignment | nullno
took_msnumberyes
debugobject | nullno

ParsedQuery

NameTypeRequiredDescription
textstringyesAs typed.
normalizedstringyesAfter the Arabic layer.
rewrittenstring | nullnoAfter the rule parser or the AI rewrite.
langstringyes
filtersobjectnoFilters the parser found, e.g. price_max 600.
sortstring | nullno
ai_usedbooleannodefault false
ai_cachedbooleannodefault false

SearchHit

NameTypeRequiredDescription
idstringyes
scorenumber | nullno
productProductCardyes
highlightsmap<string, string>no
pinnedbooleannodefault false

Facet

NameTypeRequiredDescription
namestringyes
type"terms" | "range" | "boolean" | "category_tree"yes
bucketsFacetBucket[]no
minnumber | nullno
maxnumber | nullno

Redirect

NameTypeRequiredDescription
urlstringyes
rule_idstringyes

Banner

NameTypeRequiredDescription
idstringyes
htmlstring | nullno
image_urlstring | nullno
link_urlstring | nullno
position"top" | "inline" | "bottom"nodefault "top"

ZeroResultHelp

NameTypeRequiredDescription
relaxedbooleanyesTrue when the results come from a relaxed query.
relaxed_querystring | nullno
popular_categoriesFacetBucket[]no

ExperimentAssignment

NameTypeRequiredDescription
experiment_idstringyes
variantstringyes

SearchRequest

POST /v1/search body. GET /v1/search takes the same fields as query parameters (filters as `filter[brand]=Lenovo&filter[price][lte]=600`).

NameTypeRequiredDescription
qstringnomax length 256
langstringno`auto` or a tenant locale.default "auto" · pattern ^(auto|[a-z]{2})$
pageintegernodefault 1 · min 1 · max 1000
per_pageintegernodefault 20 · min 1 · max 100
filtersmap<string, string[] | RangeFilter | string | boolean>noe.g. {"brand": ["Lenovo"], "price": {"lte": 600}, "in_stock": true}
sort"relevance" | "price_asc" | "price_desc" | "newest" | "popular"nodefault "relevance"
facetsstring[]noFacet names to return, e.g. brand, category, price.
ai"auto" | "on" | "off"noauto = plan + tenant setting decide, and the AI runs only when it helps (price or use-case requests, long or unknown words, zero results); on = the AI on every query (plan and budget still apply); off = never call the AI.default "auto"
sessionstring | nullnoOpaque shopper session id (no PII).max length 64
device"desktop" | "mobile" | "tablet" | "unknown"nodefault "unknown"
debugbooleannoSecret key or dashboard only: include the pipeline trace.default false
config_overrideRankingConfig | nullnoDashboard session only (ignored for API keys): try a ranking/synonym setup without saving it.

RangeFilter

NameTypeRequiredDescription
gtenumber | nullno
ltenumber | nullno

RankingConfig

One ranking setup, used by the dashboard playground (`SearchRequest.config_override`) and by A/B variants (`Variant.config`). Every field is optional: a missing field means "use the tenant's saved value" (`TenantSettings.search`, same field names). Nothing here is saved.

NameTypeRequiredDescription
ai_rewriteboolean | nullno
rule_parserboolean | nullno
in_stock_firstboolean | nullno
business_signalsmap<string, number> | nullnoWeights 0..1, e.g. {popularity: 0.2, margin: 0.1}. {} turns them all off.
typo_toleranceboolean | nullno
hybrid_searchboolean | nullno
cheap_rerank_top_ninteger | nullnomin 10 · max 200
merch_rulesboolean | nullnofalse = ignore all merchandising rules.
disabled_rule_idsstring[] | nullno
synonym_setsstring[] | nullnoTenant synonym sets that are on. "default" is the normal set. Example A/B: A = ["default"], B = ["default", "winter-2026"].
global_synonymsboolean | nullnofalse = ignore the platform's global synonyms.

RecommendResponse

NameTypeRequiredDescription
type"similar" | "also_viewed" | "trending" | "recently_viewed"yes
idsstring[]yes
productsProductCard[]yes
source"attributes" | "vectors" | "co_views" | "popularity" | "session"yes