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
- Criar token no dashboard.
- Integrar endpoint
/cpf/{numero}no backend. - Ler
data.NASCno JSON e calcular idade. - Aplicar regra de maioridade por rota/produto.
- Salvar logs de auditoria da decisão.
- 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.