Fraude de endereço: como cruzar CPF com dados de entrega para detectar golpes

Aprenda a cruzar dados de CPF com informações de entrega para detectar fraudes de endereço em e-commerce usando API.

Redação CPFHub.io
Redação CPFHub.io
··10 min de leitura
Fraude de endereço: como cruzar CPF com dados de entrega para detectar golpes

Cruzar o CPF do comprador com os dados de entrega é uma das técnicas mais eficazes para detectar fraudes de endereço no e-commerce. A CPFHub.io retorna nome e data de nascimento do titular em aproximadamente 900ms, permitindo identificar em tempo real quando o CPF informado não corresponde ao destinatário ou ao histórico de endereços — e bloquear o pedido antes do envio.

Introdução

A fraude de endereço é uma das modalidades mais comuns e prejudiciais no e-commerce brasileiro. O golpe funciona assim: o fraudador compra com dados de cartão roubados e informa um endereço de entrega diferente do cadastrado na fatura -- geralmente um ponto de coleta anônimo, uma portaria de prédio comercial ou um endereço de "laranja". Quando o titular do cartão contesta a compra, o lojista arca com o prejuízo do produto entregue e do chargeback.

Cruzar os dados do CPF com as informações de entrega é uma técnica eficaz para detectar inconsistências que indicam fraude.


Como funciona a fraude de endereço

O fluxo típico

O fraudador obtém dados de cartão de crédito roubados -- seja por phishing, vazamentos ou compra em mercados clandestinos. Com esses dados, faz compras em e-commerces, informando o nome do titular do cartão mas alterando o endereço de entrega. O produto é entregue no endereço do fraudador. O titular legítimo contesta a compra, e o e-commerce sofre o chargeback.

Variações do golpe

Existem variações sofisticadas. Na fraude de "vizinho cúmplice", o endereço informado é real mas pertence a um cúmplice que recebe e repassa o produto. Na fraude de "endereço de trabalho", o fraudador usa o endereço de um escritório ou coworking onde pode receber encomendas anonimamente. Na "interceptação de entrega", o fraudador monitora o rastreamento e aborda o entregador antes que este chegue ao endereço real.

Por que o endereço é o elo fraco

O endereço de entrega é o único dado que o fraudador precisa alterar. Nome, CPF e dados do cartão podem ser copiados do titular legítimo, mas o produto precisa ser entregue em um local acessível ao fraudador. Essa inconsistência é detectável.


Sinais de alerta baseados em CPF e endereço

A API da CPFHub.io retorna nome e data de nascimento do titular do CPF, dados essenciais para identificar inconsistências antes de aprovar um pedido. A FEBRABAN recomenda o cruzamento de dados cadastrais como camada obrigatória em sistemas antifraude para e-commerce e meios de pagamento.

Divergência de nome

Se o nome no CPF não corresponde ao nome no cartão de crédito ou ao nome informado no endereço de entrega, há um sinal claro de inconsistência.

Perfil demográfico incompatível

Um CPF vinculado a uma pessoa de 75 anos comprando um console de videogame para entrega em um bairro universitário pode ser um indicativo de uso fraudulento dos dados de um idoso.

Múltiplos endereços por CPF

Se o mesmo CPF aparece em pedidos com endereços de entrega em cidades ou estados diferentes em curto período, isso merece investigação.


Implementação em Python

O exemplo a seguir demonstra um sistema de análise de risco que cruza dados de CPF com informações de entrega.

import requests
import re
from datetime import datetime, timedelta
from typing import Optional
from dataclasses import dataclass, field
import json

CPFHUB_API_URL = "https://api.cpfhub.io/cpf"
CPFHUB_API_KEY = "SUA_CHAVE_DE_API"
REQUEST_TIMEOUT = 10 # segundos

@dataclass
class EnderecoEntrega:
    rua: str
    numero: str
    complemento: str
    bairro: str
    cidade: str
    estado: str
    cep: str
    destinatario: str

@dataclass
class Pedido:
    pedido_id: str
    cpf: str
    nome_comprador: str
    endereco: EnderecoEntrega
    valor: float
    data: datetime
    score_risco: float = 0.0
    alertas: list = field(default_factory=list)

# Histórico de pedidos por CPF (simulação)
historico_pedidos = {} # cpf -> [pedidos]

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("Chave de API inválida")
    raise Exception(f"Erro HTTP {status}")
    except requests.exceptions.RequestException:
    raise Exception("Erro de conexão")

def normalizar_nome(nome: str) -> str:
    """Normaliza nome para comparação."""
    import unicodedata
    normalizado = unicodedata.normalize("NFKD", nome)
    sem_acento = normalizado.encode("ASCII", "ignore").decode("ASCII")
    return sem_acento.upper().strip()

def calcular_score_risco(pedido: Pedido, dados_cpf: dict) -> dict:
    """Calcula score de risco cruzando CPF com dados de entrega."""
    score = 0.0
    alertas = []

    # 1. Verificação de nome
    nome_cpf = normalizar_nome(dados_cpf.get("name", ""))
    nome_comprador = normalizar_nome(pedido.nome_comprador)
    nome_destinatario = normalizar_nome(pedido.endereco.destinatario)

    # Nome do comprador difere do CPF
    if nome_cpf.split()[0] != nome_comprador.split()[0]:
    score += 30
    alertas.append("Primeiro nome do comprador difere do CPF")

    # Destinatário difere do titular do CPF
    if nome_cpf.split()[0] != nome_destinatario.split()[0]:
    score += 20
    alertas.append("Destinatário da entrega difere do titular do CPF")

    # Comprador difere do destinatário
    if nome_comprador != nome_destinatario:
    score += 10
    alertas.append("Nome do comprador difere do destinatário")

    # 2. Análise de idade
    ano_nascimento = dados_cpf.get("year", 0)
    if ano_nascimento:
    idade = datetime.now().year - ano_nascimento

    if idade > 70 and pedido.valor > 500:
    score += 15
    alertas.append(
    f"Titular com {idade} anos em compra de alto valor (R$ {pedido.valor:.2f})"
    )

    if idade < 18:
    score += 25
    alertas.append("Titular é menor de idade")

    # 3. Histórico de endereços
    cpf_limpo = re.sub(r"\D", "", pedido.cpf)
    pedidos_anteriores = historico_pedidos.get(cpf_limpo, [])

    if pedidos_anteriores:
    enderecos_anteriores = set()
    for p in pedidos_anteriores:
    chave = f"{p.endereco.cidade}-{p.endereco.estado}"
    enderecos_anteriores.add(chave)

    endereco_atual = f"{pedido.endereco.cidade}-{pedido.endereco.estado}"

    # Novo endereço em cidade diferente
    if endereco_atual not in enderecos_anteriores:
    score += 15
    alertas.append(
    f"Novo endereço em {pedido.endereco.cidade}/{pedido.endereco.estado} "
    f"-- histórico: {', '.join(enderecos_anteriores)}"
    )

    # Muitos endereços diferentes
    enderecos_com_atual = enderecos_anteriores | {endereco_atual}
    if len(enderecos_com_atual) > 3:
    score += 20
    alertas.append(
    f"{len(enderecos_com_atual)} endereços diferentes para o mesmo CPF"
    )

    # Pedidos recentes (últimas 24h)
    pedidos_24h = [
    p for p in pedidos_anteriores
    if (pedido.data - p.data).total_seconds() < 86400
    ]
    if len(pedidos_24h) >= 3:
    score += 15
    alertas.append(f"{len(pedidos_24h)} pedidos nas últimas 24 horas")

    # 4. Valor do pedido
    if pedido.valor > 1000:
    score += 10
    alertas.append(f"Pedido de alto valor: R$ {pedido.valor:.2f}")

    # Normaliza score para 0-100
    score = min(score, 100)

    return {
    "score": score,
    "nivel": (
    "BAIXO" if score < 30
    else "MEDIO" if score < 60
    else "ALTO"
    ),
    "alertas": alertas,
    "acao_recomendada": (
    "APROVAR" if score < 30
    else "REVISAO_MANUAL" if score < 60
    else "BLOQUEAR"
    ),
    }

def analisar_pedido(
    cpf: str,
    nome_comprador: str,
    endereco: EnderecoEntrega,
    valor: float,
) -> dict:
    """Analisa um pedido cruzando CPF com dados de entrega."""

    cpf_limpo = re.sub(r"\D", "", cpf)

    # Consulta CPF
    try:
    dados_cpf = consultar_cpf(cpf_limpo)
    except Exception as e:
    return {"erro": str(e), "acao": "REVISAO_MANUAL"}

    if not dados_cpf:
    return {
    "erro": "CPF não encontrado",
    "acao": "BLOQUEAR",
    "score": 100,
    }

    pedido = Pedido(
    pedido_id=f"PED-{datetime.now().strftime('%Y%m%d%H%M%S')}",
    cpf=cpf_limpo,
    nome_comprador=nome_comprador,
    endereco=endereco,
    valor=valor,
    data=datetime.now(),
    )

    # Calcula risco
    resultado = calcular_score_risco(pedido, dados_cpf)

    # Registra no histórico
    if cpf_limpo not in historico_pedidos:
    historico_pedidos[cpf_limpo] = []
    pedido.score_risco = resultado["score"]
    pedido.alertas = resultado["alertas"]
    historico_pedidos[cpf_limpo].append(pedido)

    return {
    "pedido_id": pedido.pedido_id,
    "titular_cpf": dados_cpf.get("name"),
    "score_risco": resultado["score"],
    "nivel_risco": resultado["nivel"],
    "acao": resultado["acao_recomendada"],
    "alertas": resultado["alertas"],
    }

# Exemplo de uso
if __name__ == "__main__":
    endereco = EnderecoEntrega(
    rua="Rua das Flores",
    numero="123",
    complemento="Apto 45",
    bairro="Centro",
    cidade="São Paulo",
    estado="SP",
    cep="01001-000",
    destinatario="Maria Souza",
    )

    resultado = analisar_pedido(
    cpf="123.456.789-09",
    nome_comprador="João da Silva",
    endereco=endereco,
    valor=2500.00,
    )

    print(json.dumps(resultado, indent=2, ensure_ascii=False, default=str))

Regras de decisão

Com base no score de risco calculado, o sistema pode tomar decisões automáticas ou encaminhar para análise humana.

Score 0-29 (baixo)

O pedido é aprovado automaticamente. Todos os dados são consistentes e não há alertas significativos.

Score 30-59 (médio)

O pedido é encaminhado para revisão manual. Um analista verifica os alertas e decide pela aprovação ou rejeição. Nesse nível, é comum encontrar pedidos legítimos -- como presentes enviados para terceiros -- que geram falsos positivos.

Score 60-100 (alto)

O pedido é bloqueado automaticamente. Múltiplos alertas simultâneos indicam alta probabilidade de fraude. O comprador pode ser contatado para verificação adicional.


Reduzindo falsos positivos

O maior desafio em sistemas antifraude é o equilíbrio entre segurança e experiência do usuário. Algumas situações legítimas geram alertas falsos.

Presentes enviados para terceiros naturalmente terão destinatário diferente do titular do CPF. Para esses casos, ofereça a opção "Enviar como presente" no checkout e ajuste o score. Compras para familiares no mesmo endereço podem ter nomes diferentes mas são legítimas. Mudanças de endereço geram alertas de "novo endereço" mas são eventos normais.

A calibração contínua dos pesos de cada fator no cálculo do score é essencial. Análise periodicamente os falsos positivos e ajuste os limites.


Integração com outros dados

A análise de risco é mais eficaz quando combina múltiplas fontes de dados. O CPF validado pela CPFHub.io serve como âncora de identidade: com o nome e data de nascimento confirmados, é possível cruzar com dados de dispositivo, geolocalização e histórico de compras para construir um score de risco mais preciso e reduzir falsos positivos sem abrir mão da segurança.


Perguntas frequentes

O que é fraude de endereço em e-commerce?

É quando o fraudador usa um CPF legítimo mas direciona a entrega para um endereço diferente do histórico do titular — geralmente um ponto de coleta controlado pelo golpista. A divergência entre o endereço de entrega e o histórico do CPF é o sinal de alerta.

Como cruzar CPF com dados de entrega para detectar fraude?

A validação de CPF retorna nome e data de nascimento do titular. Ao cruzar esses dados com o histórico de endereços anteriores do CPF no seu sistema, divergências expressivas (CEP de estado diferente em primeira compra, por exemplo) merecem revisão manual.

Todo pedido com endereço diferente do cadastro é fraude?

Não. Presentes, entregas no trabalho e mudança de endereço são situações legítimas. O sinal fica mais forte quando a divergência de endereço se combina com outros fatores: CPF sem histórico na loja, primeiro pedido de alto valor, pagamento com cartão novo.

Qual a diferença entre endereço de cobrança e endereço de entrega na detecção de fraude?

Endereço de cobrança diferente do de entrega é comum e legítimo em si. O problema é quando o CPF do comprador não corresponde ao titular do cartão E o endereço de entrega é diferente do histórico — a combinação eleva o risco consideravelmente.


Conclusão

A fraude de endereço é um problema sério que causa prejuízos de milhões de reais ao e-commerce brasileiro todos os anos. Cruzar os dados do CPF -- validados via API -- com as informações de entrega é uma técnica eficaz para detectar inconsistências e bloquear pedidos fraudulentos antes que o produto seja enviado. A CPFHub.io oferece a infraestrutura necessária para implementar esse cruzamento em tempo real, com latência de aproximadamente 900ms e plano gratuito para começar sem compromisso. 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.

Redação CPFHub.io

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.

WhatsAppFale conosco via WhatsApp