Search
The Storefront API provides product search with full-text matching across product names, descriptions, SKUs, and attribute values.
Search Products
GET /api/storefront/products/search?q=t-shirt&page=1&pageSize=20
X-Store-Code: us-store
X-Language-Code: en
X-Currency-Code: USD
Response: Same paginated format as the category product listing:
{
"products": [...],
"page": 1,
"pageSize": 20,
"totalCount": 5,
"totalPages": 1
}
Structured Search
POST /api/storefront/products/search takes the filters as a JSON body and is what listing screens, content blocks and apps use:
POST /api/storefront/products/search
X-Store-Code: us-store
X-Language-Code: en
Content-Type: application/json
{
"page": 1,
"pageSize": 20,
"categoryId": "guid",
"productIds": ["guid", "guid"],
"brandIds": ["guid"],
"priceMin": 1000,
"priceMax": 50000,
"appliedFacets": [],
"sortBy": "price",
"sortOrder": "asc"
}
All filters are optional and combine. categoryId accepts a master or a sales category. productIds restricts the result to a curated selection — a content block's hand-picked products, a favourites list; results come back in the default sort, so a client that needs the hand-picked order re-orders by its own list.
Each product card carries imageUrl (the primary still image — safe for a plain <img>) and images, the default variant's full gallery, primary first, for clients that show a swipeable gallery per card. Entries have url, altText, isPrimary, displayOrder, mediaType (image or video) and mimeType. Request a rendition by appending ?width=400 (or another configured width) to an image url.
Facets
The response's dynamicFacets are computed over the current result set, each with a key, a localized label and its values (id, value, count, isSelected). Two kinds exist:
- Variant attributes (colour, size …) — key is the attribute name, e.g.
renk. - Specifications marked Use as a search filter in the Backoffice — key is
spec:plus the specification's name, e.g.spec:tas. Only option-based specifications (dropdown, radio, checkbox) qualify; free-text values are never grouped.
Apply a selection by sending the facet's key and the chosen value ids back:
"appliedFacets": [
{ "facetKey": "spec:tas", "valueIds": ["guid-of-Pırlanta"] },
{ "facetKey": "renk", "valueIds": ["guid-of-Beyaz-Altın"] }
]
Values within one facet are OR-ed, different facets are AND-ed. Counts are disjunctive: a facet's own selection does not reduce its sibling values, so the customer can still see — and add — the alternatives.
Rate Limiting
Where the installation has rate limiting switched on, search is limited per client — 60 requests per minute by default, counted per signed-in user or otherwise per address. One visitor's searching never uses up another's allowance.
If rate limited, you'll receive:
HTTP/1.1 429 Too Many Requests
Retry-After: 60
Search Tips
- Search is case-insensitive
- Results are filtered by the current store context (store mappings apply)
- Only active products are returned
- Prices are pre-resolved for the requested currency
- Results are cached for 2 minutes per unique query + store/language/currency combination
Optional: Vector Search
If Qdrant is configured, the API can provide semantic/vector-based search for more intelligent results (e.g., searching "summer outfit" returns relevant products even if those exact words aren't in the product title). This is an optional enhancement — standard text search works without Qdrant.