Programas de pontos e milhas aéreas movimentam bilhões de reais no Brasil e são alvos constantes de fraude — contas falsas, roubo de milhas e resgates indevidos causam prejuízos milionários ao setor. A validação de CPF via API é a principal barreira para garantir que cada conta pertença a uma pessoa real e que cada operação seja autorizada pelo titular legítimo. A CPFHub.io oferece essa verificação em ~900ms, com resposta padronizada em JSON e conformidade com a LGPD.
Introdução
Programas de pontos e milhas aéreas movimentam bilhões de reais no Brasil. Smiles, Livelo, Latam Pass e dezenas de outros programas acumulam, transferem e resgatam pontos que funcionam como uma moeda paralela. Onde há valor, há fraude -- e o mercado de milhas não é exceção. Contas falsas, transferências indevidas e resgates fraudulentos causam prejuízos milionários ao setor.
A validação de CPF via API é fundamental para garantir que cada conta em um programa de fidelidade pertença a uma pessoa real e única.
Fraudes em programas de pontos
Contas fantasma para acúmulo
Fraudadores criam múltiplas contas usando dados fictícios ou de terceiros para acumular pontos de boas-vindas. Depois, transferem ou resgatam esses pontos em uma conta principal.
Roubo de milhas
Contas legítimas com saldos altos são alvo de invasão. O fraudador acessa a conta, transfere as milhas para outra conta e as resgata rapidamente. Sem verificação de CPF no momento da transferência, a plataforma não consegue confirmar se a operação é legítima.
Compra e revenda ilegal
Intermediários compram milhas de terceiros -- muitas vezes de pessoas que não entendem o valor de seus pontos -- e as revendem com lucro. A validação de CPF dificulta essa prática ao exigir que cada operação seja vinculada a uma identidade verificada.
Fraude no acúmulo retroativo
Alguns programas permitem creditar pontos retroativamente por compras passadas. Fraudadores fabricam comprovantes falsos vinculados a CPFs reais para obter pontos indevidos.
Implementação em Python
O exemplo a seguir demonstra um sistema de programa de pontos com validação de CPF em todos os momentos críticos.
import requests
import re
from datetime import datetime, timedelta
from typing import Optional
import json
CPFHUB_API_URL = "https://api.cpfhub.io/cpf"
CPFHUB_API_KEY = "SUA_CHAVE_DE_API"
REQUEST_TIMEOUT = 10 # segundos
# Simulação de banco de dados
contas_fidelidade = {} # cpf -> conta
transacoes = []
def consultar_cpf(cpf: str) -> Optional[dict]:
"""Consulta CPF na API CPFHub.io."""
cpf_limpo = re.sub(r"\D", "", cpf)
try:
response = requests.get(
f"{CPFHUB_API_URL}/{cpf_limpo}",
headers={
"x-api-key": CPFHUB_API_KEY,
"Accept": "application/json",
},
timeout=REQUEST_TIMEOUT,
)
response.raise_for_status()
dados = response.json()
if dados.get("success"):
return dados["data"]
return None
except requests.exceptions.Timeout:
raise Exception("Timeout na consulta de CPF")
except requests.exceptions.HTTPError as e:
status = e.response.status_code
if status == 404:
return None
if status == 401:
raise Exception("API key inválida")
raise Exception(f"Erro HTTP {status}")
except requests.exceptions.RequestException:
raise Exception("Erro de conexão")
def cadastrar_membro(cpf: str, nome: str, email: str) -> dict:
"""Cadastra um novo membro no programa de fidelidade."""
cpf_limpo = re.sub(r"\D", "", cpf)
# Verifica duplicidade
if cpf_limpo in contas_fidelidade:
return {
"sucesso": False,
"erro": "Este CPF já possui uma conta no programa de fidelidade",
}
# Valida CPF na API
try:
dados = consultar_cpf(cpf_limpo)
except Exception as e:
return {"sucesso": False, "erro": str(e)}
if not dados:
return {"sucesso": False, "erro": "CPF não encontrado na base"}
# Verifica correspondência de nome
nome_api = dados.get("nameUpper", "").split()
nome_informado = nome.upper().split()
if not nome_api or not nome_informado:
return {"sucesso": False, "erro": "Nomes não puderam ser comparados"}
if nome_api[0] != nome_informado[0]:
return {
"sucesso": False,
"erro": "O primeiro nome informado não corresponde ao CPF",
}
# Cria conta
conta = {
"cpf": cpf_limpo,
"nome": dados.get("name"),
"nomeUpper": dados.get("nameUpper"),
"email": email,
"dataNascimento": dados.get("birthDate"),
"genero": dados.get("gender"),
"saldoPontos": 500, # bônus de boas-vindas
"nivel": "BASICO",
"verificado": True,
"criadoEm": datetime.now().isoformat(),
}
contas_fidelidade[cpf_limpo] = conta
transacoes.append({
"cpf": cpf_limpo,
"tipo": "CREDITO",
"descricao": "Bônus de boas-vindas",
"pontos": 500,
"data": datetime.now().isoformat(),
})
return {
"sucesso": True,
"conta": {
"nome": conta["nome"],
"saldo": conta["saldoPontos"],
"nivel": conta["nivel"],
},
"mensagem": "Conta criada com 500 pontos de boas-vindas",
}
def acumular_pontos(cpf: str, valor_compra: float, parceiro: str) -> dict:
"""Acumula pontos por compra em parceiro."""
cpf_limpo = re.sub(r"\D", "", cpf)
conta = contas_fidelidade.get(cpf_limpo)
if not conta:
return {"sucesso": False, "erro": "Conta não encontrada"}
if not conta.get("verificado"):
return {"sucesso": False, "erro": "Conta não verificada"}
# Calcula pontos (1 ponto a cada R$ 1 gasto)
pontos = int(valor_compra)
# Multiplicador por nível
multiplicadores = {"BASICO": 1, "PRATA": 1.5, "OURO": 2, "DIAMANTE": 3}
multiplicador = multiplicadores.get(conta["nivel"], 1)
pontos_final = int(pontos * multiplicador)
conta["saldoPontos"] += pontos_final
transacoes.append({
"cpf": cpf_limpo,
"tipo": "CREDITO",
"descricao": f"Compra em {parceiro} - R$ {valor_compra:.2f}",
"pontos": pontos_final,
"multiplicador": multiplicador,
"data": datetime.now().isoformat(),
})
return {
"sucesso": True,
"pontosAcumulados": pontos_final,
"multiplicador": multiplicador,
"saldoAtual": conta["saldoPontos"],
}
def transferir_pontos(
cpf_origem: str, cpf_destino: str, quantidade: int
) -> dict:
"""Transfere pontos entre contas com validação de CPF."""
cpf_orig = re.sub(r"\D", "", cpf_origem)
cpf_dest = re.sub(r"\D", "", cpf_destino)
# Mesma conta
if cpf_orig == cpf_dest:
return {"sucesso": False, "erro": "Não é possível transferir para si mesmo"}
# Verifica contas
conta_origem = contas_fidelidade.get(cpf_orig)
conta_destino = contas_fidelidade.get(cpf_dest)
if not conta_origem:
return {"sucesso": False, "erro": "Conta de origem não encontrada"}
if not conta_destino:
return {"sucesso": False, "erro": "Conta de destino não encontrada"}
# Revalida CPF de origem (proteção contra roubo de conta)
try:
dados_origem = consultar_cpf(cpf_orig)
if not dados_origem:
return {
"sucesso": False,
"erro": "Falha na revalidação do CPF de origem",
}
except Exception as e:
return {"sucesso": False, "erro": f"Erro na validação: {str(e)}"}
# Verifica saldo
if conta_origem["saldoPontos"] < quantidade:
return {"sucesso": False, "erro": "Saldo insuficiente"}
# Limite de transferência por dia
hoje = datetime.now().date()
transferencias_hoje = [
t for t in transacoes
if t["cpf"] == cpf_orig
and t["tipo"] == "TRANSFERENCIA_SAIDA"
and datetime.fromisoformat(t["data"]).date() == hoje
]
total_transferido_hoje = sum(t["pontos"] for t in transferencias_hoje)
LIMITE_DIARIO = 10000
if total_transferido_hoje + quantidade > LIMITE_DIARIO:
return {
"sucesso": False,
"erro": f"Limite diário de transferência ({LIMITE_DIARIO} pontos) excedido",
}
# Executa transferência
conta_origem["saldoPontos"] -= quantidade
conta_destino["saldoPontos"] += quantidade
transacoes.append({
"cpf": cpf_orig,
"tipo": "TRANSFERENCIA_SAIDA",
"descricao": f"Transferência para {conta_destino['nome']}",
"pontos": quantidade,
"cpf_destino": cpf_dest,
"data": datetime.now().isoformat(),
})
transacoes.append({
"cpf": cpf_dest,
"tipo": "TRANSFERENCIA_ENTRADA",
"descricao": f"Transferência de {conta_origem['nome']}",
"pontos": quantidade,
"cpf_origem": cpf_orig,
"data": datetime.now().isoformat(),
})
return {
"sucesso": True,
"pontosTransferidos": quantidade,
"saldoOrigem": conta_origem["saldoPontos"],
"destinatario": conta_destino["nome"],
}
def resgatar_milhas(cpf: str, quantidade: int, destino: str) -> dict:
"""Resgata pontos como milhas aéreas."""
cpf_limpo = re.sub(r"\D", "", cpf)
conta = contas_fidelidade.get(cpf_limpo)
if not conta:
return {"sucesso": False, "erro": "Conta não encontrada"}
# Revalida CPF antes do resgate
try:
dados = consultar_cpf(cpf_limpo)
if not dados:
return {"sucesso": False, "erro": "CPF não pôde ser revalidado"}
except Exception as e:
return {"sucesso": False, "erro": f"Erro na validação: {str(e)}"}
if conta["saldoPontos"] < quantidade:
return {"sucesso": False, "erro": "Saldo insuficiente"}
# Taxa de conversão: 1 ponto = 1 milha
milhas = quantidade
conta["saldoPontos"] -= quantidade
transacoes.append({
"cpf": cpf_limpo,
"tipo": "RESGATE",
"descricao": f"Resgate de {milhas} milhas para {destino}",
"pontos": quantidade,
"data": datetime.now().isoformat(),
})
return {
"sucesso": True,
"milhasResgatadas": milhas,
"programaDestino": destino,
"saldoRestante": conta["saldoPontos"],
"titular": dados.get("name"),
}
# Exemplo de uso
if __name__ == "__main__":
# Cadastro
print("--- Cadastro ---")
r1 = cadastrar_membro("123.456.789-09", "João da Silva", "joao@email.com")
print(json.dumps(r1, indent=2, ensure_ascii=False))
# Acúmulo
print("\n--- Acúmulo ---")
r2 = acumular_pontos("12345678909", 1500.00, "Loja Online ABC")
print(json.dumps(r2, indent=2, ensure_ascii=False))
# Cadastro de segundo membro para transferência
r3 = cadastrar_membro("987.654.321-00", "Maria Oliveira", "maria@email.com")
# Transferência
print("\n--- Transferência ---")
r4 = transferir_pontos("12345678909", "98765432100", 500)
print(json.dumps(r4, indent=2, ensure_ascii=False))
# Resgate
print("\n--- Resgate ---")
r5 = resgatar_milhas("12345678909", 1000, "Smiles")
print(json.dumps(r5, indent=2, ensure_ascii=False))
Proteção em operações críticas
As operações mais vulneráveis em programas de pontos são as transferências e os resgates. A validação de CPF deve ser reforçada nesses momentos.
Transferências
Toda transferência deve revalidar o CPF de origem para confirmar que o titular legítimo está autorizando a operação. Limites diários de transferência por CPF previnem a drenagem rápida de contas comprometidas.
Resgates
Antes de converter pontos em milhas, passagens ou produtos, revalide o CPF e confirme que os dados do beneficiário estão corretos. Resgates acima de determinado valor devem exigir confirmação adicional.
Detecção de comportamento anômalo
Além da validação unitária, monitore padrões que indicam fraude em programas de pontos.
Acúmulo concentrado -- um CPF que acumula pontos em dezenas de transações de baixo valor em curto período pode estar usando um bot. Transferências em cadeia -- pontos que passam por múltiplas contas antes do resgate indicam tentativa de ocultar a origem. Resgates imediatos -- uma conta nova que acumula e resgata pontos no mesmo dia levanta suspeitas. Contas dormentes reativadas -- contas inativas por meses que subitamente realizam transferências podem ter sido comprometidas.
Integração com parceiros
Programas de fidelidade frequentemente integram-se com parceiros (lojas, companhias aéreas, bancos) para acúmulo e resgate de pontos. A validação de CPF deve ser consistente em todo o ecossistema.
Quando um parceiro envia uma solicitação de acúmulo de pontos, a plataforma deve verificar se o CPF informado pelo parceiro corresponde ao CPF cadastrado na conta de fidelidade. A API da CPFHub.io permite essa verificação cruzada em tempo real, garantindo que apenas titulares legítimos acumulem e resgatem benefícios.
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
Programas de pontos e milhas aéreas lidam com valor real -- e por isso são alvos constantes de fraude. A validação de CPF via API é a fundação sobre a qual toda a segurança do programa é construída: garante que cada conta pertence a uma pessoa real, que transferências são autorizadas pelo titular legítimo e que resgates são feitos por quem tem direito.
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.



