KYC para fintechs: passo a passo de onboarding seguro

Passo a passo técnico de onboarding KYC para fintechs usando a API SmartCPF: validação de CPF, consulta de dados cadastrais e integração prática.

Redação Smart CPFRedação Smart CPF
·· 8 min de leitura
KYC para fintechs: passo a passo de onboarding seguro

KYC para fintechs: passo a passo de onboarding seguro

O onboarding de clientes em fintechs exige conformidade regulatória rigorosa sem criar atrito excessivo no fluxo de cadastro. O Banco Central exige validação de identidade (KYC) e prevenção à lavagem de dinheiro (PLD) antes de permitir qualquer movimentação financeira, mas fluxos longos demais geram abandono. A API SmartCPF resolve a validação e consulta de CPF em uma única chamada HTTP, retornando dados cadastrais validados diretamente da Receita Federal em milissegundos, eliminando a necessidade de múltiplas integrações ou validações manuais. Com a API SmartCPF, a validação de CPF deixa de ser um gargalo: uma única requisição HTTPS para https://api.smartcpf.com.br/v2/individuals/{cpf}?package=X retorna validação de dígito verificador, situação cadastral na Receita Federal, dados cadastrais completos (nome, data de nascimento, nome da mãe, sexo) e metadados de auditoria como consultId e balance de créditos. Isso permite validar identidade, preencher cadastro automaticamente e manter trilha de auditoria em uma única chamada.

Entendendo o fluxo KYC para fintechs

O fluxo KYC (Know Your Customer) em fintechs brasileiras segue as resoluções do Banco Central (Resolução CMN nº 4.893/2021 e Circular BCB nº 3.978/2020). O fluxo mínimo exige: (1) identificação do cliente via CPF/CNPJ, (2) validação da situação cadastral na Receita Federal, (2) coleta de dados cadastrais completos, (4) verificação de listas restritivas (PEP, listas de sanções), e (5) manutenção de trilha de auditoria com consultId para auditoria futura. A API SmartCPF resolve as etapas 1, 2 e 3 em uma única chamada, retornando dados validados oficialmente.

Vantagens de usar a SmartCPF no KYC

1. Validação oficial em tempo real A API consulta a base da Receita Federal em tempo real, garantindo que a situação cadastral (regular, pendente, suspensa, nula) reflita a realidade no momento da consulta, não um cache desatualizado. 2. Preenchimento automático de cadastro O retorno traz name, birthDate, age, motherName e gender prontos para preencher o formulário de cadastro, reduzindo erros de digitação e abandono por formulários longos. 3. Controle de custos via balance O campo balance retorna o saldo de créditos restante em tempo real, permitindo alertas automáticos de recarga e controle de custos por consulta em tempo real. 4. Latência baixa para UX fluida Tempo médio de resposta de ~70ms permite validar CPF no momento do preenchimento do campo (blur do input) sem travar o fluxo do usuário. 5. Modelo de créditos sem assinatura Paga-se apenas pelo que consome, sem mensalidade, contratos anuais ou volume mínimo — ideal para fintechs em fase inicial ou com volume variável.

Desafios a considerar antes de implementar

1. Dependência de conectividade externa A chamada requer internet para alcançar api.smartcpf.com.br; falhas de rede ou bloqueios de firewall corporativo exigem fallback (retry com backoff ou fila de reprocessamento). 2. Limite de créditos (balance) O campo balance indica créditos restantes; quando chega a zero, novas consultas falham até recarga. Exige monitoramento proativo (alertas em < 100 créditos) para evitar interrupção no onboarding. 3. Dados sensíveis no retorno O retorno traz dados sensíveis (nome da mãe, data de nascimento); exige HTTPS obrigatório, logs sem dados sensíveis e conformidade LGPD no armazenamento. 4. Rate limiting da API A API aplica rate limiting por IP/token; picos de onboarding (ex: campanha de marketing) exigem implementação de fila com backoff exponencial ou pool de workers. 5. Dados podem estar desatualizados na Receita Embora a consulta seja em tempo real, a base da Receita pode conter dados desatualizados (ex: nome de solteira não atualizado após casamento); o fluxo deve permitir correção manual pelo usuário.

Como implementar com a SmartCPF

O exemplo abaixo implementa um serviço de validação KYC consumindo a API SmartCPF com tratamento de erro, retry com backoff exponencial, validação de resposta e logging estruturado para auditoria. O código é escrito em JavaScript/Node.js (compatível com Node 18+ nativo fetch) e pode ser adaptado para TypeScript, Python ou Go.

kyc-smartcpf-service.js
/**
 * Serviço KYC para validação de CPF via SmartCPF
 * Consome: GET https://api.smartcpf.com.br/v2/individuals/{cpf}?package=X
 * 
 * Package X = consulta completa (validação + dados cadastrais + situação cadastral)
 * Requer: token de acesso (x-api-key token) obtido em app.smartcpf.com.br
 */
const SMARTCP_BASE = 'https://api.smartcpf.com.br/v2';
const PACKAGE = 'X'; // package completo
/**
 * Valida CPF via SmartCPF com retry exponencial e tratamento de erros
 * @param {string} cpf - CPF apenas números (11 dígitos)
 * @param {string} token - x-api-key token da SmartCPF
 * @param {Object} options - Opções de retry/logging
 * @returns {Promise<Object>} Dados validados do CPF ou erro estruturado
 */
async function validarCPFSmartCPF(cpf, token, options = {}) {
  const {
    maxRetries = 3,
    baseDelayMs = 300,
    maxDelayMs = 5000,
    onRetry = () => {},
    onError = () => {},
    logger = console
  } = options;
  // Sanitiza CPF: remove formatação, valida 11 dígitos
  const cleanCpf = String(cpf).replace(/\D/g, '');
  if (!/^\d{11}$/.test(cleanCpf)) {
    throw new Error('CPF inválido: deve conter exatamente 11 dígitos numéricos');
  }
  const url = `${SMARTCP_BASE}/individuals/${cleanCpf}?package=${PACKAGE}`;
  const headers = {
    'Authorization': `x-api-key ${token}`,
    'Accept': 'application/json',
  };
  let attempt = 0;
  let lastError;
  while (attempt <= maxRetries) {
    attempt++;
    const startTime = Date.now();
    try {
      logger.info({ cpf: maskCpf(cleanCpf), attempt }, 'Consultando SmartCPF');
      const response = await fetch(url, { headers });
      const latencyMs = Date.now() - startTime;
      // Lê body uma única vez
      const data = await response.json();
      // Log de auditoria com consultId se disponível
      const consultId = data?.meta?.consultId;
      const balance = data?.meta?.balance;
      logger.info({ 
        cpf: maskCpf(cleanCpf), 
        consultId, 
        balance, 
        latencyMs, 
        status: response.status 
      }, 'Resposta SmartCPF recebida');
      // Sucesso HTTP mas erro de negócio (ex: CPF não encontrado, saldo zerado)
      if (!response.ok) {
        const error = new SmartCPFError(
          data?.message || `HTTP ${response.status}`,
          response.status,
          data?.errors,
          consultId
        );
        throw error;
      }
      // Sucesso: valida estrutura esperada
      if (!data?.success || !data?.result?.cpf) {
        throw new SmartCPFError('Resposta inválida da API: success=false ou result ausente', 502);
      }
      // Retorna dados normalizados para o domínio da fintech
      return normalizeKYCResponse(data, latencyMs);
    } catch (err) {
      lastError = err;
      
      // Erros não-retryáveis: 400, 401, 403, 404, 422
      if (err instanceof SmartCPFError && !err.isRetryable) {
        logger.warn({ cpf: maskCpf(cleanCpf), error: err.message, status: err.status }, 'Erro não-retryável');
        throw err;
      }
      // Última tentativa: propaga erro
      if (attempt > maxRetries) {
        logger.error({ cpf: maskCpf(cleanCpf), error: err.message, attempts: attempt }, 'Todas as tentativas esgotadas');
        throw new SmartCPFError(`Falha após ${attempt} tentativas: ${err.message}`, 502, null, null, err);
      }
      // Backoff exponencial com jitter
      const delay = Math.min(
        baseDelayMs * Math.pow(2, attempt - 1) + Math.random() * 200,
        maxDelayMs
      );
      
      logger.warn({ cpf: maskCpf(cleanCpf), attempt, delayMs: delay }, 'Retry agendado');
      onRetry({ attempt, delay, error: err.message });
      await sleep(delay);
    }
  }
  throw lastError;
}
/**
 * Normaliza resposta da SmartCPF para domínio KYC da fintech
 */
function normalizeKYCResponse(data, latencyMs) {
  const { meta, result } = data;
  return {
    // Dados de identidade validados
    cpf: result.cpf,                    // "111.111.111-11" (formatado)
    nome: result.name,                  // "João da Silva"
    dataNascimento: result.birthDate,   // "10/09/1992"
    idade: result.age,                  // 33
    nomeMae: result.motherName,         // "Maria da Silva"
    sexo: result.gender,                // "M" ou "F"
    
    // Metadados de auditoria e controle
    consultId: meta.consultId,          // UUID v4 para auditoria BC
    consultDate: meta.date,             // ISO 8601: "2025-01-15T14:32:10.123Z"
    executionTimeMs: meta.executionTimeMs, // Latência API: 74.1
    balance: meta.balance,              // Créditos restantes: 9.77
    apiVersion: meta.apiVersion,        // "v2"
    searchType: meta.searchType,        // "CPF C"
    
    // Metadados internos
    latencyMs,                          // Latência total (rede + API)
    consultedAt: new Date().toISOString()
  };
}
/**
 * Erro tipado da SmartCPF com flag de retry
 */
class SmartCPFError extends Error {
  constructor(message, status, errors = null, consultId = null, cause = null) {
    super(message);
    this.name = 'SmartCPFError';
    this.status = status;
    this.errors = errors;
    this.consultId = consultId;
    this.cause = cause;
    // Erros 4xx não são retryáveis (exceto 429); 5xx e rede são
    this.isRetryable = status === 429 || status >= 500 || !status;
  }
}
/**
 * Utilitários
 */
function maskCpf(cpf) {
  return cpf.replace(/(\d{3})(\d{3})(\d{3})(\d{2})/, '$1.$2.$3-**');
}
function sleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}
/**
 * Exemplo de uso no fluxo de onboarding
 */
async function exemploOnboarding() {
  const TOKEN = process.env.SMARTCP_TOKEN; // Configure via env
  const cpfUsuario = '11111111111'; // CPF do usuário no formulário
  try {
    const kycData = await validarCPFSmartCPF(cpfUsuario, TOKEN, {
      maxRetries: 3,
      baseDelayMs: 300,
      logger: {
        info: (meta, msg) => console.log(`[INFO] ${msg}`, meta),
        warn: (meta, msg) => console.warn(`[WARN] ${msg}`, meta),
        error: (meta, msg) => console.error(`[ERROR] ${msg}`, meta)
      },
      onRetry: ({ attempt, delay }) => {
        console.log(`Tentativa ${attempt} falhou, aguardando ${delay}ms...`);
      }
    });
    console.log('✅ KYC validado com sucesso:', {
      cpf: kycData.cpf,
      nome: kycData.nome,
      idade: kycData.idade,
      consultId: kycData.consultId,
      balance: kycData.balance
    });
    // Próximos passos do onboarding:
    // 1. Salvar kycData.consultId no banco para auditoria BC
    // 2. Verificar kycData.balance < 100 → alerta de recarga
    // 3. Cruzar kycData.nomeMae / kycData.dataNascimento com documento enviado
    // 4. Consultar listas PEP/sanções (fora do escopo da SmartCPF)
    // 5. Prosseguir para abertura de conta
    return kycData;
  } catch (err) {
    if (err instanceof SmartCPFError) {
      switch (err.status) {
        case 401:
          console.error('Token inválido ou expirado — verifique SMARTCP_TOKEN');
          break;
        case 403:
          console.error('Token sem permissão para este package — verifique plano');
          break;
        case 404:
          console.error('CPF não encontrado na base da Receita Federal');
          break;
        case 422:
          console.error('CPF inválido (dígito verificador ou formatação)');
          break;
        case 429:
          console.error('Rate limit excedido — implemente fila com backoff');
          break;
        default:
          console.error('Erro na validação KYC:', err.message);
      }
    } else {
      console.error('Erro inesperado:', err);
    }
    throw err;
  }
}
// Executa se rodado diretamente
if (require.main === module) {
  exemploOnboarding().catch(() => process.exit(1));
}
module.exports = { validarCPFSmartCPF, SmartCPFError, normalizeKYCResponse };

Resposta da API

response.json
{
  "meta": {
    "searchType": "CPF C",
    "consultId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    "user": "Minha Fintech LTDA",
    "message": "CPF encontrado com sucesso",
    "ip": "203.0.113.45",
    "success": true,
    "apiVersion": "v2",
    "date": "2025-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"
  },
  "success": true,
  "errors": []
}

O fluxo demonstrado resolve na prática:

  • Validação instantânea: searchType: "CPF C" confirma CPF válido com dígito verificador correto
  • Preenchimento automático: name, birthDate, age, motherName, gender preenchem cadastro sem digitação manual
  • Controle de custos: balance: 9.77 permite alerta automático quando créditos baixam (< 100)
  • Observabilidade: executionTimeMs: 74.1 + latencyMs total permitem SLA de latência no onboarding
  • Trilha de auditoria: date (ISO 8601) + ip + user criam trilha completa para compliance

Por que usar a SmartCPF no KYC de fintechs

  • Latência previsível: ~70ms médios permitem validação síncrona no blur do input de CPF sem travar UX
  • Integração simples: Uma única chamada REST com token, sem SDKs pesados ou dependências nativas
  • Modelo por consumo: Créditos pré-pagos sem mensalidade; balance no retorno permite controle financeiro em tempo real
  • Dados oficiais: Consulta direta à base da Receita Federal, não bases secundárias ou scrapers
  • Escalabilidade nativa: Rate limiting por token/IP gerenciável com filas; suporta picos de onboarding via worker pool

Conclusão

Implementar KYC robusto em fintechs não exige múltiplas integrações nem validações manuais. A API SmartCPF resolve validação de CPF, consulta de situação cadastral e preenchimento de dados cadastrais em uma única chamada HTTPS com latência sub-100ms, retornando consultId para auditoria e balance para controle de custos. O exemplo acima demonstra um serviço pronto para produção com retry exponencial, tratamento de erros tipados e logging estruturado para compliance. 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.