Beacon

Billing API

Ver como Markdown

Billing API

Endpoints críticos para criação de checkout, confirmação de subscrição e portal de gestão.

reference • updated 2026-03-17

Objetivo

Operar o ciclo completo de faturação recorrente: iniciar checkout, confirmar estado pós-pagamento e abrir portal self-service sem perder rastreabilidade por organização.

Endpoints e contrato operativo

EndpointQuando usarRequisitos-chave
POST /api/billing/subscription/checkout?org={slug}&mode={test|live}iniciar subscrição ou upgradeBearer token Beacon, papel OWNER/ADMIN, plan e billingCycle
POST /api/billing/subscription/confirm?org={slug}&mode={test|live}reconciliar estado após retorno do checkoutcontexto de organização; body opcional com sessionId
POST /api/billing/subscription/portal?org={slug}&mode={test|live}abrir gestão self-service de plano/métodocliente Stripe já associado e subscrição elegível

Fluxo recomendado

  1. 11) Criar checkout

    Gera sessão com plano, ciclo e contexto de organização. Guarda o checkoutSessionId para rastreio.

  2. 22) Redirecionar utilizador

    Envia o utilizador para redirectUrl e evita submits concorrentes no frontend.

  3. 33) Confirmar resultado

    Após o retorno do checkout, chama subscription/confirm. Se tiveres o session_id do success URL, envia-o como sessionId.

  4. 44) Expor portal

    Disponibiliza subscription/portal apenas quando já existe cliente/subscrição Stripe gerível.

Exemplo de criação de checkout

bash
curl -X POST "https://test.beacon.pt/api/billing/subscription/checkout?org=acme&mode=test" \
  -H "Authorization: Bearer <beacon_session_token>" \
  -H "Content-Type: application/json" \
  -d '{
    "plan": "plus",
    "billingCycle": "monthly"
  }'
json
{
  "ok": true,
  "checkoutSessionId": "cs_123",
  "redirectUrl": "https://checkout.stripe.com/c/pay/cs_123",
  "plan": "PLUS",
  "billingCycle": "monthly",
  "context": {
    "mode": "test",
    "organizationSlug": "acme"
  }
}

Confirmação e consistência

  • O checkout não expõe Idempotency-Key pública; a chave usada na Stripe é gerada no servidor.
  • Se já existir checkout pendente para o mesmo plano e ciclo, a API pode reutilizar a sessão pendente e devolver pending: true.
  • Se existir checkout pendente para outro plano ou se a organização já tiver subscrição activa, a API responde com 409.
  • Não assumes sucesso apenas com o redirect concluído; o estado final deve ser confirmado por subscription/confirm e por eventos Stripe.

Exemplo de confirmação

bash
curl -X POST "https://test.beacon.pt/api/billing/subscription/confirm?org=acme&mode=test" \
  -H "Authorization: Bearer <beacon_session_token>" \
  -H "Content-Type: application/json" \
  -d '{"sessionId":"cs_test_a1b2c3"}'
json
{
  "ok": true,
  "subscription": {
    "plan": "PLUS",
    "status": "ACTIVE"
  },
  "context": {
    "mode": "test",
    "organizationSlug": "acme"
  }
}

Erros frequentes

CódigoCausa típicaAção recomendada
400org, plan ou billingCycle inválidoscorrigir payload/query e repetir
401token inválido ou expiradorenovar sessão Beacon e repetir
403utilizador sem OWNER/ADMINrever permissões da organização
409subscrição activa, checkout pendente ou sessão ainda não prontausar o estado existente ou aguardar alguns segundos
404organização inexistente ou inactivaconfirmar slug e contexto activo

Checklist de go-live

  • Fluxo testado em mode=test com sucesso e sem estados pendentes.
  • Alertas ativos para falhas de confirmação e aumento de retries.
  • Portal restrito por perfil e com auditoria de acesso.