Segurança & chaves

API keys são credenciais — trata como senha. Cada produto tem sua key isolada.

Anatomia da API key

Formato: vap_ + 32 chars base64url. Ex: vap_3xK9pQrL2nM7fT8wB5vN1zC4hY6jA0i.

  • vap_ = video analysis product
  • 32 chars de entropia (192 bits) = impossível de adivinhar
  • Mostrada UMA vez na criação ou rotação — depois só mascarada
  • Tenant id (slug do produto) ≠ API key (são coisas diferentes)

Onde guardar

Nunca em código. Nunca em logs. Nunca em pastebins. Use env vars + secret manager do teu provedor:

# .env (NÃO commitar — adicionar ao .gitignore)
VIDEO_ANALYSIS_API_KEY=vap_xxxxxxxxxxxxxxxxxxxxxxxxxxxxx
⚠ NUNCA:
  • Commitar em código — git log guarda pra sempre
  • Colar em chat (Slack, Discord) — fica em logs deles
  • Logar em produção — pode acabar em Sentry/Datadog
  • Mandar no frontend — qualquer cliente HTTP vê. Cliente faz chamada pro teu backend, teu backend chama nossa API

Quando rotacionar

CenárioUrgênciaAção
Suspeita de vazamento (commit acidental, print)🔴 ImediataRotacionar agora + auditar uso
Funcionário com acesso saiu🟡 Em 24hRotacionar + atualizar env vars
Perdeu a key (esqueceu de copiar)🟢 Quando puderRotacionar + copiar (e desta vez salvar)
Política periódica (90d)🟢 OpcionalRotacionar com janela de manutenção

Como rotacionar: no detalhe do produto, clica em "Gerar nova API key". Old key invalidada imediatamente; nova aparece 1x. Tenant id e config ficam iguais.

Audit log

Cada vez que copias a key completa no portal, fica registrado em users/{uid}/audit_logs no Firestore com:

  • kind: "api_key_copy" (no futuro: rotated, created, deleted)
  • productId — qual produto
  • userAgent — browser/CLI que copiou
  • at — timestamp server-side

Você pode auditar pelo Firebase Console (Firestore) ou pela UI (em breve, N+3).

Tenant isolation

Cada produto é um tenant separado no backend. Isso significa:

  • Budget cap independente — atingir cap do produto A não afeta produto B
  • Rate limit independente — cada tenant tem seu bucket
  • Webhook isolado — cada produto pode ter URL diferente
  • Dados não cruzam — jobs do tenant A nunca aparecem listando o tenant B

Use isso a teu favor: 1 produto por app/serviço (ex.: ViralCutter, SocialBot, InternalDashboard). Se um vazar, só ele é comprometido.

Próximos passos

Segurança & chaves — FrameOracle Docs