Como validar CPF com Node.js e a API SmartCPF
Tutorial prático de validação de CPF em Node.js usando a API SmartCPF v2 com autenticação X-API-KEY.

Validar CPF é um requisito recorrente em sistemas brasileiros — cadastros, onboarding, compliance, prevenção a fraude. A validação algorítmica (dígitos verificadores) garante apenas que o número seja sintaticamente válido; não confirma se o CPF existe, está ativo ou pertence à pessoa informada. A API SmartCPF resolve essa lacuna consultando bases oficiais em tempo real, retornando nome, data de nascimento, situação cadastral, e-mails, telefones e endereços associados. Este artigo mostra como integrar a validação completa em uma aplicação Node.js usando o endpoint v2/individuals/{cpf}.
O endpoint de consulta individual
A API SmartCPF expõe a rota GET https://api.smartcpf.com.br/v2/individuals/{cpf}?package=X para consultas unitárias. O parâmetro package define o nível de detalhe do retorno (dados cadastrais básicos, contatos, endereços, score, etc.). A autenticação é feita exclusivamente via header X-API-KEY — não há suporte a Bearer token, query string ou cookies. O CPF na URL pode ser enviado com ou sem formatação (pontos e hífen); a API normaliza internamente. O retorno inclui metadados úteis: consultId para rastreamento, balance para controle de créditos, executionTimeMs para monitoramento de latência, e success indicando se a consulta foi processada sem erros internos.
Vantagens da validação via API
1. Dados oficiais em tempo real
A consulta acessa bases da Receita Federal e parceiros autorizados, retornando a situação cadastral atual (Regular, Suspenso, Cancelado, Nulo) e dados do titular.
2. Enriquecimento automático
Além do status, o retorno traz nome completo, data de nascimento, idade calculada, nome da mãe, gênero, e-mails, telefones com operadora e tipo, e endereços — dispensando múltiplas integrações.
3. Rastreabilidade nativa
Cada resposta carrega consultId (UUID) e ip de origem, facilitando auditoria, debug e compliance com LGPD.
4. Controle de custos transparente
O campo balance mostra créditos restantes após a consulta; o modelo pré-pago evita surpresas na fatura.
5. Latência previsívelexecutionTimeMs permite alertas de SLA e otimização de timeouts no cliente.
6. Versionamento estável
O prefixo v2 no path garante que mudanças breaking não afetem integrações existentes sem aviso prévio.
Desafios e considerações
1. Dependência de conectividade externa
A validação requer chamada de rede; falhas de DNS, timeout ou indisponibilidade da API impactam o fluxo. Implemente retry com backoff exponencial e fallback para validação local de dígitos verificadores.
2. Gestão de créditos
Consultas consomem saldo. Monitore balance e configure alertas (ex.: < 100 créditos) para evitar interrupção em produção.
3. Rate limiting
Existem limites por chave e por IP. Respeite Retry-After em respostas 429 e implemente fila local em picos.
4. LGPD e finalidade
Só consulte CPFs com base legal clara (consentimento, legítimo interesse, obrigação legal). Armazene consultId para demonstrar finalidade em auditorias.
Como implementar com a SmartCPF
O exemplo abaixo encapsula a chamada em uma função reutilizável, trata erros de rede e HTTP, valida a resposta e expõe um uso simples via CLI. Substitua SUA_API_KEY pela chave gerada no painel da SmartCPF.
/**
* Valida CPF usando a API SmartCPF v2
* Documentação: https://api.smartcpf.com.br/docs
*/
const API_BASE = 'https://api.smartcpf.com.br/v2';
const API_KEY = process.env.SMARTCPf_API_KEY || 'SUA_API_KEY';
/**
* Remove formatação do CPF (pontos, hífen, espaços)
* @param {string} cpf - CPF com ou sem máscara
* @returns {string} Apenas dígitos
*/
function normalizarCpf(cpf) {
return cpf.replace(/\D/g, '');
}
/**
* Consulta CPF na API SmartCPF
* @param {string} cpf - CPF a consultar (com ou sem máscara)
* @param {string} pkg - Pacote de dados (padrão: 'basic')
* @returns {Promise<Object>} Resposta parseada da API
*/
async function consultarCpf(cpf, pkg = 'basic') {
const cpfLimpo = normalizarCpf(cpf);
if (cpfLimpo.length !== 11) {
throw new Error('CPF deve conter 11 dígitos numéricos');
}
const url = `${API_BASE}/individuals/${cpfLimpo}?package=${encodeURIComponent(pkg)}`;
const response = await fetch(url, {
method: 'GET',
headers: {
'X-API-KEY': API_KEY,
'Accept': 'application/json',
'User-Agent': 'smartcpf-nodejs-exemplo/1.0'
},
// Timeout de 10s para evitar travamentos
signal: AbortSignal.timeout(10_000)
});
// A API sempre retorna 200 para consultas processadas; erros de negócio vêm no body
if (!response.ok) {
const errBody = await response.text().catch(() => '');
throw new Error(`HTTP ${response.status}: ${errBody || response.statusText}`);
}
const data = await response.json();
// Estrutura padrão de resposta da SmartCPF
if (!data.success) {
const msgs = (data.errors || []).map(e => e.message || e).join('; ');
throw new Error(`API error: ${msgs || 'Falha desconhecida'}`);
}
return data;
}
/**
* Exibe resultado de forma legível
*/
function exibirResultado(data) {
const meta = data.meta;
const result = data.result;
console.log('\n=== METADADOS DA CONSULTA ===');
console.log(`ConsultId: ${meta.consultId}`);
console.log(`Tipo: ${meta.searchType}`);
console.log(`Usuário: ${meta.user}`);
console.log(`Mensagem: ${meta.message}`);
console.log(`IP origem: ${meta.ip}`);
console.log(`Versão API: ${meta.apiVersion}`);
console.log(`Data: ${meta.date}`);
console.log(`Latência: ${meta.executionTimeMs} ms`);
console.log(`Saldo restante: ${meta.balance} créditos`);
if (!result || Object.keys(result).length === 0) {
console.log('\n--- CPF não encontrado nas bases ---');
return;
}
console.log('\n=== DADOS DO TITULAR ===');
console.log(`CPF: ${result.cpf}`);
console.log(`Nome: ${result.name}`);
console.log(`Nascimento: ${result.birthDate} (${result.age} anos)`);
console.log(`Mãe: ${result.motherName}`);
console.log(`Gênero: ${result.gender}`);
console.log(`Situação: ${result.status}`);
if (result.emails?.length) {
console.log(`E-mails: ${result.emails.join(', ')}`);
}
if (result.phones?.length) {
console.log('Telefones:');
result.phones.forEach((p, i) => {
const tags = [];
if (p.blockedTelemarketing) tags.push('bloqueado telemarketing');
if (p.whatsapp) tags.push('WhatsApp');
const tagStr = tags.length ? ` [${tags.join(', ')}]` : '';
console.log(` ${i + 1}. ${p.number} (${p.type}, ${p.operator})${tagStr}`);
});
}
if (result.addresses?.length) {
console.log('Endereços:');
result.addresses.forEach((a, i) => {
console.log(` ${i + 1}. ${a.street}, ${a.number} - ${a.neighborhood}, ${a.city}/${a.state} - ${a.zipCode}`);
});
}
}
/**
* Função principal - uso via linha de comando
*/
async function main() {
const cpfArg = process.argv[2];
if (!cpfArg) {
console.error('Uso: node validar-cpf.js <CPF> [package]');
console.error('Exemplo: node validar-cpf.js 111.111.111-11 basic');
process.exit(1);
}
const pkg = process.argv[3] || 'basic';
try {
console.log(`Consultando CPF ${cpfArg} (package: ${pkg})...`);
const data = await consultarCpf(cpfArg, pkg);
exibirResultado(data);
} catch (err) {
console.error('\n❌ Erro:', err.message);
process.exit(1);
}
}
// Executa se chamado diretamente
if (import.meta.url === `file://${process.argv[1]}`) {
main();
}
export { consultarCpf, normalizarCpf, exibirResultado };
Resposta da API
{
"meta": {
"searchType": "CPF G",
"consultId": "550e8400-e29b-41d4-a716-446655440000",
"user": "Fulano de Tal",
"message": "CPF encontrado com sucesso",
"ip": "127.0.0.1",
"success": true,
"apiVersion": "v2",
"date": "2026-01-15T14:32:10.123Z",
"executionTimeMs": 74.1,
"balance": 9.77
},
"result": {
"cpf": "111.111.111-11",
"name": "João da Silva",
"birthDate": "10/09/1992",
"age": 33,
"motherName": "Maria da Silva",
"gender": "M",
"status": "Regular",
"emails": ["[email protected]"],
"phones": [
{
"number": "(55) 99999-9999",
"blockedTelemarketing": false,
"operator": "VIVO",
"type": "CELULAR",
"whatsapp": false
}
],
"addresses": []
},
"success": true,
"errors": []
}
O fluxo acima resolve na prática:
- Validação sintática + semântica:
normalizarCpfgarante 11 dígitos antes de chamar a API; o retornoresult.statusconfirma se o CPF está "Regular", "Suspenso", "Cancelado" ou "Nulo". - Rastreabilidade:
meta.consultIdpermite correlacionar logs, tickets de suporte e auditorias LGPD. - Controle de custo:
meta.balancedecrementa a cada consulta; monitore para recarregar créditos antes de zerar. - Observabilidade:
meta.executionTimeMsalimenta dashboards de latência e alertas de SLA. - Tratamento robusto: a função lança erros tipados para HTTP ≠ 200,
success: falseno body, timeout de rede e CPF malformado.
Por que usar a SmartCPF
- Integração direta via HTTPS/JSON — sem SDK proprietário, funciona com
fetchnativo, Axios, Got ou qualquer cliente HTTP. - Modelo de créditos pré-pago — pague apenas pelo que consumir, sem mensalidade mínima ou contratos anuais.
- Escalabilidade horizontal — a API atende de dezenas a milhões de consultas/dia com a mesma latência média (< 100 ms).
- Dados enriquecidos por padrão — e-mails, telefones com operadora e WhatsApp, endereços estruturados já no pacote básico.
- Suporte técnico em português — documentação, exemplos e atendimento no fuso horário do Brasil.
Conclusão
Validar CPF com a SmartCPF reduz a um fetch autenticado o que antes exigia múltiplas integrações, validações manuais e planilhas offline. O código apresentado cobre o ciclo completo: normalização, chamada autenticada com X-API-KEY, tratamento de erros de rede e de negócio, e exibição estruturada dos campos mais relevantes (consultId, balance, executionTimeMs, result.status, contatos). Adapte o parâmetro package conforme a necessidade do seu caso de uso e integre a função consultarCpf em middlewares, jobs de validação em lote ou APIs internas. Crie sua conta na SmartCPF e faça sua primeira consulta em minutos.
Sobre a redação
Redação Smart CPF
Autor do blog
Mais artigos

Como funciona o dígito verificador do CPF: o algoritmo explicado
Entenda o cálculo dos dígitos verificadores do CPF, sua validação matemática e como a API SmartCPF automatiza esse processo.

Verificação de identidade no cadastro de pacientes em clínicas médicas
Como a SmartCPF automatiza a validação de CPF no onboarding de pacientes, reduzindo fraudes e erros manuais em clínicas.

Consórcios: validação de identidade na adesão de novos cotistas
Como a validação de CPF via API evita fraudes e agiliza a adesão de cotistas em consórcios, com exemplo prático de integração.

API de validação de CPF vs raspagem de dados: riscos e custos
Comparativo técnico entre APIs oficiais e scraping para validação de CPF: confiabilidade, legalidade, custo real e integração.
Pronto para validar CPFs em segundos?
Consultas gratuitas para testar agora. Acesso imediato à documentação.