Privacidade & LGPD
Seus contatos são o ativo mais precioso do seu negócio. O bZapper foi construído para proteger essa base — não só porque a LGPD (Lei 13.709/2018) exige, mas porque um número banido e uma lista queimada custam caro. Esta página descreve os controles de privacidade que já existem no produto e como usá-los.
O bZapper é o operador dos dados: fornece as ferramentas de consentimento, supressão e segurança. Você (o controlador) decide as finalidades e garante a base legal de cada contato. As duas partes precisam trabalhar juntas — o produto automatiza o trabalho pesado; a base legal do consentimento é sua.
Base legal do consentimento
A LGPD exige uma base legal para tratar dados pessoais. Para mensagens de marketing e notificações via WhatsApp, a base mais comum é o consentimento — que precisa ser:
- Livre — sem coação; a pessoa pode dizer não sem prejuízo.
- Informado — ela sabe quem é você e para que vai receber mensagens.
- Inequívoco — um "sim" claro (um opt-in ativo, não um pré-marcado).
Outras bases previstas na lei também aparecem no produto: execução de contrato
(contract) e legítimo interesse (legitimate_interest) — úteis para mensagens
transacionais (OTP, confirmação de pedido, cobrança).
Trilha de consentimento (consent_ledger)
Toda vez que um contato opta por entrar ou por sair, o bZapper pode registrar o
evento numa trilha append-only — o consent_ledger. É uma prova datada e imutável de
que houve (ou deixou de haver) consentimento, exatamente o que a LGPD pede quando você
precisa demonstrar a base legal.
Cada registro guarda:
| Campo | O que é |
|---|---|
phone | telefone normalizado (só dígitos, com DDI) |
channel | canal do consentimento (padrão whatsapp) |
basis | base legal: consent, contract ou legitimate_interest |
granted | true = opt-in, false = opt-out registrado |
source | origem da prova: form, import, api, keyword:parar… |
evidence | texto/URL da prova (ex.: link do formulário assinado) |
created_at | data e hora do evento |
A trilha só recebe inserções — nunca é editada nem apagada linha a linha. É isso que a torna auditável: o histórico de consentimento de um contato é uma sequência cronológica de fatos, não um estado que você pode reescrever.
Opt-out por palavra-chave
Quem responder PARAR, SAIR, STOP (entre outras) a uma mensagem entra automaticamente na lista de supressão do projeto — e nunca mais recebe disparo. O bZapper detecta o pedido de descadastro no inbound, sem você escrever nada.
Palavras reconhecidas (case-insensitive, tolerante a acento e pontuação):
parar · pare · sair · cancelar · descadastrar · remover · chega
stop · unsubscribe · "sem promoção" · "não quero" · "não perturbe" · "me tira"
A detecção é conservadora: casa a mensagem inteira curta ou a primeira palavra —
"não posso parar de te elogiar" não suprime ninguém. Quando o opt-out é
registrado pela primeira vez, o bZapper emite o webhook contact.opted_out.
Não existe palavra-chave de "voltar/START" no inbound — por segurança, a re-inscrição é sempre manual (um admin remove o contato da supressão). Isso evita que um "start" acidental reabra o canal para quem pediu para sair.
Block list de dois níveis
A supressão protege o seu número (e a reputação dele) barrando o envio antes de a mensagem entrar na fila. Há dois níveis:
- Parede (sempre barra) —
opt_out(a pessoa pediu para sair) emanual(um admin bloqueou). Esses nunca furam, nem comforce. - Inferido (modo estrito) —
blocked_inferred(mensagens que ficaram em "enviado" e nunca viraram "entregue") ehard_bounce. Esses só barram se a conta ativar o modo estrito (enforce_unreachable_suppression); do contrário são só um sinal.
Cada registro guarda o motivo (reason) e a origem (source, ex.:
keyword:parar, campaign:<id>, admin), então você sempre sabe por que um número
foi suprimido. A verificação vale para envio avulso e campanha — ela vive no caminho de
saída compartilhado.
Mídia privada com presign
Toda mídia de conversa (imagens, áudios, documentos que chegam pelo WhatsApp) é privada:
- Guardada num bucket privado — nunca num diretório público.
- Baixada por URL pré-assinada com validade curta (TTL). O padrão é 24 horas
(
MEDIA_URL_TTL), e o link é regenerado a cada acesso no inbox. - O cliente baixa direto do bucket — os bytes não passam pela sua API.
- As URLs assinadas usam HMAC-SHA256 e são validadas por tempo: link expirado não abre.
Ou seja: um arquivo de conversa não fica "solto" numa URL pública indexável. Sem uma URL assinada e ainda válida, ninguém acessa.
Isolamento por projeto
Dentro da sua conta, cada projeto é um ambiente isolado (veja Conta, projetos e usuários). Números, inbox, keys, estatísticas e a lista de supressão são por projeto. Uma chamada autenticada só enxerga o projeto do qual a chave/sessão faz parte:
- API key → carrega o projeto embutido; toda operação fica escopada a ele.
- Sessão no painel → o projeto ativo vai no header
X-Project-Id, validado contra a sua conta a cada requisição.
No banco, as consultas são sempre filtradas por tenant_id e project_id — um projeto
nunca lê os dados de outro.
Retenção e exclusão
Dados de conversa não ficam para sempre. O bZapper roda uma rotina de retenção que, de acordo com o seu plano, apaga mídia e mensagens antigas:
- Mídia vencida tem os bytes apagados do bucket (libera cota), preservando a linha da mensagem.
- Mensagens vencidas são excluídas; a mídia atrelada é apagada antes (garantia de que nada fica órfão no bucket).
A exclusão manual usa o mesmo caminho — apagar uma mensagem apaga a mídia junto.
Outros controles de segurança
- Webhooks assinados — cada entrega leva
X-Bzapper-Signature(HMAC-SHA256) para você verificar a autenticidade; a comparação é timing-safe. Veja Webhooks. O segredo do webhook é criptografado em repouso. - Segredos criptografados — as sessões do WhatsApp são criptografadas em repouso; o código do OTP nunca é persistido nem exibido.
- Rate limiting — cada API key tem um limite de requisições por segundo (token-bucket).
- Telefone e e-mail normalizados — telefone vira só dígitos com DDI; e-mail é minúsculo no banco — o mesmo contato é reconhecido sem duplicatas.
Checklist para começar certo
- Colete consentimento de forma livre, informada e inequívoca — e guarde a prova.
- Registre a base legal de cada contato (a trilha existe para isso).
- Deixe o opt-out fluir — não bloqueie as palavras-chave; elas protegem você.
- Escute o
contact.opted_outpara sincronizar com o seu CRM. - Respeite a supressão — não tente reimportar quem pediu para sair.
O bZapper trata opt-out, supressão e a trilha de consentimento automaticamente, mas quem garante que cada contato autorizou receber suas mensagens é você. Dispare só para quem optou por entrar.