Rendered collection by handle: products, facets and merchandising for a collection page.
GET /search/collection/{handle}
GET https://mercury.plutocracy.io/search/collection/{handle}
Served from Redis in all four regions (Sydney, N. Virginia, N. California, Frankfurt); DNS latency routing picks the nearest.
Alias of CollectionByHandleRoute (identical behaviour).
Auth: Origin+bypass redis strategy.
Authentication
Send the storefront's Origin (browsers do this for you) or ?bypassToken=. A request with neither gets 401. See authentication.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
handle required | path | string | |
take | query | string | |
skip | query | string | |
page | query | string | |
pageNumber | query | string | |
query | query | string | JSON-stringified |
sort | query | "manual" | "az" | "za" | "oldest" | "newest" | "priceLow" | "priceHigh" | "random" | Sort override; |
currency | query | string | |
tracking | query | string |
|
userId | query | string | |
grid_config | query | string | See |
Responses
200 OK application/json
Type: RenderedCollection
Response of GET collection/:handle (rendered collection): the stored
Shopify collection body spread at the top level, plus campaign/config,
facets/products, sort_order and the echoed query.
| Field | Type | Description | |||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
id | number | ||||||||||
rules optional | ShopifyCollectionRule[] | ||||||||||
title | string | ||||||||||
handle | string | ||||||||||
body_html | string | ||||||||||
metafields optional | { [key]: { [key]: any } } | Namespace -> key -> value (save-collection.service mapMetafieldsIntoCorrectFormat). Fields
| |||||||||
updated_at optional | string | ||||||||||
disjunctive optional | boolean | ||||||||||
published_at optional | string | ||||||||||
collection_type optional | string | ||||||||||
published_scope optional | string | ||||||||||
template_suffix optional | string | null | ||||||||||
admin_graphql_api_id optional | string | ||||||||||
campaign optional | any | Campaign attached to the collection, if any. | |||||||||
config | object | Collection config plus the collection's Fields
| |||||||||
facets | SearchFacets | ||||||||||
products | RenderedProduct[] | ||||||||||
sort_order | MercurySortOrder | Resolved sort order actually applied. | |||||||||
query | FilterOperator[] | Echo of the parsed | |||||||||
grid_config optional | GridConfig | Present when | |||||||||
[key: string] | any | Any further keys. |
Example response (illustrative)
{
"id": 7712345678901,
"rules": [
{
"column": "string",
"relation": "string",
"condition": "string"
}
],
"title": "Linen shirt",
"handle": "linen-shirt",
"body_html": "<p>Breathable linen.</p>",
"metafields": {
"custom": {
"custom": null
}
},
"updated_at": "2026-11-01T00:00:00.000Z",
"disjunctive": false,
"published_at": "2026-11-01T00:00:00.000Z",
"collection_type": "Shirts",
"published_scope": "string",
"template_suffix": "string",
"admin_graphql_api_id": "7712345678901",
"campaign": null,
"config": {
"implode": false
},
"facets": {
"vendors": [
{
"vendor": "Mercury Apparel",
"count": 12
}
],
"types": [
{
"type": "Shirts",
"count": 12
}
],
"tags": [
{
"value": "string",
"count": 12
}
],
"count": 12
},
"products": [
{
"id": "7712345678901",
"title": "Linen shirt",
"implode": 1,
"handle": "linen-shirt",
"min_price": 89,
"compare_at_min_price": 89,
"vendor": "Mercury Apparel",
"type": "Shirts",
"on_sale": false,
"total_stock": 12,
"variants": [
{
"title": "Linen shirt",
"id": 7712345678901,
"inventory": 12,
"price": "89.00",
"compare_at_price": "89.00"
}
],
"prices": {
"AUD": {
"price": 89
}
},
"created_date": "2026-11-01T00:00:00.000Z",
"options": null,
"normalised_stock": 12,
"tags": [
"summer"
],
"image": "https://cdn.shopify.com/s/files/1/0000/0001/files/linen-shirt.jpg",
"images": [
"https://cdn.shopify.com/s/files/1/0000/0001/files/linen-shirt.jpg"
],
"related": "string",
"imploded": [
{
"id": "7712345678901",
"title": "Linen shirt",
"implode": 1,
"handle": "linen-shirt",
"min_price": 89,
"max_price": 89,
"compare_at_min_price": 89,
"compare_at_max_price": 89,
"vendor": "Mercury Apparel",
"type": "Shirts",
"on_sale": false,
"total_stock": 12,
"variants": [
{
"title": "Linen shirt",
"id": 7712345678901,
"inventory": 12,
"price": "89.00",
"compare_at_price": "89.00"
}
],
"prices": {
"AUD": {
"price": null
}
},
"created_date": "2026-11-01T00:00:00.000Z",
"tags": [
"summer"
]
}
],
"meta": {
"key": null
}
}
],
"sort_order": "manual",
"query": [
{
"type": "Shirts",
"condition": "string",
"value": null
}
],
"grid_config": {
"grid": {
"elements": {
"key": null
},
"core": {
"key": null
},
"breakpoints": [
{
"index": 1,
"label": "string",
"minwidth": 1,
"columns": 1,
"format": "string"
}
],
"currentBreakpoint": {
"key": null
},
"styles": "string"
},
"currency": "AUD",
"locale": "string",
"delimiter": "string",
"sizeMapping": null,
"colourMapping": {
"key": "#1f6feb"
},
"imageMapping": {
"key": "string"
},
"facetMapping": null,
"integrations": null,
"skuSearch": null
}
}401 No valid credential. application/json
Type: ApiErrorResponse
default An error, in the standard envelope. application/json
Type: ApiErrorResponse
Errors use the standard envelope; see errors and status codes.
Example request
curl "https://mercury.plutocracy.io/search/collection/linen-shirt?bypassToken=$MERCURY_BYPASS_TOKEN"
Where this comes from
- Contract
SearchCollectionAliasRouteinapi-types/src/storefront/search.ts- Route
GET /search/collection/:handleon the view app