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
- Interface de consentimento (frontend): formulários e banners que coletam o consentimento.
- API de consentimento (backend): registra, consulta e revoga consentimentos.
- Banco de evidências: armazena provas imutáveis de cada consentimento.
- Verificador de consentimento: middleware que verifica consentimento ativo antes de processar dados.
Implementação do backend
API de gerenciamento de consentimento
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, 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.
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"}
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
- Coleta: titular fornece consentimento via formulário.
- Registro: sistema armazena evidência completa do consentimento.
- Verificação: toda operação com CPF verifica consentimento ativo.
- Renovação: quando os termos mudam, solicite novo consentimento.
- Revogação: titular revoga a qualquer momento, com efeito imediato.
- 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 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.
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 — 50 consultas mensais gratuitas, sem cartão de crédito — e comece hoje mesmo.
CPFHub.io
Pronto para integrar a API?
50 consultas gratuitas para testar agora. Sem cartão de crédito. Acesso imediato à documentação.
Sobre a redação
Redação CPFHub.io
Time editorial especializado em APIs de CPF, identidade digital e compliance no mercado brasileiro. Produzimos guias técnicos, análises regulatórias e tutoriais sobre LGPD e KYC para desenvolvedores e líderes de produto.



