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
curl "$BASE_URL/api/v1/storefront/search?q=camiseta&min_price=5000&max_price=50000&in_stock=true&sort=price_asc&per_page=2"Resposta
{
"products": [
{
"id": "db033935-75ea-4b6f-abbb-13d0fcd6386d",
"name": "Camiseta Lite Verde 00146",
"slug": "camiseta-lite-verde-00146-146",
"description": "Camiseta Lite Verde 00146. Produto de alta qualidade, ideal para uso diário.",
"price": 39990,
"vendor_id": "94bd7e9a-fdad-4d01-8fc2-ba9d677d8b36",
"category_id": "8fcaf422-1631-4282-b503-85cc57380649",
"image_url": "/uploads/dfe2555e-bfd0-41a8-9fa1-9586999f3798/product/db033935-75ea-4b6f-abbb-13d0fcd6386d/foto.png",
"rating_avg": 4.9,
"rating_count": 17,
"status": "A",
"score": 0,
"quantity": 1,
"track_inventory": true,
"zero_price_action": "P",
"out_of_stock_action": "N",
"quantity_step": 1
}
],
"total": 158,
"page": 1,
"per_page": 2,
"total_pages": 79,
"took": 0,
"query": "camiseta",
"facets": {
"categories": [{ "key": "8fcaf422-1631-4282-b503-85cc57380649", "label": "Camisetas", "doc_count": 158 }],
"vendors": [{ "key": "94bd7e9a-fdad-4d01-8fc2-ba9d677d8b36", "label": "Loja Seller Teste", "doc_count": 158 }],
"brands": [{ "key": "Eco", "label": "Eco", "doc_count": 1 }],
"price_ranges": null,
"ratings": null
},
"log_id": "e0e3b1ce-6cd2-4ddc-a847-e97af386a2f0",
"search_event_id": "3e19709e-6461-4f10-9e79-87e38f3d92b4"
}{ "products": [], "total": 0, "page": 1, "per_page": 20, "total_pages": 0, "took": 0, "query": "" }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.