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- Commitar em código —
git logguarda 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ário | Urgência | Ação |
|---|---|---|
| Suspeita de vazamento (commit acidental, print) | 🔴 Imediata | Rotacionar agora + auditar uso |
| Funcionário com acesso saiu | 🟡 Em 24h | Rotacionar + atualizar env vars |
| Perdeu a key (esqueceu de copiar) | 🟢 Quando puder | Rotacionar + copiar (e desta vez salvar) |
| Política periódica (90d) | 🟢 Opcional | Rotacionar 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 produtouserAgent— browser/CLI que copiouat— 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
- Códigos de erro — quando 401/402/429/500 dispara
- Ir pros teus produtos — rotacionar, copiar key, audit