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.

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.
/**
* 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
{
"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,genderpreenchem cadastro sem digitação manual - Controle de custos:
balance: 9.77permite alerta automático quando créditos baixam (< 100) - Observabilidade:
executionTimeMs: 74.1+latencyMstotal permitem SLA de latência no onboarding - Trilha de auditoria:
date(ISO 8601) +ip+usercriam 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;
balanceno 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.
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.