Skip to main content

GET /auth/login

Inicia o fluxo de autenticação. Exibe o formulário de login e, após autenticação, redireciona para redirect_to. Query Parameters:
ParâmetroTipoObrigatórioDescrição
redirect_tostringSimURL de callback para onde redirecionar após login. Deve estar cadastrada no Supabase → Auth → URL Configuration.
Respostas:
StatusDescrição
200Renderiza o formulário de login
302Redireciona para /auth/welcomeredirect_to após login bem-sucedido

GET /auth/check

Verifica se o usuário possui um eg_session cookie válido. Usado por apps server-side para validar autenticação sem redirecionar. Não aceita parâmetros. Lê o cookie eg_session da requisição. Resposta 200 — autenticado:
{
  "authenticated": true,
  "session": {
    "sub": "uuid-do-usuario",
    "email": "usuario@email.com",
    "name": "João Silva",
    "is_producer": false,
    "is_beta": true,
    "plan_slug": "easy-standard"
  }
}
Resposta 200 — não autenticado:
{ "authenticated": false, "reason": "missing_session" }
ou
{ "authenticated": false, "reason": "invalid_session" }
Este endpoint é para verificação server-side (ex: middleware de proteção de rotas, auth provider da documentação). Não redireciona o usuário.

POST /auth/verify

Valida um eg_token temporário emitido para apps externos e retorna um eg_session JWT. Deve ser chamado server-side no callback route do app externo. Headers:
Authorization: Bearer {api_key}
Content-Type: application/json
Body:
{ "token": "<eg_token>" }
Resposta 200:
{
  "user": {
    "sub": "uuid",
    "email": "usuario@email.com",
    "name": "João Silva",
    "is_producer": false,
    "scopes": ["read:email", "read:profile"]
  },
  "eg_session": "<jwt-assinado>"
}
Respostas de erro:
StatusErroDescrição
400token ausenteBody sem campo token
401invalid_api_keyAPI key inválida ou ausente
401invalid_tokeneg_token expirado ou assinatura inválida

GET /api/me

Retorna o perfil do usuário autenticado via Supabase token. Usado pelo auth-provider package para buscar dados do usuário após o callback. Headers:
Authorization: Bearer {supabase_access_token}
Resposta 200:
{
  "id": "uuid-do-usuario",
  "email": "usuario@email.com",
  "name": "João Silva",
  "avatar_url": "https://...",
  "plan": "easy-standard"
}
StatusDescrição
200Perfil retornado
401Token ausente, inválido ou expirado

POST /api/webhook/payment

Recebe notificações de compra do app-front, verificadas com HMAC SHA256. Payload:
{
  "event": "purchase.completed",
  "customer": {
    "email": "usuario@email.com",
    "name": "João Silva",
    "phone": "+5511999999999"
  },
  "product": {
    "id": "uuid-do-produto",
    "plan_slug": "easy-standard"
  },
  "company": {
    "name": "Empresa Ltda",
    "cnpj": "00.000.000/0001-00"
  },
  "signature": "<hmac-sha256-hex>"
}
plan_slug aceita: easy-standard, easy-pro, easy-enterprise Assinando no app-front:
import { createHmac } from 'crypto';

const body = { event, customer, product, company, timestamp };
const bodyString = JSON.stringify(body);
const signature = createHmac('sha256', process.env.SSO_WEBHOOK_SECRET!)
  .update(bodyString)
  .digest('hex');

await fetch(process.env.SSO_WEBHOOK_URL!, {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({ ...body, signature }),
});
WEBHOOK_SECRET (SSO) e SSO_WEBHOOK_SECRET (app-front) devem ser idênticos.
Respostas:
StatusDescrição
200Webhook recebido e processado
400Payload inválido
401Assinatura ausente ou inválida
500Configuração incompleta no servidor

GET /api/plans/public

Retorna os planos disponíveis para compra. Endpoint público, sem autenticação. Resposta 200:
[
  { "slug": "easy-standard",   "name": "Easy Standard",   "price": 9900 },
  { "slug": "easy-pro",        "name": "Easy Pro",        "price": 19900 },
  { "slug": "easy-enterprise", "name": "Easy Enterprise", "price": 49900 }
]