Mapa de APIs
Esta nota funciona como referência rápida dos endpoints mais importantes que implementamos no admin e no ecommerce.
Leitura pensada para explicar responsabilidades, ordem de execução e trechos reais do código com foco no fluxo da implementação.
O que você encontra aqui
Esta nota funciona como referência rápida dos endpoints mais importantes que implementamos no admin e no ecommerce.
Ela não substitui as notas conceituais. Ela serve como mapa operacional.
Envelope padrão de resposta
Hoje existem dois perfis de API no projeto:
- admin (
/api/ecommpanel/*), comno-store; - pública versionada (
/api/v1/*), comCache-Controlpara leitura rápida e integração.
Admin
As APIs do admin usam dois helpers importantes:
export function jsonNoStore(payload: unknown, init?: ResponseInit): NextResponse {
const response = NextResponse.json(payload, init);
response.headers.set('Cache-Control', 'no-store, max-age=0');
return response;
}
export function errorNoStore(status: number, error: string, details?: unknown): NextResponse {
return jsonNoStore({ error, ...(details ? { details } : {}) }, { status });
}Leitura guiada
Isso significa que, em geral, as respostas seguem dois formatos:
sucesso
{
"ok": true
}ou um documento específico como user, page, template, routes.
erro
{
"error": "Mensagem de erro",
"details": {}
}Pública versionada
As APIs públicas usam envelope estável:
{
"version": "v1",
"generatedAt": "2026-03-18T03:00:00.000Z",
"data": {},
"meta": {}
}E são publicadas com cache HTTP para suportar storefront, integrações e futuro app mobile sem acoplar tudo ao painel.
Auth do admin
`POST /api/ecommpanel/auth/login`
Faz login e cria sessão.
request
{
"email": "main@ecommpanel.local",
"password": "Admin@123456"
}success
{
"ok": true,
"user": {
"id": "usr-main-001",
"email": "main@ecommpanel.local",
"roleIds": ["main_admin"],
"permissions": ["site.layout.manage", "site.content.manage"]
},
"csrfToken": "...",
"mustChangePassword": false
}erros comuns
400quando falta email ou senha401para credenciais invalidas423para conta bloqueada429para rate limit
`GET /api/ecommpanel/auth/me`
Retorna a sessão autenticada atual.
success
{
"authenticated": true,
"user": {
"id": "usr-main-001",
"email": "main@ecommpanel.local"
},
"csrfToken": "..."
}`POST /api/ecommpanel/auth/logout`
Revoga a sessão atual. Exige origem confiável e CSRF quando existe sessão ativa.
success
{
"ok": true
}`POST /api/ecommpanel/auth/login-token/request`
Solicita um código de acesso de 6 dígitos por e-mail.
request
{
"email": "stalinsn@hotmail.com"
}success
{
"ok": true,
"message": "Se o e-mail estiver ativo, o código de acesso será enviado.",
"deliveryMode": "email",
"debugCode": "408504",
"expiresAt": "2026-03-18T23:26:44.902Z"
}regras
- o código vale por um único login;
- expira em 10 minutos;
- não é permitido reenviar um novo código enquanto existir um ativo para o mesmo usuário.
`POST /api/ecommpanel/auth/login-token/verify`
Consome o código de acesso e cria a sessão do painel.
request
{
"email": "stalinsn@hotmail.com",
"code": "408504"
}success
{
"ok": true,
"user": {
"id": "usr-owner-001",
"email": "stalinsn@hotmail.com"
},
"csrfToken": "...",
"mustChangePassword": false
}`POST /api/ecommpanel/auth/forgot-password`
Dispara a recuperação de senha. Quando o SMTP do painel está ativo, envia e-mail com link e token. Sem SMTP, em desenvolvimento, também pode devolver o token de debug.
request
{
"email": "main@ecommpanel.local"
}success
{
"ok": true,
"message": "Se o e-mail existir e estiver ativo, enviaremos as instrucoes de recuperacao.",
"deliveryMode": "email",
"debugResetToken": "...",
"debugResetUrl": "http://localhost:3000/ecommpanel/reset-password?token=..."
}`POST /api/ecommpanel/auth/reset-password`
Consome token e troca a senha.
request
{
"token": "token-recebido",
"password": "NovaSenha@12345"
}success
{
"ok": true,
"sessionsRevoked": 2
}Builder do site
`GET /api/ecommpanel/site/routes`
Lista rotas resumidas.
success
{
"routes": [
{
"id": "page-abc",
"title": "Landing Black Friday",
"slug": "landing/black-friday",
"status": "draft",
"updatedAt": "2026-03-17T10:00:00.000Z",
"publishedAt": null
}
]
}`POST /api/ecommpanel/site/routes`
Cria rota e página inicial.
request
{
"title": "Landing Black Friday",
"slug": "landing/black-friday",
"description": "Campanha principal"
}success
{
"ok": true,
"route": {
"id": "page-abc",
"title": "Landing Black Friday",
"slug": "landing/black-friday"
}
}erros comuns
400para titulo ou slug ausente400para slug inválido409para colisão com rota nativa ou duplicidade
`DELETE /api/ecommpanel/site/routes/[pageId]`
Move a rota para lixeira lógica.
success
{
"ok": true,
"route": {
"id": "page-abc",
"status": "deleted"
}
}`POST /api/ecommpanel/site/routes/[pageId]/restore`
Catalogo do painel
`GET /api/ecommpanel/catalog/products`
Lista os produtos operacionais do catalogo.
success
{
"products": [
{
"id": "prd-123",
"slug": "arroz-tipo-1-1kg",
"name": "Arroz Tipo 1 1kg",
"status": "active",
"price": 11.43
}
]
}`POST /api/ecommpanel/catalog/products`
Cria um novo produto no catalogo.
request
{
"slug": "arroz-tipo-1-1kg",
"sku": "810001",
"name": "Arroz Tipo 1 1kg",
"status": "draft",
"available": true,
"price": 11.43,
"categories": ["Mercearia"],
"departments": ["Arroz"],
"collections": ["Ofertas"]
}`PUT /api/ecommpanel/catalog/products/[productId]`
Atualiza um produto existente.
Catalogo publico
`GET /api/v1/catalog/products`
Lista produtos publicos com filtros, facets e paginação.
filtros principais
qcategorycollectionavailablebranddeptpricepagelimitsort
`GET /api/v1/catalog/products/[slug]`
Retorna o detalhe de um produto.
`GET /api/v1/catalog/categories`
Retorna as categorias derivadas do catalogo ativo.
Restaura da lixeira.
success
{
"ok": true,
"route": {
"id": "page-abc",
"status": "draft"
}
}`GET /api/ecommpanel/site/routes/trash`
Lista rotas removidas lógicamente.
Páginas do builder
`GET /api/ecommpanel/site/pages`
Retorna os documentos completos conhecidos pelo builder.
`POST /api/ecommpanel/site/pages`
Cria página completa a partir de título e slug.
request
{
"title": "Institucional",
"slug": "institucional/quem-somos",
"description": "Pagina institucional"
}success
{
"ok": true,
"page": {
"id": "page-xyz",
"title": "Institucional",
"slug": "institucional/quem-somos",
"layoutPreset": "institutional"
}
}`GET /api/ecommpanel/site/pages/[pageId]`
Retorna uma página específica.
`PUT /api/ecommpanel/site/pages/[pageId]`
Atualiza o documento inteiro da página.
request
{
"title": "Quem somos",
"slug": "institucional/quem-somos",
"description": "Historia da empresa",
"layoutPreset": "institutional",
"slots": [
{
"id": "main",
"name": "Main",
"blocks": []
}
],
"seo": {
"title": "Quem somos",
"description": "Historia da empresa"
},
"theme": {
"preset": "classic"
}
}success
{
"ok": true,
"page": {
"id": "page-xyz",
"title": "Quem somos",
"slug": "institucional/quem-somos"
}
}`POST /api/ecommpanel/site/pages/[pageId]/publish`
Publica a página para o runtime.
success
{
"ok": true,
"page": {
"id": "page-xyz",
"status": "published"
}
}`POST /api/ecommpanel/site/pages/[pageId]/draft`
Volta a página para rascunho.
success
{
"ok": true,
"page": {
"id": "page-xyz",
"status": "draft"
}
}Blog
`GET /api/ecommpanel/blog/authors`
Lista os usuários editoriais ativos que podem ser usados como owner do post.
`GET /api/ecommpanel/blog/posts`
Lista os posts resumidos conhecidos pelo painel.
success
{
"posts": [
{
"id": "post-abc",
"slug": "runtime-do-site",
"title": "Como estruturamos o runtime do site",
"status": "draft",
"category": "Arquitetura"
}
]
}`POST /api/ecommpanel/blog/posts`
Cria um post em rascunho.
request
{
"title": "Como estruturamos o runtime do site",
"slug": "runtime-do-site",
"category": "Arquitetura",
"authorName": "Equipe de Conteúdo"
}`GET /api/ecommpanel/blog/posts/[postId]`
Retorna o documento completo do post e a fila de comentários conhecida para ele.
`PUT /api/ecommpanel/blog/posts/[postId]`
Atualiza o documento editorial completo.
Campos importantes:
titleslugexcerptcategorytagscoverImageUrlintrosectionsoutrointeractionseo
`POST /api/ecommpanel/blog/posts/[postId]/publish`
Publica o post no runtime.
success
{
"ok": true,
"post": {
"id": "post-abc",
"status": "published",
"slug": "runtime-do-site"
}
}`POST /api/ecommpanel/blog/posts/[postId]/draft`
Retorna o post para rascunho e remove o slug do runtime publicado.
`PATCH /api/ecommpanel/blog/posts/[postId]/comments/[commentId]`
Modera comentário.
request
{
"status": "approved"
}APIs públicas do blog
`GET /api/blog/posts/[slug]/comments`
Retorna só comentários aprovados.
`POST /api/blog/posts/[slug]/comments`
Cria comentário.
request
{
"authorName": "Stalin",
"content": "Gostei do fluxo de publicação."
}success
{
"ok": true,
"visibility": "pending",
"comment": null
}Se o post não exigir moderação, visibility pode ser approved e o comment volta preenchido.
`GET /api/blog/posts/[slug]/reactions`
Retorna o resumo público de reações e, quando possível, a reação do usuário atual.
success
{
"summary": {
"likes": 10,
"dislikes": 1,
"userReaction": "like"
}
}`POST /api/blog/posts/[slug]/reactions`
Registra reação.
request
{
"value": "like"
}Valores aceitos:
likedislikeclear
`GET /api/ecommpanel/site/resolve?path=/landing/black-friday`
Endpoint de diagnostico do runtime.
success dinâmico
{
"source": "dynamic",
"path": "/landing/black-friday",
"page": {
"id": "page-abc",
"slug": "landing/black-friday"
}
}success nativo
{
"source": "native",
"path": "/checkout",
"page": null
}Template estrutural
`GET /api/ecommpanel/site/template`
Retorna o documento consolidado do template.
success
{
"template": {
"schemaVersion": 4,
"theme": {
"preset": "classic",
"campaign": "black-friday",
"overrides": {}
},
"header": {},
"home": {},
"footer": {}
}
}`PATCH /api/ecommpanel/site/template`
Atualiza o template inteiro e republica o snapshot do storefront.
request
{
"template": {
"schemaVersion": 4,
"theme": {
"preset": "fresh",
"campaign": null,
"overrides": {
"colorBrandPrimary": "#0f766e"
}
}
}
}Observação nova:
home.overrideagora permite apontar/e-commercepara um slug já publicado e escolher se header e footer continuam visíveis.
Analytics administrativo
`GET /api/ecommpanel/analytics/config`
Retorna a configuração operacional atual de coleta interna, GTM e GA4.
`PATCH /api/ecommpanel/analytics/config`
Atualiza a configuração e publica o snapshot que a loja passa a ler em runtime.
Campos principais:
internal.enabledinternal.heartbeatIntervalSecondsinternal.activeWindowMinutesinternal.retainDaysgoogle.enabledgoogle.gtmEnabledgoogle.gtmContainerIdgoogle.gaEnabledgoogle.gaMeasurementId
Analytics interno
`POST /api/analytics/collect`
Recebe lotes de eventos enviados pelo storefront.
Eventos aceitos hoje:
page_viewheartbeatinteraction_clicksearch_submitcart_updatecheckout_step
API pública versionada
`GET /api/v1`
Índice rápido dos recursos públicos disponíveis.
`GET /api/v1/content/pages`
Lista páginas dinâmicas publicadas no runtime.
`GET /api/v1/content/pages/[...slug]`
Retorna uma página publicada com slots, SEO e tema.
`GET /api/v1/content/blog/posts`
Lista posts publicados com filtros leves como limit, category e featured.
`GET /api/v1/content/blog/posts/[slug]`
Retorna o post publicado com comentários aprovados e resumo de reações.
`GET /api/v1/catalog/products`
Lista catálogo com filtros de busca, categoria, coleção e disponibilidade.
`GET /api/v1/catalog/products/[slug]`
Retorna o produto com detalhe rico, incluindo pricing, stock, logistics, SEO e variações mock.
`GET /api/v1/catalog/categories`
Lista categorias consolidadas com contagem de produtos e filhos.
`GET /api/v1/system/health`
Expõe um health snapshot simples de conteúdo, blog, template e modo de persistência publicado.
success
{
"ok": true,
"template": {
"schemaVersion": 4,
"theme": {
"preset": "fresh"
}
}
}Ecommerce storefront
`POST /api/checkout`
Fecha o pedido no ambiente atual de simulação.
Observação operacional:
- além de responder o
orderId, a rota agora registra internamente o eventopurchase_completepara alimentar o dashboard de analytics.
request
{
"orderFormId": "of-123",
"items": [
{
"id": "sku-1",
"name": "Cafe",
"quantity": 2,
"price": 19.9
}
],
"clientProfileData": {
"firstName": "Stalin",
"email": "stalin@example.com"
},
"shipping": {
"selectedAddress": {
"postalCode": "01001-000",
"city": "Sao Paulo",
"state": "SP"
}
},
"payments": [
{
"system": "pix",
"value": 39.8
}
],
"totalizers": [],
"value": 39.8
}success
{
"orderId": "ORD-ABC123",
"status": "created"
}erros comuns
400para carrinho vazio400para dados do cliente incompletos400para endereço ausente400para pagamento ausente
Explicando de forma simples
"O mapa de APIs é o desenho da fronteira entre camadas. Quando o aluno aprende a ler esse mapa, ele para de pensar só em componente visual e passa a entender o sistema como contratos entre cliente, servidor, persistência e runtime."