Skip to main content
Com a Headless Storefront API você monta a vitrine como quiser — Next.js, WordPress, app mobile, o que for. O catálogo, o carrinho e os pedidos vêm desta API. O pagamento continua acontecendo no checkout hospedado da loja.gg: você redireciona o comprador para uma checkout_url e recebe a confirmação por webhook. Base URL: https://api.loja.gg/storefront/v1

1. Antes de começar

No painel, em Loja → Storefront API:
1

Habilite a API headless

Sem isso, todas as chamadas respondem 403 headless_disabled.
2

Cadastre as origens permitidas

Os domínios de onde o navegador vai chamar a API — ex.: https://minhaloja.com.br. Precisa ser https (exceto http://localhost), sem caminho e sem wildcard. Se a origem não estiver cadastrada, o navegador bloqueia a chamada.
3

Cadastre as URLs de retorno

Para onde o comprador volta depois do checkout — ex.: https://minhaloja.com.br/obrigado. Sem isso, a criação da sessão de checkout falha com redirect_url_not_allowed.
4

Crie suas chaves

A chave completa aparece uma única vez, no momento da criação. Só o hash é armazenado — se perder, revogue e gere outra.

2. As duas chaves

Se a chave secreta for usada a partir de um navegador, a requisição é bloqueada com secret_key_in_browser e um alerta é disparado. Não é um bug — é a detecção de que a chave vazou no bundle do seu front. Revogue e emita outra.

Modo de teste

Chaves hk_test_* funcionam contra o sandbox dos gateways e nunca movimentam dinheiro real. Toda resposta traz livemode: true|false. Construa a loja inteira em test antes de trocar as chaves para hk_live_*.
Resposta
Todos os valores estão em centavos. 4990 é R$ 49,90. Nunca use ponto flutuante para dinheiro — é assim que surgem diferenças como 49.900000000000006 e o total da vitrine diverge do total do checkout.
Filtros em /products: page, limit (máx. 100), category, category_id, search.
Use o ETag retornado: repita a chamada com If-None-Match e receba 304 sem consumir banda.

4. Checkout

Você monta o carrinho no seu site e, na hora de pagar, cria a sessão e redireciona o comprador.
Resposta
Redirecione o comprador para checkout_url.
Não existe campo de preço na requisição. O valor é sempre recalculado a partir do produto no banco — mesmo que você envie um preço, ele é ignorado.
string
required
Obrigatória. Se a requisição der timeout e você repetir com a mesma chave e o mesmo corpo, a resposta original é devolvida em vez de criar uma segunda sessão. Corpo diferente com a mesma chave retorna 409.
A sessão de checkout expira em 30 minutos.

Validando um cupom

Um cupom inválido devolve 200 com valid: false e uma mensagem genérica — a API não distingue “não existe” de “expirado” de “não se aplica”, para não entregar um oráculo de força bruta contra códigos de cupom.

5. Pedidos

Paginação por cursor: passe o next_cursor da resposta anterior em starting_after.
O CPF/CNPJ vem sempre mascarado (***.***.789-**), inclusive para a chave secreta. Dados de gateway, taxas, split e margem não são expostos nesta API — eles ficam no painel. Um pedido que não é da sua loja responde 404, nunca 403 (um 403 confirmaria que o id existe).

6. Erros

Programe contra o code, não contra a message — a mensagem pode mudar, o código não. Inclua sempre o request_id ao abrir um chamado de suporte.

Próximos passos

Integrando com Next.js

Um cliente de API pronto e o modelo mental de chaves publishable/secret no App Router.

Webhooks

Como validar assinatura e entregar o produto de forma confiável.