Pular para o conteúdo

Versão 2026-09-07 · atualizado em 27/08/2026

Rascunho em revisão jurídica. Este texto ainda não foi revisado por advogado e pode mudar antes do lançamento. Os campos marcados como a definir serão preenchidos com os dados da empresa.

Consentimentos e aceites

1. O que a tabela consents guarda

consents(user_id, kind, version, granted_at, ip, user_agent)
Coluna Regra
kind terms · privacy · guardian · marketing
version data da versão aceita, no formato AAAA-MM-DD (ex.: 2026-09-07) — igual ao campo version do frontmatter do documento correspondente
granted_at timestamp UTC do aceite, gravado pelo servidor (nunca vindo do cliente)
ip IP de origem da requisição — prova do aceite; sujeito à retenção do §4
user_agent user agent do request

Regras invioláveis:

  1. Append-only. Revogar não apaga a linha: grava uma nova linha do mesmo kind com granted_at novo e o marcador de revogação (revoked_at, já presente no schema de packages/db). O histórico é a prova.
  2. O servidor decide. O front envia "aceitei o kind X"; a API resolve qual é a versão vigente do documento e grava. O cliente não manda a versão — se mandasse, bastaria forjar.
  3. Re-aceite ao mudar de versão. Se a versão vigente de terms ou privacy for maior que a última aceita pelo usuário, a API sinaliza em GET /me (pendingConsents: ['terms']) e a UI apresenta o re-aceite antes de qualquer ação sensível.
  4. IP e user agent são dado pessoal. Não vão para log de aplicação, não vão para analytics, não saem em GET /me/export de terceiros. Ficam só na tabela.
  5. marketing é opt-in puro. Nunca pré-marcado, nunca embutido em outro checkbox, sempre revogável em um clique.

2. Tabela dos kind

kind Base legal Quando coletar Obrigatório? Documento vinculado
terms Execução de contrato (LGPD art. 7º, V) — o "aceite" é adesão contratual, não consentimento em sentido técnico Cadastro, e a cada nova versão dos Termos Sim — sem isso não há conta /legal/termos-de-uso
privacy Ciência da política (transparência, art. 9º) Cadastro, junto com terms, e a cada nova versão Sim /legal/privacidade
guardian Melhor interesse do menor (art. 14) + assistência civil 1) Cadastro de quem tem 13–17 anos; 2) Checkout de quem tem menos de 18 (registro separado, com o texto de assistência) Sim, nos dois momentos /legal/menores-fluxo
marketing Consentimento (art. 7º, I) Cadastro (opcional, passo de perfil) ou Perfil → Privacidade; versão própria MARKETING_CONSENT_VERSION (§3.5) Não — nunca bloqueia nada —

Nota jurídica para o advogado: usamos consents como registro único de aceites, mesmo quando a base legal não é "consentimento" em sentido técnico (caso de terms e privacy). Isso simplifica a prova e não prejudica o titular. Confirmar se a nomenclatura precisa ser ajustada.

3. Textos exatos dos checkboxes

3.1 terms + privacy — cadastro

Um único checkbox cobre os dois documentos (aceite de adesão), gerando duas linhas em consents.

Checkbox (obrigatório, nunca pré-marcado):

Li e aceito os Termos de Uso e a Política de Privacidade.

Erro se não marcado:

Aceite os Termos e a Política de Privacidade para criar sua conta.

Variação para quem tem 13–17 anos (mesmo checkbox, texto de apoio adicional abaixo):

Tem menos de 18? Leia a versão curta da política, feita para você.

3.2 terms / privacy — re-aceite por nova versão

Tela modal, bloqueante para ações sensíveis (enviar redação, comprar), nunca para continuar respondendo questões.

Título

Atualizamos nossos termos

Corpo

Mudamos {resumo em uma frase do que mudou}. A versão nova vale a partir de {data}. Leia e confirme para continuar.

Ver o que mudou · Política de Privacidade

Checkbox (obrigatório)

Li e aceito a nova versão dos Termos de Uso e da Política de Privacidade.

Ações: Aceitar e continuar · Agora não

"Agora não" fecha o modal e mantém o acesso ao que é gratuito; ações sensíveis continuam pedindo o aceite.

3.3 guardian — cadastro de 13 a 17 anos

Checkbox (obrigatório):

Meu responsável sabe que eu uso o Gabarita e concorda com os Termos de Uso e a Política de Privacidade.

Erro se não marcado:

Marque a confirmação para continuar.

Grava: kind='guardian', version = versão vigente dos Termos.

3.4 guardian — checkout de menor de 18 anos

Checkbox (obrigatório):

Declaro que meu responsável legal está ciente desta compra e a autoriza, e que os dados informados acima são dele.

Erro se não marcado:

Marque a confirmação para continuar.

Grava uma segunda linha kind='guardian' (não sobrescreve a do cadastro), com version = versão vigente dos Termos e referência ao checkout no payload de auditoria.

3.5 marketing — opt-in

Aparece no cadastro (passo de perfil, junto do celular) e em Perfil → Privacidade ("Novidades e dicas por e-mail e WhatsApp"). Nunca pré-marcado. Nunca obrigatório.

⚠️ Texto novo em 10/09/2026, revisar com advogado. Passou a citar WhatsApp para não exigir novo aceite quando o canal existir (PRD L-N1); nada é enviado por WhatsApp até lá. A versão gravada em consents para este kind é a constante MARKETING_CONSENT_VERSION = '2026-09-10' do contrato, separada de CONSENT_VERSIONS (que os apps compilam). Exceção à regra 2 do §1: para marketing o cliente envia a versão e a API aceita qualquer valor, como já fazia.

Checkbox:

Quero receber dicas de estudo, novidades e avisos sobre o ENEM por e-mail e WhatsApp.

Texto de apoio:

No máximo um e-mail por semana. Você pode cancelar quando quiser, no rodapé de qualquer e-mail ou no seu perfil.

O que este consentimento libera (PRD L-N1): a variante de oferta dos avisos (que cita o Passe, sem preço) e o aviso de cota de redação usada, por push ou e-mail. Só para maiores de 18; menor nunca recebe oferta, mesmo que marque.

O que não depende dele: avisos de serviço sobre a conta (energia recarregada, cobrança pendente que o próprio aluno iniciou), que têm toggle próprio em Perfil → Preferências ("Avisos sobre a sua conta por e-mail", user_settings.lifecycle_emails) e o mesmo link de descadastro em 1 clique, com escopo lifecycle.

Revogação (Perfil → Privacidade ou link no e-mail, escopo marketing):

Você não vai mais receber nossos e-mails de novidades. Avisos sobre sua conta, sua redação corrigida e suas compras continuam chegando — esses fazem parte do serviço.

Grava linha de revogação em consents e desativa o envio imediatamente (sem "pode levar até 48 horas").

4. Retenção e exportação

Item Regra
Linhas de consents mantidas enquanto a conta existir + 5 anos após a exclusão, como prova do aceite (exercício regular de direitos, art. 7º, VI)
ip e user_agent nas linhas de consentimento mantidos junto com a linha; não são reutilizados para nenhuma outra finalidade
GET /me/export inclui kind, version e granted_at das linhas do próprio usuário; não inclui ip nem user_agent (dado de segurança, não de perfil)
Exclusão de conta as linhas de consents sobrevivem à exclusão, desvinculadas do perfil (mantendo apenas o user_id como identificador opaco) — documentar isso na Política de Privacidade, §6

5. Checklist de aceite (API + web)

  • Nenhum checkbox de consentimento nasce marcado.
  • marketing nunca bloqueia cadastro, compra ou qualquer funcionalidade.
  • version é resolvida no servidor a partir do frontmatter do documento vigente; o cliente nunca envia versão.
  • granted_at vem do relógio do servidor.
  • POST /me/consents é idempotente por (user_id, kind, version).
  • GET /me expõe pendingConsents quando há versão nova.
  • Revogação de marketing tem efeito imediato e é auditável.
  • ip / user_agent de consentimento não aparecem em log de aplicação nem em evento de analytics.
  • O texto de cada checkbox no código é idêntico ao deste documento (se divergir, este documento é a fonte).

Pendências para o advogado

  • Validar os quatro textos de checkbox (§3), incluindo o texto novo de marketing (§3.5, 10/09/2026) que cita WhatsApp.
  • Bump das versões legais (10/09/2026): a Política de Privacidade ganhou a linha do celular e duas bases legais novas (avisos sobre a conta e cobrança pendente) sem mudar o version do frontmatter nem CONSENT_VERSIONS, porque os apps compilam a versão. Decidir com o advogado se o bump + aviso de 15 dias entra quando as builds iOS/Android com o campo de celular shiparem, ou antes.
  • Divergência com o produto (revisão 27/08): o §4 promete que as linhas de consents sobrevivem à exclusão da conta por +5 anos, mas o schema atual (consents.user_id → profiles com on delete cascade) as apaga junto com a conta no account.purge. Decidir: arquivar as provas de aceite antes do purge (mudança de schema/worker) ou assumir a exclusão total — a Política de Privacidade publicada já descreve a exclusão total, e este documento só fecha depois dessa decisão.
  • Confirmar se terms/privacy devem mesmo ser registrados como "consentimento" ou renomeados para "aceite" no schema.
  • Confirmar o prazo de 5 anos de retenção das provas de aceite.
  • Definir o texto do "resumo em uma frase do que mudou" (§3.2) como obrigação de processo a cada nova versão.