Saltar al contenido
Guías
Consultas

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

CampoTipoValor predeterminadoReglas
productIds[String!]Sin filtroMáximo 100 IDs opacos válidos.
searchStringSin búsquedaMáximo 200 caracteres.
categories[String!]Sin filtroMáximo 50 valores y 100 caracteres por valor.
brands[String!]Sin filtroMáximo 50 valores y 100 caracteres por valor.
sellerSlugs[String!]Sin filtroMáximo 20 slugs y 100 caracteres por slug.
collections[String!]Sin filtroMáximo 50 valores y 100 caracteres por valor.
collectionIdStringSin filtroID opaco válido de una colección.
productTypes[ProductType!]Sin filtroMáximo 50 valores.
tags[String!]Sin filtroMáximo 50 valores y 100 caracteres por valor.
filters[String!]Sin facetas seleccionadasMáximo 100 filtros y 250 caracteres por filtro.
inStockBooleanSin filtroCuando es true, limita el resultado a productos disponibles.
minPriceDecimalSin mínimoDebe ser mayor o igual a 0.
maxPriceDecimalSin máximoDebe ser mayor o igual a 0 y a minPrice.
pageInt1Entre 1 y 100.
pageSizeInt24Entre 1 y 100.
sortProductSearchSortDEFAULTOrden de los resultados.

Los valores de filters usan una de estas formas:

option:nombre:valor
attribute:nombre:valor

Solo 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:

ValorUso
DEFAULTOrden predeterminado del catálogo.
PRICE_ASCMenor precio primero.
PRICE_DESCMayor precio primero.
NEWESTProductos más recientes primero.
NAME_ASCNombre ascendente.
NAME_DESCNombre descendente.

Retorno

SearchResult contiene:

CampoTipoDescripción
pageIndexInt!Página devuelta.
pageSizeInt!Tamaño de página aplicado.
totalCountLong!Número total de coincidencias.
totalPagesInt!Número total de páginas.
products[ProductSummary!]!Productos de la página.
filters[SearchFilter!]!Facetas disponibles para refinar la consulta.

ProductSummary

CampoTipoCampoTipo
idString!nameString!
slugString!productTypeString!
imageUrlString!priceDecimal!
compareAtPriceDecimalvariantCountInt!
isAvailableBoolean!totalInventoryInt!
bundleItemsCountInt!brandString!
categoryString!statusString!
collections[String!]!tags[String!]!
sellerProductSellerInfo

ProductSellerInfo contiene id, name y slug, todos String!.

Filtros y facetas

Cada SearchFilter contiene:

CampoTipoDescripción
idString!Identificador del filtro.
labelString!Etiqueta de presentación.
typeString!Tipo del filtro.
values[FacetItem!]!Valores disponibles y sus conteos.
minDecimalLímite inferior disponible, cuando aplica.
maxDecimalLímite superior disponible, cuando aplica.
selectedMinDecimalLímite inferior seleccionado, cuando aplica.
selectedMaxDecimalLímite superior seleccionado, cuando aplica.

Cada FacetItem contiene value: String!, count: Int!, label: String y selected: Boolean!.

Query

Products.graphql
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:

Variables
{
  "input": {
    "search": "mug",
    "categories": ["Home"],
    "inStock": true,
    "page": 1,
    "pageSize": 24,
    "sort": "PRICE_ASC"
  }
}

cURL

Terminal
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:

Respuesta
{
  "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ódigoCausa común
BAD_USER_INPUTPágina, tamaño, precio, ID, filtro o cantidad de valores fuera del contrato.
NOT_FOUNDUna colección solicitada no existe o no es visible.
STORE_CONTEXT_REQUIREDx-Store-Domain no resolvió una tienda.

Una respuesta GraphQL puede incluir errors con HTTP 200. Consulta Errores GraphQL.

Consultas relacionadas

En esta página