Vitrine sem prefixo v1
O que é a superfície /api/storefront, quem pode chamá-la e o mapa de todas as rotas.
A vitrine é a parte da loja que o cliente final usa. A superfície /api/storefront/... (sem prefixo de versão) foi criada para integrações de terceiros que precisam de um caminho estável e de uma forma própria de autorização: chaves de API da vitrine (sfk_...) e tokens de app (vat_...), cada um com escopos. Os apps e conectores escritos para a Venddor 1.0 usam este caminho.
Esta seção documenta as 21 rotas dessa superfície: catálogo (produtos, categorias, busca), conteúdo (páginas, menus), checkout por sessão, cálculo de frete e a lista de pedidos do cliente logado.
Como funciona
O funil de compra
O cliente monta um carrinho na loja ou no app, e é a partir do cart_id dele que o checkout começa. A sessão de checkout guarda o endereço, o frete, a forma de pagamento e os descontos, e a cada passo recalcula o total.
- Criar a sessão
POST /api/storefront/checkoutcom ocart_id. A resposta traz oidda sessão e o passo atual. - Informar endereço, frete e pagamento
Três
PUTna ordem (passos do checkout). Cada um devolve a sessão com o total recalculado. - Aplicar descontos (opcional)
- Validar e fechar
validateconfere estoque, preço, cupom e pagamento sem criar nada;placecria o pedido.
Os passos da sessão (step) avançam sozinhos: address, shipping, payment, review.
Conceitos-chave
Quem pode chamar
| Credencial | Cabeçalho | Serve para |
|---|---|---|
| Nenhuma (anônimo) | Nenhum | Catálogo, páginas, menus, frete. Checkout apenas com X-Session-ID do carrinho de visitante. |
| JWT do cliente | Authorization: Bearer <jwt> | Tudo, e é obrigatório para a lista de pedidos. |
| Chave da vitrine | X-API-Key: sfk_... ou Authorization: Bearer sfk_... | Escopos storefront:read e storefront:write. Falta de escopo: 403 {"error":"missing_scope","required":"..."}. |
| Token de app | Authorization: Bearer vat_... | Escopos read_content, write_orders, read_shipping, read_orders. Falta de escopo: 403 {"error":"missing_scope","required":"..."}. |
Mais sobre chaves e tokens em Autenticação.
Catálogo fechado para visitantes
Se a loja exigir login para navegar, as rotas de produtos, categorias e busca respondem 401 {"error":"shopping_requires_login","message":"this storefront requires login to browse"} para quem não estiver logado. Páginas, menus, checkout e frete não passam por essa trava.
Sessão de checkout e dono
A sessão pertence a quem a criou. Usuário logado: a sessão é do user_id. Visitante: a sessão é do X-Session-ID do carrinho. Outro chamador recebe 404 {"error":"checkout session not found"}, igual a uma sessão que não existe.
Valores e datas
Dinheiro em centavos (int). Datas em RFC 3339 (UTC). Ids em UUID. O corpo de erro desta superfície é {"error": "..."}, sem status.
Endpoints
| Método e caminho | Para que serve | Autenticação | Página |
|---|---|---|---|
GET /api/storefront/products | Lista produtos | Anônimo, sfk_ storefront:read | Produtos |
GET /api/storefront/products/{id} | Lê um produto | Anônimo, sfk_ storefront:read | Produtos |
GET /api/storefront/categories | Árvore de categorias | Anônimo, sfk_ storefront:read | Categorias |
GET /api/storefront/categories/{id} | Lê uma categoria | Anônimo, sfk_ storefront:read | Categorias |
GET /api/storefront/search | Busca de produtos | Anônimo, sfk_ storefront:read | Busca |
GET /api/storefront/pages | Lista páginas de conteúdo | Anônimo | Páginas e menus |
GET /api/storefront/pages/{slug} | Lê uma página | Anônimo | Páginas e menus |
GET /api/storefront/menus | Menus de navegação | Anônimo, vat_ read_content | Páginas e menus |
POST /api/storefront/checkout | Abre a sessão de checkout | Dono do carrinho | Iniciar checkout |
GET /api/storefront/checkout/{sessionId} | Resumo da sessão e opções | Dono da sessão | Iniciar checkout |
PUT /api/storefront/checkout/{sessionId}/address | Define endereço e documento | Dono da sessão | Passos do checkout |
PUT /api/storefront/checkout/{sessionId}/shipping | Escolhe o frete | Dono da sessão | Passos do checkout |
PUT /api/storefront/checkout/{sessionId}/payment | Escolhe o pagamento | Dono da sessão | Passos do checkout |
POST e DELETE /api/storefront/checkout/{sessionId}/coupon | Aplica e remove cupom | Dono da sessão | Cupom e vale-presente |
POST e DELETE /api/storefront/checkout/{sessionId}/gift-certificate | Aplica e remove vale-presente | Dono da sessão | Cupom e vale-presente |
POST /api/storefront/checkout/{sessionId}/validate | Valida sem fechar | Dono da sessão | Validar e fechar |
POST /api/storefront/checkout/{sessionId}/place | Cria o pedido | Dono da sessão | Validar e fechar |
POST /api/storefront/shipping/calculate | Cotação de frete de uma sacola | Anônimo, vat_ read_shipping | Calcular frete |
GET /api/storefront/orders | Pedidos do cliente logado | JWT do cliente | Pedidos do cliente |
Erros comuns
- Chamar
checkoutsemguest_emailcomo visitante. Quem não está logado precisa mandarguest_emailao abrir a sessão. - Mandar um
X-Session-IDdiferente do usado no carrinho. O carrinho do visitante "não é seu" e a resposta é404 cart not found. - Ler
valid: trueemvalidatecomo "pode fechar".validateconfere estoque, preço, cupom e pagamento, mas não exige endereço nem frete; oplacesem endereço dá 400. - Tratar
409doplacecomo falha definitiva. Alguns 409 pedem apenas que o cliente revise (preço mudou) ou espere (pedido em processamento). - Usar chave
sfk_na lista de pedidos. Ela exige o JWT do cliente. - Esperar ids numéricos. Aqui os ids são UUID.