Lei Felca: como validar maioridade com API de CPF (com exemplos reais para sites e empresas)

Veja como a API CPF Nacional ajuda sites, apps e empresas a validar maioridade com base na data de nascimento (NASC) retornada no JSON, com exemplos práticos de integração.

Lei Felca e validacao de maioridade com API de CPF

Lei Felca: por que isso muda o jogo para sites, apps e empresas

Com o avanço das exigências de proteção de menores (popularmente associadas a movimentos como a Lei Felca), a validação de idade deixou de ser um detalhe de UX e virou tema de risco operacional, compliance e reputação.

Se o seu projeto tem cadastro, checkout, área de membros, marketplace, conteúdo sensível ou qualquer funcionalidade restrita por idade, você precisa sair do checkbox +18 e adotar um processo com evidência técnica.

Como a API CPF Nacional ajuda na validação real de maioridade

Na prática, sua aplicação consulta o endpoint da API e recebe um JSON com dados cadastrais, incluindo a data de nascimento em NASC. Com isso, o backend calcula a idade e aplica sua política de acesso.

Exemplo de retorno (mesmo formato apresentado na home):

{
  "success": true,
  "data": {
    "CPF": "00000000191",
    "NOME": "RECEITA FEDERAL...",
    "SEXO": "F",
    "NASC": "1899-11-30"
  }
}

Com esse retorno, você consegue:

  • bloquear menores de idade automaticamente em fluxos críticos;
  • reduzir fraude de identidade no onboarding;
  • evitar risco regulatório por falta de diligência;
  • registrar trilha de auditoria com timestamp, resultado e decisão.

Endpoint e autenticação

Conforme a documentação e a home da API CPF Nacional:

GET https://api.cpf-brasil.org/cpf/{cpf}
Header: X-API-Key: SEU_TOKEN_AQUI

Exemplo real 1: Node.js (Express) validando 18+

import express from "express";

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

function calcularIdade(nascIso) {
  const nasc = new Date(nascIso + "T00:00:00");
  const hoje = new Date();
  let idade = hoje.getFullYear() - nasc.getFullYear();
  const m = hoje.getMonth() - nasc.getMonth();
  if (m < 0 || (m === 0 && hoje.getDate() < nasc.getDate())) idade--;
  return idade;
}

app.post("/validar-maioridade", async (req, res) => {
  try {
    const cpf = String(req.body.cpf || "").replace(/\D/g, "");
    if (cpf.length !== 11) {
      return res.status(400).json({ ok: false, motivo: "cpf_invalido" });
    }

    const r = await fetch(`https://api.cpf-brasil.org/cpf/${cpf}`, {
      method: "GET",
      headers: {
        "X-API-Key": process.env.CPF_API_KEY,
        "Content-Type": "application/json"
      }
    });

    if (!r.ok) {
      return res.status(502).json({ ok: false, motivo: "falha_api_cpf" });
    }

    const payload = await r.json();
    const nasc = payload?.data?.NASC;
    if (!nasc) {
      return res.status(422).json({ ok: false, motivo: "sem_data_nascimento" });
    }

    const idade = calcularIdade(nasc);
    const maior = idade >= 18;

    // Salve trilha de auditoria no seu banco (ex.: user_id, cpf_hash, idade, decisao, timestamp)
    return res.json({
      ok: true,
      maior_idade: maior,
      idade,
      politica: "acesso_18_plus"
    });
  } catch (e) {
    return res.status(500).json({ ok: false, motivo: "erro_interno" });
  }
});

app.listen(3000);

Exemplo real 2: PHP (cadastro/check-out)

<?php
function idadePorNascimento(string $nasc): int {
    $n = new DateTime($nasc);
    $h = new DateTime("now");
    return (int)$h->diff($n)->y;
}

function validarMaioridadePorCpf(string $cpf, string $token): array {
    $cpf = preg_replace("/\\D/", "", $cpf);
    if (strlen($cpf) !== 11) {
        return ["ok" => false, "motivo" => "cpf_invalido"];
    }

    $url = "https://api.cpf-brasil.org/cpf/{$cpf}";
    $ch = curl_init($url);
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_HTTPHEADER => [
            "X-API-Key: {$token}",
            "Content-Type: application/json"
        ],
        CURLOPT_TIMEOUT => 10,
    ]);

    $resp = curl_exec($ch);
    $http = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);

    if ($http !== 200 || !$resp) {
        return ["ok" => false, "motivo" => "falha_api_cpf"];
    }

    $json = json_decode($resp, true);
    $nasc = $json["data"]["NASC"] ?? null;
    if (!$nasc) {
        return ["ok" => false, "motivo" => "sem_data_nascimento"];
    }

    $idade = idadePorNascimento($nasc);
    return [
        "ok" => true,
        "idade" => $idade,
        "maior_idade" => $idade >= 18
    ];
}

$resultado = validarMaioridadePorCpf($_POST["cpf"] ?? "", "SEU_TOKEN_AQUI");
if (!$resultado["ok"] || !$resultado["maior_idade"]) {
    http_response_code(403);
    echo json_encode(["erro" => "Acesso permitido apenas para maiores de 18 anos"]);
    exit;
}
?>

Exemplo real 3: Python (Django/FastAPI/KYC)

import requests
from datetime import date, datetime

def calcular_idade(nasc_iso: str) -> int:
    nasc = datetime.strptime(nasc_iso, "%Y-%m-%d").date()
    hoje = date.today()
    return hoje.year - nasc.year - ((hoje.month, hoje.day) < (nasc.month, nasc.day))

def validar_maioridade(cpf: str, token: str):
    cpf = "".join(c for c in cpf if c.isdigit())
    if len(cpf) != 11:
        return {"ok": False, "motivo": "cpf_invalido"}

    resp = requests.get(
        f"https://api.cpf-brasil.org/cpf/{cpf}",
        headers={"X-API-Key": token, "Content-Type": "application/json"},
        timeout=10
    )

    if resp.status_code != 200:
        return {"ok": False, "motivo": "falha_api_cpf"}

    payload = resp.json()
    nasc = payload.get("data", {}).get("NASC")
    if not nasc:
        return {"ok": False, "motivo": "sem_data_nascimento"}

    idade = calcular_idade(nasc)
    return {"ok": True, "idade": idade, "maior_idade": idade >= 18}

Aplicações diretas por segmento

  • E-commerce: bloqueio de venda de itens restritos para menores.
  • Marketplaces: qualificação de vendedores e redução de fraude cadastral.
  • Fintech/KYC: validação mais confiável na abertura de conta.
  • Plataformas de conteúdo: gate de maioridade em áreas sensíveis.
  • SaaS B2B: onboarding com regras de compliance por perfil.

Boas práticas de compliance e LGPD

  • Faça a validação no backend, nunca somente no front-end.
  • Guarde apenas o mínimo necessário para auditoria (evite excesso de dados).
  • Registre decisão de negócio (permitido/bloqueado), motivo e timestamp.
  • Use criptografia e controle de acesso nos logs de validação.
  • Revise termos e política de privacidade para refletir o fluxo de verificação.

Checklist rápido para implementar hoje

  1. Criar token no dashboard.
  2. Integrar endpoint /cpf/{numero} no backend.
  3. Ler data.NASC no JSON e calcular idade.
  4. Aplicar regra de maioridade por rota/produto.
  5. Salvar logs de auditoria da decisão.
  6. Monitorar métricas (bloqueios, fraudes evitadas, conversão).

Conclusão

A principal contribuição da API CPF Nacional nesse cenário é simples: transformar uma validação frágil em um processo técnico, auditável e escalável. Você ganha proteção operacional, melhora compliance e reduz risco sem sacrificar experiência do usuário.

Se você quer implementar isso no seu site, app ou projeto com rapidez, comece pelo fluxo com retorno de NASC e regra de 18+ no backend.

Este conteúdo é informativo e não substitui orientação jurídica específica.

Artigos Recentes

100% Gratuito

Comece a Usar a API CPF Nacional Agora

Crie sua conta e comece a usar nossa API imediatamente.
Dashboard completo • API ilimitada • Suporte dedicado