Como usar validação de CPF em plataformas de food delivery (iFood, Rappi)

Descubra como plataformas de food delivery podem usar validação de CPF via API para prevenir fraudes e proteger restaurantes parceiros.

Redação CPFHub.io
Redação CPFHub.io
··10 min de leitura
Como usar validação de CPF em plataformas de food delivery (iFood, Rappi)

Plataformas de food delivery podem usar a validação de CPF via API para vincular cada conta a uma identidade real, eliminando contas descartáveis, bloqueando fraudes de cupom e reduzindo chargebacks em até 50%. Com a CPFHub.io, a verificação acontece em ~900ms durante o cadastro, sem prejudicar a experiência do usuário que está com fome. O plano gratuito oferece 50 consultas mensais sem cartão de crédito para você começar agora.

Introdução

O mercado de food delivery no Brasil movimenta dezenas de bilhões de reais por ano, com plataformas como iFood e Rappi processando milhões de pedidos diariamente. Esse volume massivo atrai fraudadores que exploram brechas no cadastro e no pagamento para obter refeições sem pagar, gerar chargebacks e abusar de cupons promocionais.

A validação de CPF via API é uma das ferramentas mais eficazes para combater esses problemas, pois vincula cada conta a uma identidade real e verificável.


Fraudes comuns no food delivery

Chargeback após entrega

O golpe mais frequente: o consumidor faz o pedido com seu próprio cartão, recebe a refeição e depois contesta a cobrança junto ao emissor do cartão, alegando que não reconhece a compra. Com a validação de CPF, a plataforma possui evidências de que o titular do CPF corresponde ao titular do cartão, fortalecendo a defesa contra chargebacks.

Contas descartáveis para cupons

Plataformas de delivery oferecem cupons generosos para novos usuários -- às vezes R$ 20 ou mais na primeira compra. Fraudadores criam dezenas de contas com e-mails descartáveis para usar esses cupons repetidamente. A exigência de CPF único por conta elimina essa possibilidade.

Fraude de entregador

Entregadores que marcam a entrega como realizada sem de fato entregar o pedido. Embora a validação de CPF do entregador não seja o foco principal deste artigo, o mesmo princípio se aplica -- vincular cada entregador a um CPF verificado facilita a responsabilização.

Pedidos com cartão roubado

Compras feitas com dados de cartão de crédito roubados, geralmente para endereços diferentes do cadastro. A verificação de CPF permite cruzar o titular do cartão com o titular da conta.


Pontos de validação no fluxo

A validação de CPF no food delivery deve ocorrer em momentos estratégicos para maximizar a proteção sem prejudicar a experiência do usuário.

No cadastro da conta

É o momento ideal para exigir o CPF. O usuário já espera preencher dados pessoais, e a validação ocorre apenas uma vez. O CPF fica vinculado à conta permanentemente.

Na adição de novo meio de pagamento

Quando o usuário adiciona um novo cartão de crédito, verificar se o titular do cartão corresponde ao CPF cadastrado adiciona uma camada de segurança.

Em pedidos acima de determinado valor

Para pedidos de alto valor -- acima de R$ 200, por exemplo -- uma revalidação do CPF pode ser acionada como medida extra de segurança.


Implementação em Node.js

O exemplo a seguir mostra um middleware para plataformas de food delivery com validação de CPF integrada.

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

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 contas = new Map();
const cpfsRegistrados = new Map(); // cpf -> contaId
const pedidos = [];
const VALOR_LIMITE_REVERIFICACAO = 200.0;

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

async function consultarCpfHub(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 ao consultar CPF");
    }
}

// Cadastro de conta com CPF
app.post("/api/conta/cadastro", async (req, res) => {
    const { nome, email, telefone, cpf } = req.body;

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

    const cpfLimpo = limparCpf(cpf);

    // Verifica duplicidade de CPF
    if (cpfsRegistrados.has(cpfLimpo)) {
    return res.status(409).json({
    erro: "Este CPF já está vinculado a uma conta existente",
    contaExistente: true,
    });
    }

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

    // Verifica correspondência básica de nome
    const primeiroNomeInformado = nome.trim().split(" ")[0].toUpperCase();
    const primeiroNomeApi = dados.name.trim().split(" ")[0].toUpperCase();

    if (primeiroNomeInformado !== primeiroNomeApi) {
    return res.status(422).json({
    erro: "Nome informado não corresponde ao CPF",
    });
    }

    const contaId = `CONTA-${Date.now()}`;

    contas.set(contaId, {
    id: contaId,
    nome: dados.name,
    email,
    telefone,
    cpf: cpfLimpo,
    genero: dados.gender,
    dataNascimento: dados.birthDate,
    verificado: true,
    criadoEm: new Date().toISOString(),
    totalPedidos: 0,
    cuponsUsados: [],
    scoreRisco: 0,
    });

    cpfsRegistrados.set(cpfLimpo, contaId);

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

// Aplicar cupom de primeira compra
app.post("/api/pedido/aplicar-cupom", (req, res) => {
    const { contaId, codigoCupom } = req.body;

    const conta = contas.get(contaId);
    if (!conta) {
    return res.status(404).json({ erro: "Conta não encontrada" });
    }

    if (!conta.verificado) {
    return res.status(403).json({
    erro: "CPF precisa ser verificado antes de usar cupons",
    });
    }

    // Verifica se o cupom é de primeira compra
    if (codigoCupom === "PRIMEIRACOMPRA") {
    if (conta.totalPedidos > 0) {
    return res.status(400).json({
    erro: "Cupom válido apenas para primeira compra",
    });
    }

    // Verifica se o CPF já usou este cupom (em qualquer conta)
    for (const [, outraConta] of contas) {
    if (
    outraConta.cpf === conta.cpf &&
    outraConta.cuponsUsados.includes(codigoCupom)
    ) {
    return res.status(403).json({
    erro: "Este CPF já utilizou este cupom",
    });
    }
    }
    }

    conta.cuponsUsados.push(codigoCupom);

    res.json({
    sucesso: true,
    desconto: 20.0,
    mensagem: "Cupom aplicado com sucesso",
    });
});

// Criar pedido com verificação de risco
app.post("/api/pedido/criar", async (req, res) => {
    const { contaId, itens, valorTotal, enderecoEntrega } = req.body;

    const conta = contas.get(contaId);
    if (!conta) {
    return res.status(404).json({ erro: "Conta não encontrada" });
    }

    // Análise de risco baseada no CPF
    const riscos = [];

    // Conta recém-criada com pedido alto valor
    const idadeConta =
    (Date.now() - new Date(conta.criadoEm).getTime()) / (1000 * 60 * 60);
    if (idadeConta < 1 && valorTotal > 100) {
    riscos.push("Conta com menos de 1 hora e pedido acima de R$ 100");
    }

    // Muitos pedidos em curto período
    const pedidosRecentes = pedidos.filter(
    (p) =>
    p.contaId === contaId &&
    Date.now() - new Date(p.criadoEm).getTime() < 3600000
    );
    if (pedidosRecentes.length >= 3) {
    riscos.push("Mais de 3 pedidos na última hora");
    }

    // Pedido acima do limite requer re-verificação
    if (valorTotal > VALOR_LIMITE_REVERIFICACAO) {
    try {
    const dadosAtuais = await consultarCpfHub(conta.cpf);
    if (!dadosAtuais) {
    return res.status(422).json({
    erro: "Falha na re-verificação de CPF para pedido de alto valor",
    });
    }
    } catch (error) {
    riscos.push("Falha na re-verificação de CPF");
    }
    }

    const pedido = {
    id: `PED-${Date.now()}`,
    contaId,
    cpf: conta.cpf,
    itens,
    valorTotal,
    enderecoEntrega,
    riscos,
    status: riscos.length > 2 ? "REVISAO_MANUAL" : "CONFIRMADO",
    criadoEm: new Date().toISOString(),
    };

    pedidos.push(pedido);
    conta.totalPedidos += 1;

    res.json({
    sucesso: true,
    pedidoId: pedido.id,
    status: pedido.status,
    alertas: riscos.length > 0 ? riscos : undefined,
    mensagem:
    pedido.status === "REVISAO_MANUAL"
    ? "Pedido em análise. Você será notificado em breve."
    : "Pedido confirmado!",
    });
});

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

Proteção para restaurantes parceiros

Restaurantes parceiros são as maiores vítimas de fraudes em plataformas de delivery. Quando um pedido é contestado via chargeback, o restaurante muitas vezes arca com o prejuízo -- a comida já foi preparada e entregue, e o valor não é repassado.

A validação de CPF protege os restaurantes de várias formas. Reduz o volume de pedidos fraudulentos ao exigir identidade verificada. Fornece evidências para defesa contra chargebacks. Permite criar listas de bloqueio baseadas em CPF para fraudadores reincidentes. Facilita a resolução de disputas, pois cada pedido está vinculado a uma pessoa identificável.


Métricas de fraude no delivery

Com a validação de CPF implementada, acompanhe as seguintes métricas para avaliar a eficácia da proteção.

A taxa de chargeback deve cair significativamente -- uma redução de 30% a 50% é comum após a implementação da validação de CPF. A taxa de rejeição no cadastro por CPF duplicado indica o volume de tentativas de criação de contas falsas. O valor médio de pedidos rejeitados por análise de risco ajuda a calibrar os limites de verificação. A proporção de cupons por CPF único revela se as campanhas promocionais estão atingindo usuários reais.


Experiência do usuário

A principal preocupação ao adicionar validação de CPF em food delivery é o impacto na experiência do usuário. No delivery, a rapidez é fundamental -- ninguém quer preencher formulários quando está com fome.

A solução é solicitar o CPF apenas no cadastro inicial, uma única vez. A API da CPFHub.io responde em ~900ms, tornando a verificação imperceptível para o usuário e garantindo que apenas identidades reais acessem os benefícios da plataforma.


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

Plataformas de food delivery enfrentam desafios únicos de fraude que impactam consumidores, restaurantes e a própria plataforma. A validação de CPF via API oferece uma solução elegante -- verifica a identidade do usuário uma única vez, no cadastro, e protege todo o ecossistema a partir desse ponto. Com a CPFHub.io, você tem uma integração simples, latência de ~900ms e dados atualizados da Receita Federal para blindar sua plataforma contra fraudes.

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