# Como implementar consent management para coleta de CPF em sites e apps

> Aprenda a implementar um sistema de consent management para coleta de CPF em sites e aplicativos, em total conformidade com a LGPD.

**Publicado:** 23/11/2025
**Autor:** Redação CPFHub.io
**URL:** https://cpfhub.io/blog/implementar-consent-management-coleta-cpf

---


A LGPD exige que o consentimento para coleta de CPF seja livre, informado, inequívoco e documentado — uma simples checkbox não basta. Com uma Consent Management Platform integrada à CPFHub.io, você garante que cada consulta de CPF só ocorre com consentimento ativo registrado, facilitando auditorias e atendendo às exigências da ANPD.

## Introdução

O consentimento é uma das bases legais mais utilizadas para o tratamento de dados de CPF, mas sua implementação correta exige muito mais do que uma simples caixa de seleção. A LGPD exige que o consentimento seja livre, informado, inequívoco e específico -- e que o controlador seja capaz de comprovar que ele foi obtido de forma válida. Um sistema de Consent Management Platform (CMP) é a ferramenta adequada para atender a esses requisitos.

---

## Requisitos legais do consentimento na LGPD

O artigo 8 da LGPD define os requisitos do consentimento:

- **Livre**: o titular deve ter a opção real de não consentir, sem ser penalizado.
- **Informado**: deve saber exatamente quais dados serão coletados e para que.
- **Inequívoco**: a manifestação deve ser clara, sem margem para dúvida.
- **Específico**: para cada finalidade distinta, um consentimento separado.
- **Documentado**: o controlador deve provar que obteve o consentimento.
- **Revogável**: o titular pode revogar o consentimento a qualquer momento, de forma gratuita e facilitada.

---

## Arquitetura do sistema de consent management

### Componentes

1. **Interface de consentimento (frontend)**: formulários e banners que coletam o consentimento.
2. **API de consentimento (backend)**: registra, consulta e revoga consentimentos.
3. **Banco de evidências**: armazena provas imutáveis de cada consentimento.
4. **Verificador de consentimento**: middleware que verifica consentimento ativo antes de processar dados.

---

## Implementação do backend

### API de gerenciamento de consentimento

```python
from flask import Flask, request, jsonify
import json
import hashlib
import sqlite3
from datetime import datetime, timezone
from typing import Optional, List

app = Flask(__name__)

class ConsentManagementPlatform:
 """Plataforma de gerenciamento de consentimento para coleta de CPF."""

 def __init__(self, db_path: str = "consent.db"):
 self.conn = sqlite3.connect(db_path, check_same_thread=False)
 self._criar_tabelas()

 def _criar_tabelas(self):
 self.conn.executescript("""
 CREATE TABLE IF NOT EXISTS consentimentos (
 id TEXT PRIMARY KEY,
 cpf_hash TEXT NOT NULL,
 finalidade TEXT NOT NULL,
 versao_termos TEXT NOT NULL,
 texto_consentimento TEXT NOT NULL,
 status TEXT NOT NULL DEFAULT 'ativo',
 canal TEXT NOT NULL,
 ip_origem TEXT,
 user_agent TEXT,
 criado_em TEXT NOT NULL,
 revogado_em TEXT
 );

 CREATE INDEX IF NOT EXISTS idx_cpf_finalidade
 ON consentimentos(cpf_hash, finalidade, status);

 CREATE TABLE IF NOT EXISTS historico_consentimentos (
 id INTEGER PRIMARY KEY AUTOINCREMENT,
 consentimento_id TEXT NOT NULL,
 acao TEXT NOT NULL,
 timestamp TEXT NOT NULL,
 detalhes TEXT
 );
 """)
 self.conn.commit()

 def registrar_consentimento(
 self,
 cpf: str,
 finalidade: str,
 versao_termos: str,
 texto_consentimento: str,
 canal: str,
 ip_origem: str,
 user_agent: str
 ) -> dict:
 """Registra um novo consentimento do titular."""

 cpf_hash = hashlib.sha256(cpf.encode()).hexdigest()
 consent_id = hashlib.sha256(
 f"{cpf_hash}:{finalidade}:{datetime.now().isoformat()}".encode()
 ).hexdigest()[:24]

 agora = datetime.now(timezone.utc).isoformat()

 self.conn.execute(
 """INSERT INTO consentimentos
 (id, cpf_hash, finalidade, versao_termos, texto_consentimento,
 status, canal, ip_origem, user_agent, criado_em)
 VALUES (?, ?, ?, ?, ?, 'ativo', ?, ?, ?, ?)""",
 (consent_id, cpf_hash, finalidade, versao_termos,
 texto_consentimento, canal, ip_origem, user_agent, agora)
 )

 self.conn.execute(
 "INSERT INTO historico_consentimentos (consentimento_id, acao, timestamp) VALUES (?, ?, ?)",
 (consent_id, "consentimento_registrado", agora)
 )

 self.conn.commit()

 return {
 "consent_id": consent_id,
 "status": "ativo",
 "finalidade": finalidade,
 "registrado_em": agora
 }

 def verificar_consentimento(self, cpf: str, finalidade: str) -> bool:
 """Verifica se existe consentimento ativo para a finalidade."""

 cpf_hash = hashlib.sha256(cpf.encode()).hexdigest()
 cursor = self.conn.execute(
 "SELECT id FROM consentimentos WHERE cpf_hash = ? AND finalidade = ? AND status = 'ativo'",
 (cpf_hash, finalidade)
 )
 return cursor.fetchone() is not None

 def revogar_consentimento(self, cpf: str, finalidade: str) -> bool:
 """Revoga consentimento do titular para a finalidade especificada."""

 cpf_hash = hashlib.sha256(cpf.encode()).hexdigest()
 agora = datetime.now(timezone.utc).isoformat()

 cursor = self.conn.execute(
 "UPDATE consentimentos SET status = 'revogado', revogado_em = ? WHERE cpf_hash = ? AND finalidade = ? AND status = 'ativo'",
 (agora, cpf_hash, finalidade)
 )
 self.conn.commit()

 if cursor.rowcount > 0:
 self.conn.execute(
 "INSERT INTO historico_consentimentos (consentimento_id, acao, timestamp) VALUES (?, ?, ?)",
 (f"{cpf_hash}:{finalidade}", "consentimento_revogado", agora)
 )
 self.conn.commit()
 return True

 return False

 def listar_consentimentos(self, cpf: str) -> List[dict]:
 """Lista todos os consentimentos de um titular."""

 cpf_hash = hashlib.sha256(cpf.encode()).hexdigest()
 cursor = self.conn.execute(
 "SELECT id, finalidade, status, criado_em, revogado_em FROM consentimentos WHERE cpf_hash = ?",
 (cpf_hash,)
 )
 return [
 {
 "consent_id": row[0],
 "finalidade": row[1],
 "status": row[2],
 "criado_em": row[3],
 "revogado_em": row[4]
 }
 for row in cursor.fetchall()
 ]

# Instanciar a CMP
cmp = ConsentManagementPlatform()

@app.route("/api/consent/registrar", methods=["POST"])
def registrar():
 dados = request.json
 resultado = cmp.registrar_consentimento(
 cpf=dados["cpf"],
 finalidade=dados["finalidade"],
 versao_termos=dados["versao_termos"],
 texto_consentimento=dados["texto_consentimento"],
 canal=dados.get("canal", "web"),
 ip_origem=request.remote_addr,
 user_agent=request.headers.get("User-Agent", "")
 )
 return jsonify(resultado), 201

@app.route("/api/consent/verificar", methods=["GET"])
def verificar():
 cpf = request.args.get("cpf")
 finalidade = request.args.get("finalidade")
 ativo = cmp.verificar_consentimento(cpf, finalidade)
 return jsonify({"consentimento_ativo": ativo})

@app.route("/api/consent/revogar", methods=["POST"])
def revogar():
 dados = request.json
 revogado = cmp.revogar_consentimento(dados["cpf"], dados["finalidade"])
 return jsonify({"revogado": revogado})
```

---

## Integração com consulta de CPF

Antes de qualquer consulta à API do [**CPFHub.io**](https://www.cpfhub.io/), o sistema deve verificar se existe consentimento ativo registrado para aquele CPF e finalidade. Sem consentimento válido, a requisição não deve ser feita.

```python
import requests

def consultar_cpf_com_consentimento(
 cpf: str, finalidade: str, cmp: ConsentManagementPlatform
) -> dict:
 """Consulta CPF somente se houver consentimento ativo."""

 if not cmp.verificar_consentimento(cpf, finalidade):
 return {"error": "Consentimento não encontrado ou revogado"}

 try:
 response = requests.get(
 f"https://api.cpfhub.io/cpf/{cpf}",
 headers={
 "x-api-key": "SUA_API_KEY",
 "Accept": "application/json"
 },
 timeout=30
 )

 if response.status_code == 200:
 return response.json()

 except requests.exceptions.Timeout:
 return {"error": "Timeout na consulta"}

 return {"error": "CPF não encontrado"}
```

```bash
curl -X GET "https://api.cpfhub.io/cpf/12345678901" \
 -H "x-api-key: SUA_API_KEY" \
 -H "Accept: application/json" \
 --max-time 30
```

---

## Interface de consentimento (frontend)

### Boas práticas para o formulário

- **Linguagem clara**: evite jargão jurídico. Explique em termos simples o que será feito com o CPF.
- **Granularidade**: ofereça opções separadas para cada finalidade (verificação, marketing, análise de crédito).
- **Sem pré-seleção**: checkboxes devem estar desmarcados por padrão.
- **Destaque para a revogação**: inclua link visível para revogar consentimentos.
- **Versão dos termos**: vincule cada consentimento à versão exata dos termos aceitos.

### Elementos obrigatórios no formulário

- Identificação do controlador (nome e CNPJ).
- Dados que serão coletados (CPF, nome, etc.).
- Finalidade específica de cada dado.
- Prazo de retenção.
- Direitos do titular (acesso, correção, exclusão, portabilidade).
- Informações do DPO para contato.
- Link para a política de privacidade completa.

---

## Ciclo de vida do consentimento

1. **Coleta**: titular fornece consentimento via formulário.
2. **Registro**: sistema armazena evidência completa do consentimento.
3. **Verificação**: toda operação com CPF verifica consentimento ativo.
4. **Renovação**: quando os termos mudam, solicite novo consentimento.
5. **Revogação**: titular revoga a qualquer momento, com efeito imediato.
6. **Exclusão**: dados são eliminados conforme política de retenção.

---

## Relatórios de conformidade

Gere relatórios periódicos que demonstrem:

- Total de consentimentos ativos por finalidade.
- Taxa de revogação por canal e finalidade.
- Consentimentos pendentes de renovação (termos atualizados).
- Tempo médio de atendimento a revogações.
- Histórico completo de cada consentimento para auditoria.

---

## Perguntas frequentes

### O que é necessário para implementar validação de CPF neste contexto?
A validação de CPF exige uma chamada à API com o número do documento e a chave de autenticação. A CPFHub.io retorna o status do CPF, nome do titular e data de nascimento em ~900ms, permitindo a verificação em tempo real durante o cadastro ou transação.

### A API CPFHub.io funciona para todos os volumes de consulta?
Sim. O plano gratuito oferece 50 consultas por mês sem cartão de crédito — ideal para testes e projetos pequenos. Para volumes maiores, o plano Pro inclui 1.000 consultas mensais por R$149. Se o limite for ultrapassado, a API não bloqueia: cobra R$0,15 por consulta adicional.

### Como garantir conformidade com a LGPD ao usar uma API de CPF?
Use o CPF apenas para a finalidade declarada ao titular, armazene apenas o necessário (não guarde o CPF cru se um token bastar), implemente controle de acesso aos logs de consulta e documente a base legal para o tratamento. A [ANPD](https://www.gov.br/anpd/) orienta que dados de identificação devem ser tratados com o princípio da necessidade.

### Quanto tempo leva para integrar a API CPFHub.io?
A integração básica leva menos de 30 minutos: crie uma conta em cpfhub.io, gere a API key no painel e faça uma chamada GET para `https://api.cpfhub.io/cpf/{CPF}` com o header `x-api-key`. A documentação inclui exemplos em Python, Node.js, PHP, Java e outras linguagens.

### Leia também

- [Diferença entre validação de CPF e consulta de CPF: quando usar cada uma](https://cpfhub.io/blog/diferenca-entre-validacao-de-cpf-e-consulta-de-cpf-quando-usar-cada-uma)
- [API de CPF grátis para desenvolvedores: como começar em 5 minutos](https://cpfhub.io/blog/api-cpf-gratis-desenvolvedores-comecar-5-minutos)
- [Onboarding digital em fintechs: como validar CPF em menos de 30 segundos](https://cpfhub.io/blog/onboarding-digital-em-fintechs-como-validar-cpf-em-menos-de-30-segundos)
- [KYC no Brasil: quais setores são obrigados a validar CPF por lei](https://cpfhub.io/blog/kyc-no-brasil-quais-setores-sao-obrigados-a-validar-cpf-por-lei)

---

## Conclusão

Um sistema de consent management bem implementado é a base para a coleta legal de dados de CPF. Além de garantir conformidade com a LGPD, ele fortalece a confiança dos seus clientes e protege a empresa contra sanções. Invista em granularidade, transparência e facilidade de revogação -- e sempre verifique o consentimento ativo antes de processar qualquer dado pessoal.

Para consultas de CPF seguras e integradas ao seu fluxo de consentimento, utilize uma API confiável. Cadastre-se em [cpfhub.io](https://www.cpfhub.io/) — 50 consultas mensais gratuitas, sem cartão de crédito — e comece hoje mesmo.

