GETProdutos
Lista os produtos ativos da vitrine com filtros e ordenação, e lê um produto pelo id ou pelo slug.
As duas leituras de catálogo da vitrine. A lista devolve o cartão de cada produto (nome, imagens, preço, estoque, vendedor); a leitura individual devolve a página completa de um produto (descrição, breadcrumb, SEO). Só aparecem produtos ativos (status A): rascunhos, desativados e em moderação respondem 404 ou ficam fora da lista, e não há parâmetro para vê-los.
As credenciais aceitas estão na visão geral.
Listar produtos
/api/storefront/productsPúblicaListar produtos da vitrine
Parâmetros de consulta
pageintegerpadrão: 1per_pageintegerpadrão: 20limit é aceito como apelido.sort_bystringpadrão: created_atcreated_atpricenamesales_countrating_avgupdated_atquantitypopularitystatuscategorysort_dirstringpadrão: descascdescasc vale desc.idsstringcategory_iduuidcategory_idsstringinclude_subcategoriesbooleanpadrão: falsetrue inclui os produtos das subcategorias.vendor_iduuidvendor_idsstringbrandstringbrand_idstringmin_priceintegermax_priceintegeron_salebooleantrue restringe a produtos em promoção.in_stockbooleanpadrão: falsetrue esconde produtos sem saldo.searchstringq é um apelido; se vierem os dois, vale search. Para busca com relevância e filtros por faceta, use Busca.features[featureId]stringfeatures[<id da característica>]=<id da variante>,<id da variante>: OU dentro da característica, E entre características.features_hashstringfeatures[...] para URLs amigáveis: idCaracteristica.idVariante1-idVariante2.outraCaracteristica.idVariante. Uma característica já enviada em features[...] tem prioridade.exclude_variationsbooleanpadrão: truefalse inclui os produtos-filhos de variação, que normalmente ficam sob o produto pai.parent_product_iduuidexclude_variations=false.langstringpt-BR, en, es). Também vale o cabeçalho Accept-Language.Cabeçalhos
AuthorizationstringBearer $TOKEN de um cliente libera produtos restritos ao grupo dele e preços de grupo.X-API-Keystringsfk_... com o escopo storefront:read.X-Tenant-IDstringLer um produto
/api/storefront/products/{id}PúblicaLer um produto pelo id ou slug
Parâmetros de caminho
idstringobrigatóriocamisa-flamengo-masculina-i-26-adidas). Código SKU e o número display_id não servem e dão 404.Exemplo de requisição
curl "$BASE_URL/api/storefront/products?per_page=2&sort_by=price&sort_dir=asc"
curl "$BASE_URL/api/storefront/products/camisa-flamengo-masculina-i-26-adidas"Resposta
{
"page": 1,
"per_page": 2,
"total": 4976,
"total_pages": 2488,
"products": [
{
"id": "22fbd12a-1b6e-41ea-a84f-4d9cf06c8766",
"display_id": 10497,
"name": "Camisa do Flamengo Masculina I 26 Adidas",
"slug": "camisa-flamengo-masculina-i-26-adidas",
"sku": "FLA-I-26",
"short_description": "Camisa oficial Flamengo I 26 Adidas",
"category_id": "8fcaf422-1631-4282-b503-85cc57380649",
"canonical_path": ["moda", "roupas", "camisetas", "camisa-flamengo-masculina-i-26-adidas", "p"],
"price": 30000,
"price_str": "300.00",
"list_price": 44990,
"list_price_str": "449.90",
"catalog_discount": 6000,
"track_inventory": true,
"quantity": 38,
"out_of_stock_action": "N",
"min_quantity": 0,
"max_quantity": 0,
"quantity_step": 1,
"sale_unit": "un",
"free_shipping": false,
"requires_shipping": true,
"images": [
{
"id": "1ed7ed93-e870-4e59-b863-a577764e5d1a",
"image_url": "/uploads/dfe2555e/product/22fbd12a/camisa.png",
"alt_text": "Camisa do Flamengo Masculina I 26 Adidas",
"is_primary": true,
"position": 0
}
],
"vendor_id": "94bd7e9a-fdad-4d01-8fc2-ba9d677d8b36",
"vendor_name": "Loja Seller Teste",
"rating_avg": 0,
"rating_count": 0,
"status": "A",
"created_at": "2026-08-25T02:40:35.960912Z"
}
]
}Campos da resposta
page, per_page, total, total_pagesintegertotal é a contagem de produtos que passam nos filtros.products[].iduuidproduct_id repete o valor).products[].display_idintegerproducts[].namestringproduct repete o valor).products[].slugstringproducts[].skustringproducts[].priceintegerprice_str repete em reais.products[].list_priceintegerlist_price_str repete em reais.products[].catalog_discountintegerproducts[].quantityintegeramount repete o valor.products[].track_inventorybooleanfalse quer dizer que o produto não controla estoque.products[].out_of_stock_actionstringNBSN esconde o botão de comprar, B aceita encomenda (permite comprar mesmo sem saldo), S mostra o formulário "avise-me quando voltar".products[].min_quantityinteger0 é sem mínimo).products[].max_quantityinteger0 é sem máximo).products[].quantity_stepintegerproducts[].sale_unitstringun).products[].canonical_patharrayproducts[].imagesarrayimage_url relativo ao domínio da loja, is_primary e position.products[].vendor_iduuidcompany_id repete o valor.products[].statusstringA nesta rota.A resposta traz ainda dezenas de campos de apoio, em duplicidade, para clientes antigos (timestamp, updated_timestamp, seo_name, product_code, supplier, zero_price_action, price_tiers...). A leitura individual acrescenta breadcrumb, categories, seo e full_description.
{ "redirect": "/products/novo-slug", "slug": "novo-slug" }Quando o slug pedido é antigo e a loja registrou um redirecionamento, a leitura devolve 200 com este corpo no lugar do produto. Siga o redirect.
Erros
| Status | Quando | Corpo |
|---|---|---|
| 401 | Loja que exige login para navegar e chamada anônima | {"error": "shopping_requires_login", "message": "this storefront requires login to browse"} |
| 403 | Chave sfk_ sem o escopo storefront:read | {"error": "missing_scope", "required": "storefront:read"} |
| 404 | Produto inexistente, inativo, restrito ao grupo do cliente ou de seller que não entrega na região | {"error": "product not found"} |
| 500 | Falha ao ler o produto | {"error": "failed to get product", ...} |