products
Busca productos visibles, aplica filtros y recupera paginación y facetas mediante GraphQL.
Última actualización:
products consulta el catálogo publicado de la tienda resuelta. Usa esta query para listados, resultados de búsqueda y páginas de colección o vendedor.
Firma
products(input: StorefrontProductsInput): SearchResult!input es opcional. Si lo omites, la API consulta la primera página con pageSize: 24 y el orden predeterminado.
Input
| Campo | Tipo | Valor predeterminado | Reglas |
|---|---|---|---|
productIds | [String!] | Sin filtro | Máximo 100 IDs opacos válidos. |
search | String | Sin búsqueda | Máximo 200 caracteres. |
categories | [String!] | Sin filtro | Máximo 50 valores y 100 caracteres por valor. |
brands | [String!] | Sin filtro | Máximo 50 valores y 100 caracteres por valor. |
sellerSlugs | [String!] | Sin filtro | Máximo 20 slugs y 100 caracteres por slug. |
collections | [String!] | Sin filtro | Máximo 50 valores y 100 caracteres por valor. |
collectionId | String | Sin filtro | ID opaco válido de una colección. |
productTypes | [ProductType!] | Sin filtro | Máximo 50 valores. |
tags | [String!] | Sin filtro | Máximo 50 valores y 100 caracteres por valor. |
filters | [String!] | Sin facetas seleccionadas | Máximo 100 filtros y 250 caracteres por filtro. |
inStock | Boolean | Sin filtro | Cuando es true, limita el resultado a productos disponibles. |
minPrice | Decimal | Sin mínimo | Debe ser mayor o igual a 0. |
maxPrice | Decimal | Sin máximo | Debe ser mayor o igual a 0 y a minPrice. |
page | Int | 1 | Entre 1 y 100. |
pageSize | Int | 24 | Entre 1 y 100. |
sort | ProductSearchSort | DEFAULT | Orden de los resultados. |
Los valores de filters usan una de estas formas:
option:nombre:valor
attribute:nombre:valorSolo puedes seleccionar un valor por cada opción de producto. Los filtros de atributos sí pueden combinarse.
Enums
ProductType admite PRODUCT, SERVICE y BUNDLE.
ProductSearchSort admite:
| Valor | Uso |
|---|---|
DEFAULT | Orden predeterminado del catálogo. |
PRICE_ASC | Menor precio primero. |
PRICE_DESC | Mayor precio primero. |
NEWEST | Productos más recientes primero. |
NAME_ASC | Nombre ascendente. |
NAME_DESC | Nombre descendente. |
Retorno
SearchResult contiene:
| Campo | Tipo | Descripción |
|---|---|---|
pageIndex | Int! | Página devuelta. |
pageSize | Int! | Tamaño de página aplicado. |
totalCount | Long! | Número total de coincidencias. |
totalPages | Int! | Número total de páginas. |
products | [ProductSummary!]! | Productos de la página. |
filters | [SearchFilter!]! | Facetas disponibles para refinar la consulta. |
ProductSummary
| Campo | Tipo | Campo | Tipo |
|---|---|---|---|
id | String! | name | String! |
slug | String! | productType | String! |
imageUrl | String! | price | Decimal! |
compareAtPrice | Decimal | variantCount | Int! |
isAvailable | Boolean! | totalInventory | Int! |
bundleItemsCount | Int! | brand | String! |
category | String! | status | String! |
collections | [String!]! | tags | [String!]! |
seller | ProductSellerInfo |
ProductSellerInfo contiene id, name y slug, todos String!.
Filtros y facetas
Cada SearchFilter contiene:
| Campo | Tipo | Descripción |
|---|---|---|
id | String! | Identificador del filtro. |
label | String! | Etiqueta de presentación. |
type | String! | Tipo del filtro. |
values | [FacetItem!]! | Valores disponibles y sus conteos. |
min | Decimal | Límite inferior disponible, cuando aplica. |
max | Decimal | Límite superior disponible, cuando aplica. |
selectedMin | Decimal | Límite inferior seleccionado, cuando aplica. |
selectedMax | Decimal | Límite superior seleccionado, cuando aplica. |
Cada FacetItem contiene value: String!, count: Int!, label: String y selected: Boolean!.
Query
query Products($input: StorefrontProductsInput) {
products(input: $input) {
pageIndex
pageSize
totalCount
totalPages
products {
id
name
slug
productType
imageUrl
price
compareAtPrice
variantCount
isAvailable
totalInventory
bundleItemsCount
brand
category
status
collections
tags
seller {
id
name
slug
}
}
filters {
id
label
type
min
max
selectedMin
selectedMax
values {
value
count
label
selected
}
}
}
}Variables:
{
"input": {
"search": "mug",
"categories": ["Home"],
"inStock": true,
"page": 1,
"pageSize": 24,
"sort": "PRICE_ASC"
}
}cURL
curl --request POST "https://storefront.ecomiq.pe/graphql" \
--header "Content-Type: application/json" \
--header "x-Store-Domain: mi-tienda" \
--data-binary '{
"query": "query Products($input: StorefrontProductsInput) { products(input: $input) { pageIndex pageSize totalCount totalPages products { id name slug productType imageUrl price compareAtPrice variantCount isAvailable totalInventory bundleItemsCount brand category status collections tags seller { id name slug } } filters { id label type min max selectedMin selectedMax values { value count label selected } } } }",
"variables": {
"input": {
"search": "mug",
"categories": ["Home"],
"inStock": true,
"page": 1,
"pageSize": 24,
"sort": "PRICE_ASC"
}
}
}'Respuesta
La API devuelve únicamente los campos solicitados. Este ejemplo usa los valores del producto resumido cubierto por el contrato del host:
{
"data": {
"products": {
"pageIndex": 1,
"pageSize": 24,
"totalCount": 1,
"totalPages": 1,
"products": [
{
"id": "789",
"name": "Related mug",
"slug": "related-mug",
"productType": "Product",
"imageUrl": "/related.jpg",
"price": 12,
"compareAtPrice": null,
"variantCount": 1,
"isAvailable": true,
"totalInventory": 2,
"bundleItemsCount": 0,
"brand": "Acme",
"category": "Home",
"status": "Active",
"collections": [],
"tags": [],
"seller": null
}
],
"filters": []
}
}
}Errores
| Código | Causa común |
|---|---|
BAD_USER_INPUT | Página, tamaño, precio, ID, filtro o cantidad de valores fuera del contrato. |
NOT_FOUND | Una colección solicitada no existe o no es visible. |
STORE_CONTEXT_REQUIRED | x-Store-Domain no resolvió una tienda. |
Una respuesta GraphQL puede incluir errors con HTTP 200. Consulta Errores GraphQL.