Como prevenir fraudes em programas de indicação (referral) com validação de CPF

Aprenda a usar validação de CPF via API para impedir fraudes em programas de indicação e referral em e-commerces e apps.

Redação CPFHub.io
Redação CPFHub.io
··10 min de leitura
Como prevenir fraudes em programas de indicação (referral) com validação de CPF

Fraudes em programas de indicação acontecem quando fraudadores criam múltiplas contas falsas para simular indicações e embolsar bônus indevidos. A CPFHub.io permite validar cada CPF cadastrado em ~900ms, garantindo que indicador e indicado são pessoas reais e distintas — bloqueando a fraude na raiz antes que qualquer bônus seja liberado.

Introdução

Programas de indicação -- conhecidos como referral programs -- são uma das estratégias de crescimento mais eficazes no e-commerce e em aplicativos. A lógica é simples: um cliente existente indica um amigo, ambos ganham um benefício, e a plataforma adquire um novo usuário a um custo menor do que canais pagos. O problema é que essa mecânica é extremamente vulnerável a fraudes.

Fraudadores criam dezenas de contas falsas para simular indicações, embolsando os bônus de ambos os lados. A validação de CPF via API é a forma mais eficaz de garantir que cada indicação envolve pessoas reais e distintas.


Anatomia da fraude em referral

O esquema clássico

O fraudador cria uma conta principal com dados reais. Em seguida, gera dezenas de contas secundárias com e-mails descartáveis, usando o link de indicação da conta principal. Cada conta secundária completa a ação necessária -- geralmente uma primeira compra de valor mínimo -- e o bônus é creditado tanto para a conta principal quanto para a secundária.

Variações mais sofisticadas

Fraudes mais elaboradas envolvem redes de fraudadores que trocam indicações entre si, cada um usando seu CPF real mas combinando para maximizar os bônus. Outras variações incluem o uso de CPFs de terceiros (familiares falecidos, por exemplo) para criar contas que parecem legítimas.

Impacto nos negócios

Além do prejuízo financeiro direto -- que pode representar milhares de reais por mês em bônus indevidos -- a fraude em referral distorce métricas críticas como CAC (custo de aquisição de cliente), taxa de conversão e lifetime value. Decisões estratégicas baseadas em dados contaminados levam a investimentos errados.


Estratégia de proteção com CPF

A validação de CPF atua em três pontos do fluxo de indicação.

Ponto 1 -- Cadastro do indicador

Antes de permitir que um usuário gere links de indicação, exija a verificação de CPF. Isso garante que a conta principal pertence a uma pessoa real.

Ponto 2 -- Cadastro do indicado

Quando alguém se cadastra usando um link de indicação, solicite o CPF e valide-o. Compare com o CPF do indicador para garantir que são pessoas diferentes.

Ponto 3 -- Liberação do bônus

Antes de creditar o bônus, faça uma verificação final: confirme que o CPF do indicado não está associado a nenhuma outra conta na plataforma e que não coincide com o CPF do indicador.


Implementação em Node.js

O exemplo a seguir demonstra um sistema de referral com proteção por CPF.

const express = require("express");
const axios = require("axios");
const crypto = require("crypto");

const app = express();
app.use(express.json());

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

// Simulação de banco de dados
const usuarios = new Map();
const indicacoes = new Map();
const cpfsRegistrados = new Set();

function limparCpf(cpf) {
    return cpf.replace(/\D/g, "");
}

async function consultarCpf(cpf) {
    const cpfLimpo = limparCpf(cpf);

    try {
    const response = await axios.get(`${CPFHUB_API_URL}/${cpfLimpo}`, {
    headers: {
    "x-api-key": CPFHUB_API_KEY,
    Accept: "application/json",
    },
    timeout: REQUEST_TIMEOUT,
    });

    if (response.data.success) {
    return response.data.data;
    }
    return null;
    } catch (error) {
    if (error.code === "ECONNABORTED") {
    throw new Error("Timeout na consulta de CPF");
    }
    if (error.response) {
    const { status } = error.response;
    if (status === 401) throw new Error("API key inválida");
    if (status === 404) return null;
    }
    throw new Error("Erro na consulta de CPF");
    }
}

function gerarCodigoReferral() {
    return crypto.randomBytes(4).toString("hex").toUpperCase();
}

// Endpoint: verificar CPF e habilitar referral
app.post("/api/referral/habilitar", async (req, res) => {
    const { usuarioId, cpf } = req.body;

    if (!usuarioId || !cpf) {
    return res.status(400).json({ erro: "usuarioId e cpf são obrigatórios" });
    }

    const cpfLimpo = limparCpf(cpf);

    // Verifica se CPF já está em uso
    if (cpfsRegistrados.has(cpfLimpo)) {
    const usuarioExistente = [...usuarios.values()].find(
    (u) => u.cpf === cpfLimpo
    );
    if (usuarioExistente && usuarioExistente.id !== usuarioId) {
    return res.status(409).json({
    erro: "Este CPF já está vinculado a outra conta",
    });
    }
    }

    try {
    const dados = await consultarCpf(cpfLimpo);
    if (!dados) {
    return res.status(422).json({
    erro: "CPF não encontrado na base de dados",
    });
    }

    const codigoReferral = gerarCodigoReferral();

    usuarios.set(usuarioId, {
    id: usuarioId,
    cpf: cpfLimpo,
    nome: dados.name,
    dataNascimento: dados.birthDate,
    codigoReferral,
    indicacoesRealizadas: 0,
    bonusAcumulado: 0,
    habilitadoEm: new Date().toISOString(),
    });

    cpfsRegistrados.add(cpfLimpo);

    res.json({
    sucesso: true,
    codigoReferral,
    mensagem: `Referral habilitado para ${dados.name}`,
    });
    } catch (error) {
    res.status(503).json({ erro: error.message });
    }
});

// Endpoint: cadastro via indicação
app.post("/api/referral/cadastro", async (req, res) => {
    const { nome, email, cpf, codigoReferral } = req.body;

    if (!cpf || !codigoReferral) {
    return res.status(400).json({
    erro: "CPF e código de indicação são obrigatórios",
    });
    }

    const cpfLimpo = limparCpf(cpf);

    // Verifica se o código de referral existe
    const indicador = [...usuarios.values()].find(
    (u) => u.codigoReferral === codigoReferral
    );

    if (!indicador) {
    return res.status(404).json({ erro: "Código de indicação inválido" });
    }

    // Proteção 1: CPF do indicado não pode ser igual ao do indicador
    if (cpfLimpo === indicador.cpf) {
    return res.status(403).json({
    erro: "Não é possível usar o próprio código de indicação",
    });
    }

    // Proteção 2: CPF não pode estar em uso
    if (cpfsRegistrados.has(cpfLimpo)) {
    return res.status(409).json({
    erro: "Este CPF já possui uma conta na plataforma",
    });
    }

    // Proteção 3: validar CPF via API
    try {
    const dados = await consultarCpf(cpfLimpo);
    if (!dados) {
    return res.status(422).json({
    erro: "CPF não encontrado na base de dados",
    });
    }

    // Proteção 4: verificar que são pessoas diferentes
    // (mesmo sobrenome + mesma data nascimento pode indicar fraude familiar)
    const sobrenomeIndicador = indicador.nome.split(" ").pop().toUpperCase();
    const sobrenomeIndicado = dados.name.split(" ").pop().toUpperCase();
    const mesmoSobrenome = sobrenomeIndicador === sobrenomeIndicado;
    const mesmaFamilia =
    mesmoSobrenome &&
    dados.birthDate &&
    indicador.dataNascimento &&
    dados.year === indicador.dataNascimento.split("/").pop();

    const novoUsuarioId = crypto.randomUUID();

    usuarios.set(novoUsuarioId, {
    id: novoUsuarioId,
    cpf: cpfLimpo,
    nome: dados.name,
    dataNascimento: dados.birthDate,
    indicadoPor: indicador.id,
    codigoReferral: gerarCodigoReferral(),
    indicacoesRealizadas: 0,
    bonusAcumulado: 0,
    habilitadoEm: new Date().toISOString(),
    });

    cpfsRegistrados.add(cpfLimpo);

    // Registra a indicação (bônus pendente até primeira compra)
    indicacoes.set(`${indicador.id}-${novoUsuarioId}`, {
    indicadorId: indicador.id,
    indicadoId: novoUsuarioId,
    status: "PENDENTE",
    alertaFamiliar: mesmaFamilia,
    criadoEm: new Date().toISOString(),
    });

    res.json({
    sucesso: true,
    usuarioId: novoUsuarioId,
    indicadoPor: indicador.nome,
    bonusPendente: true,
    alertaRevisao: mesmaFamilia,
    mensagem: mesmaFamilia
    ? "Cadastro realizado. Bônus sujeito a revisão manual."
    : "Cadastro realizado. Bônus será liberado após primeira compra.",
    });
    } catch (error) {
    res.status(503).json({ erro: error.message });
    }
});

// Endpoint: liberar bônus após primeira compra
app.post("/api/referral/liberar-bonus", async (req, res) => {
    const { indicadoId, valorCompra } = req.body;

    const indicado = usuarios.get(indicadoId);
    if (!indicado || !indicado.indicadoPor) {
    return res.status(404).json({ erro: "Indicação não encontrada" });
    }

    const chave = `${indicado.indicadoPor}-${indicadoId}`;
    const indicacao = indicacoes.get(chave);

    if (!indicacao || indicacao.status !== "PENDENTE") {
    return res.status(400).json({ erro: "Bônus já processado ou inexistente" });
    }

    // Verifica se a compra atinge o valor mínimo
    const VALOR_MINIMO = 50.0;
    if (valorCompra < VALOR_MINIMO) {
    return res.status(400).json({
    erro: `Compra mínima de R$ ${VALOR_MINIMO} para ativar bônus`,
    });
    }

    // Se há alerta familiar, requer revisão manual
    if (indicacao.alertaFamiliar) {
    indicacao.status = "REVISAO_MANUAL";
    return res.json({
    sucesso: true,
    status: "REVISAO_MANUAL",
    mensagem: "Bônus encaminhado para revisão manual",
    });
    }

    // Libera bônus para ambos
    const BONUS_INDICADOR = 25.0;
    const BONUS_INDICADO = 25.0;

    const indicador = usuarios.get(indicado.indicadoPor);
    indicador.bonusAcumulado += BONUS_INDICADOR;
    indicador.indicacoesRealizadas += 1;
    indicado.bonusAcumulado += BONUS_INDICADO;
    indicacao.status = "LIBERADO";

    res.json({
    sucesso: true,
    bonusIndicador: BONUS_INDICADOR,
    bonusIndicado: BONUS_INDICADO,
    mensagem: "Bônus liberado para ambos os participantes",
    });
});

app.listen(3000, () => {
    console.log("Servidor rodando na porta 3000");
});

Detecção de padrões suspeitos

Além da validação unitária de CPF, é importante monitorar padrões que indicam fraude organizada. A FEBRABAN recomenda que plataformas digitais implementem camadas de análise comportamental complementares à validação de identidade.

Indicadores de alerta

Existem vários sinais que merecem atenção. Um indicador que acumula um número anormal de indicações bem-sucedidas em curto período. Indicações em que indicador e indicado compartilham o mesmo sobrenome e faixa etária. Múltiplos cadastros originados do mesmo endereço IP em sequência. Indicados que fazem apenas a compra mínima para ativar o bônus e nunca mais retornam.

Score de risco

Atribua um score de risco a cada indicação com base nesses indicadores. Indicações com score alto devem passar por revisão manual antes da liberação do bônus.


Limites e controles

Para complementar a validação de CPF, implemente limites operacionais no programa de referral.

Defina um número máximo de indicações por CPF por mês -- um valor entre 5 e 10 é razoável para a maioria dos programas. Estabeleça um valor mínimo de primeira compra que seja significativo o suficiente para desencorajar fraudes -- se o bônus é de R$ 25, a compra mínima deve ser consideravelmente maior. Implemente um período de carência entre o cadastro e a liberação do bônus, permitindo que análises de fraude sejam executadas. Considere liberar o bônus em crédito na plataforma em vez de dinheiro, reduzindo a atratividade para fraudadores.


Métricas de saúde do programa

A validação de CPF permite acompanhar métricas que revelam a saúde do programa de referral.

A taxa de rejeição por CPF duplicado indica a proporção de tentativas de fraude por duplicação de conta. A taxa de indicações entre parentes (mesmo sobrenome) ajuda a calibrar as regras -- nem toda indicação familiar é fraude, mas uma taxa muito alta merece investigação. O lifetime value dos indicados comparado com o de usuários orgânicos revela se o programa está atraindo clientes genuínos ou apenas caçadores de bônus.


Custo-benefício

O custo de validação de CPF é insignificante comparado ao potencial de perda com fraude em referral. Com o plano Pro da CPFHub.io, a plataforma realiza até 1.000 consultas mensais por R$149 — o equivalente a menos de R$0,15 por verificação, muito abaixo do valor de qualquer bônus de indicação.


Perguntas frequentes

Como funciona a fraude em programas de indicação?

O fraudador cria múltiplas contas falsas (com CPFs diferentes) e usa o código de indicação da conta principal para simular indicações legítimas. Cada "indicação" gera crédito para o indicador, sem que nenhuma conta secundária seja de um usuário real.

Como a validação de CPF detecta auto-referência?

Ao verificar que cada CPF cadastrado é único, real e com nome correspondente, a plataforma elimina as contas fictícias criadas para simular indicações. Sem contas falsas, não há indicações falsas — o bônus de referral é pago apenas por indicações de pessoas reais.

Além do CPF, que outras verificações fortalecem o programa de referral?

Validação de número de telefone (SMS OTP), verificação de e-mail, análise de IP (identificar múltiplas contas do mesmo dispositivo) e período de carência antes de liberar o bônus (para confirmar que o indicado realmente usou o serviço). O CPF é a camada de identidade; as demais reduzem bots.

Qual o impacto financeiro da fraude em programas de referral?

Depende do valor do bônus e do volume. Empresas com bônus de R$50 por indicação e escala de campanhas podem perder centenas de milhares de reais em fraude de referral. O custo de implementar validação de CPF é uma fração desse valor.


Conclusão

Programas de indicação são motores de crescimento poderosos, mas apenas quando os participantes são reais. A validação de CPF via API transforma o referral de um canal vulnerável a fraudes em um mecanismo confiável e mensurável de aquisição de clientes. Com a CPFHub.io, cada verificação custa menos de R$0,15 e retorna em ~900ms — uma proteção de altíssimo custo-benefício para qualquer programa de indicação.

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