Buscar produtos
Devolve os produtos que casam com um texto e com filtros de categoria, seller, marca, preço, nota e estoque, com ordenação, paginação e facetas para a barra lateral.
Use esta rota para montar a página de resultados da busca da loja e, com category_id, também a página de uma categoria. Você manda o texto digitado (q), os filtros que o cliente marcou e a ordenação, e recebe a página de produtos, o total e as facetas: as contagens por categoria, seller (lojista) e marca que alimentam a barra lateral de filtros.
A rota é pública. Ela grava a busca no painel de analytics da loja e devolve ids para você registrar o clique (Registrar cliques). Não altera estoque, carrinho nem pedidos.
/api/v1/storefront/searchPúblicaBuscar produtos da vitrine
Cabeçalhos
AuthorizationstringBearer $TOKEN de um cliente logado. Sem ele você é tratado como visitante (preço pode vir escondido, conforme a loja). Chave de API precisa do escopo storefront:read.X-Tenant-IDstring$BASE_URL) a loja já é identificada pelo domínio. Veja Lojas e domínios.X-Session-IdstringParâmetros de consulta
qstringcategory_iduuidvendor_iduuidbrandstringfacets.brands[].key.min_priceintegermax_priceintegermin_ratingnumber4).in_stockbooleantrue1true ou 1, só produtos com estoque. Qualquer outro valor é ignorado.features[CÓDIGO]stringfacets.attributes[].feature_id e code. Valores separados por vírgula (features[cor]=Azul,Verde) valem como "ou" dentro da característica; características diferentes se combinam como "e". Para característica numérica mande uma faixa min-max. Repita o parâmetro para várias características.sort_bystringpricenamecreated_atrating_avgsales_countcategoryq) ou do mais novo para o mais antigo.sort_dirstringpadrão: descascdescsort_by. rating_avg e sales_count são sempre do maior para o menor.sortstringprice_ascprice_descnewestratingrating_descname_ascname_desccategory_asccategory_descsalesbest_sellingsort_by não foi enviado. É o mesmo vocabulário de /search/meili.pageintegerpadrão: 1per_pageintegerpadrão: 20Exemplo de requisição
Resposta
Campos da resposta
productsarrayredirect_url.products[].iduuidproducts[].namestringproducts[].slugstringproducts[].descriptionstringproducts[].priceinteger0 com price_redacted: true quando o preço está escondido de visitantes.products[].list_priceintegerprice. Ausente se não existe.products[].catalog_discountintegerproducts[].price_redactedbooleantrue quando o preço foi zerado por ser visitante em loja que restringe preço.products[].vendor_iduuidproducts[].category_iduuidproducts[].image_urlstringproducts[].rating_avgnumberproducts[].rating_countintegerproducts[].statusstringA (ativo) na vitrine.products[].scorenumberproducts[].quantitynumberproducts[].track_inventorybooleanfalse quando a loja não controla estoque desse produto: ele está sempre disponível.products[].zero_price_actionstringP, pedir preço).products[].out_of_stock_actionstringN, nada).products[].has_unified_variationsbooleantrue quando o produto tem variações (cor, tamanho) e não pode ir ao carrinho só com o id do produto: abra a página do produto e escolha a variação.products[].matched_variant_skustringproducts[].matched_variant_idintegerproducts[].sell_unitstringkg, un), em lojas de atacado.products[].quantity_stepnumberproducts[].min_quantitynumberproducts[].units_per_boxintegerproducts[].unit_weight_kgnumberproducts[].weightnumbertotalintegerpageintegerper_pageintegertotal_pagesintegertookinteger0.querystringfacetsobjectContagens para os filtros, calculadas sobre o resultado atual (o filtro de uma faceta não esconde as outras opções dela mesma). Ausente se a loja não pôde calcular.
categoriesarray{key, label, doc_count}. key é o category_id para usar no filtro, label o nome para exibir.vendorsarray{key, label, doc_count}. key é o vendor_id.brandsarray{key, label, doc_count}. key é o nome da marca, valor de brand.price_rangesarray{key, from, to, doc_count} em centavos. Na busca padrão da loja vem null; calcule as faixas na vitrine a partir de min_price e max_price.ratingsarraynull.attributesarray{feature_id, code, name, display_type, position, buckets[]}. display_type é checkbox, chips, slider ou swatch. Cada bucket tem value, count e, conforme o tipo, variant_id, image_url, min_cents e max_cents. Para filtrar mande features[code]=value.log_iduuidPOST /search/click.search_event_iduuidPOST /search/events.did_you_meanstringtotal é 0 e existe um termo parecido (até 2 letras de diferença) na loja.redirect_urlstringproducts vem vazio.bannerobject{title, image_url, link_url}, quando o lojista configurou um para o termo. Só na primeira página.Erros
| Status | Quando | Corpo |
|---|---|---|
| 401 | A loja exige login para navegar e a chamada não tem token | {"error":"shopping_requires_login","message":"this storefront requires login to browse"} |
| 403 | Chave de API sem o escopo storefront:read | {"error":"missing_scope","required":"storefront:read"} |
| 500 | Falha ao consultar o catálogo | {"error":"failed to search products","detail":"..."} |
Um texto sem resultado não é erro: a resposta é 200 com products: [], total: 0 e, se houver, did_you_mean.