A LGPD garante aos titulares de CPF o direito de acessar, corrigir, portar e solicitar a exclusão dos seus dados — e toda empresa que processa esses dados precisa de um fluxo de atendimento estruturado, com prazos documentados e trilha de auditoria. A API da CPFHub.io permite verificar a identidade do solicitante antes de executar qualquer operação, garantindo que os dados sejam entregues apenas ao titular legítimo.
Introdução
A LGPD garante aos titulares de dados pessoais um conjunto robusto de direitos que devem ser respeitados por qualquer empresa que processe dados de CPF. Do acesso à exclusão, da correção à portabilidade, cada direito exige um fluxo de atendimento estruturado, com prazos definidos e registros de auditoria. Não basta ter um canal de atendimento — é preciso que ele funcione de forma eficiente e documentada.
Direitos do titular na LGPD
O artigo 18 da LGPD lista os seguintes direitos:
- Confirmação de tratamento: saber se a empresa trata seus dados.
- Acesso: obter cópia dos dados pessoais tratados.
- Correção: solicitar a atualização de dados incompletos ou incorretos.
- Anonimização, bloqueio ou eliminação: para dados desnecessários, excessivos ou tratados irregularmente.
- Portabilidade: transferir dados a outro controlador.
- Eliminação: excluir dados tratados com base no consentimento.
- Informação sobre compartilhamento: saber com quem os dados foram compartilhados.
- Informação sobre o consentimento: saber que pode negar consentimento e as consequências.
- Revogação do consentimento: revogar autorização previamente concedida.
Sistema de atendimento ao titular
Modelo de dados e gerenciador de solicitações
import json
import hashlib
import sqlite3
from datetime import datetime, timezone, timedelta
from enum import Enum
from typing import Optional, List
import requests
class TipoDireito(Enum):
CONFIRMACAO = "confirmacao_tratamento"
ACESSO = "acesso_dados"
CORRECAO = "correcao_dados"
ELIMINACAO = "eliminacao_dados"
PORTABILIDADE = "portabilidade"
INFORMACAO_COMPARTILHAMENTO = "info_compartilhamento"
REVOGACAO_CONSENTIMENTO = "revogacao_consentimento"
ANONIMIZACAO = "anonimizacao"
class StatusSolicitacao(Enum):
RECEBIDA = "recebida"
EM_ANALISE = "em_analise"
EM_PROCESSAMENTO = "em_processamento"
CONCLUIDA = "concluida"
INDEFERIDA = "indeferida"
class GerenciadorDireitosTitular:
"""Gerencia solicitações de direitos do titular para dados de CPF."""
PRAZO_DIAS = 15 # Prazo legal para atendimento
def __init__(self, db_path: str = "direitos_titular.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 solicitacoes (
protocolo TEXT PRIMARY KEY,
cpf_hash TEXT NOT NULL,
tipo_direito TEXT NOT NULL,
status TEXT NOT NULL,
detalhes TEXT,
criado_em TEXT NOT NULL,
prazo_limite TEXT NOT NULL,
concluido_em TEXT,
resposta TEXT,
atendente TEXT
);
CREATE TABLE IF NOT EXISTS historico_solicitacoes (
id INTEGER PRIMARY KEY AUTOINCREMENT,
protocolo TEXT NOT NULL,
status_anterior TEXT,
status_novo TEXT NOT NULL,
timestamp TEXT NOT NULL,
observacao TEXT
);
""")
self.conn.commit()
def abrir_solicitacao(
self,
cpf: str,
tipo_direito: TipoDireito,
detalhes: str = ""
) -> dict:
"""Abre uma nova solicitação de direito do titular."""
cpf_hash = hashlib.sha256(cpf.encode()).hexdigest()
protocolo = f"SOL-{datetime.now().strftime('%Y%m%d')}-{hashlib.sha256(f'{cpf}{datetime.now().isoformat()}'.encode()).hexdigest()[:8].upper()}"
agora = datetime.now(timezone.utc)
prazo = agora + timedelta(days=self.PRAZO_DIAS)
self.conn.execute(
"""INSERT INTO solicitacoes
(protocolo, cpf_hash, tipo_direito, status, detalhes, criado_em, prazo_limite)
VALUES (?, ?, ?, ?, ?, ?, ?)""",
(protocolo, cpf_hash, tipo_direito.value,
StatusSolicitacao.RECEBIDA.value, detalhes,
agora.isoformat(), prazo.isoformat())
)
self._registrar_historico(protocolo, None, StatusSolicitacao.RECEBIDA.value, "Solicitação recebida")
self.conn.commit()
return {
"protocolo": protocolo,
"tipo_direito": tipo_direito.value,
"status": StatusSolicitacao.RECEBIDA.value,
"criado_em": agora.isoformat(),
"prazo_limite": prazo.isoformat()
}
def processar_solicitacao(self, protocolo: str, atendente: str):
"""Atualiza o status da solicitação para em processamento."""
self.conn.execute(
"UPDATE solicitacoes SET status = ?, atendente = ? WHERE protocolo = ?",
(StatusSolicitacao.EM_PROCESSAMENTO.value, atendente, protocolo)
)
self._registrar_historico(
protocolo, StatusSolicitacao.EM_ANALISE.value,
StatusSolicitacao.EM_PROCESSAMENTO.value,
f"Atendente: {atendente}"
)
self.conn.commit()
def concluir_solicitacao(self, protocolo: str, resposta: str):
"""Conclui a solicitação com a resposta ao titular."""
agora = datetime.now(timezone.utc).isoformat()
self.conn.execute(
"UPDATE solicitacoes SET status = ?, concluido_em = ?, resposta = ? WHERE protocolo = ?",
(StatusSolicitacao.CONCLUIDA.value, agora, resposta, protocolo)
)
self._registrar_historico(
protocolo, StatusSolicitacao.EM_PROCESSAMENTO.value,
StatusSolicitacao.CONCLUIDA.value,
"Solicitação concluída"
)
self.conn.commit()
def consultar_status(self, protocolo: str) -> Optional[dict]:
"""Consulta o status de uma solicitação."""
cursor = self.conn.execute(
"SELECT protocolo, tipo_direito, status, criado_em, prazo_limite, concluido_em FROM solicitacoes WHERE protocolo = ?",
(protocolo,)
)
row = cursor.fetchone()
if row:
return {
"protocolo": row[0],
"tipo_direito": row[1],
"status": row[2],
"criado_em": row[3],
"prazo_limite": row[4],
"concluido_em": row[5]
}
return None
def solicitacoes_pendentes(self) -> List[dict]:
"""Lista solicitações pendentes próximas do prazo."""
cursor = self.conn.execute(
"SELECT protocolo, tipo_direito, status, prazo_limite FROM solicitacoes WHERE status != 'concluida' AND status != 'indeferida' ORDER BY prazo_limite ASC"
)
return [
{"protocolo": r[0], "tipo": r[1], "status": r[2], "prazo": r[3]}
for r in cursor.fetchall()
]
def _registrar_historico(self, protocolo, status_anterior, status_novo, obs):
self.conn.execute(
"INSERT INTO historico_solicitacoes (protocolo, status_anterior, status_novo, timestamp, observacao) VALUES (?, ?, ?, ?, ?)",
(protocolo, status_anterior, status_novo,
datetime.now(timezone.utc).isoformat(), obs)
)
Processamento de cada tipo de direito
Direito de acesso
def processar_acesso(cpf: str, api_key: str) -> dict:
"""Processa solicitação de acesso aos dados de CPF."""
try:
response = requests.get(
f"https://api.cpfhub.io/cpf/{cpf}",
headers={
"x-api-key": api_key,
"Accept": "application/json"
},
timeout=30
)
if response.status_code == 200:
dados = response.json()["data"]
return {
"dados_tratados": dados,
"base_legal": "execucao_contrato",
"finalidade": "verificacao_cadastral",
"data_coleta": "2025-01-15",
"compartilhado_com": ["Provedor de pagamento XYZ"],
"retencao_prevista": "365 dias"
}
except requests.exceptions.Timeout:
return {"error": "Timeout ao recuperar dados"}
return {"error": "Dados não encontrados"}
Verificação via cURL
curl -X GET "https://api.cpfhub.io/cpf/12345678901" \
-H "x-api-key: SUA_API_KEY" \
-H "Accept: application/json" \
--max-time 30
Fluxo visual do atendimento
Titular -> [Solicitação] -> Recebida -> Verificação de Identidade
-> Em Análise -> Classificação do Direito -> Em Processamento
-> Execução da Ação -> Geração da Resposta -> Concluída
-> Notificação ao Titular -> Registro de Auditoria
Prazos por tipo de direito
| Direito | Prazo LGPD | Complexidade |
|---|---|---|
| Confirmação de tratamento | Imediato (formato simplificado) ou 15 dias | Baixa |
| Acesso aos dados | 15 dias | Média |
| Correção | 15 dias | Baixa |
| Eliminação | 15 dias | Alta |
| Portabilidade | 15 dias | Alta |
| Revogação de consentimento | Imediato | Baixa |
Verificação de identidade do solicitante
Antes de atender qualquer solicitação, confirme que o solicitante é de fato o titular do CPF. Utilize múltiplos fatores:
- E-mail vinculado ao cadastro.
- Token SMS para o telefone cadastrado.
- Perguntas de segurança.
- Documento de identidade (para solicitações de alto risco).
Métricas e SLAs
Monitore os seguintes indicadores:
- Tempo médio de atendimento: deve estar abaixo de 15 dias.
- Taxa de conclusão no prazo: meta de 100%.
- Volume de solicitações por tipo: identifica padrões e oportunidades de melhoria.
- Taxa de indeferimento: justificativas devem ser documentadas.
- Satisfação do titular: pesquisa pós-atendimento.
Automação de respostas recorrentes
Para solicitações recorrentes — como confirmação de tratamento — automatize a resposta com templates aprovados pelo DPO e pelo jurídico, reduzindo o tempo de atendimento e garantindo consistência.
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
O atendimento aos direitos do titular é uma obrigação legal que, quando bem implementada, fortalece a relação de confiança com os clientes. Um sistema estruturado, com protocolos claros, prazos controlados e registros de auditoria, demonstra maturidade na governança de dados e reduz significativamente o risco de sanções por descumprimento.
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.



