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.

Redação Smart CPFRedação Smart CPF
·· 7 min de leitura
Como validar CPF com Node.js e a API SmartCPF

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ível
executionTimeMs 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.

validar-cpf.js
/**
 * 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

response.json
{
  "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: normalizarCpf garante 11 dígitos antes de chamar a API; o retorno result.status confirma se o CPF está "Regular", "Suspenso", "Cancelado" ou "Nulo".
  • Rastreabilidade: meta.consultId permite correlacionar logs, tickets de suporte e auditorias LGPD.
  • Controle de custo: meta.balance decrementa a cada consulta; monitore para recarregar créditos antes de zerar.
  • Observabilidade: meta.executionTimeMs alimenta dashboards de latência e alertas de SLA.
  • Tratamento robusto: a função lança erros tipados para HTTP ≠ 200, success: false no body, timeout de rede e CPF malformado.

Por que usar a SmartCPF

  • Integração direta via HTTPS/JSON — sem SDK proprietário, funciona com fetch nativo, 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.

Redação Smart CPF

Sobre a redação

Redação Smart CPF

Autor do blog

Pronto para validar CPFs em segundos?

Consultas gratuitas para testar agora. Acesso imediato à documentação.